KamoCRM

Live Change Log

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

17,393
Total Changes
5,908
Features
5,260
Fixes
30
Projects
Filter by project
All Projects17,393AIService242APIService174BillingService157ConversionService110DaemonService137DocsService223ESigService91EmailService568InitializerService329KBService151KlusterServices738MCPGatewayService235MediaService592RAGService79SecurityService1,829TranslateService62VOIPService248VectorService11kamo-apps26kamo-asterisk-support27kamo-capcha17kamo-capcha-widget4kamo-internal8,327kamo-login335kamo-marketing641kamo-nowww20kamo-register213kamo-shared-library1,637kamo-signer-monorepo56kamolos114
Filter by type
All TypesBuild16CI523Chore773Docs3,252Feature5,908Fix5,260Other993Performance165Refactor278Revert23Style42Test159Upgrade1
August 14, 2026
FeatureInitializerService

Purge stored rows for the deleted chat-channel rights

Ids 74/75/76 no longer resolve. RoleRightsSyncService would sweep them on some future SecurityService boot anyway — silently, at an unpredictable moment, with n...

Kamo·2mo ago
Featurekamo-shared-library

Delete the three chat-channel rights — 196

CREATE_CHANNELS (74), MANAGE_CHANNELS (75) and MODERATE_CHAT (76) gated nothing and could not be implemented as written: chat is real but the platform has no ch...

Kamo·2mo ago
FeatureInitializerService

Move notes from account ownership onto membership

Adds notes.member_id and attaches each note to its owner's earliest membership — the organisation the account has belonged to longest, which in practice is wher...

Kamo·2mo ago
Featurekamo-internal

One event-sound system, three layers, wired to what actually fires

There were two sound systems and neither knew about the other: four mp3s behind useChatSounds, and four synthesised tones behind notificationSound with a five-o...

kamo·2mo ago
FeatureSecurityService

Read and write the three layers of the event-sound stack

GET returns all three layers in one round trip plus what the caller may edit — every settings page needs the whole stack, because an org administrator editing t...

Kamo·2mo ago
Featurekamo-shared-library

One table for the three layers of the event-sound stack

Platform defaults, an organization's overrides and a member's own are the same shape, so they are the same table: a scope, the id that scope is about, and the s...

Kamo·2mo ago
Featurekamo-internal

Give the deck its slide back, without the lurch

Dropping `layout` to stop the card lurching onto the edge of the screen also took the sibling slide with it: dismissing a card left the rest snapping into its p...

kamo·2mo ago
Featurekamo-internal

Stagger the cascade, add branch bulk actions, explain the rule

The cascade highlight now travels the chain instead of flashing every affected row at once. enabledAncestors already arrives nearest-first, so the index IS the ...

kamo·2mo ago
Featurekamo-internal

Show and enforce the permission hierarchy in all five editors

Five editors granted 199 rights as five flat lists of checkboxes, and none of them showed that one right can be a prerequisite for another. Granting a child wit...

kamo·2mo ago
FeatureSecurityService

Normalise member overrides against the hierarchy

Member direct rights now go through RightsHierarchy.normalizeLevel before they are persisted: a granted child pulls its ancestors up to GRANTED at the member le...

Kamo·2mo ago
FeatureInitializerService

Backfill ancestors so closure cannot remove access

MemberRightsAppliedService now denies any right whose parent chain is not granted. Every row written before the hierarchy existed knows nothing about ancestors,...

Kamo·2mo ago
Featurekamo-shared-library

Parent/child hierarchy for all 199 rights

RoleRightType has declared a 'parent' field and a public getParent() for years. Every constant passed null and nothing ever called it. This finishes that scaffo...

Kamo·2mo ago
Featurekamo-internal

Repaint the reminder in the org's colour, open its options in place

The card is the organisation's primary colour now, with every mark on it drawn in --on-primary rather than a literal white — a white-label org that picks a pale...

kamo·2mo ago
Featurekamo-internal

Legal & Compliance settings tab with the org default legal text

A new tab on /settings/features/hrs holding Default Legal Text, linked from the settings menu and the settings launchpad. Creating a package on /hr/legal-compli...

kamo·2mo ago
Featurekamo-internal

Rich text in the sticky and the previews, and a mode you can switch

A note now says whether it is rich text or plain text, and both the editor and the floating sticky can switch it. The floating note in rich mode embeds the ver...

kamo·2mo ago
FeatureKBService

Carry a note's rich-text / plain-text mode through the API

Create honours the requested mode and defaults to rich, matching the editor a note is created in. Update is null-guarded like every other field on that endpoint...

Kamo·2mo ago
FeatureInitializerService

Add the is_rich_text column, defaulted and backfilled to rich

Whether a note is edited as rich text or plain text cannot be read back out of its content: a rich note nobody has formatted yet is byte-for-byte a plain one. W...

Kamo·2mo ago
Featurekamo-shared-library

A note records whether it is rich text or plain text

The mode cannot be derived from the content. A rich note the member has not formatted yet serializes byte-for-byte identically to a plain one — both are a Lexic...

Kamo·2mo ago
Featurekamo-internal

One page for the notifications and the controls over them

The notifications page wore a header of its own — an eyebrow, a title and three pill buttons inside a bordered card — while every neighbouring page (the account...

kamo·2mo ago
FeatureDocsService

GET/PATCH the org's default legal text

/api/docs/legal/settings, behind the same guarded() funnel as every other mapping on this controller. The read NEVER creates a row: it resolves to LegalDefault...

Kamo·2mo ago
FeatureInitializerService

Seed every organization a default legal text

One hr_legal_settings row per org, unique on org_id, carrying **************** INSERT-ONLY, never an UPDATE. An org that has edited its own wording owns it; a ...

Kamo·2mo ago
Featurekamo-shared-library

Org-level default legal text

LegalSettings is one row per organization carrying the wording a NEW legal package starts with. It is a DEFAULT, never a live reference: creating a package copi...

Kamo·2mo ago
Featurekamo-internal

The history becomes a page, and the bell rings

The bell opened a popover, which is the right shape for "what just happened" and the wrong one for "what did that reminder say on Tuesday". A panel hanging off ...

kamo·2mo ago
FeatureEmailService

A paged, filterable history

The centre could answer one question: the most recent hundred, unread or not, with no way to ask for what had already been read. So anything a member had seen w...

Kamo·2mo ago
Featurekamo-shared-library

Let the history be queried by specification

The browsable history filters by kind and by whether a notification has been read, and those combine freely — which as JPQL is a query per combination, or one q...

Kamo·2mo ago
Featurekamo-internal

Rebuild /notes as a paper wall with a split-pane editor

The page was the last screen still on raw Tailwind blue-600/gray-50 while everything around it moved to the house system, and every one of its ~100 `dark:` vari...

kamo·2mo ago
Featurekamo-internal

Pin and unpin a note from its floating sticky

The sticky could recolour, rename, minimize, maximize and close a note but not pin it — so pinning meant going back to /notes for the one thing the note is alre...

kamo·2mo ago
Featurekamo-internal

One quiet-hours window, governing both notification channels

There were two. The pair near the top of the page silenced the in-app cards; the pair at the bottom silenced the missed-message emails. Nothing on screen said t...

kamo·2mo ago
Featurekamo-internal

Two meanings of 100% — a reading width, and the whole pane

The percentage reset to one baseline: the page grown to the pane but capped at 920px, which on a wide monitor leaves the sheet floating in a lot of empty desk. ...

kamo·2mo ago
Featurekamo-internal

Refresh the NavTop clock the moment the editor saves

Voiding the punch a member is currently clocked in under already leaves them OFF server-side: RosterService.clockState reads the latest LIVE punch and skips voi...

kamo·2mo ago
Featurekamo-internal

Zoom the document, and grab it to move it

A floating capsule in the bottom-right of the document pane: −, the current percentage, +. The READOUT IS THE RESET — a separate reset button would be a third c...

kamo·2mo ago
Featurekamo-internal

Pinned notes on the launchpad, colour rotation, and a proper send-off

Three things. Pinned notes reach the home launchpad. Every note pinned on /notes gets a chip there in its own sticky colour, with a short preview; clicking one...

kamo·2mo ago
Featurekamo-internal

Notification settings across the width, with a working model

It was one 760px column of switch rows, which reads as a form to fill in rather than something to tune — and on a wide screen left two thirds of the page empty ...

kamo·2mo ago
Featurekamo-internal

Notifications become a tab on the member's own profile

They were a page of their own at /settings/notifications, which put a preference about one person somewhere other than the page about that person — and left the...

kamo·2mo ago
Featurekamo-internal

Sign a package at /settings/sign, on a route of its own

Signing was inline on the member's profile tab, so the document sat under the settings tab strip AND the compliance sub-tab strip AND that tab's help panel — th...

kamo·2mo ago
Featurekamo-internal

Remember each floating note's size and position per device

Reopening a detached note now puts it back exactly where it was left, at the size it was left, on that screen. Placement is per DEVICE, deliberately. Which not...

kamo·2mo ago
Featurekamo-internal

The lead on a callback is read, not remembered — and a call can be reopened

Two things, both about a calendar event being a poor place to keep a copy of somebody else's record. The event dialog now reads the lead from the CRM. Its name...

kamo·2mo ago
FeatureEmailService

Read one event by id

The lead page holds a callback's event id and wants to reopen it in the same dialog the calendar uses, so it needs to be able to fetch the event on its own. Sc...

Kamo·2mo ago
Featurekamo-internal

Floating notes become a second class of hex head window

Hex heads now back two kinds of window: the popup tool windows they always did, and floating notes. Minimize replaces the old roll-up — a minimized sticky leave...

kamo·2mo ago
Featurekamo-internal

A control that actually opens what produced the event

The callback's description carried "Open the lead: /leads/view/123" as text, and text in a textarea cannot be clicked — the event dialog edits its description i...

kamo·2mo ago
Featurekamo-internal

Callbacks on the calendar, and a marker on the list

Two ways to see a call you promised to make without opening the lead. On the calendar, a callback gets its own line item rather than looking like any other app...

kamo·2mo ago
FeatureSecurityService

Callback summary for the leads list marker

Answers which leads have a call still waiting, and when the soonest one is due, for the caller's organisation in one request. Its own endpoint rather than a fie...

Kamo·2mo ago
Featurekamo-shared-library

Pending callbacks for a whole organisation in one query

Feeds the leads list's per-row callback marker. The grid holds every lead the member can see, so asking per lead would be a request per row to render one column...

Kamo·2mo ago
Featurekamo-internal

A notification centre, on every page

Reminders had nowhere to arrive. The calendar's popup was a plain alert in the top corner of whichever page happened to be open, it vanished on a timer, and any...

kamo·2mo ago
FeatureSecurityService

A callback that leads back to the lead

The callback already reached the member's calendar, as an event titled "Lead Callback" with their comment in the description. Nothing said whose call it was, no...

Kamo·2mo ago
FeatureInitializerService

Member notification tables, and an event's origin columns

Two halves of one feature. A callback scheduled on a lead is mirrored onto the scheduling member's calendar, and the point of the mirror is to get back to the l...

Kamo·2mo ago
Featurekamo-shared-library

Member notification centre, and an event's origin

Adds MemberNotification and MemberNotificationPreference: one row per member per notification, because read, dismissed and snoozed are per-person answers and a ...

Kamo·2mo ago
Featurekamo-internal

Detach notes into draggable, resizable floating stickies

Each note in the list (and the editor) gets a detach control that pops it onto a screen-wide overlay. Any number can float at once; each can be dragged anywhere...

kamo·2mo ago
FeatureEmailService

One integer for the mail badge, and count what the index path is worth

Three things, all about knowing rather than assuming. The nav-top unread badge fetched the entire folder tree and picked INBOX out of the result — the most exp...

Kamo·2mo ago
Featurekamo-internal

Brand chrome around a drafting board in the signing room

The desk was tinted with the org's colour and went dark in both themes, which put the brand under the document and left the chrome neutral — exactly backwards. ...

kamo·2mo 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