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 11, 2026
FeatureInitializerService

Add the auto-expand columns

Kamo·1mo ago
Featurekamo-shared-library

Opt-in auto-expand with a ceiling

Two columns on the subscription that holds the blocks: whether to buy another one automatically when the organization runs out of room, and the most it may ever...

Kamo·1mo ago
FeatureBillingService

Let a catalog price change actually reach Stripe

Stripe Prices are immutable and the mapping holds one row per (org, type, code, cycle) behind a unique key, so once a price existed it could never change. A pri...

Kamo·1mo ago
FeatureInitializerService

Add the columns that make a price change detectable

Order(0), nullable, no backfill — a null amount reads as "we do not know what this price was created with" and the reconciler treats it as unknown rather than a...

Kamo·1mo ago
Featurekamo-shared-library

Record what each Stripe price was created with

The mapping stored only which price id to use, so a catalog price change could not even be noticed. ensurePlanPrices short-circuited on the row's existence and ...

Kamo·1mo ago
Featurekamo-internal

Type the storage capacity the summary now returns

Keeps the client contract in step with BillingService, which now reports what the plan includes, what blocks were bought, the combined ceiling and the fraction ...

kamo·1mo ago
FeatureBillingService

Report capacity alongside usage

The storage panel reported bytes stored against nothing at all — no allowance, no percentage, no money — so an owner looking at 400 GB had no way to tell whethe...

Kamo·1mo ago
Featurekamo-shared-library

Give the storage allowance an effect

Storage was measured across nineteen domains, nightly, with a build-failing coverage test — and nothing anywhere computed an allowance or refused a byte. The pl...

Kamo·1mo ago
Featurekamo-internal

Tell the requestor whether their agent is actually there

A silent thread does not distinguish "nobody has looked at this" from "my agent stepped away", and the person waiting cannot tell which. The notice under the co...

kamo·1mo ago
FeatureMediaService

Reassignment reaches the new agent, and the requestor is told who is there

Reassignment did not reach anybody. assignmentOpenedAt records that a client put the conversation on screen, and it is what raises a ticket at sign-in — but it ...

Kamo·1mo ago
Featurekamo-internal

Assign a chat request, and assign from the tickets list

Two gaps, same cause — assignment was treated as something that happens to a ticket rather than to a piece of work. The assign button was hidden for pre-ticket...

kamo·1mo ago
FixMediaService

Assigning by hand must not consume the PRE_TICKET status

assignToAgent and reassignAgent set ASSIGNED unconditionally, which quietly made a chat request impossible to convert afterwards — convertPreTicket accepts noth...

Kamo·1mo ago
Featurekamo-internal

Quote engine for the plan picker, matching what Stripe will bill

The arithmetic behind a live running total, kept apart from any component so the numbers can be tested directly. It mirrors **************** exactly: per-seat a...

kamo·1mo ago
FeatureBillingService

Make a first plan purchasable, and return real plan prices

Two things stopped an organization ever buying a first subscription. Plan lists were reachable only through sub.marketId on a subscription the org already held...

Kamo·1mo ago
FixBillingService

Let a sub-org reach the account that pays for it

AccountSubscription deliberately separates the payer from the organization whose members consume the seats, and auto-provisioned accounts sit on the top-level K...

Kamo·1mo ago
Featurekamo-internal

Gate paid actions on a licensed seat, at the chokepoint

Nearly every gateable action in the product — dial an extension, email a member, open the AI assistant, play a recording, start a social conversation — is a bar...

kamo·1mo ago
FeatureSecurityService

Resolve what a member may do, not just what their plan includes

Feature grants describe a plan. They never described this member, because the console gates navigation on org-level org.features — so a member with no license a...

Kamo·1mo ago
Fixkamo-marketing

Derive the add-on unit from the catalog, and correct stale prices

The storage add-on advertised as "+$4 /user/month" for a pool the same page called organization-wide. Cause: mapAddOns matched addonCode "additional_storage" wh...

Kamo·1mo ago
FeatureBillingService

Bill per-unit add-ons by units bought, not by headcount

Threads the new add-on quantity through create and update: a FLAT add-on now takes its Stripe quantity from what the subscription actually bought, so four 10 GB...

Kamo·1mo ago
FeatureInitializerService

Reprice Additional Storage as $2.50 per 10 GB, org-wide

The add-on described an organization-wide shared pool and was then priced USAGE_BASED at $4 with "25 GB" stated only in prose. Nothing ever submitted a storage ...

Kamo·1mo ago
Featurekamo-shared-library

Give add-ons a unit size and a purchasable quantity

An add-on's unit only ever existed as prose inside its description ("Each unit adds 25 GB") and as a hardcoded constant in the marketing site, so nothing could ...

Kamo·1mo ago
August 10, 2026
FixBillingService

Charge what the catalog says, once, for the right quantity

Five defects that all moved real money, plus the sub-resource IDOR beneath them. Billing cycles. ANNUAL prices were sent to Stripe at the stored per-month rate...

Kamo·1mo ago
Featurekamo-internal

Pick the agent to reassign a ticket to, instead of typing their id

Assign and reassign opened a text box you typed a raw member id into — which meant already knowing the id of the person you wanted, for an action whose whole pu...

kamo·1mo ago
FixMediaService

Validate who a ticket may be handed to by hand

assignToAgent and reassignAgent checked only that the id resolved to a member. Assignment adds that member to the ticket's chat session, so an id from another o...

Kamo·1mo ago
Docskamo-internal

Design for the platform billing redesign

Records the audit finding that measurement, entitlement and money are three pipelines that were each built well and never connected, plus the 17 confirmed defec...

kamo·1mo ago
FixBillingService

Verify god mode against the database, not a forged header

AccountOrgScopeInterceptor short-circuited every org and member check on the raw X-God-Mode-Active header, and kamo-internal's billing proxy copies that header ...

Kamo·1mo ago
FixMediaService

Auto Assignment offers the ticket, it does not allocate it

Auto Assignment pages every available support agent and goes to the first one who accepts. It was implemented as "silently pick the least-busy agent who is onli...

Kamo·1mo ago
FixMediaService

Run the topic's strategy for widget chats too

A chat opened in the web widget is the same unit of work as one filed inside the app, but this path skipped the topic's assignment strategy entirely — the only ...

Kamo·1mo ago
Fixkamo-internal

Decide the sign-in auto-open on the server, not in this tab

The per-tab sessionStorage flag was not a record of anything. Signing in on a second device replayed every conversation the first had already popped, and cleari...

kamo·1mo ago
FeatureMediaService

Endpoints for the sign-in auto-open handover

GET /sessions/chat/auto-open returns the chat conversations this member's client should raise; POST /sessions/{guid}/auto-opened records that it did. The durabl...

Kamo·1mo ago
Featurekamo-shared-library

Durable record of a conversation the client raised by itself

MediaSessionMember gains AUTO_OPENED_AT, beside msgIdLastViewed because it is the same grain — a fact about one member's relationship to one session. That one a...

Kamo·1mo ago
Featurekamo-internal

Overhaul the preferences panel

Four dropdowns and a switch on a panel washed top to bottom in the tenant colour at full strength, so every control fought its own background. Each select hid t...

kamo·1mo ago
Featurekamo-internal

Replace the mailbox spinners with a skeleton that assembles

Every loading state on /messages was a Loader2 on an otherwise empty pane — the boot, the message list, the folder tree, the message body and the next page all ...

kamo·1mo ago
Stylekamo-internal

Restore the CRLF endings on the calendar types

Same script-normalisation slip as the attendee repository: the file was rewritten through Python, which converted every line ending and turned a handful of type...

kamo·1mo ago
Fixkamo-internal

Don't let one failed request silence the sign-in auto-open

Unread chats are auto-opened once per tab-session, guarded by a sessionStorage flag. That flag was written up-front, before the fetch that tells a chat session ...

kamo·1mo ago
Featurekamo-internal

Add and remove guests from the event dialog

The last thing the dialog could not do. It could display who was already on an event, but there was no way to put anyone there — the only guest control was "upd...

kamo·1mo ago
FeatureEmailService

Manage an event's guest list

The dialog could show who was already on an event but never add or remove anyone; the only guest operation was re-notifying people who were somehow already ther...

Kamo·1mo ago
Stylekamo-shared-library

Restore the CRLF endings on the attendee repository

The previous commit rewrote the file through a script that normalised its line endings, so a twelve-line addition arrived as a fifty-line rewrite. That buries t...

Kamo·1mo ago
Featurekamo-shared-library

Batched guest lookup, and delete-by-event

The event dialog shows who an event is with, and the list endpoint returns a month of events at a time. Asking for guests per event is a query per row; findByEv...

Kamo·1mo ago
Featurekamo-internal

Tell the member what the event collides with, as they set it

The most useful thing a scheduling dialog can say is "you already have something then", and the endpoint to answer it existed all along with nothing calling it....

kamo·1mo ago
FeatureEmailService

Let the conflicts endpoint exclude the event being edited

ConflictDetectionService has always taken an excludeEventId; this endpoint passed null. Without it an event overlaps itself, so the moment the event dialog star...

Kamo·1mo ago
Fixkamo-internal

Stop typing an unseen support session as a plain chat

A live activity frame for a session not already in the list synthesized a row hard-coded to 'CHAT'. For a support ticket that put it in the wrong sub-tab, showe...

kamo·1mo ago
FixMediaService

Put the session type on the activity frame too

The unread/ACTIVITY broadcast is published for every session type and carried no indication of which. The chats list, having nothing to go on, typed an unseen s...

Kamo·1mo ago
Fixkamo-internal

Stop a support ticket opening a plain chat window full of JSON

Two faults, one symptom. Assignment makes the agent a member of the ticket's media session, so the incoming-message notification reached them and ChatNotificati...

kamo·1mo ago
FixMediaService

Tell the client which kind of conversation a message arrived in

Every member of a media session receives the incoming-message notification, and assigning a support ticket makes the agent a member of that ticket's session. Th...

Kamo·1mo ago
Stylekamo-internal

Halve the gap between stacked pinned-app bands

kamo·1mo ago
Fixkamo-internal

Declare the calendar tokens at :root, and rebuild the event dialog

The tokens were declared on the calendar wrapper element, which reads as the tidy thing to do and is wrong. MUI dialogs and menus render through a portal into d...

kamo·1mo ago
Fixkamo-internal

Actually override the operator label ink

The previous attempt raised specificity, which was the wrong diagnosis: tailwind.config.js sets `important: true`, so every declaration in .operator-label ships...

kamo·1mo ago
Featurekamo-internal

Rebuild the event dialog around when, not around fields

Ten identically weighted outlined fields in a column, in the order the columns happen to sit in the table: title, description, location, calendar, all-day, star...

kamo·1mo ago
Featurekamo-internal

Auto Assignment strategy, and open an assigned conversation automatically

Topics settings gains the fourth strategy. The list rows and the edit dialog share the same label, and the key shipped to kamo-translation-dictionary first — me...

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