KamoCRM

Live Change Log

Every feature, fix and improvement, posted as it ships. Nothing is held back for a launch.

15,120
Total Changes
5,169
Features
4,935
Fixes
30
Projects
Filter by project
All Projects15,120AIService197APIService161BillingService143ConversionService107DaemonService129DocsService215ESigService88EmailService518InitializerService318KBService105KlusterServices697MCPGatewayService85MediaService546RAGService71SecurityService1,658TranslateService55VOIPService205VectorService11kamo-apps25kamo-asterisk-support24kamo-capcha17kamo-capcha-widget4kamo-internal6,937kamo-login330kamo-marketing625kamo-nowww20kamo-register213kamo-shared-library1,455kamo-signer-monorepo53kamolos108
Filter by type
All TypesBuild11CI523Chore738Docs2,167Feature5,169Fix4,935Other986Performance157Refactor274Revert23Style42Test94Upgrade1
August 13, 2026
FeatureMediaService

Stamp unseen counts on the ticket list, and keep the queue live

getTickets now bulk-loads an unseen-message count per row for the caller, beside the visitor rows it already loads that way, and getTicketDetail computes its ow...

Kamo·1mo ago
Featurekamo-shared-library

Count unseen messages for a viewer who is not in the conversation

Unread has always been derived from the viewer's own MediaSessionMember row, so a conversation they had not joined produced no count at all. On a support queue ...

Kamo·1mo ago
Featurekamo-internal

Delete, magnets, a right-click menu, and a clock that asks which

Six additions to the period graph and the nav clock. DELETE removes the focused pill. Backspace too, because on a Mac the key labelled "delete" IS Backspace an...

kamo·1mo ago
FeatureSecurityService

Relay the punch void

Passthrough for POST /punches/{id}/void, the editor's delete key and the machinery behind merging two adjacent spans. Same authority as /correct, and for the s...

Kamo·1mo ago
Featurekamo-shared-library

A punch can be voided without being deleted

Four nullable columns and a second write-once transition on TimecardPunch. A void says the punch should never have existed — a double tap on the clock, an aband...

Kamo·1mo ago
FeatureInitializerService

The void columns on hr_timecard_punch

Mirrors four new nullable columns on the TimecardPunch entity. A void is neither a delete nor a correction: it says the punch should never have existed — a doub...

Kamo·1mo ago
FixKlusterServices

Repair the kamouniverse backup, broken since the Yugabyte cutover

Renaming the dead CockroachBackupMissing alert in the previous commit made it fire immediately: no universe backup had succeeded since the 2026-08-09 migration....

Kamo·1mo ago
ChoreKlusterServices

Retire CockroachDB now that YugabyteDB owns the data

CockroachDB v24.2.4 was pinned to the last release under the old free BSL terms and was replaced by YugabyteDB on 2026-08-09. Nothing has connected to it since;...

Kamo·1mo ago
Refactorkamo-internal

One Plans & Billing screen instead of two that each answered half

The platform had two billing screens. /settings/account?tab=billing answered what the organization pays; Plans & Billing on the member profile answered what a p...

kamo·1mo ago
FixInitializerService

Point at YugabyteDB, and stop `mvn test` migrating production

The datasource still named port 26257. That is the retired CockroachDB, which is still running and still answering, so a run against it succeeds completely and ...

Kamo·1mo ago
Featurekamo-internal

Show the market onboarding panel when no CRM markets exist

/leads rendered the lead grid with an empty, disabled market tab bar for an org that had never configured a CRM market. It now shows the same onboarding panel /...

kamo·1mo ago
August 12, 2026
FixInitializerService

Start again, and stop the billing migration deleting its own index

KamoInitializer could not start at all. Hibernate detects CockroachDialect, whose supportsInsertReturning() and **************** are both false, so an @Id carry...

Kamo·1mo ago
Fixkamo-internal

Open at the newest message, and scroll up for the rest

Opening a long conversation showed the oldest loaded message first and then travelled down to the present while the member waited. Both chat surfaces scrolled t...

kamo·1mo ago
Featurekamo-internal

The period graph, and a timecard you edit as a draft

Replaces the one-day timeline on **************** with a whole pay period, and changes what editing one feels like. The pills carry no text. They used to carry...

kamo·1mo ago
FeatureSecurityService

Relay the editor's period range

Passthrough for GET /members/{id}/range, the period graph's read. from/to are forwarded only when present so TimecardService can resolve the member's own pay pe...

Kamo·1mo ago
Featurekamo-internal

Raise a support conversation when somebody replies in it

Closing a support window is not leaving the conversation, but it was treated as if it were. ChatNotificationListener returned early on every SUPPORT_TICKET noti...

kamo·1mo ago
FeatureMediaService

One conversation, many hands — join on open, name every message, re-open on a reply

A support ticket is worked by whoever is helping, not only by whoever it is currently stamped with. Assignment decides who the work is offered to and whose list...

Kamo·1mo ago
Fixkamo-shared-library

Quote the feed queries' aliases, and stop counting your own support messages against you

Two independent defects in the Chats feed, both invisible from the Java side. The native chat/support/social queries aliased columns in camelCase without quoti...

Kamo·1mo ago
Featurekamo-internal

Linkable tabs, a working Add Member, and a full history tab

Every tab on /account/view/{id} is a real route now — /members, /history and the rest are links somebody can send, bookmark, or land on. Old ?tab= links redirec...

kamo·1mo ago
FeatureInitializerService

Create ACCOUNT_HISTORY

Mirrors the AccountHistory entity in kamo-shared-library. Written explicitly rather than left to ddl-auto because the defaults matter: ID and DATE_CREATED carry...

Kamo·1mo ago
FeatureSecurityService

Account history endpoints, real member rows, an all-members directory

The account view can now say what has happened to an account and who is on it. - Every mutation on the account surface records history: create, field edits, ...

Kamo·1mo ago
Featurekamo-shared-library

An audit trail for accounts, and a directory that includes non-staff

ACCOUNT_HISTORY records what happens to an account the way LEAD_HISTORY records what happens to a lead — deliberately the same columns, because the internal sit...

Kamo·1mo ago
Featurekamo-internal

Confirm a clock in/out before writing the punch

The nav clock punched straight off the click. Every other control in that bar is idempotent or trivially undoable; a punch is a wage record that afterwards only...

kamo·1mo ago
Refactorkamo-internal

One strip — filter and refresh beside the sub-tabs

The controls sat in a second full-width row under the tab strip holding three short words and an icon, spending a whole band of the pane on what fits in the spa...

kamo·1mo ago
Fixkamo-internal

Make the option strip yield the room instead of the clusters colliding

The left cluster carried minWidth: 0 while its contents (correctly) refuse to shrink or wrap, so a crowded bar shrank the box below its own content and the cont...

kamo·1mo ago
Featurekamo-internal

Segmented status filter in place of the select

Pending/Complete/All are three short peers that fit on one line, so a dropdown hid two of them behind a click and spent a label and a 170px well to say nothing....

kamo·1mo ago
Fixkamo-internal

Skeleton tracks the shared grid helpers; test jsonBody's 204 guard

The loading skeleton in app/hr/overview/page.tsx still hand-wrote the 1800px breakpoint that OverviewPillars and friends extracted into primitives.tsx (WIDE_BRE...

kamo·1mo ago
Fixkamo-internal

Follow the approval figure into currentPeriod, and stop null reading as zero

SecurityService 7c55054 moved awaitingApproval inside currentPeriod, where the window it describes actually is, and omits it entirely when there is no open peri...

kamo·1mo ago
Fixkamo-internal

Two-up figure rows so no card label wraps

The figure labels are Operator Labels — uppercase, 11px, 0.12em tracking — which puts "Execution incomplete" at 158px, "Blocking exceptions" at 150px and "Await...

kamo·1mo ago
Fixkamo-internal

Stop the fixed chrome labels breaking across two lines

A flex item's automatic minimum size is its min-content width, which for wrapping text is its widest word — so a crowded bar squeezed these controls narrow enou...

kamo·1mo ago
FixDocsService

One snapshot per block, and figures that say what they measure

Both summarize methods are @Transactional(readOnly = true). Each issues six or seven reads whose figures are cross-checked ACROSS query boundaries: countOverdue...

Kamo·1mo ago
FixSecurityService

An unreadable close-readiness body is unknown, and the approval count moves into its window

The wrong-path bug is fixed and the response shape is verified, but the CLASS of failure it belonged to was still open: if TimecardService renames `blocking`, d...

Kamo·1mo ago
Performancekamo-shared-library

Fetch the summary slices' to-one associations and count instead of scanning

The Overview's attention and recent slices read a title per row off a LAZY @ManyToOne, costing up to 16 extra selects per block under open-session-in-view. All ...

Kamo·1mo ago
Fixkamo-internal

One glow on the clock icon, not two around the button

The rule carried BOTH a radial-gradient and a box-shadow. The gradient filled its own box while the box-shadow painted a separate ring outside it — two concentr...

kamo·1mo ago
Featurekamo-internal

Slide a crowded nav instead of crushing its options

Pinning more options than a nav can show squeezed the tiles out of shape: both strips were raw overflow boxes and the tiles are flex children with no flex-shrin...

kamo·1mo ago
Fixkamo-marketing

Locale-correct structured data, and a robots.txt rule that matched nothing

Every BreadcrumbJsonLd and ItemList URL was hardcoded to /en, so the structured data on /fr/terms told crawlers its breadcrumb parent was the English page — 19 ...

Kamo·1mo ago
Fixkamo-internal

Line the card figures up on a shared baseline

Every figure on the masthead and the four pillar cards was its own stacked box — Operator Label above, value below. Operator Labels are uppercase with 0.12em tr...

kamo·1mo ago
Fixkamo-internal

Withheld approval state renders as not-tracked, not clear

attendanceState() marked every member 'clear' whenever blockingExceptions was 0 and timecardState wasn't 'SUBMITTED' — true for every member under a caller lack...

kamo·1mo ago
FixSecurityService

A failed close-readiness relay leaves awaitingApproval unknown, not a confident zero

With FINALIZE_PAY_PERIODS held, a 5xx/404/unparseable close-readiness response left awaitingApproval sitting at its initial 0 — the WARN log fired but the HR Ov...

Kamo·1mo ago
Featurekamo-marketing

Index the collection detail pages in 19 more languages

The sync finished, so the ~2,400 detail pages that were noindexed for having English body copy now have real translations and can be indexed. Measured across al...

Kamo·1mo ago
Fixkamo-internal

AwaitingApproval is nullable, and null is not zero

SecurityService now withholds the approval half of the summary from a caller without FINALIZE_PAY_PERIODS — resolveRole never admitted MANAGE_TIMECARDS to appro...

kamo·1mo ago
FixSecurityService

Gate the approval half of hr-summary on FINALIZE_PAY_PERIODS

Pointing the composer at close-readiness widened privilege. That relay's own mapping guards with FINALIZE_PAY_PERIODS, and resolveRole does not admit MANAGE_TIM...

Kamo·1mo ago
Fixkamo-internal

Honest compliance figure, per-section failed states, right gating

The masthead percentage mixed units and could only flatter. `complete` summed org-wide ASSIGNMENT counts while `open` counted MEMBER-DOMAINS off memberRows, cap...

kamo·1mo ago
FixDocsService

Fill the per-member overdue rollup instead of sending zero

Both summary services built members[] with .overdue(0). The Overview's matrix branches on that field, so legal and training could only ever render amber or gree...

Kamo·1mo ago
FixSecurityService

The attendance summary called a path that does not exist

summarize() asked TimecardService for **************** That is the name of the SecurityService MAPPING, not of any downstream route. TimecardService has no such...

Kamo·1mo ago
Featurekamo-shared-library

Per-member overdue rollup for the compliance matrix

The HR Overview's matrix branches on `row.overdue > 0`, but the legal and training rollups shipped with that field hardcoded to 0 — a branch that could never be...

Kamo·1mo ago
Fixkamo-internal

Derive overview pillar deep links from sub-tab id maps; kill dead textSecondary in activity rail

OverviewPillars.tsx hard-coded **************** instead of deriving them from **************** the way AttentionLedger.tsx already does — same name-indexed patt...

kamo·1mo ago
Featurekamo-internal

Build the Overview tab as a report over the other four

Full-width reporting console: masthead readout, four tab pillars, the needs-attention ledger, the workforce compliance matrix and an activity rail. Read-only — ...

kamo·1mo ago
Featurekamo-internal

Overview attention ledger, compliance matrix and activity rail

useMemberNames sources /api/security/members/names rather than the brief's guessed .../org-config shape: org-config never returns a member list (confirmed by re...

kamo·1mo ago

Like what you see shipping?

All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.

Start Free ForeverView Pricing