KamoCRM

Live Change Log

Every feature, fix and improvement, posted as it ships. Nothing is held back for a launch.

18,392
Total Changes
6,527
Features
5,537
Fixes
30
Projects
Filter by project
All Projects18,392AIService276APIService177BillingService161ConversionService117DaemonService146DocsService240ESigService93EmailService619InitializerService344KBService162KlusterServices769MCPGatewayService277MediaService620RAGService79SecurityService1,995TranslateService62VOIPService265VectorService11kamo-apps26kamo-asterisk-support28kamo-capcha17kamo-capcha-widget4kamo-internal8,692kamo-login342kamo-marketing642kamo-nowww20kamo-register213kamo-shared-library1,824kamo-signer-monorepo57kamolos114
Filter by type
All TypesBuild23CI525Chore794Docs3,286Feature6,527Fix5,537Other1,001Performance174Refactor281Revert23Style45Test175Upgrade1
September 17, 2026
FixMediaService

Refuse webhook posts for Discord connections, which only ever receive DMs over the Gateway

Discord DMs reach MediaService only through DiscordGatewayManager's WebSocket, which publishes straight to social.inbound.raw. But every social connection has a...

Kamo·1mo ago
September 16, 2026
FixMediaService

Rebuild so queue consumers self-heal their stale durables

social-inbound-consumer and marketing-conversion-consumer predate their deliver groups and live on SOCIAL_MESSAGES / MARKETING_EVENTS, which the shared NATS rec...

Kamo·1mo ago
OtherMediaService

Liveness probe on /actuator/health/liveness, not the DB-aware aggregate

The aggregate /actuator/health includes the DataSource indicator, so restarting the database failed liveness on every pod at once and restarted the whole platfo...

Kamo·1mo ago
OtherMediaService

Release idle Hikari connections now that YSQL pooling is shared

The connection manager no longer pins sessions **************** so idle app connections no longer each hold a database backend. Keep the pool maximum, but stop ...

Kamo·1mo ago
September 13, 2026
FeatureMediaService

Blind-copy the Additionally Notified team members on presenter emails

GET/PUT /api/webinar/notify-members (MANAGE_SUPPORT) read and replace an organization's Additionally Notified list; every id must be a team member of that organ...

Kamo·1mo ago
FixMediaService

Accept OCI image indexes when resolving the built digest [skip ci]

The images are pushed as OCI image indexes, so asking the registry for a single image manifest only answered 404, the digest came back empty and the check faile...

Kamo·1mo ago
FixMediaService

Deliver booking, cancellation and reminder emails

Every webinar letter posted to EmailService's /api/email/send, a member-session mailbox endpoint, so each one failed silently; the public booking path sent noth...

Kamo·1mo ago
FixMediaService

Restart when a same-commit rebuild leaves pods on the old digest [skip ci]

The rollout step tried to detect a same-commit rebuild by comparing the Deployment's image reference before and after `set image`. "Apply manifests" has already...

Kamo·1mo ago
September 12, 2026
FeatureMediaService

Relay org change events to /topic/rt/org/{orgId}/{domain}

Writers publish rt.org.{orgId}.{domain} on core NATS after a successful change; every pod relays it to the org's topic so open screens refetch instead of loadin...

Kamo·2mo ago
FixMediaService

The desk is never a client of itself

Sage and Erik both hold EXEC2EXEC_ACCESS, and each owns organizations of their own. Signed into one, the owner arm of Exec2ExecEligibility gave each a "client" ...

Kamo·2mo ago
September 11, 2026
FeatureMediaService

The roster no longer names a voided organization

An organization voided from Platform -> Configuration -> Organizations (orgs.is_active = FALSE) does not exist anywhere but the console's Void tab. findOwnedOrg...

Kamo·2mo ago
FeatureMediaService

The faces answer says how many people are in the conversation

GET **************** now carries `participants`: the console puts a face beside each message only when three or more people are in a conversation, since between...

Kamo·2mo ago
FeatureMediaService

A face for every message in every chat window

GET **************** answers, for one conversation, the photo to draw beside each message: everybody on it now AND everybody who ever wrote in it (a roster forg...

Kamo·2mo ago
FeatureMediaService

A meeting link in the conversation, always on the platform's Kamo Meet

POST **************** lets either side of an Exec2Exec conversation add a meeting link, behind the same gate as sending a message. The meeting is created as the...

Kamo·2mo ago
FeatureMediaService

Faces on the desk — a client's photo, last sign-in and presence

The desk's roster now carries, for every client, their own photo (users.avatar_id, built on the operator's live theme host — the only one their console loads im...

Kamo·2mo ago
FeatureMediaService

A conversation reaches the phone

A message on an Exec2Exec line now goes to the recipients' phones as well as their consoles: the customer's phone when KamoCRM replies, every desk member's phon...

Kamo·2mo ago
September 10, 2026
FixMediaService

Chat and bug emails link to the console the recipient can reach

ChatEmailNoticeService named the recipient org's first domain whatever its state. The reported case: Exec2Exec letters to makeitpopsigns.com, sent before its DN...

Kamo·2mo ago
FeatureMediaService

The desk's count of client messages not yet viewed

GET **************** returns how many messages from clients this EXEC2EXEC_ACCESS holder has not viewed, across every conversation, and each roster row carries ...

Kamo·2mo ago
FeatureMediaService

Seat the whole desk on every chat, show who is on it, close the chat feeds

- Standing membership: every explicit EXEC2EXEC_ACCESS holder sits on every Exec2Exec conversation. Exec2ExecDeskReconciler seats and unseats from the grant...

Kamo·2mo ago
TestMediaService

Parse the desk's audience query at test time

findHolderMemberIdsOf lives in the shared library, so nothing in this package parsed it — and a mistyped path there crash-loops MediaService at boot, every endp...

Kamo·2mo ago
FixMediaService

A customer's message reaches the desk, not only the thread

An executive wrote into their Exec2Exec chat and nobody at KamoCRM heard. announce() told the session's own members, and an operator is only a member of a conve...

Kamo·2mo ago
FeatureMediaService

Serve the executive channel

A conversation with its own audience rule and no ticket machinery, following SystemBug's shape: its own package, its own controller, its own visibility, and Med...

Kamo·2mo ago
FixMediaService

An announce that throws must not roll back the buy-in

`announceToConversation` runs INSIDE the transaction that seats the host and charges them — unlike `announceTable`, which the controller calls after the fact. T...

Kamo·2mo ago
FixMediaService

Colleagues in the invite list, and an invitation from a chat that arrives

Two reported defects, both in who a table can reach. **The invite dialog offered accounts.** `invitableFor` read `members.findByOrganizationId`, and an organiz...

Kamo·2mo ago
September 9, 2026
FeatureMediaService

No empty tables, numbered tables, and one table per member

Four rules, all of them things a member reported seeing broken. EMPTY TABLES. A lobby showed three tables while one game was being played. Two had no seats at ...

Kamo·2mo ago
TestMediaService

Prove the endpoints actually CONSULT the entitlement, not just that it works

GamesEntitlementTest proves the gate answers correctly. Nothing proved the three controllers ask it — and that distinction is the entire defect this change set ...

Kamo·2mo ago
FixMediaService

A hand shown on the flop is five cards, and gets a name

`showHand` named a hand only with a full five-card board, while `finishHand` scores one from three — and two hole cards plus a three-card flop ARE a five-card h...

Kamo·2mo ago
FeatureMediaService

Show the hand nobody made you show

A pot taken with everybody folding is the one hand at the table whose contents only its owner knows, and there was no way to say what it was. Showing a bluff is...

Kamo·2mo ago
FixMediaService

A raiser could raise again after being called

One character, and it decided pots. `canRaise` is exactly `!actedThisStreet`, so that boolean is the whole of "may you raise". The service reconstructs it from...

Kamo·2mo ago
FeatureMediaService

Opening a table buys you into it, and the last one out closes it

Both ends of a table's life allowed the same thing: a table with nobody at it. OPENING ONE COST NOTHING AND SEATED NOBODY. A host could put a table in front of...

Kamo·2mo ago
September 8, 2026
FeatureMediaService

The plies, and how long each one took

Two things the move panel needs, neither of them on the published frame. `GET /games/{id}/moves` hands over every ply in order. It is a separate read rather th...

Kamo·2mo ago
FixMediaService

Chess, Hold'em and the wallet never asked whether the org has the app

The companion to the kamo-internal commit, and the half that actually mattered. The browser gate was cosmetic: ChessController, HoldemController and CheddarWall...

Kamo·2mo ago
FixMediaService

A re-let chair was handed the previous occupant's mucked hand

Two defects the linger made reachable, found by reviewing the commit that added it. THE REDACTION. viewFor matched hand-seat rows to seats by seat NUMBER alone...

Kamo·2mo ago
FixMediaService

The felt never saw a showdown, and a fold-out pot was counted twice

Two defects that were invisible for the same reason, and the data a poker table needs to present a result at all. THE SHOWDOWN NOBODY COULD WATCH. finishHand()...

Kamo·2mo ago
FixMediaService

New table 500'd on a ternary that unboxed a null button

Pressing New table answered 500: NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because the return value of HoldemTable.getButtonSeat()...

Kamo·2mo ago
PerformanceMediaService

Stop rebuilding the wallet and the guest list on every check

`viewFor` fetched the recipient's Cheddar balance and queried the whole organization's member list — both per RECIPIENT, on every published frame. At a full tab...

Kamo·2mo ago
FixMediaService

The clock could never have fired, and a full all-in re-opened nothing

Two defects found by reading the code back, neither of which any test could see. ## The clock would have thrown on its first tick `HoldemDeadlineSweep` carrie...

Kamo·2mo ago
FixMediaService

Spring Data does not register a NESTED repository interface

MediaService crash-looped on the Hold'em image. The six repositories shipped as nested interfaces inside one `HoldemRepositories` class — one file rather than s...

Kamo·2mo ago
FeatureMediaService

A server-authoritative Texas Hold'em, and the Cheddar wallet seam

Up to ten players a table, started from any conversation, with anyone else in the organization invitable into it. Every rule lives here; the browser owns none. ...

Kamo·2mo ago
FeatureMediaService

The chat entry is a door to the pair's board, and you can ask them back

Two colleagues who have played once have a board together for good. So the chat entry stops offering to introduce them: `gameWith` answers with the SHARED game ...

Kamo·2mo ago
RefactorMediaService

The frame stops carrying an archive nothing renders

The window's notation panel is gone — the captured pieces have that space — so `moveList` and `fenHistory` came off the published view. `fenHistory` alone was s...

Kamo·2mo 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·2mo 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·2mo 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·2mo 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·2mo 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·2mo 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·2mo ago
September 7, 2026
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·2mo 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·2mo ago
FeatureMediaService

An approval settles the member's achievement

Approving a submission now tells SecurityService to recount that member's SPREAD_THE_WORD standing, so the trophy lands in the same second as the decision rathe...

Kamo·2mo 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