Live Change Log

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

17,967
Total Changes
4,633
Features
4,555
Fixes
32
Projects
Filter by project
All Projects17,967AIService112APIService138BillingService133ConversionService85DaemonService107DocsService189ESigService78EmailService384InitializerService300KBService74KlusterServices547MCPGatewayService43MediaService462RAGService61SecurityService1,526TranslateService45VOIPService173VectorService8kamo-analytics6,157kamo-apps18kamo-asterisk-support19kamo-capcha17kamo-capcha-widget4kamo-internal4,589kamo-login319kamo-marketing588kamo-meet90kamo-nowww18kamo-register206kamo-shared-library1,325kamo-signer-monorepo50kamolos102
Filter by type
All TypesBuild24CI523Chore670Docs228Feature4,633Fix4,555Other6,781Performance136Refactor274Revert23Style48Test71Upgrade1
September 8, 2026
Fixkamo-internal

The two mode plates were clipped by their own scroller, at every size

The selected plate lifts 2px and carries a 1px ring, and it is the first child of an `overflow-y: auto` column — so its top border sat 3px above the clip edge a...

Kamo·4d ago
FixMediaService

Map.of throws on a null value, so "no game yet" was a 500

`gameWith` answered with `Map.of("game", …)`, and `Map.of` rejects a null value with a NullPointerException. So the one endpoint whose documented normal answer ...

Kamo·4d ago
Featurekamo-internal

Starting a game from a chat asks once, then plays — it never asks who

Clicking chess in a conversation opened the new-game pane and asked whether you wanted to play the computer or a person, then made you pick the person. The pers...

Kamo·4d ago
Featurekamo-internal

The opening pane, rebuilt around a game instead of an icon

The pane you get when chess has no opponent yet was the SaaS-card kit: an icon in a rounded square, two tab-cards, two segmented rows, a button. It looked like ...

Kamo·4d ago
FeatureMediaService

The inviter plays immediately, and the invitee is told when it is their turn

An invitation used to produce a board the inviter could look at and not touch, waiting on somebody who might be away from their desk. Now the game is running fr...

Kamo·4d ago
Otherkamo-shared-library

Merge branch 'main' of ****************

Kamo·4d ago
Featurekamo-shared-library

An invited game starts running, and records whether it has been seen

Inviting somebody created a PENDING game nobody could touch, so the person who had just asked for a game sat in front of a board they were not allowed to use un...

Kamo·4d ago
Fixkamo-internal

The proxy could still be walked out of, because a dot is not encoded

The catch-all re-encodes each segment, and the comment claimed that meant it could only ever address the chess API. `encodeURIComponent('..')` is `'..'` — dots ...

Kamo·4d ago
Fixkamo-internal

The error test did not typecheck, and next build runs tsc

`await promise.catch((e: Error) => e)` does not give you an Error. The catch handler's return type unions with the promise's resolve type, so the result is `Che...

Kamo·4d ago
Otherkamo-internal

Merge branch 'main' of ****************

Kamo·4d ago
Fixkamo-internal

The BFF route that was never written, and an error that was a megabyte of HTML

Pressing Start game returned 1,529,239 bytes of markup. `/api/media/*` is not a proxied prefix — every path under it is a hand-written Next route and there is n...

Kamo·4d ago
FixMediaService

Let a refusal keep the sentence it was written with

The chess code refuses with reasons meant to be read — "not your turn", "this game is not in play", "illegal move". None of them reached anybody. `server.error....

Kamo·4d ago
Fixkamo-internal

AppType hid two live apps, and the guard could not see the place they were hidden

The Java app enum is mirrored into TypeScript twice, and only one of the two was guarded. AppType.ts — the mirror Organization's app getters actually read — had...

Kamo·4d ago
Fixkamo-shared-library

An app id an older build cannot name must not fail every feature read

ServiceType ships inside each service's jar while ORG_FEATURES is shared, so a newly added app is ALWAYS in the database before the older readers have been rebu...

Kamo·4d ago
Refactorkamo-internal

Drop aiThinking from the client mirror too

It was always false on the wire and nothing rendered it. Removed alongside the server field so the two shapes stay identical — a mirror that keeps a field the s...

Kamo·4d ago
RefactorMediaService

Drop a field that was always false and a statement that did nothing

`aiThinking` was on every published board and was never once true — the AI answers inside the request that provoked it, so the window that asked already knows i...

Kamo·4d ago
Otherkamo-internal

Stop the history fetch from deleting the text that just arrived

SmsThread loads its page and REPLACED the list with it. A message landing between the query executing and its response arriving was appended by the live subscri...

Kamo·4d ago
Fixkamo-internal

A black piece on the Kamo board was the colour of the square under it

Only a browser found this. The Kamo scheme derived its piece colours from `--color-primary` as well as its squares, and both mixed the same token into similar d...

Kamo·4d ago
OtherVOIPService

Put the stream in the config the pod actually reads

The previous commit set nats.jetstream.stream in **************** shipped, deployed — and the new pod still logged NATS stream 'CHAT_MESSAGES' already exis...

Kamo·4d ago
Chorekamo-internal

@kamo/chat-core 0.1.18, for the game-invite fields

The lockfile is edited by hand — four lines: the root range, and the version, resolved URL and integrity of the one package. `npm install --package-lock-only` r...

Kamo·4d ago
Otherkamo-internal

Carry an arriving text across the boundary the dock sits above

An inbound SMS never reached an open SMS window, and the reason was not the transport everyone went looking at. SmsMessageProvider was mounted in Authenticated...

Kamo·4d ago
OtherMediaService

Stop letting one bad boot deafen the VOIP relay for the pod's life

The relay subscribed once, from @PostConstruct, and never again. When VOIPService's voip.> stream did not exist — which it did not — both replicas logged exactl...

Kamo·4d ago
OtherVOIPService

Give voip.* a stream to live in, and stop lying about who sent the text

There was no VOIP_MESSAGES stream in NATS at all. Every `voip.*` publish answered 503 No Responders Available and both media pods logged, once, at boot: [V...

Kamo·4d ago
FeatureMediaService

A whole game of chess, server-authoritative, over NATS

The rules live in ONE place and it is this one. ChessEngine implements the whole ruleset — move generation, legality under pin and check, castling, en passant, ...

Kamo·4d ago
Featurekamo-shared-library

Games becomes a parent app, with Kamo Universe and Chess under it

GAMES was a category with exactly one thing behind it — the nav icon launched Kamo Universe directly, so the app and the thing inside it named the same click. C...

Kamo·4d ago
September 7, 2026
Fixkamo-internal

Dial the detail dialog's tel: through the shared normaliser

The dialog built `tel:${action.tel}` by hand because telHref() was not on main when it landed — it was in a concurrent branch, and importing it then would have ...

Kamo·4d ago
Fixkamo-internal

One formatter, and one dialable link, for every number on screen

Follow-on to the lead-view country-code fix, closing the places that still answered the same question their own way. `NumbersTab` kept a private US-only format...

Kamo·4d ago
Fixkamo-internal

Light the bell, and make a click mean something

Three defects behind one report: the browser tab alerted for an unread notification while the bell stayed dark, and clicking rows on /notifications went to the ...

Kamo·4d ago
Featurekamo-internal

Filter the bug and improvement reports by who filed them

Reuses /leads' Agent filter — the same field, the same picker, the same gesture — pointed at a different directory: everybody who has filed at least one report,...

Kamo·4d ago
Fixkamo-internal

Two more deadlines a background tab cannot meet

Swept the app for the failure the notification deck's repeat turned out to be: work whose correctness depends on a timer firing while nobody is looking. Chrome ...

Kamo·4d ago
FixSecurityService

A pane lock survives the editor alt-tabbing away

The client heartbeats its pane lock every 15s and the sweeper released any lock unheard from for 45s — three missed beats, which reads like a generous margin an...

Kamo·4d ago
FixMediaService

Stop writing "/" as the destination of a review notification

The Growth Hub has no screen of its own — kamo-internal's widgetRegistry says so where it decoders to give the widget an href: "the widget IS the feature". So t...

Kamo·4d ago
FixEmailService

A notification raised on the wrong pod reached nobody

The broker here is enableSimpleBroker — in-heap, per pod, no relay — and this deployment runs two replicas. MemberNotificationService published straight into it...

Kamo·4d ago
FeatureMediaService

A reporter filter, for platform team members only

The board is global — every organization sees every report — and what protects a customer is SystemBugIdentityPolicy withholding WHO filed a row. A control that...

Kamo·4d ago
Featurekamo-shared-library

Let the listing be narrowed to one reporter

Adds an optional reporterId predicate to findVisible (both halves) and to countGroupedByStatus, so the numbers beside the status menu keep promising what pickin...

Kamo·4d ago
FixEmailService

The last two durable consumers become queues, and contact sync reaches every pod

The mail relay was one of four NATS subscriptions on a plain durable consumer. A plain durable admits exactly ONE subscriber, so at two replicas the second is r...

Kamo·4d ago
Featurekamo-internal

The browser half of the fifty easter eggs

THE CLAIM ROUTE DID NOT EXIST. The Java endpoint has accepted CLIENT claims since the catalogue's first ones shipped, but nothing in Next forwarded to it and no...

Kamo·4d ago
Featurekamo-internal

An hourglass sprite for the Loitering track

The catalogue guard gives every TRACK a sprite no other track and no single action wears, so the ninth track needed its own 16x16. Drawn three times before it ...

Kamo·4d ago
FeatureSecurityService

Probes for the eleven derived easter eggs

Eleven of the fifty secrets are questions about durable data rather than about whether a member has SEEN something, so they are DERIVED and they backfill: a mem...

Kamo·4d ago
Featurekamo-shared-library

Fifty secret easter eggs, spread across the product

The catalogue was good at rewarding the parts of the product a member already uses and bad at getting them into the parts they do not. A prompt cannot fix that ...

Kamo·4d ago
FeatureSecurityService

Award Loitering from the session that is still open

The measure is the age of the *** the member is holding, so the session had to start carrying the instant it was minted — nothing anywhere recorded it, because ...

Kamo·4d ago
Featurekamo-shared-library

Loitering, nine levels of not leaving

A DERIVED track over the age of the session the member is holding right now, in minutes: 30, 45, 60, 90, 160, 360, 720, 1440, 2880. The first entry in DEDICATIO...

Kamo·4d ago
Fixkamo-internal

A bulk action announces the folder changed, like opening one message does

`email:folder-changed` is what the nav badge listens for while it is not being pushed a count — a socket that never came up, or one that came up and relays noth...

Kamo·5d ago
FixEmailService

A bulk mark-read announces itself, so the nav badge follows it

The single-message endpoints have always published the mailbox events that move the nav badge and reload the other tabs. The three batch endpoints — flags, move...

Kamo·5d ago
FixEmailService

Every pod relays the mailbox push, so the unread badge moves again

The browser's email relay bound a DURABLE NATS consumer named after the member ("email-ws-<id>"). A durable push consumer admits exactly one subscriber, so with...

Kamo·5d ago
Fixkamo-internal

The nav badge follows a message being read, instead of waiting for a reload

The badge treated the STOMP socket being UP as proof that counts were being pushed to it, and those are two different questions. EmailService relays the count f...

Kamo·5d ago
Fixkamo-internal

A lead outside the US lost its number's country code

The lead view read "+373 606208888" back as "606208888". `formatPhoneDisplay` chose between national and international form by comparing the number's calling co...

Kamo·5d ago
Fixkamo-internal

The repeating sound survives a tab nobody is looking at

"Repeat sound" saved correctly and did nothing audible. The deck beat the tone out with setInterval, and Chrome clamps timers in a page that has been hidden for...

Kamo·5d ago
Fixkamo-marketing

Let a local build reach the catalogue it already has the key for

`npm run build` on a laptop died prerendering /en/alternatives/gohighlevel with "Kamo seat prices unavailable", and `npm run dev` served a homepage with no pric...

Kamo·5d ago
Fixkamo-internal

The leaderboard called everyone on it a former member while it loaded

The board and the names come from two different places, and the names come second. The board is one request to SecurityService; the names are the shared member ...

Kamo·5d 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