KamoCRM

Live Change Log

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

15,120
Total Changes
5,169
Features
4,935
Fixes
30
Projects
Filter by project
All Projects15,120AIService197APIService161BillingService143ConversionService107DaemonService129DocsService215ESigService88EmailService518InitializerService318KBService105KlusterServices697MCPGatewayService85MediaService546RAGService71SecurityService1,658TranslateService55VOIPService205VectorService11kamo-apps25kamo-asterisk-support24kamo-capcha17kamo-capcha-widget4kamo-internal6,937kamo-login330kamo-marketing625kamo-nowww20kamo-register213kamo-shared-library1,455kamo-signer-monorepo53kamolos108
Filter by type
All TypesBuild11CI523Chore738Docs2,167Feature5,169Fix4,935Other986Performance157Refactor274Revert23Style42Test94Upgrade1
September 10, 2026
FixKlusterServices

Delete identity headers at the edge before header-trusting backends

Add a strip-identity-headers Middleware. A customRequestHeaders value of "" deletes the header, so X-Org-Id, X-Member-Id, X-User-Id, X-God-Mode-Active, X-Member...

Kamo·2w ago
Fixkamo-internal

Stop a revoked executive's window; raise only chats waiting on the desk

- A MEMBER_REMOVED naming the viewer unsubscribes the transcript, empties it, disables the composer and says why. Revoking Exec2Exec Access used to leave th...

Kamo·2w ago
Fixkamo-marketing

Draw the search icon down from the full-size mark instead of doubling the small one

The 192px icon Google lists was the 96px export with every pixel doubled. It is now downscaled from the 820px master, so its edges are drawn rather than stepped...

Kamo·2w ago
Fixkamo-marketing

Give Google a canonical it can read, and stop redirects outvoting it

Search Console began excluding pages as "Duplicate without user-selected canonical", "Duplicate, Google chose different canonical than user" and "Alternate page...

Kamo·2w ago
Fixkamo-marketing

Publish prices search engines accept, and the ones the page actually shows

Search Console's product snippet report flagged "Invalid price format" on both `price` and `priceSpecification.price`. The cause was Enterprise going out as "pr...

Kamo·2w ago
Fixkamo-internal

Raise the conversation when a customer writes, and on a reply

An executive's message reached nobody at KamoCRM: nothing on the console read an Exec2Exec frame. Exec2ExecDeskOpener now raises that customer's window — named,...

Kamo·2w 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·2w 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·2w ago
Fixkamo-internal

The nudge the inviter could never send, and a chat invite that rejoins

**Nudge.** The rail hid the button unless it was the opponent's turn, which reads as a rule about fairness and is a rule about nothing — the server has never ha...

Kamo·2w ago
Fixkamo-internal

One "on" colour, and a retry that does not cascade

Two things left over from the categories table. The allow swatch was tinted by whether the setting is locked — primary for locked, a green for unlocked. The lo...

Kamo·2w 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·2w ago
September 9, 2026
Fixkamo-signer-monorepo

Publish the packages from CI, with a token that can actually publish

The secret exists now — a Forgejo token scoped to `write:package`, added to this repository — so `publish_packages` does the publishing instead of a person doin...

Kamo·2w ago
FixESigService

The certificate must not claim a disclosure nobody was shown

Verified against a real completed envelope on the cluster, and the closing paragraph read "Each signer was shown, and accepted, the consumer disclosure required...

Kamo·2w ago
FixESigService

Stop asserting an eIDAS assurance tier this product does not implement

`buildSession` reported `stepUpRequired ? "AES" : "SES"`, so requiring a one-time passcode made every signing session assert an ADVANCED electronic signature — ...

Kamo·2w ago
Fixkamo-signer-monorepo

Publish the packages from a job of their own, and never nest a second pdf.js

The publish steps sat inside `build`, so run 12014 failed and took the image with it — and `pnpm install --frozen-lockfile` was clean locally, which is the tell...

Kamo·2w ago
Fixkamo-internal

The envelope dashboard could not tell "not emailed" from "not opened"

The warning naming an undelivered invitation lives in the send response, so it is gone the moment the dialog closes. After that the dashboard is all there is — ...

Kamo·2w ago
FixDocsService

A rename answered with no Url skips Docs's rename callback

Docs shares one client-side callback between RenameFile and Save As, and **************** skips its whole body — the File_Rename event the embedding page listen...

Kamo·2w ago
FixDocsService

Losing the race to store identical content is not a failed save

The look-up before the ImgDat insert is not a lock, and kamowsdocs runs two replicas behind one gateway — two documents whose bytes are identical (two members c...

Kamo·2w ago
FixESigService

Every e-signature email was a silent 403, and a Signature Date field

**No e-sign email had been leaving the cluster.** EmailService gates /api/email/templates/send on the cluster-wide internal-auth secret (mlos-internal-auth -> I...

Kamo·2w ago
FixDocsService

A Save As that changes format is not the source document's type

uploadDocument refuses an upload whose claimed MIME type disagrees with what it detects from the bytes, and saveAsNewDocument claimed the type of the row it was...

Kamo·2w ago
FixDocsService

A Docs save could not store bytes the platform already held

Saving a document twice, and renaming one, both ended in "Document cannot be saved, please check your permissions" — and after five retries Docs gave up and dis...

Kamo·2w ago
Fixkamo-marketing

The offer countdown could not hydrate, so React threw the banner away on every load

The homepage has been throwing React #418 — "the server rendered text didn't match the client" — on every load, in production as well as locally. The mismatch i...

Kamo·2w ago
FixSecurityService

An org without the app must not accrue achievements either

The award gate asked for VIEW_ACHIEVEMENTS and stopped there. Rights are not entitlement-filtered, so that right stays granted — and keeps answering true — in a...

Kamo·2w ago
Fixkamo-internal

The particles ran at the monitor's speed, and the chips were unreadable on two denominations

Two deferred things finished, both measured rather than eyeballed. THE PARTICLE LOOP IS TIME-STEPPED. `PixelParticles` advanced physics once per FRAME — every ...

Kamo·2w ago
Fixkamo-internal

Four things about the celebration only a browser could say

Measured in Chrome against the real component, not reasoned about. The headline was sized at a flat 13cqw, which is right for a number and wrong for a word: CH...

Kamo·2w ago
FixSecurityService

Refuse to award a member whose security type excludes it

AchievementController checks VIEW_ACHIEVEMENTS on all four of its endpoints, and that read like the rule being enforced. It was not: it is the rule enforced on ...

Kamo·2w ago
Fixkamo-shared-library

Rank only members whose security type includes achievements

The leaderboard grouped every member holding an achievement row, so a member whose role denies VIEW_ACHIEVEMENTS — who cannot open the page, the trophy or the w...

Kamo·2w ago
FixBillingService

The same-commit-rebuild guard could never fire, and the digest check failed open

Both protections against a deploy that deploys nothing were inert, so the pipeline reported two green jobs while the pods stayed on the previous digest. That is...

Kamo·2w ago
FixBillingService

A catalog row naming an app this build cannot resolve is not for sale

ServiceTypeConverter stopped throwing on an unknown app id and started resolving it to null, which is what a service must do — the enum ships inside each jar wh...

Kamo·2w ago
Fixkamo-internal

The opening effect's cancel guards were guarding nothing

`cancelled` was declared, read seven times, and never assigned — the effect returned no cleanup — so every `if (!cancelled)` in the load that opens a window was...

Kamo·2w ago
Fixkamo-internal

Early Bird and Twenty Doors read the laptop's clock, not the member's

`check-server-timestamps` was red on main: `rememberToday` bucketed the day with `new **************** which is the BROWSER's zone. The guard exists because tha...

Kamo·2w ago
Fixkamo-internal

The chips were on the table, not on the felt

A member reported that the player opposite them had chips half off the table. Measured in a browser: NINE of the ten piles were off the cloth. The reader's own ...

Kamo·2w 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·2w 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·2w ago
Fixkamo-internal

The computer's reply was silent against the quickest level

The four move cues carried an 80ms throttle. Each is raised once per published frame the board could prove it understood, and a frame is a move — so there was n...

Kamo·2w ago
Fixkamo-internal

Six the adversarial review upheld

Ten reviewers, three skeptics each. Twelve findings survived; most of the rest were refuted because they had already been fixed. Of the twelve, six were still r...

Kamo·2w ago
September 8, 2026
Fixkamo-internal

What an adversarial read of the whole thing found

Ten reviewers over the change, three skeptics per finding. These are the ones that survived, and most of them were in the wiring rather than in the parts that h...

Kamo·2w ago
Fixkamo-internal

Looking at an organization is not being in it

A workspace signed in to KamoCRM repainted itself as BluEleven - logo, colours, favicon, tab title, and the feature set driving the navigation - while every rec...

kamo·2w ago
Fixkamo-internal

Three things a browser said and jsdom could not

The panels were built and tested entirely in jsdom, which can say a label is present and cannot say how wide it ended up. Rendering them at the widths ChessTool...

Kamo·2w ago
Fixkamo-internal

The chips in the middle are worth what the number says

A settled pot draws the CONTESTED total now, not everything that went in. `hand.pot` keeps every chip that entered the hand; `totalPot` reports what was played...

Kamo·2w 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·2w ago
Fixkamo-internal

The Games icon appeared for organizations that have no Games app

Reported on harmonyhomeloans, whose owner saw the icon in the top bar for an app their organization does not have, cannot enable in Apps & Features, and whose c...

Kamo·2w ago
Fixkamo-internal

The reveal turned your own cards face down, and four more from review

An adversarial review of the choreography commit, verified against the code. Six defects, two of which only a browser could have shown. YOUR OWN CARDS. The sho...

Kamo·2w 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·2w ago
Fixkamo-internal

The compact rail clipped a payout flag off the top of the window

The rail reserves a fixed strip above the pucks so a label does not make the strip taller and move the board — but it reserved room for ONE row and the showdown...

Kamo·2w 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·2w ago
Fixkamo-internal

The table list had nothing between it and the lobby header

The lobby's scroll container carried `px` and `pb` and no `pt` at all, so the first table's top border sat exactly on the container's edge, flush against the he...

Kamo·2w 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·2w ago
FixSecurityService

The same-commit-rebuild guard could never fire, so every dispatch failed

Rebuilding this service without a commit of its own — a workflow_dispatch, a re-run, or a kamo-shared-library change it must pick up — has been failing at deplo...

Kamo·2w ago
Fixkamo-internal

The wedge is yellow, and it stops depending on the tenant's brand

`/icon/cheddar.svg` was five paths of pure #000000 — a black cheese wedge, which on the nav bar's dark ground was very nearly nothing at all. It is a real chedd...

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