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 25, 2026
Featurekamo-shared-library

Rights, entities, repositories and DTOs

MANAGE_SYSTEM_BUGS is a PlatformRightType and must stay one: the dispatch it a tenant administrator can edit their own organization's security models. Screensh...

Kamo·2w ago
Featurekamo-shared-library

Add a global alias-uniqueness check

**************** scopes by provider, and that was right while an alias was only ever resolved as (security_provider_id, alias) — the pair behind a <alias>.<pare...

Kamo·2w ago
FeatureKlusterServices

Dispatch a bug report into sage's open VS Code

URI handler that creates a conversation in a RUNNING window and pre-fills the input, which is the only way to reach the editor sage already has open instead of ...

Kamo·2w ago
FeatureInitializerService

Create the System Bugs tables

No CHECK constraint on the ordinal columns: support_ticket_status_check is what happens when Hibernate freezes one at an enum's size and the enum then grows, an...

Kamo·2w ago
Featurekamo-internal

Manage a custom domain from Company settings

A domain used to be the doorway into an organization: DNS had to be configured before anyone could sign in at all, which is why /setup/dns was reached from the ...

kamo·2w ago
FeatureSecurityService

Send the tree on the app-catalog endpoint too

Branch Types → Allowed Apps builds its editor from /features/app-catalog, not from the tenant features listing, so it was the one surface that could not see whi...

Kamo·2w ago
Featurekamo-internal

Render the app tree, and confirm what a parent switch-off takes

Children now sit under their parent in the Apps & Features list, each with its own switch. Nesting is expressed by ORDER plus an indent rather than a nested con...

kamo·2w ago
August 24, 2026
FeatureInitializerService

Price the commerce children and the EHR, with a totality guard

Neither pricing map had a totality check, and the two failure modes are different and both silent. Missing from CATALOG, an app lands nowhere on the pricing mat...

Kamo·2w ago
Featurekamo-marketing

Stop counting a member's visits to their own link

A member checking that their own tracking link works is the most common first visit any code ever gets, and it is worse than useless: it inflates the number the...

Kamo·2w ago
Featurekamo-internal

The Affiliate Sales Scoreboard widget

One grid column wide and two rows tall: the ten people in the organisation bringing in the most through their tracking links, over today, this month, this year ...

kamo·2w ago
FeatureMediaService

The Affiliate Sales Scoreboard endpoint

GET **************** answers this organisation's top ten for one metric over one window, plus the caller's own standing when they are not on it. The counters o...

Kamo·2w ago
Featurekamo-shared-library

Add the Affiliate Sales Scoreboard widget rights

Five rights, 234-238, in the MARKETING group and hung off VIEW_REFERRAL_CODES: a leaderboard of referral numbers is tracking-code data, and a member who may not...

Kamo·2w ago
Featurekamo-login

Brand and scope the sign-in screen with ?org=

login.kamocrm.com is the sign-in screen for every organization that has no host of its own, so the hostname cannot say which one is signing in. ?org= does: it n...

Kamo·2w ago
FeatureSecurityService

Serve an org's branding to a screen with no session

Login, registration and the meeting lobby paint an organization's colours before any session exists. They knew which one from the hostname, which is exactly wha...

Kamo·2w ago
FeatureMediaService

Refuse meeting recording for a tenant that handles PHI

The capability split made ServiceType.MEET permitted — a live conference on self-hosted Meet never leaves the cluster — while MEETING_RECORDING stayed blocked, ...

Kamo·2w ago
FeatureVOIPService

The blocked capability now outranks the right, and god mode

PhiPlaybackAuthorizer gated PHI call playback on VIEW_CALL_LOGS. That was the whole check because ServiceType.VOIP mapped to the blocked VOIP_RECORDING module, ...

Kamo·2w ago
FeatureSecurityService

Serve the app tree, and fix the unguarded auto-enable

FeatureController now sends parent/children/isParent on every serialized app so the client can render children nested under their parent. Served rather than mir...

Kamo·2w ago
Featurekamo-internal

Mirror the six commerce child apps, and stop the mirrors drifting

Both TS mirrors are now GENERATED from ServiceType.java rather than hand-maintained. They had drifted badly from Java and from each other: stale "RAG integratio...

kamo·2w ago
Featurekamo-internal

One scrollbar, three times as wide, down every conversation

The bar beside the messages was 8px in the member chat and SMS, 6px in support tickets and social, and in the AI chat it was nothing at all: that list declared ...

kamo·2w ago
FeatureInitializerService

Extend market grandfathering into the app-tree backfill

grandfatherExistingGatedMarkets already walked each org's active markets, resolved getRequiredService() and enabled the missing app — it was just restricted to ...

Kamo·2w ago
FeatureSecurityService

Entitlement-check every vertical, not just the gated two

Every CommerceType now names its own child app under POS, so the isGated() short-circuit that waved retail, rentals, service, subscriptions and procurement stra...

Kamo·2w ago
Featurekamo-internal

The toolbar's search is a glyph that opens into a field

The member chat carried a permanent search box across the top of the window — the width of the whole toolbar, spent on a control that is empty almost all of the...

kamo·2w ago
Featurekamo-shared-library

Every vertical names its own child app

requiredService becomes total now that each vertical has a child app under ServiceType.POS, which deletes the "null means POS alone is enough" special case and ...

Kamo·2w ago
FeatureMediaService

Let the public config be addressed by org id, not only by host

The meet sidecar looks up an org's meet config to decide whether a guest needs a meeting password. It asked by hostname, which on the shared meet host resolves ...

Kamo·2w ago
Featurekamo-shared-library

Cascade feature enable/disable across the app tree

Enabling a child enables its parent; disabling a parent disables every child; disabling the last child disables the parent. Enabling a parent leaves children al...

Kamo·2w ago
Featurekamo-shared-library

Add PhiCapabilityGuard for call-time capability checks

PhiTenantGuard runs at feature-enable time and nowhere else — three call sites, all in FeatureService. Now that PhiModule is capability-grained, an app whose co...

Kamo·2w ago
Featurekamo-shared-library

Split PhiModule from app-grained to capability-grained

POS mapped to ECOMMERCE_SYNC (BLOCKED_NO_BAA) and the whole commerce surface hangs off POS, so an org with handlesPhi=true could not switch commerce on at all —...

Kamo·2w ago
Featurekamo-internal

Land inside a newly created org instead of at DNS setup

Creating an org routed the creator to /setup/dns, and the reason was real: entering meant an OTK redirect to internal.<new-domain>, and a brand-new org has no D...

kamo·2w ago
Featurekamo-shared-library

Give ServiceType a two-level parent/child tree

Six commerce children at new ids 26-31, wired to POS in a static block on the RoleRightType pattern (an enum constant cannot reference another from its own cons...

Kamo·2w ago
Featurekamo-internal

Make an org without a domain enterable

Entering an org meant navigating to **************** With no domain that URL rendered as the literal **************** so Enter was disabled and owners were rout...

kamo·2w ago
FeatureSecurityService

Let the shell fetch its org from the session, not the host

kamo-internal's root layout reads the Host header, strips "internal." and fetches /org/domain/<that>. On a host serving one tenant that is the same question as ...

Kamo·2w ago
Featurekamo-internal

Write a scheduled-support description as rich text

The description on **************** was a three-row textarea. It is the /kb/new writing surface now, minus pictures and the media library — those upload into KB...

kamo·2w ago
Featurekamo-login

Add the workspace picker

A sign-in that names no organization now comes back with a list instead of a session. This is the client half: /api/login passes that payload through (before th...

Kamo·2w ago
FeatureMediaService

Carry the type description in both of its shapes

The description is a Lexical document now, so the service stores the plain-text mirror the client sends alongside it and hands readers whichever shape they can ...

Kamo·2w ago
FeatureInitializerService

Rich-text description columns on webinar_type

Mirrors the shared-lib entity change. Two things the table needs before MediaService maps them. The description column has to be unbounded: it holds a Lexical ...

Kamo·2w ago
Featurekamo-shared-library

Store the type description as rich text

The description on **************** is a Lexical editor state now rather than a line of prose, so the column has to be an unbounded TEXT bound as a long varchar...

Kamo·2w ago
FeatureSecurityService

Let a member sign in without a host naming their org

Adds the second half of the split: a sign-in that names no organization authenticates the user, then asks which workspace. POST /api/security/session/select tur...

Kamo·2w ago
FeatureInitializerService

Remember the last workspace a member signed in to

users.last_org_id backs the workspace picker. An organization is no longer named by the hostname, so a member who belongs to several chooses one after signing i...

Kamo·2w ago
Featurekamo-internal

A file may be dropped anywhere on a chat window, not only on the input strip

The drop target was the composer surface alone — a few dozen pixels at the bottom of a window that is otherwise all messages. A screenshot let go over the conve...

kamo·2w ago
August 23, 2026
Featurekamo-internal

Drop the greeting block and put the masthead on one row

The launchpad's masthead carried a kicker, a "good afternoon" heading and a status line of apps/title/trial/date beside the logo, and the member's own controls ...

kamo·3w ago
Featurekamo-internal

Move Binders and Uploads to the right of the strip

The strip now separates what a document manager IS from where it takes you. Left: Originals, Modified, Common — three views of the same documents. Right: the fo...

kamo·3w ago
August 22, 2026
Featurekamo-marketing

Set the headline in quotation marks

Quotes around the banner line, as asked — but rendered from CSS (`open-quote`/`close-quote` against `quotes: auto`) rather than typed into the string, for two r...

Kamo·3w ago
Featurekamo-internal

Expression — colour, Spirit Animal and logo as one decision

Two corner controls become one. That split was an accident of the order the features shipped rather than a distinction anybody holds: a colour, a pattern and th...

kamo·3w ago
Featurekamo-internal

Count on the Binders tab, and land on Selected Docs

The tab reads "Binders (n)" so the count the Selected Docs binder holds is visible from the strip — including (0), which is the case worth seeing, since it says...

kamo·3w ago
Featurekamo-internal

The picture frame IS the pane, not something inside one

Every other widget is content in the launchpad's frosted glass card, with a header, a title and a corner control. A picture frame is not: rendered that way it i...

kamo·3w ago
Featurekamo-internal

Show which layers of a modified document were worked on

A document has one modified record, so the Modified tab has one row per document. The column names the layers touched rather than which of two kinds a row was: ...

kamo·3w ago
Featurekamo-marketing

Trade the NOW LIVE badge for the headline it was hiding

The top banner led with a six-character pill — bordered, uppercase, pulsing — and put the actual message after it. The pill now carries the message itself: "Run...

Kamo·3w ago
FeatureInitializerService

Merge the two modified records into one with two layers

Where a document has both kinds, the CLASSIC row survives — it is the one that may hold edited bytes — the design is repointed onto it, and the FORM_FILLABLE ro...

Kamo·3w ago
Featurekamo-internal

Picture Frame — a member's own photos and videos, in a frame they build

The first INSTANCED widget. A member hangs as many frames as they like, each with its own contents, its own moulding and its own place in the grid, all from one...

kamo·3w ago
FeatureSecurityService

Frame and media endpoints, and seed the new rights

Self only, and enforced in the QUERY. Every read and write resolves the member from the session and every repository call takes that id, including the single-fr...

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