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
Featurekamo-shared-library

Count DISTINCT events across a rollup's owners

A phone number can be a contact point on more than one owner at once, and two leads on one account sharing one is the ORDINARY case — they are commonly the same...

Kamo·2w ago
Featurekamo-internal

Gate the line window per member, and show which mode you are in

The rollout control. Default off, opt-in per member from Phone Settings, nested under the VOIP switch because it means nothing for a member with no line. One h...

kamo·2w ago
FeatureVOIPService

Read and write the line-window gate

GET surfaces lineWindowEnabled; PUT accepts it as a nullable Boolean so that absent means "not mentioned" and preserves the stored value. Every existing caller ...

Kamo·2w ago
Featurekamo-shared-library

Map LINE_WINDOW_ENABLED on MemberVoipConfig

The per-member gate for the dedicated softphone line window. Version pin stays at 1.6.0 — adding a field needs no bump, and a split pin would break CI for every...

Kamo·2w ago
FeatureInitializerService

DDL for the per-member line-window gate

Adds **************** defaulting to false. A column rather than a feature flag because there is no flag system here and MemberCapabilities is a closed, fail-cl...

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
FeatureKlusterServices

Bounce a bare visit to the Kamo login, and end the session on tab close

Closing the KamoDesktop tab left a live session sitting on the machine. Guacamole keeps its auth token in localStorage (GUAC_AUTH), which survives closing the t...

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

Badge the AI option with unreviewed replies

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
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
FeatureSecurityService

An account-level communications timeline

The level most people mean when they say "this customer's calls". The spine is already keyed on an owner, so the account endpoint is the same merged, component ...

Kamo·2w ago
Featurekamo-shared-library

Let an account roll up its leads' communications

Several leads commonly hang off one account precisely because they are the same person enquiring twice, and each of their calls was matched to whichever lead he...

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
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
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
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
FeatureSecurityService

A patient's calls, texts and email — on the platform's own spine

Not a second timeline. LeadCommunicationsService now takes a CommsSubject and the lead overload delegates to it, so /leads keeps its exact behaviour drift. A pa...

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
FeatureInitializerService

Widen the comms spine to an owner, in the order that keeps it safe

LEAD_CONTACT_POINTS and LEAD_COMMUNICATIONS gain the document manager's (assoc_type, assoc_object_id) pair so an account, a patient or a commerce record can own...

Kamo·2w ago
Featurekamo-shared-library

Key the communications spine on an owner, not a lead

The spine was built lead-shaped — LEAD_CONTACT_POINTS.LEAD_UID, LEAD_COMMUNICATIONS.LEAD_UID — and the association it actually needs is broader. An account owns...

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
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
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
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-login

The workspace picker shows each org's logo

Two letters standing in for a logo was a workaround for the response not carrying one. It does now, resolved server-side from the folder the org's theme was pro...

Kamo·2w ago
FeatureSecurityService

The sign-in response carries each workspace's logo

The picker drew two letters per row because the response held a name and an alias and no image. A list of workspaces is read by mark long before it is read by n...

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
FeatureVOIPService

Authenticate RingCentral with a JWT, per phone server

RingCentral was the last provider whose credentials came from a Kamo-wide registration plus two browser consent hops — one for the org, one per member. Both are...

Kamo·2w ago
FeatureInitializerService

Add the RingCentral JWT and direct-number columns

Order 0, because the shared-library entities map both columns from the moment this build starts: every runner that loads a PhoneExtension or a MemberVoipOAuthTo...

Kamo·2w ago
Featurekamo-shared-library

Give a member a RingCentral JWT and an extension its own number

Two columns, both nullable so nothing is backfilled and no existing row changes meaning. **************** holds a member's own RingCentral JWT. RingCentral onl...

Kamo·2w ago
FeatureVOIPService

Missed-call and voicemail counts for the softphone indicator

Reported as separate lines rather than a total: the icon shows the sum and its dropdown shows the breakdown, so a pre-summed wire value would make the dropdown ...

Kamo·2w ago
August 25, 2026
FeatureAIService

Unreviewed-response counts and a mark-read

Keyed by session guid, which is what a tool window carries. Not audited as a disclosure: it returns counts and never a word of a transcript, and recording a bad...

Kamo·2w ago
FeatureVOIPService

An unread snapshot, a mark-read, and a live frame

Its own NATS subject rather than the existing message one: the browser's handler for /topic/voip/message/ plays the arrival sound and opens a tool window for ev...

Kamo·2w ago
Featurekamo-internal

Availability for presenters only, and a way to understand it

Three things, all about the same layer. WHO SEES IT. The availability toggle was shown to everybody. Declaring hours is only meaningful for somebody a webinar ...

kamo·2w ago
FeatureBillingService

Make a replayed Stripe event a no-op

Adds BillingWebhookEventClaimService on its own bean, with REQUIRES_NEW on every method, and wires it into processEvent ahead of the dispatch switch. A losing c...

Kamo·2w ago
FeatureMediaService

GET /api/webinar/presenting

The webinar types the CALLER is a presenter for. The calendar asks this before it offers an availability layer at all: hours declared by a member no type lists ...

Kamo·2w ago
Featurekamo-shared-library

Find the types a member presents, and parse-guard the queries

The calendar needs to answer one question before it offers an availability layer: is declaring hours meaningful for this person? Nobody is a presenter by defaul...

Kamo·2w ago
FeatureMediaService

Tell a member about a webinar booked on their behalf

Not gated on a webinar right, unlike the ticket counters: the case this exists for is one where the member took no action at all, so requiring the right to requ...

Kamo·2w ago
Featurekamo-internal

The new organization opens in its own tab

Creating one signed THIS tab into it, so a member who created an organization on someone's behalf was silently moved out of the one they were working in — and h...

kamo·2w ago
FeatureMediaService

Count unreviewed bug reports for platform admins

Zero for an ungated caller rather than a 403: the nav polls this on every page load for every member, and an error they must routinely swallow is how real error...

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