Live Change Log

See what we're building, in real-time. Every feature, fix, and improvement shipped across the platform.

17,988
Total Changes
4,648
Features
4,558
Fixes
32
Projects
Filter by project
All Projects17,988AIService112APIService138BillingService133ConversionService85DaemonService107DocsService189ESigService78EmailService386InitializerService302KBService74KlusterServices547MCPGatewayService43MediaService462RAGService61SecurityService1,529TranslateService45VOIPService173VectorService8kamo-analytics6,157kamo-apps18kamo-asterisk-support19kamo-capcha17kamo-capcha-widget4kamo-internal4,600kamo-login319kamo-marketing588kamo-meet90kamo-nowww18kamo-register206kamo-shared-library1,328kamo-signer-monorepo50kamolos102
Filter by type
All TypesBuild24CI523Chore670Docs231Feature4,648Fix4,558Other6,781Performance136Refactor274Revert23Style48Test71Upgrade1
August 26, 2026
Fixkamo-internal

The new workspace opens once, ready, and as itself

Three faults with one cause, reported after creating Carl's Jr: the new tab said ?org=kamocrm.com, showed Kamo's logo and none of the org's colours — while its ...

kamo·2w ago
Fixkamo-shared-library

Delete findConflictingEvents, which never returned a row

Four independent defects, any one of which emptied the result set: it filtered e.user.id while both callers pass a member id and the two columns never coincide;...

Kamo·2w ago
FixEmailService

Conflict detection now finds conflicts

Delegates to findBusyForMemberInRange and excludes the event being edited in Java, where a null exclusion cannot poison a SQL predicate. The test it replaces m...

Kamo·2w ago
Fixkamo-internal

Remove the recurrence control, which discarded what it collected

The switch, frequency select and occurrence count rendered on the calendar page and reached no payload: composeDraft never read them and onSave never sent them....

kamo·2w ago
Fixkamo-internal

Settle the loading gate on the gate, not on a "load started" flag

Two follow-ups to the session store, one of them a real defect. ensureLoaded decided foreground-vs-background from an `everLoaded` flag set when the first fore...

kamo·2w ago
FixSecurityService

A push token may be claimed by one device row, not every past sign-in

Companion to MediaService 8a809b3, which stopped members getting the same chat message three-plus times on their phone. That change made dispatch collapse dupli...

Kamo·2w ago
FixMediaService

One phone, one alert — collapse duplicate push destinations

Members were getting the same chat message three-plus times on their phone. Registrations are unique on (device_token_id, org_id, push_kind), NOT on the push t...

Kamo·2w ago
Fixkamo-internal

A tab only names an organization it actually has

Opening TacoBell from /network put ?org=kamocrm.com on the new tab. The tab lands on /validate, which renders inside this shell BEFORE its session exists — so t...

kamo·2w ago
FixSecurityService

Recover a lost background count from the images themselves

commitBackgroundOrder writes the images to STAGING, and imageBgCount is only a record of how many it wrote — which made that one column a single point of failur...

Kamo·2w ago
FixSecurityService

Gate the nine Service Work endpoints on a right

They shipped checking only that the caller had a session, so any member of an org could read and mutate every work order in it regardless of role. ASSIGN_SERVI...

Kamo·2w ago
FixSecurityService

Drop the nine Service Work endpoints from the unguarded baseline

They are gated as of e6e1d02, so their baseline entries no longer match an unguarded endpoint and **************** fails on the stale lines. Requiring the remov...

Kamo·2w ago
FixSecurityService

Stop the customer **************** rights reading every tenant's rows

Every endpoint that accepted a VIEW_OWN_* right as an OR-alternative loaded its record by primary key alone, never checking who it belonged to: getSubscription,...

Kamo·2w ago
Fixkamo-internal

The org reference belongs in proxy.ts, not a second middleware file

Next 16 replaced middleware with proxy, and this repo already had proxy.ts — so adding middleware.ts alongside it failed the build outright: "Both middleware fi...

kamo·2w ago
Fixkamo-analytics

The signed-in session becomes per-tab

analytics.auth lived in localStorage, which every tab of this origin shares. Analytics is reached by an OTK handoff from a workspace and each handoff mints a to...

Kamo·2w ago
Fixkamo-meet

A member's identity and their org stop leaking between tabs

meet.<platform> is shared by every organization without a host of its own, and localStorage is per ORIGIN. The signed-in member's name, email and avatar were wr...

Kamo·2w ago
Fixkamo-login

Theme assets come from a host that resolves

The sign-in screen paints an organization's branding from theme.<its own domain>. That domain may not resolve: an org can exist and be signed into before its DN...

Kamo·2w ago
Fixkamo-internal

One tab, one tenant — stop resolving the org from the shared cookie

Open KamoCRM in one tab and another organization in a second, refresh the first, and it rendered as the second. Close that tab, refresh again, and it came back....

kamo·2w ago
FixSecurityService

Serve a tenant's assets from a host that resolves, and stop deleting its backgrounds

Two faults found while working out why a new org opened with no logo and no colours. THEME DELIVERY. Assets were requested from theme.<the org's own domain>. A...

Kamo·2w ago
Fixkamo-internal

Stop standing workload from flashing the browser tab forever

TabAttention fed navGrandTotal into a 1100ms title flasher. Four of its eight addends are queue depth that never reaches zero when a member reads something: sup...

kamo·2w ago
Fixkamo-internal

Wire markSmsRead/markAiRead/social mark-read to their windows

Final review found markSmsRead and markAiRead had zero callers, and SocialChatWindow never called markAsRead/beginViewing at all — three of five conversation su...

kamo·2w ago
FixVOIPService

Gate the voicemail nav count on VIEW_VOICEMAIL

**************** handed any authenticated member holding a MemberVoipConfig row the instance-wide unread-voicemail count with no rights check at all, even thoug...

Kamo·2w ago
FixMediaService

Route getChatSessions' unread ambiguity through OwnAuthorshipAmbiguity

MediaController.getChatSessions hand-rolled the pre-extraction version of the "was this written by somebody else?" rule (rowVisitor != null && callerId ********...

Kamo·2w ago
Fixkamo-internal

Give the web media path a TURN relay

The browser SIP path built its peer connection with one hardcoded public STUN /api/voip/turn/credentials for as long as that endpoint has existed — TurnControll...

kamo·2w ago
Fixkamo-internal

Stop the app tree's rails putting a scrollbar on the viewport

/settings/account?tab=apps scrolled the whole window, down into empty space below the shell, while the apps column it was supposedly scrolling had its own scrol...

kamo·2w ago
FixSecurityService

Show one call once in a rollup, and stop 500ing on unworked leads

Two fixes the account rollup made visible. A phone number can be a contact point on more than one owner at the same time, and two leads on one account sharing ...

Kamo·2w ago
FixBillingService

Close the webhook idempotency gap BL0's final review found

Finding 1 (Critical): a losing claim on a redelivered Stripe event only proved a row existed, not that the prior attempt finished. A claimed row left behind by ...

Kamo·2w ago
FixSecurityService

Make the KamoDesktop SSO link redeemable exactly once

The link is delivered as a URL, so it lands in browser history and in the reopen-closed-tab list, where it long outlives the session it was minted for. Until no...

Kamo·2w ago
FixSecurityService

The account rollup must not widen what a reader may see

The account timeline I added last commit was a way around the per-lead read gate. A member refused a lead's messages on the page that names the lead could open ...

Kamo·2w ago
Fixkamo-shared-library

Carry the assignee into the account rollup, over a LEFT join

Reading a lead's communications is gated on who it is assigned to. A rollup that returned uids alone could not apply that gate, so the account timeline built on...

Kamo·2w ago
Fixkamo-internal

Thump the first real message, not just the second

shouldThump(undefined, n) meant "first render" — but a spawned head's unread starts genuinely undefined, and applyUnreadToHeads's own undefined-vs-0 guard never...

kamo·2w ago
Fixkamo-internal

Make every client component safe to render on the server

Next server-renders client components, so `window`, `document`, `localStorage`, `sessionStorage` and `navigator` do not exist during the render that produces th...

kamo·2w ago
FixBillingService

Do not key ephemeral per-attempt Stripe creates

Round 2 review (Ruling 17) found "is this a create?" is necessary but not sufficient. The question that matters: can this subject legitimately be created more t...

Kamo·2w ago
FixBillingService

Keys belong on Stripe creates only, not on mutations

Round 1 review (Ruling 15) found the Critical: a stable idempotency key on an update/cancel/attach/detach is not a safeguard, it is a bug. Those calls already s...

Kamo·2w ago
FixKlusterServices

The auto-reconnect reload-looped every page into a blank screen

I shipped this and it took the desktop down: a blank white page and a tab loading forever. Disabled in-cluster immediately; this is the real fix. `ng-switch` s...

Kamo·2w ago
Fixkamo-internal

Read-fence SMS/AI mark-reads, fold sessionType into sameSessions

Three review findings against Task 21, all plan-mandated: - markSmsRead/markAiRead had no read fence: a refresh or an inbound push resolving between the opti...

kamo·2w ago
FixBillingService

Make every Stripe write idempotent, and fail the build on a new one without a key

A socket timeout on a Stripe write that actually succeeded is indistinguishable, from our side, from one that did not; without an idempotency key the retry crea...

Kamo·2w ago
FixBillingService

Commit the processed flag with the money write, not ahead of it

markProcessed was REQUIRES_NEW, so it committed processed=true while the handler's money writes were still uncommitted in the suspended outer transaction. JpaTr...

Kamo·2w ago
Fixkamo-internal

A thrown hexhead can no longer end a live call

SoftphoneTool never listened for the cancelable tool:requestClose that MessageTool uses to protect unsent text, so scoring the remove goal on a minimized softph...

kamo·2w ago
Fixkamo-internal

A refresh mid-call no longer re-dials the customer

The tool-window snapshot replayed props verbatim, which is right for state and wrong for an instruction. `autoDial: true` survived into the restored window and ...

kamo·2w ago
FixMediaService

Consistent error handling and layering on two review findings

Review findings on Tasks 14 and 15: - SystemBugController held a SystemBugRepository field and queried it directly for the new-bug count, while every other r...

Kamo·2w ago
FixMediaService

Guard the unread-lookup itself, not just the broadcast

Review finding on Task 9: persistInbound is @Transactional, and only the broadcast() call inside the per-member loop was exception-safe (it swallows its own fai...

Kamo·2w ago
August 25, 2026
Fixkamo-internal

Apply the branding the wizard just collected

Colours, logos and backgrounds chosen while creating an organization were not reaching it. The member opened their new workspace on default branding and had to ...

kamo·2w ago
FixSecurityService

/org/current stops depending on a live Hibernate session

This endpoint is what the workspace shell loads before it renders, and the client refuses a record it cannot read — Organization.fromJSON throws without a domai...

Kamo·2w ago
Fixkamo-shared-library

Make the retail webhook signature check fail closed and compare in constant time

validateSignature used to return true three ways without verifying anything: a null secret short-circuited, six of eleven provider types fell through default ->...

Kamo·2w ago
Fixkamo-login

Continue stays disabled once a workspace is opening

The button already carried disabled={!selected || submitting}, but submitting was only true for the duration of the request. On success the page sets redirectin...

Kamo·2w ago
Fixkamo-login

Only a spent token sends the member back to the start

Every non-ok status fell back to "Please sign in again", which is only true of 401 — the one status that means the selection token is really gone. SecurityServi...

Kamo·2w ago

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing