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 21, 2026
Fixkamo-internal

Removing from Selected Docs unchecks the row

The mirror ran one way. Removing a document deleted the binder item but left its checkbox ticked in the grid, so the next sync — on the very next visit to the t...

kamo·1mo ago
Fixkamo-internal

Stop rounding document ids into nothing

A document id is a 19-digit int64 — 1200096283020258886, some 133x past Number.MAX_SAFE_INTEGER. OrganizerTab joined the selection into a key so the effect woul...

kamo·1mo ago
Fixkamo-marketing

Quote the annual rate under the "billed annually" caption

The homepage cards read the month-to-month rate out of the catalog and printed it above a line saying "billed annually", so Starter advertised $34 and Business ...

Kamo·1mo ago
Featurekamo-internal

Say when a selected document could not be added

The Selected Docs binder skips a document it cannot legally hold rather than failing the whole sync, which is right — but it did so silently, so a binder holdin...

kamo·1mo ago
FixDocsService

Let an unscoped binder hold its own grid's documents

sameCollection demanded an exact assoc_object_id match in both directions, which made every binder in My Docs refuse every document My Docs was showing it. The ...

Kamo·1mo ago
Featurekamo-internal

Fold the Modify tab into Binders

The strip is now Originals | Binders | Modified | Common | Uploads. Modify is gone: everything it did — arrange the checked documents, preview them, merge them ...

kamo·1mo ago
FeatureDocsService

Serve and sync the Selected Docs binder

POST /api/docs/binders/scratch fetches the caller's Selected Docs binder for one collection, creating it on first use, and replaces its documents with the grid ...

Kamo·1mo ago
FeatureInitializerService

Add binders.is_scratch

Four statements rather than one ALTER: binders is populated, and Yugabyte rejects the whole ADD COLUMN … NOT NULL statement rather than the clause, so the colum...

Kamo·1mo ago
Featurekamo-shared-library

Mark the member's auto-managed Selected Docs binder

binders.is_scratch flags the one binder per (owner, collection) whose documents are the DocManager grid selection rather than a curated list. It is an ordinary ...

Kamo·1mo ago
Featurekamo-internal

Assemble the lead record instead of holding it behind a spinner

The Details tab's loading state was one card of fourteen grey MUI pulse rows — a shape the pane never takes, on a per-element clock, replaced wholesale by a lay...

kamo·1mo ago
Fixkamo-internal

A minimized chat is neither read nor silent

Two bugs that shared a cause: the only flag saying "this window is minimized" was pinned false, so everything that asked it silently did nothing. An arriving m...

kamo·1mo ago
Fixkamo-internal

A member chat's own reads clear its badge, and a reply counts as one

Two gaps left over from giving the support window this treatment. Sending a message cleared nothing. The chat core marks a conversation read when it starts, wh...

kamo·1mo ago
FeatureSecurityService

Ask EmailService to back-fill a lead's past e-mail

Implements the shared library's LeadEmailBackfillTrigger, so ticking "Associate Past E-Mails w/ Lead" on a lead save reaches the only service that can read mail...

Kamo·1mo ago
FeatureEmailService

Scan the org's mailboxes for a lead's past e-mail on request

Serves the "Associate Past E-Mails w/ Lead" tick-box. Given a lead and the address just recorded on it, read INBOX and Sent of every mailbox in that lead's orga...

Kamo·1mo ago
Featurekamo-shared-library

Let a lead claim mail that predates its e-mail address

Matching is point-in-time by design — a contact point only claims traffic inside its window, so editing a lead cannot retroactively rewrite history. The cost is...

Kamo·1mo ago
Featurekamo-internal

Offer to associate past e-mail when a lead's address is set

Mail is matched to a lead strictly point-in-time: an address only claims traffic from the moment it is recorded, so that editing a lead today cannot rewrite who...

kamo·1mo ago
Featurekamo-internal

One agent picker for assignment, reservations and the filter

The Assigned Agent control on a lead's assignment pane was a local component in LeadViewClient. Two other places wanted exactly it, so it moves to *************...

kamo·1mo ago
FeatureSecurityService

Accept a reservation raised for another agent

POST **************** now honours onBehalfOfMemberId, gated on EDIT_OPPORTUNITIES — the right that gates managing opportunities on the reserved list, and alread...

Kamo·1mo ago
FeatureInitializerService

Add ****************

Records who filed a reservation when that is not the agent it names, so somebody managing opportunities can raise one on a sales agent's behalf without the reco...

Kamo·1mo ago
Featurekamo-shared-library

Let a manager raise a reservation for an agent

Somebody who manages opportunities can now file a reservation request on a sales agent's behalf. CreateReservationRequest carries onBehalfOfMemberId for it. Th...

Kamo·1mo ago
Fixkamo-internal

Stop flexbox crushing the When card down to its header

The start and end fields were not clipped by their own width. The card holding them was being shrunk to nothing. A flex item's automatic minimum size — `min-he...

kamo·1mo ago
Featurekamo-internal

Hide the balance controls that free-for-all cannot use

Credit Balance, Daily Allotment and Max Balance all act on a granted balance, and an FFA product has none — acceptance there mints and spends its own credit. Le...

kamo·1mo ago
Featurekamo-shared-library

Make free-for-all acceptance spendable, so it can be capped

FFA bypassed the credit system outright, which left a manager with no lever over it: Max Daily Spend sat behind if (!ffa) and could not cap an FFA product, and ...

Kamo·1mo ago
Featurekamo-internal

Name the requestor, move the org line, shorten the Open Org button

Three adjustments to the support surfaces. "Open org as System User" is now "Open Org", sitting immediately after assign/reassign rather than at the end of the...

kamo·1mo ago
Featurekamo-internal

Say which clock the event dialog is on, and show the start time

Four things the composer got wrong, on /calendar and on the lead page alike. The zone was the browser's. That is a fact about the laptop, not about the member:...

kamo·1mo ago
FeatureSecurityService

Publish Hibernate statement counts to Prometheus

/actuator/prometheus already carried jdbc_* and hikaricp_* but no hibernate_*, because Spring Boot 3 only auto-configures those metrics when **************** is...

Kamo·1mo ago
Featurekamo-internal

Show the requestor's photo on each support chat row

Every row in Chats → Support wore the same blue support glyph, which is no help at all when the list is what you scan to decide what to pick up. The face is now...

kamo·1mo ago
FeatureMediaService

Put the requestor's face and name on each support chat row

A Chats → Support row showed the same support glyph on every line, so a queue of them was a wall of identical blue circles. The face people actually scan for is...

Kamo·1mo ago
Featurekamo-internal

Pool count on the product header, accepted-today per member

Leads Available was rendered in every member row of a product group, but it is a property of the (product, market) pool — the same number repeated down the colu...

kamo·1mo ago
RefactorSecurityService

Delegate AvatarObjectPaths to the shared library

MediaService now names avatar objects too — the support chats list shows the requestor's photo, and a support requestor is in somebody else's organization, so n...

Kamo·1mo ago
Featurekamo-shared-library

Resolve a member's photo URL from the shared library

The Chats → Support list is about to show the requestor's face, and a support requestor is — on the platform's own desk — always somebody else's member. Every o...

Kamo·1mo ago
FeatureSecurityService

Return each member's accepted-today count per product

Manage-Credits shows Max Daily Spend but nothing about how much of it is used, so a manager could not tell whether a member was one lead from their cap or had n...

Kamo·1mo ago
Featurekamo-shared-library

Count today's spend across a member's products in one query

Manage-Credits wants to show, per member, how many leads they have accepted so far today — the running total the Max Daily Spend cap is compared against. ******...

Kamo·1mo ago
Stylekamo-shared-library

Drop imports left unused by removing the @EntityGraph

Page, Specification and EntityGraph were only needed by the findAll override that was removed after it took /leads down. Leaving an unused EntityGraph import on...

Kamo·1mo ago
FixSecurityService

Stop cutting note bodies off at 500 characters in the timeline

The All tab of a lead's communications rendered a note through LeadCommunicationMapper, which capped the body at 500 characters — with no ellipsis and no flag, ...

Kamo·1mo ago
Fixkamo-internal

Take leads-available from the server's per-product counts

leadsByProduct was derived from the allotment rows, which only cover products someone already holds a credit rule for. The grid lists products from the vendor c...

kamo·1mo ago
FixSecurityService

Report leads available for products with no allotment

/manage built its whole response by looping over allotments, calling countAssignablePool once per row. But the Manage-Credits grid lists products from the vendo...

Kamo·1mo ago
Featurekamo-shared-library

Count the assignable pool for every vendor product at once

countAssignablePool answers for one product, so a caller can only ask about products it already holds. Manage-Credits was iterating allotments to decide what to...

Kamo·1mo ago
Fixkamo-internal

Give the composer its caret back after each send

Every chat box in a tool window locks itself while a message goes out — the input carries `disabled` so nothing typed mid-flight is discarded when the draft res...

kamo·1mo ago
FeatureInitializerService

Composite indexes for geolite_locations

Country alone was the only index on an 80,429-row table. Measured on production: city resolution (country + subdivision) index-scanned all 18,870 US rows to kee...

Kamo·1mo ago
PerformanceSecurityService

Stop scanning every market x product after the answer is known

/leads/available-summary returns three things — hasAcceptable, hasAcceptableCredit and one example product — but visited every market x product pair regardless,...

Kamo·1mo ago
Performancekamo-shared-library

Index the two shapes geolite_locations is actually queried by

Country alone was the only index on an 80,429-row table, and neither real query used it well. Measured on production: city resolution (country + subdivision)...

Kamo·1mo ago
Featurekamo-internal

Show the requestor's org, and offer the System User door to their agent

The support chat header now names the organization the request came from, to everyone working the conversation and to nobody else — the person who raised it wou...

kamo·1mo ago
FeatureMediaService

Name the requestor's org, and end System User access when the ticket moves

Three things, all about a support desk that answers more than one tenant. The ticket detail now carries a per-viewer verdict on whether to offer "open the requ...

Kamo·1mo ago
FeatureSecurityService

Mint a System User session for a support agent's open ticket

enter-as gains a second reason to say yes. SystemUserEntryPolicy turns the caller's *** into the facts the shared SupportSystemAccessResolver takes, and that re...

Kamo·1mo ago
Featurekamo-shared-library

Let an open ticket grant its agent the requestor's org, and expire with it

A support agent needs to look inside the customer's tenant to answer the ticket they are holding. Until now the only way in was the blanket SYSTEM_USER platform...

Kamo·1mo ago
DocsDaemonService

Record that the unprocessed claim is now batched

getUnprocessedPayloads() returned every unprocessed payload, and this job holds each one's raw and flattened text for its whole run — so its memory was a functi...

Kamo·1mo ago
PerformanceSecurityService

Count in the database instead of hydrating every commit

GET /changelog/public/stats loaded all 16,571 commit logs as entities and tallied them in a Java loop to produce two small maps and a total. It takes no authent...

Kamo·1mo ago
FeatureInitializerService

Index member_rights_applied on (member_id, the_right)

The table had no indexes at all, while every finder on it filters by MEMBER_ID. At 10,524 rows a single member's rights lookup was a full sequential scan — meas...

Kamo·1mo ago
Stylekamo-shared-library

Restore CRLF in MemberRightsApplied

The previous commit rewrote this file with a script and silently converted its line endings, so 53 unchanged lines showed as modified and buried the actual 15-l...

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