KamoCRM

Live Change Log

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

18,874
Total Changes
6,817
Features
5,696
Fixes
30
Projects
Filter by project
All Projects18,874AIService287APIService179BillingService166ConversionService121DaemonService152DocsService275ESigService103EmailService651InitializerService350KBService163KlusterServices778MCPGatewayService280MediaService629RAGService79SecurityService2,061TranslateService62VOIPService266VectorService11kamo-apps29kamo-asterisk-support29kamo-capcha17kamo-capcha-widget4kamo-internal8,878kamo-login346kamo-marketing642kamo-nowww20kamo-register216kamo-shared-library1,892kamo-signer-monorepo73kamolos115
Filter by type
All TypesBuild23CI528Chore798Docs3,294Feature6,817Fix5,696Other1,007Performance175Refactor286Revert23Style45Test181Upgrade1
August 15, 2026
Fixkamo-internal

Draw the callback markers as soon as the summary loads

The summary lands after the grid has drawn its rows, and AG Grid keeps the cellRenderer a column was built with and only re-creates a cell when its row changes....

kamo·3mo ago
Fixkamo-internal

A deleted upload now falls back instead of going silent

The previous commit claimed a retired sound "degrades to the layer beneath it rather than to silence". It did not. `isKnownSoundId` accepts a custom id on shape...

kamo·3mo ago
Fixkamo-internal

48 unenforced — the six PLOS rights are gated now

Gating the LOS proxy made PLOS_* enforced, but they stayed on the unenforced list, so the editors were showing 'Not yet enforced' against six live gates. Third ...

kamo·3mo ago
Fixkamo-internal

Put the callback marker after the lead id

Leading the cell with the marker pushed the id right on any row with a call waiting, so the ids no longer lined up down the column while scrolling.

kamo·3mo ago
Fixkamo-internal

The meeting reminder reaches the bell, and pops once

MeetReminderPopup drew its own Snackbar from its own subscription to **************** Nothing else knew a reminder had happened: the bell stayed at zero, the de...

kamo·3mo ago
FixMediaService

The meeting reminder is a notification, not a popup of its own

The sweep published a bespoke event on /topic/meet/reminder/{memberId} that a dedicated Snackbar drew in the corner of the screen. That popup was the entire rem...

Kamo·3mo ago
August 14, 2026
Fixkamo-internal

One calendar reminder, announced once

A reminder was arriving twice. The deck picks it up as a notification, and the older path picked it up as well: CalendarWebSocketContext opened a second STOMP c...

kamo·3mo ago
Fixkamo-internal

A note is owned by a member, not by an account

Mirrors the API: NoteDTO now carries memberId in place of userId. A member is the signed-in account inside ONE organisation, so opening a different org shows a ...

kamo·3mo ago
FixKBService

Read and write notes as a member, never as an account

Every endpoint now requires memberID on the session — reads included — and refuses the request without one. The reads used to need only a userID, which is globa...

Kamo·3mo ago
Fixkamo-shared-library

Scope notes to a membership instead of an account

A note hung off USER_ID alone and carried no organisation at all. A user is global and a member is that user inside one organisation, so an account belonging to...

Kamo·3mo ago
Fixkamo-internal

Re-derive the audit structurally — 57 decorative

The count moved 58 -> 52 -> 47 -> 57 because every version hard-coded a list of gate-helper names and the codebase has more than anyone can recall. Six were mis...

kamo·3mo ago
Fixkamo-internal

Dock popup windows beside the page scrollbar, not on top of it

Tool windows are fixed to the viewport and dock right-to-left from its edge, and the layout was told about exactly one thing occupying that edge: the interactio...

kamo·3mo ago
FixSecurityService

Enforce the doc-share search rights server-side

/members-subscribers and /team-members-contractors enumerate the organisation's people — names and ids — to fill the document-share autocomplete, and required o...

Kamo·3mo ago
FixDocsService

Enforce the doc-share alias rights server-side

GET /shares/resolve-alias turns a guessable alias into a real person's NAME and required only a valid session. The rule lived solely in ShareDocumentDialog, and...

Kamo·3mo ago
Fixkamo-internal

Stop the reminder lurching to the screen edge when an option opens

The card kept framer's `layout` after it grew a fold-out options panel. `layout` animates size and position by transform, so that one height change was being an...

kamo·3mo ago
Fixkamo-internal

47 unenforced — five more were falsely reported

CREATE_ORG_CALENDAR_EVENTS is enforced: MemberCalendarService throws OrgCalendarForbiddenException when a member without it writes to the org calendar. The chec...

kamo·3mo ago
Fixkamo-internal

52 unenforced, not 58 — six were falsely reported

The audit's gate detection recognised hasRight and checkRight but not denyUnless, hasAnyRight, sessionHasRight or forbidden. Six rights that ARE enforced were t...

kamo·3mo ago
Fixkamo-internal

Make the emoji picker's search actually filter

The picker's search matched the query against the translated category name only, and fell back to pushing every emoji into the results when nothing matched — so...

kamo·3mo ago
Fixkamo-internal

Sticky scrollbars, a toolbar that never scrolls, and a dialog that clears the note

Three things, all in the floating sticky. The scrollbar was still grey. The rules were written as **************** which styles only the element CARRYING the c...

kamo·3mo ago
Fixkamo-internal

Stop the launchpad backdrop painting over the page scrollbar

The launchpad is the only page that renders the full-bleed Backdrop, and it was the only page whose scrollbar stayed invisible after the -webkit-/standard confl...

kamo·3mo ago
Fixkamo-internal

The sticky's watermark is centred from the moment it opens

It only landed correctly after the note was resized. The measurement used getBoundingClientRect, which reports the PAINTED box — and a sticky opens by animating...

kamo·3mo ago
Fixkamo-internal

Centre the sticky's watermark on the writing surface

It was centred on the whole note, so it sat high — pulled up behind the title bar — and in rich mode it drifted further every time the toolbar wrapped to a seco...

kamo·3mo ago
FixDocsService

Writing the org legal settings needs BOTH HR rights

The Legal & Compliance settings tab is the only writer and is now offered only to a member holding MANAGE_HRS_SETTINGS *and* MANAGE_LEGAL_AND_COMPLIANCE, so the...

Kamo·3mo ago
Fixkamo-internal

The floating sticky's pin is the same pin /notes draws

The sticky was drawing a hand-rolled bookmark path while the notes wall, the editor, the rail and the bulk bar had all moved to MUI's PushPin — outlined when lo...

kamo·3mo ago
Fixkamo-internal

Stop the page scrollbar's two halves cancelling each other out

The main content scroller declared both **************** and a block of `::-webkit-scrollbar` rules, on the theory that whichever the browser understood would w...

kamo·3mo ago
Fixkamo-internal

Draw the main content scrollbar, in the org's colour

html/body are pinned to height:100%, so the element that actually scrolls a page is the main content div in layout.tsx — and it carried no scrollbar styling at ...

kamo·3mo ago
Fixkamo-internal

Hold a launchpad card's pin chip back until its pane arrives

The panes reveal themselves on scroll (whileInView, opacity 0 -> 1), but the pin control is a sibling overlay rather than part of that animation — it has to be,...

kamo·3mo ago
Fixkamo-internal

Solid sticky paper, and a scrollbar in the note's own colour

The note's background faded to `rgba(0,0,0,0.045)` at one corner. That is not a shade — it is 95% TRANSPARENT, so the corner of a sticky showed the page scrolli...

kamo·3mo ago
Fixkamo-internal

Stop the docket flickering a scrollbar, and centre the step counter

THE FLICKER. The docket row set `overflow-x: auto` and left the other axis alone — but CSS computes `overflow-y: visible` to `auto` the moment the other axis is...

kamo·3mo ago
FixInitializerService

Match the enum-whitelist CHECK sweep to the YugabyteDB rendering

dropStaleEnumWhitelistChecks() looked for '% IN (%', which is how CockroachDB stored a @Enumerated(EnumType.STRING) whitelist. PostgreSQL and YugabyteDB normali...

Kamo·3mo ago
Fixkamo-internal

Catch npm silently dropping Next's native SWC binary

The image build died in `next build` with Downloading swc package @next/swc-linux-x64-gnu... unhandledRejection TypeError: terminated (UND_ERR_SOCKET)...

kamo·3mo ago
FixSecurityService

Stop copying lead details onto the calendar event

The event carried the lead's name, number, email and best time to call, copied into its description when the call was booked. A copy of a record that is still b...

Kamo·3mo ago
FixSecurityService

Stop writing the lead path into the callback's description

It read "Open the lead: /leads/view/123" and was not a link. It could not be: a description is edited in a textarea, where text is text — and outside the applic...

Kamo·3mo ago
Fixkamo-shared-library

Stop an omitted date window failing every event lookup

The calendar page could never list anything. It asks for every event a member has, with no window, and these queries took the range as nullable and tested it wi...

Kamo·3mo ago
FixEmailService

Put a callback on a calendar the member can actually see

Callbacks were not reaching the calendar at all. This service picked the target calendar by account — findPrimaryByUser — and a user is global while a member is...

Kamo·3mo ago
Fixkamo-internal

Stop the event dialog throwing "Invalid time value" on open

wallClockToInstant called toISOString() on a date it had not checked, so any unreadable input threw RangeError instead of returning something unusable. The dia...

kamo·3mo ago
Fixkamo-internal

Let "not established" be a value the images gate can see

Follows EmailService boxing **************** A folder listing now reports null for it rather than a primitive's false, so the types here admit null and the gate...

kamo·3mo ago
FixEmailService

Stop envelopes claiming a consent answer nobody asked for

remoteImagesAllowed was a primitive boolean, and only the three endpoints that fetch a whole message ever assign it. The folder listing does not — answering it ...

Kamo·3mo ago
FixEmailService

Make event reminders actually notify someone

Three faults, one symptom. Members reported that calendar notifications did not work, and all three reasons were on this side. Reminders were never written. Th...

Kamo·3mo ago
Fixkamo-internal

Stop flashing the external-images prompt at members who allow them

Opening a message showed the "display external images" banner for a moment and then withdrew it, for anyone who had already chosen to allow images everywhere. ...

kamo·3mo ago
Fixkamo-internal

Stop storing which side a message is on

The mirrored rule was right; what was wrong is that the answer was computed once, when a message arrived, and kept. Placement needs three things — the sender, t...

kamo·3mo ago
Fixkamo-internal

Keep the session document name as the consent card's fallback heading

Extracting FieldLayer dropped detailTitleFor, and with it the fallback to session.documents[0].name — a document with a null fileName would have headed its cons...

kamo·3mo ago
Fixkamo-internal

Render the document the wizard was measuring into a node that did not exist

The execution wizard showed a blank surface for every signable document — no pages, no field overlays, no PDF request, and nothing in any log. DocumentStep mea...

kamo·3mo ago
FixEmailService

Record all three IMAP flags, and say why the index cannot serve a list yet

The migration has run, so is_answered exists and SearchIndexService now writes it alongside is_read and is_starred. The index has recorded two of the three flag...

Kamo·3mo ago
FixEmailService

Do not read or write is_answered before its column exists

Follows the shared-library change unmapping the field. Nothing in the deployed path now touches a column that KamoInitializer has not yet created. The index-ba...

Kamo·3mo ago
Fixkamo-shared-library

Unmap is_answered until its migration has run

Mapping the column ahead of the migration that creates it is armed, and I armed it. SearchIndexEntity is hydrated from fullTextSearch, which is a native SELECT ...

Kamo·3mo ago
Fixkamo-internal

Only the requestor is asked how the support went

Closing a ticket put "How was your experience?" in front of every agent in the conversation — the people who did the work, invited to score themselves. Since a ...

kamo·3mo ago
Fixkamo-internal

A read clears the indicators immediately, not on the next reload

Reading a conversation updated the server and then waited for the news to come back: PUT /read commits, MediaService broadcasts a fresh count over core NATS, th...

kamo·3mo ago
FixESigService

Resolve a native PDF's source bytes instead of demanding a rendition

**************** required dat.convertedDat to be non-null. ConversionService only mints a second ImgDat when it actually converts something -- a document that a...

Kamo·3mo ago
FixMediaService

The ticket list survives a broken indicator

The unread read threw and took the whole ticket list with it — the page came back empty, which is a far worse outcome than a page with no markers on it. It is g...

Kamo·3mo 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