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
September 23, 2026
FixAIService

MCP configs need MANAGE_AI_SETTINGS, provider/MCP urls can't reach the cluster, quota policies are enforced

Three independent findings, fixed together because the first two share files and a class. 1. AiMcpController had zero right checks on create/update/delete/test...

Kamo·6d ago
FixMediaService

Session reads, ticket mutations and public keys stop trusting the caller's say-so

Four related holes, all the same shape: a request carried an authenticated member, and that was treated as enough. - **************** SessionFacesController.fa...

Kamo·6d ago
Featurekamo-shared-library

Let a caller resolve a MediaObjImg by the Img id alone

DocsService's imaging endpoints (download/stream/list/delete) know an Img's id but have no reason to hold the MediaObj it was attached to — until they need to h...

Kamo·6d ago
FeatureDaemonService

Fold the lead ledgers every 30 s and recount them nightly; the job trigger needs the cluster secret

The lead ledgers (securityservice create_lead_ledgers.sql, applied 2026-09-22) replace COUNT(*) over a 796k-lead pool and over lead_credits with maintained tota...

Kamo·6d ago
PerformanceSecurityService

Manage-Credits and Leads-Available read the lead ledgers once instead of counting per row

/leads/credits (GET /api/security/credits/manage) counted the lead pool once per allotment row — ~8 s apiece against one org's 796k-lead pool — then once more g...

Kamo·6d ago
Performancekamo-shared-library

Leads available and credit balances read a ledger instead of counting rows

"Leads available" was COUNT(*) over the assignable pool, and one org's pool holds ~796k leads: ~7.8 s per (market, product) count and ~11 s for the grouped one ...

Kamo·6d ago
FixDocsService

Bind every WOPI endpoint to the document its token was minted for

CheckFileInfo was the only WOPI endpoint that both compared the access token's document against the request path and re-checked live access; GetFile, PutFile, P...

Kamo·6d ago
Featurekamo-internal

The card on reply quotes, hand histories, ticket events and bug-thread authors

The last four surfaces that named a member with nothing to open, now that MediaService sends the ids (fa25989): - Reply quotes: the quoted author's name opens t...

Kamo·6d ago
FixRAGService

The session path searches the caller's own org, never the request body

RagSearchController read orgId/memberId/memberType from the JSON body on every path, including requests authenticated by a *** session rather than X-Internal-Au...

Kamo·6d ago
September 21, 2026
Featurekamo-internal

Show JustCall callback URL before credentials exist

Generates a phone-server UUID when JustCall is selected and shows the webhook URL immediately. That same id is sent on create so the URL the member pasted into ...

kamo·1w ago
FeatureVOIPService

Pre-assign JustCall phone server id for callback URL

The new-phone form generates a UUID before create so the member can paste the webhook callback URL into JustCall while requesting API credentials. Create accept...

Kamo·1w ago
Chorekamo-internal

Retrigger build after JustCall i18n dictionary update

The prior image build failed check-i18n-keys; the English strings now live in kamo-translation-dictionary.

kamo·1w ago
FeatureVOIPService

Serve JustCall callback URL for phone server setup

Adds GET /api/voip/setup so the settings UI can show the exact per-instance webhook URL without hardcoding the deployment host.

Kamo·1w ago
Featurekamo-internal

Show JustCall webhook callback URL on new-phone setup

Surfaces the per-instance callback URL on the JustCall new-phone and overview tabs so members know what to give JustCall when configuring APIs and webhooks. The...

kamo·1w ago
September 20, 2026
Fixkamo-marketing

Give the postbuild compression probe more time to start the server.

Docker builds can still be settling after prerender workers finish; extend upstream and probe waits and surface child stderr when startup fails.

Kamo·1w ago
Fixkamo-marketing

Lower the floating logo by 3px.

Reduce NAV_LOGO_RISE from 10 to 7 so the mark sits slightly lower while keeping shared chrome math in sync.

Kamo·1w ago
Fixkamo-marketing

Stop double-counting banner height on secondary pages.

Body already reserves the preview strip; main padding now clears only the nav row and logo overhang so inner pages do not stack a second chrome band.

Kamo·1w ago
Fixkamo-marketing

Move the floating logo outside the header containing block.

backdrop-filter on the header trapped position:fixed children so top and margin offsets never moved the mark; pin it to the viewport instead.

Kamo·1w ago
Fixkamo-marketing

Move the floating logo up with marginTop instead of top calc.

The dynamic top calc was not shifting the mark; mirror nav-row flex centring and pull it up 10px with marginTop.

Kamo·1w ago
Fixkamo-marketing

Pin the floating logo top edge for a reliable vertical offset.

Stop relying on translateY(-50%), which was not moving the rendered mark, and place the logo 10px above nav centre explicitly.

Kamo·1w ago
Fixkamo-marketing

Correct the floating logo vertical offset.

Anchor the mark 10px above nav center instead of shifting it down with a transform miscalculation.

Kamo·1w ago
Fixkamo-marketing

Float the logo above the preview banner and raise it 10px.

Use fixed positioning so the mark escapes the nav header stacking context and paints over the red strip.

Kamo·1w ago
Featurekamo-marketing

Use full PNG logo that floats over the preview banner.

Replace the SVG wordmark with kamocrm-logo-full-v4 so the mark extends above the red strip and below the nav bar.

Kamo·1w ago
September 19, 2026
Fixkamo-internal

Show the correct draft batch total before send

Draft batches keep totalAmount at zero until send — it is a post-send snapshot, not a running total — so the compose UI now sums line amounts for the KPI tile a...

kamo·1w ago
FixSecurityService

Normalize memberId when relaying line add/update requests

The browser keeps member ids as strings to avoid IEEE-754 rounding on CockroachDB unique_rowids. Normalize to Long before relaying so the credit lands on the in...

Kamo·1w ago
September 18, 2026
Featurekamo-internal

The card on the deliverability history's "who"

EmailService now sends the member behind each change in an address's opt-out history (actorMemberId, text). On Settings → Email → Deliverability a colleague's n...

Kamo·1w ago
Featurekamo-internal

The card on email aliases and shared-mailbox access

EmailService now sends the member ids on aliases and shared-mailbox access as text. As JSON numbers they were rounded past 2^53, so these tabs matched nobody on...

Kamo·1w ago
FeatureMediaService

Quotes, hand histories, ticket events and bug threads send the id a member card needs

Four surfaces showed a member by name with no id beside it, so the console's member card had nothing to open. Each now sends the id as TEXT next to the name it ...

Kamo·1w ago
FeatureEmailService

The deliverability history names the member behind each change

Settings → Email → Deliverability shows an address's opt-out history with who made each change, but HistoryView sent only the actor's name, so the page could no...

Kamo·1w ago
FixEmailService

Aliases and shared-mailbox access name their members as text

GET and POST /api/email/aliases (and /aliases/member/{id}) and GET and POST **************** answered with the entities themselves, whose Long memberId and gran...

Kamo·1w ago
Featurekamo-internal

The card on the opt-out list's "last changed by"

EmailService now sends the member behind each address's last change (lastActorMemberId, text). The list cuts their name out of the "last changed by" sentence (a...

Kamo·1w ago
FeatureEmailService

An opt-out row carries the member behind its last change

The opt-out list named who made each address's last change (lastActorName) but not who they are, so the settings page could not open their member card. Each row...

Kamo·1w ago
Featurekamo-internal

The card on the people the servers now name — document history and shares, careers, the account's primary member, a group seat's manager

Wires the ids the services now send: - Document history (DocManager's changes and downloads, the marketing material drawer's history): the member by name (mem...

Kamo·1w ago
FeatureBillingService

A group seat's coverage carries its manager's member id

GET /api/billing/self/coverage named the billing group's manager (managerName) but not who they are, so the member's plan page could not open the manager's memb...

Kamo·1w ago
FixVOIPService

A number's owner travels as exact text, so saving it no longer re-owns it

GET /api/voip/numbers wrote ownerMemberId as the entity's Long. A member id is an INT8 past 2^53, so the settings page read it rounded: the owner was never foun...

Kamo·1w ago
FixSecurityService

The account view names its primary member

GET /customers/{uid} sent the primary member only as primaryMemberId, while the account view reads a primaryMember object — so its Primary member row read "---"...

Kamo·1w ago
Fixkamo-internal

An article's version history draws, and names who edited each version

kbservice answers /articles/{guid}/versions with a Spring Page of its entity. The history component read the body as a list and called .map on the Page, so it n...

Kamo·1w ago
Fixkamo-internal

A face that opens a card has a name for a screen reader

A MemberHoverCard around a face alone was a focusable button with nothing to be named by. It takes an optional label, used only when the trigger has no text of ...

Kamo·1w ago
Refactorkamo-internal

One way to cut a sentence around the people it names

Three agents and the first sweep each taught the app the same trick — format a translated sentence with a mark where the name goes, split on it, draw the name a...

Kamo·1w ago
FixDocsService

A document's history loads, and names the people on it and on its shares

GET /imaging/history/changes and /history/downloads built each row with Map.of, which throws on a null — and a row with no IPv6 address, no prior data or no mem...

Kamo·1w ago
Featurekamo-internal

The card on admin, leads and settings — history values, reservations, mailboxes, audit logs, the profile hero

Every remaining member these screens show opens the member card. Ids are the strings the data carries, each checked on the server's origin/main. - History (Ent...

Kamo·1w ago
Featurekamo-internal

The card on home boards, HR, KB, documents and e-sign — face and name as one door

The owner's two: the Achievement Leaderboard and Affiliate Scoreboard widgets had the card on the 20px face only. MemberFace (BoardChrome) now takes the row's n...

Kamo·1w ago
Featurekamo-internal

The card on chat, support and the dock's windows — names beside faces, and the lines that name people

Where a face already opened the member card and the name beside it did not, and on the lines that name people. Every id is the string the data already carries, ...

Kamo·1w ago
Featurekamo-internal

The card's header wears the wallpaper their desktop shows

The header band now shows the member's own desktop wallpaper — their first photograph on air, or the organization's when that is what their desktop plays — unde...

Kamo·1w ago
FeatureSecurityService

The member card carries the wallpaper their desktop shows

GET /members/{id}/card gains "wallpaper" for the card's header, resolved the way the console backdrop and the profile hero resolve a member's desktop: none when...

Kamo·1w ago
Fixkamo-internal

An article's byline names its author, and opens their card

kbservice answers GET /articles/{guid} with its entity, so authorMemberId is a JSON number, and JSON.parse rounds a 19-digit member id. The article route compar...

Kamo·1w ago
Fixkamo-internal

The Enter that opens a card goes no further

A name's trigger handled Enter and Space but let the key bubble on, so a list around it that acts on Enter itself — the timecard approvals queue opens the membe...

Kamo·1w ago
Refactorkamo-internal

The row no longer guards against the card's presses itself

The member card now keeps the events that start something inside itself (a92b3cac), for every surface, so the chat row's own guard against a press from its card...

Kamo·1w ago
Fixkamo-internal

A card opened in a tool window knows who is online

Presence and availability are provided inside AuthedChrome, but the ToolDock — every chat, ticket and social window, and the chats switcher — is mounted above i...

Kamo·1w ago
Featurekamo-internal

The card on the long tail — HR, KB, boards, webinars, growth, tracking, Hold'em

Every member these screens name now opens the member card. Ids are the strings the data already carried, except where noted. - PersonCell / PersonStack (HR att...

Kamo·1w 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