KamoCRM

Live Change Log

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

18,751
Total Changes
6,756
Features
5,653
Fixes
30
Projects
Filter by project
All Projects18,751AIService286APIService179BillingService166ConversionService121DaemonService150DocsService275ESigService101EmailService646InitializerService349KBService162KlusterServices775MCPGatewayService278MediaService627RAGService79SecurityService2,035TranslateService62VOIPService266VectorService11kamo-apps29kamo-asterisk-support29kamo-capcha17kamo-capcha-widget4kamo-internal8,821kamo-login346kamo-marketing642kamo-nowww20kamo-register216kamo-shared-library1,873kamo-signer-monorepo71kamolos115
Filter by type
All TypesBuild23CI527Chore796Docs3,290Feature6,756Fix5,653Other1,001Performance174Refactor284Revert23Style45Test178Upgrade1
September 16, 2026
OtherSecurityService

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
FixSecurityService

Take kamo-meet and kamo-analytics off the public changelog

Both names leave changelog.public-projects. Every public read goes through that one list, so the marketing site's /changelog stops showing them everywhere at on...

Kamo·1mo ago
FeatureSecurityService

The Email Campaigns widget arrives on for everyone who can open the campaigns

EMAIL_CAMPAIGNS_WIDGET and its ADDED, OPTIONAL and MOVABLE policies seed from VIEW_BULK_EMAIL on the boot that introduces them, so the pane lands on the launchp...

Kamo·1mo ago
September 13, 2026
FeatureSecurityService

Lead opt-out panel passes personAsked to the ledger

The lead page's opt-out update takes an optional personAsked flag and hands it to the ledger, which now refuses to lift a person's own unsubscribe, complaint or...

Kamo·2mo ago
FeatureSecurityService

The organizations each member created, on the member lists

GET **************** and /team-members-contractors now carry createdOrgs per person: the names of the organizations they own (orgs.user_id_owner, set once by PO...

Kamo·2mo ago
FeatureSecurityService

An organization's and a member's own page transition

The page transition is now chosen at three levels, resolved member, then organization, then platform — for the choice of transition and, one transition at a tim...

Kamo·2mo ago
September 12, 2026
FeatureSecurityService

Tune each page transition, tile size and colour to start

GET and PUT /api/security/page-transition answer options for every catalogue id, normalised from PAGE_TRANSITION_OPTIONS: a missing, unreadable or out-of-range ...

Kamo·2mo ago
FeatureSecurityService

Every tab reads the page transition, and an operator chooses it

GET /api/security/page-transition answers any signed-in session, since every tab needs it to uncover a page; an unset or unknown value reads as TILE_DISSOLVE. T...

Kamo·2mo ago
FixSecurityService

The id resolver never hands a campaign an address the member can't read

Resolving lead ids read each address through the lead masking DTO and skipped only blank ones. Masking now obfuscates instead of blanking ("s*****@gmail.com"), ...

Kamo·2mo ago
FeatureSecurityService

A lead's opt-out change refreshes open screens live

The ledger here tells OptOutChangePublisher after the change commits, which publishes rt.org.{orgId}.email-opt-outs on core NATS (this service's JetStream strea...

Kamo·2mo ago
FeatureSecurityService

Issue personal single-use codes from a template promotion

The kamocrm.com site hunt hands each solver a code of their own, and only the first N solvers ever get one. A shared code could not do that: the first solver to...

Kamo·2mo ago
FixSecurityService

A new organization's folder holds none of the platform's backgrounds, stylesheet or config

Provisioning copied the whole base theme into every new organization's folder, KamoCRM's three sign-in photographs included. They sat at img/bg/1-3.webp under t...

Kamo·2mo ago
FixSecurityService

A god account is shown every organization, wherever it is signed in

GET /org/all-networks - the list behind /network - was gated on the SYSTEM_USER platform right alone, and platform rights resolve only in a top-level-organizati...

Kamo·2mo ago
FeatureSecurityService

See and change a lead's email opt-out from the lead

A member working a lead can now see whether that person may be emailed, and change it, without the org-wide opt-out settings list. GET **************** answers...

Kamo·2mo ago
TestSecurityService

MANAGE_OUTBOUND_EMAIL_HOSTS is enforced in EmailService

PlatformOutboundHostsController checks it through SessionPlatformFacts and the shared PlatformRightsResolver, so it is listed with the rights enforced elsewhere...

Kamo·2mo ago
September 11, 2026
FixSecurityService

An echo of the censored English is not a translation

translatedLocales compared each translation with the English title as stored. The translator is given the censored title (ChangelogSanitizationService masks sec...

Kamo·2mo ago
FixSecurityService

The General tab counts what the Organizations tab calls Active

6c8d789 moved the platform overview's organization count onto findAllLive(), which also drops orgs created by synthetic (is_fake) accounts — so the General tab ...

Kamo·2mo ago
FeatureSecurityService

Say which locales each entry is really translated into

The marketing site's sitemap now lists every language version of every entry, and each entry page names the others as its hreflang alternates. A translation row...

Kamo·2mo ago
FeatureSecurityService

Void an organization, and let no way in reach a voided one

Platform -> Configuration -> Organizations can now void an organization. The void is orgs.is_active = FALSE; this commit adds the action and makes every way INT...

Kamo·2mo ago
FeatureSecurityService

Give every public entry an address, and page the list on the server

The public changelog served entries with no identifier, so the marketing site could neither link to one nor list them in a sitemap. Each entry now carries a slu...

Kamo·2mo ago
FeatureSecurityService

Bake the careers site's logo overlay into config.json

kamo-careers paints the org's logo in its header and has no OrgContext; it reads the theme config.json on the server, the same file login, register and apps tak...

Kamo·2mo ago
September 10, 2026
FixSecurityService

Quote and borrower-portal links only name a live domain

QuoteEmailClient settled for any active domain, verified or not, so an org still setting up its white-label domain had quote links mailed to sign.<that domain>....

Kamo·2mo ago
FixSecurityService

An organization's .svg names show its own art, not the platform's

A new organization's folder is seeded from the base theme, so it starts out with KamoCRM's art under img/logo-full.svg and favicon/favicon.svg. An organization ...

Kamo·2mo ago
FeatureSecurityService

Say when the desk changes

Granting or revoking Exec2Exec Access now publishes exec2exec.desk.changed, so MediaService can put an executive on every chat — or take them off — as the toggl...

Kamo·2mo ago
FeatureSecurityService

Store the Welcome Message

The greeting the platform sends first over Exec2Exec, on the platform config singleton where every other platform-wide setting already lives. Two new endpoints...

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

Serve the three layers of the contact-effect stack

GET /api/security/contact-effects returns the platform, org and member layers in one round trip; PUT and DELETE on /{scope} write and reset one layer. The servi...

Kamo·2mo ago
ChoreSecurityService

Baseline the single-action event endpoint

Same door and same reasoning as its sibling one line above: X-Internal-Auth, constant-time, fail-closed. Genuinely pre-session — a mobile sign-in is reported by...

Kamo·2mo ago
FeatureSecurityService

Award and backfill the single-action achievements

Twenty-six of the thirty-five are questions the database can already answer, so they are awarded by asking it. SingleActionProbes holds one EXISTS per achieveme...

Kamo·2mo ago
FeatureSecurityService

Award the six tracking-link achievements, and backfill them

**************** reads all six of a member's marketing counters in one row and settles all six tracks against them. Wired into /self and /self/pending beside th...

Kamo·2mo ago
ChoreSecurityService

Baseline the growth-mission sync endpoint

**************** caught the new internal endpoint, which is what it is for: with anyRequest().permitAll(), a handler that resolves no caller is reachable throug...

Kamo·2mo ago
FeatureSecurityService

An owner's storage position, carried on a payload that already exists

The launchpad is getting a storage meter, and the obvious way to feed it is a request of its own on every page load. The numbers do not deserve one: "used" come...

Kamo·2mo ago
FeatureSecurityService

Award SPREAD_THE_WORD from the Growth Hub

**************** counts a member's APPROVED Growth Hub submissions and settles their SPREAD_THE_WORD level against that count. It RECOUNTS rather than being to...

Kamo·2mo ago
FixSecurityService

The baseline award was two transactions, not one

`ensureBaselineFor` calls `ensureBaseline` on `this`, and Spring's transaction advice is a PROXY — a self-invocation does not pass through it, so the inner REQU...

Kamo·2mo ago
FeatureSecurityService

Award Join The Team to everybody, without a backfill

SecurityService owns the member, so it owns the achievement. It awards, reads, acknowledges and publishes; MediaService only relays. EVERY MEMBER GETS JOIN THE...

Kamo·2mo ago
FixSecurityService

A callback can carry the link to the call

The lead page composes a callback in the calendar's own dialog, and every field that dialog collects is meant to survive the trip through here. meetingUrl did n...

Kamo·2mo ago
FeatureSecurityService

A callback can invite the lead it is with

Scheduling a callback told the lead nothing. The dialog said so outright — "The lead is not notified" — and the only way to get a customer the time in writing w...

Kamo·2mo ago
September 6, 2026
FeatureSecurityService

Send To AI tells everybody on the thread, not just the reporter

The dispatch sends the same letter MediaService does, so its audience has to move the same way: every participant in the report's thread minus whoever acted, ea...

Kamo·2mo ago
FixSecurityService

Wire the god guard into the identity-rights test's policy

UserAccountEditPolicy took a third constructor argument and this test still built it with two, so test-compile failed — and CI runs `mvn package -DskipTests`, w...

Kamo·2mo ago
FeatureSecurityService

Only a god may administer a god, and no god is impersonable

MANAGE_USERS reached the break-glass identity. UserAdminController guarded only the System User, so a non-god holder could disable a god account and revoke its ...

Kamo·2mo ago
FeatureSecurityService

Say which plan an organization is on, and who may change it

The console could tell that a trial was running and nothing else. entitlementSource is "TRIAL" or null, so free, expired-trial, paid and comped organizations we...

Kamo·2mo ago
FixSecurityService

Keep the dispatch's status write in step with the denial reason

Two services move a system bug's status, and only one of them knew about the new denial_reason column. A dispatch applying IN_PROGRESS to a report that had been...

Kamo·2mo ago
FeatureSecurityService

An administrator may grant a peer or a lesser, never a superior

MANAGE_PLATFORM_ADMINS is the right to administer the platform's access list, not a right to invent access. Without a ceiling it was silently every right at onc...

Kamo·2mo ago
FeatureSecurityService

Sweep the dev machine for coder usage and publish what moved

Feeds the two meters the Linux Desktop menu now draws — how much of a member's A sweep rather than a push, because the numbers are born on the machine and stat...

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