Live Change Log

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

17,987
Total Changes
4,647
Features
4,558
Fixes
32
Projects
Filter by project
All Projects17,987AIService112APIService138BillingService133ConversionService85DaemonService107DocsService189ESigService78EmailService386InitializerService302KBService74KlusterServices547MCPGatewayService43MediaService462RAGService61SecurityService1,528TranslateService45VOIPService173VectorService8kamo-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,647Fix4,558Other6,781Performance136Refactor274Revert23Style48Test71Upgrade1
August 26, 2026
Docskamo-internal

Keep the decision record — 18 rulings and what each costs if wrong

The plan records what shipped; this records why it differs from the plan. Three rulings were themselves corrected by a later review (the Stripe write count went...

kamo·2w ago
Performancekamo-internal

Server-render the authenticated app, and fix the fallback org that 500s

MemberListProvider returned null until its mount effect ran, and it sits above NavTop AND {children} — so that one line kept the ENTIRE authenticated applicatio...

kamo·2w ago
Featurekamo-internal

An AI sub-tab in the Interaction Center

AI sessions live in AIService and are not MediaSessions, so this bucket gets its own loader in front of the /api/media/sessions/chat fetch the other four share,...

kamo·2w ago
Featurekamo-internal

The dedicated line window

The call now lives in a window a refresh of the workspace cannot touch. SoftphoneProvider becomes owner-or-follower. Only the owner REGISTERs and opens the STO...

kamo·2w ago
Featurekamo-internal

A communications tab that rolls up the account's leads

The level most people mean when they say "this customer's calls". Several leads commonly hang off one account precisely because they are the same person enquiri...

kamo·2w ago
Docskamo-internal

The KamoDesktop link is single-use now

The comment claimed a reload re-submits ?data= and restores the session. It no longer does: the link is spent the moment the tab opens it, so it is worthless af...

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
Featurekamo-internal

Line ownership, the bridge, and the no-yank handover rule

Three pure modules with no consumers yet, so this ships inert. lineOwnership elects exactly one SIP registrar per browser via Web Locks. That is mandatory here...

kamo·2w ago
Docskamo-internal

Stop the plan instructing the money-path bug it was corrected on

Task 8 Step 4 still told the reader to key update/cancel/detach/del with "the current intent in the key". That is the Critical defect the final review reversed:...

kamo·2w ago
Featurekamo-internal

The tab title counts everything waiting, not just chat

The tab strip has room for one number, and 'chat and support only' stopped being what a member is waiting on once SMS, AI, missed calls and unreviewed reports e...

kamo·2w ago
Docskamo-internal

Answer the softphone spec's biggest open question

Verified live on the cluster: every FreePBX AOR is max_contacts=1 with remove_existing=yes. That value was set nowhere in any Kamo repo, which is why it had gon...

kamo·2w ago
Featurekamo-internal

Badge the AI option with unreviewed replies

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
Featurekamo-internal

A total on the phone icon, the breakdown in the menu

This icon carried no badge at all, so a missed call while the softphone was closed reached the member nowhere. Opening the phone clears the missed count.

kamo·2w ago
Featurekamo-internal

A total on the icon, the breakdown in the menu

pendingCount was the whole badge, so unreviewed bug reports and webinars booked on somebody's behalf had no way to reach anyone. Opening the webinar row stamps ...

kamo·2w ago
Refactorkamo-internal

The settings tab opens the calendar's editor

Sharing the day picker was the half-measure. It left two forms that still had to agree with each other about recurrence, times, effective range, note, save sema...

kamo·2w ago
Featurekamo-internal

The chat badge counts chats

It was silently chat plus support, so a ticket lit the chat bell and nothing distinguished the two. Support has its own icon now; social joins chat, because a s...

kamo·2w ago
Featurekamo-internal

Let a dropdown row carry its own count

The icon shows the sum and the rows show the breakdown — the point of splitting the indicators is seeing WHICH thing wants you without opening anything.

kamo·2w ago
Featurekamo-internal

Thump on arrival, with the glow dissipating outward

Its own layer inside .hex-scale: that element already animates transform for the hover grow, and two animations on one element do not compose — the second repla...

kamo·2w ago
Featurekamo-internal

One context for the four indicators' counts

Composes what exists and owns the three that had no home: unreviewed bug reports, unreviewed webinars, and the phone's missed calls and voicemails. The 60s for...

kamo·2w ago
Docskamo-internal

Mark the softphone guardrails plan executed

Real commit SHAs in place of the placeholder, and 47 steps ticked. A finished plan showing all-unchecked boxes misreads as abandoned work.

kamo·2w ago
Performancekamo-internal

A checkbox click should not re-render the folder sidebar

Six call sites read the email store with a bare `useEmailStore()`. In zustand that subscribes to the WHOLE store, so any change anywhere in it re-renders the co...

kamo·2w ago
Featurekamo-internal

The drop beacon reports which path ICE actually chose

The beacon shipped iceCandidateType as a permanently-null field. That is worse than omitting it: it makes the telemetry look more informative than it is, and th...

kamo·2w ago
Performancekamo-internal

Memoize the app-wide unread value, fix a self-retriggering effect

UnreadContext published a fourteen-member object literal as its context value, so React saw the context change on every render of the provider and woke every co...

kamo·2w ago
Performancekamo-internal

Stop polling for badges nobody is looking at, and stop waking every consumer

Two always-mounted providers ran a one-minute poll with no visibility gate. LegalPackageCount had none at all; TrainingPendingCount had a visibilitychange re-re...

kamo·2w ago
Performancekamo-internal

A phone-less org should not open a call socket

The softphone opened its SockJS/STOMP connection to media.<domain> unconditionally at boot. getCapabilities() is awaited a few lines above and is the backend's ...

kamo·2w ago
Featurekamo-internal

One day picker, shared by the calendar and the settings tab

The two surfaces had each grown their own answer to "which days?". The settings tab put Workweek Days, Weekend Days and Every Day behind a dropdown; the calenda...

kamo·2w ago
Performancekamo-internal

Stop re-merging the whole catalogue on every request

getRequestConfig runs per request, and for any non-English member it called mergeWithFallback over the entire 23,252-key catalogue every time — rebuilding a res...

kamo·2w ago
Featurekamo-internal

Badge a minimized window with its server unread count

The one component that sees both the window list and the unread maps — the engine knows nothing about conversations and the unread context knows nothing about w...

kamo·2w ago
Featurekamo-internal

Set an absolute unread count from the server

Replaces hexhead:incoming, which nothing ever dispatched. Its +1 would have counted a re-delivered snapshot as a new message, and its spawn-if-missing branch wo...

kamo·2w ago
Featurekamo-internal

Messages and calls, on the existing timeline component

CommunicationsTimeline and EmailEntry take an optional endpointBase and keep the lead path as the default, so every existing call site is byte-for- does not car...

kamo·2w ago
Featurekamo-internal

Stop losing calls to session expiry, teardown and stale devices

Four guardrails that share two files, so they share a commit. A live call now counts as session activity. ClientActivityTracker equated presence with input eve...

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
Performancekamo-internal

One arriving message should not re-render the whole history

Batch 5 of the client-side performance audit. MessageList maps every loaded message to a MessageBubble, and MessageBubble was not memoized. With 300 messages o...

kamo·2w ago
Performancekamo-internal

Take AG Grid's 187 KB of CSS off the critical path of every route

Batch 4 of the client-side performance audit, and the last of the big ones. app/globals.css opened with two @imports of ag-grid's stylesheets, and the root lay...

kamo·2w ago
Featurekamo-internal

SMS and AI counts, and a per-surface split

One MediaService snapshot covers three surfaces that belong on two different nav indicators, so the totals are separated from the server's declared sessionType ...

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
Performancekamo-internal

Stop sending the whole message catalogue to the sign-in handoff

Batch 3 of the client-side performance audit. The root layout passed every message to NextIntlClientProvider on every route. The catalogue is 1.05 MB compact —...

kamo·2w ago
Featurekamo-internal

Confirm before a refresh takes a live call

The SIP session lives in the document and nothing on the server holds a handle to it, so a reload ends the call outright — with no BYE, leaving the far end on s...

kamo·2w ago
Featurekamo-internal

Rebuild the availability editor around the day it describes

The editor was a stack of form rows that never showed what it was making. It now opens with the thing itself: a 24-hour rail with the block painted on it, in th...

kamo·2w ago
Performancekamo-internal

Split the tool windows out of the shell, stop the idle timer storm

Batch 2 of the client-side performance audit. As with batch 1, nothing a member can see or do changes. The tool registry imported all ten tool windows eagerly,...

kamo·2w ago
Featurekamo-internal

One address for a conversation on any of five surfaces

chat/support/social share the chat: namespace because they share one unread snapshot; SMS and AI get their own, because a VoipConversation UUID and a media sess...

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
Featurekamo-internal

Routes for the notification spine's counts and mark-reads

The PUT routes answer 204 and must not call .json() on it — that turns a successful mark-read into a 500.

kamo·2w ago
Featurekamo-internal

Set up RingCentral with a JWT, and assign members their own number

Three screens, one change. The phone server's overview tab replaces "Connect with RingCentral" with the credential form the JWT flow actually needs — client id...

kamo·2w ago
Docskamo-internal

Implementation plans for the softphone line window

Two plans, because the spec covers two subsystems and the first ships working software on its own. The guardrails plan is seven tasks that need no new browsing...

kamo·2w ago
Chorekamo-internal

@kamo/tool-core 0.1.2

Brings raisedBy: 'incoming' and the quietRaise event, so an arriving message can be absorbed by a minimized window's hexhead instead of re-opening it.

kamo·2w ago
Performancekamo-internal

Stop shipping the shell code no route can reach

Batch 1 of the client-side performance audit. Every change is behaviour-preserving; nothing a member can see or do is different afterwards. I18nProviders impor...

kamo·2w ago
Docskamo-internal

Design the softphone line window

A call cannot be moved into a window after it starts — an RTCPeerConnection and its MediaStream are not transferable between browsing contexts, and there is no ...

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