Live Change Log

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

17,865
Total Changes
4,581
Features
4,512
Fixes
32
Projects
Filter by project
All Projects17,865AIService110APIService138BillingService133ConversionService85DaemonService107DocsService189ESigService78EmailService348InitializerService299KBService74KlusterServices539MCPGatewayService43MediaService460RAGService61SecurityService1,519TranslateService45VOIPService173VectorService8kamo-analytics6,157kamo-apps18kamo-asterisk-support19kamo-capcha17kamo-capcha-widget4kamo-internal4,553kamo-login318kamo-marketing584kamo-meet90kamo-nowww18kamo-register206kamo-shared-library1,320kamo-signer-monorepo50kamolos102
Filter by type
All TypesBuild24CI522Chore670Docs226Feature4,581Fix4,512Other6,781Performance136Refactor273Revert23Style48Test68Upgrade1
August 24, 2026
FixSecurityService

Refuse an alias that names more than one organization

byAlias took LIMIT 1 over orgs.alias, which has no uniqueness constraint: the create path checks it per security provider and PUT /org/{id} does not check it at...

Kamo·2w ago
Fixkamo-internal

The scheduled-support presenter picker offered nobody

The Presenters tab dropdown was empty for every organization, and always had been. GET **************** answers with { teamMembers, total }; the tab read data.m...

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
Docskamo-internal

Task 7 needed no new migration, and top-level orgs must be included

The app-tree backfill turned out to already exist as **************** restricted to isGated() verticals. Dropping that restriction is the whole change. Records...

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
FixSecurityService

Resolve the domain on /org/current server-side

internal.kamocrm.com failed to render with "Invalid organization data: missing 'id' or 'domain'". Organization has no `domain` field -- it has a `domains` colle...

Kamo·2w ago
Fixkamo-internal

Give /api/org/current the domain the client requires

internal.kamocrm.com failed to render with "Invalid organization data: missing 'id' or 'domain'". Organization.fromJSON refuses a record without a domain, and t...

kamo·2w ago
Fixkamo-internal

Move jump-to-newest in with the toolbar's other actions

Search now owns the whole left track of the toolbar, because the empty part of that track is exactly the room the field opens into. The scroll-to-bottom control...

kamo·2w ago
Chorekamo-internal

Refresh the favicon and drop the unused blueleven logos

public/favicon.ico now carries 48x48 and 32x32 layers instead of 32x32/16x16. The five logo-blu*/logo-blueleven* PNGs are referenced from nowhere in the app, so...

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
FixSecurityService

Give the workspace path the same post-login work as the host path

Two gaps found by re-reading the original login tail against the new one, before enabling the picker. The form-encoded /login endpoint built its LoginRequest w...

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
Fixkamo-internal

A sent message animates in once, not twice

The message list keyed each row on the message id, and a sent message's id changes exactly once — the optimistic row is appended under a local id, and the STOMP...

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
Fixkamo-internal

Name rooms after the org id, not the hostname

getOrgToken() took the first label of the current host, and its own comment said why: "so identically-named rooms cannot collide across orgs". On the shared hos...

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
Fixkamo-meet

Scope rooms to their organization on the shared meet host

Room isolation was the HOST. A member of org B could not present a *** cookie on meet.<org-A-domain>, so knowing org A's room name got them nowhere. Serving org...

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
Docskamo-internal

Implementation plan for SP1, the app catalog parent/child tree

12 tasks across kamo-shared-library, KamoInitializerService, SecurityService, MediaService, VOIPService, kamo-internal and the translation dictionary. Ordering...

kamo·2w ago
Fixkamo-login

Make the auto-login cross-tenant guard actually run

The guard read the host org's id with /"id"\s*:\s*(\d+)/ -- a bare digit straight after the colon. SecurityService's JsSafeLongSerializer writes any Long above ...

Kamo·2w ago
FixESigService

Stop handing an alias row over as the org's domain

**************** walked org.getDomains() filtering only on isActive. That collection holds the org's root domain AND its alias rows -- api, login, theme and the...

Kamo·2w ago
Docskamo-login

Correct the sign.pink finding

The inventory called SignLinkBuilder's sign.sign.pink fallback a "foreign apex" and I recorded it as one. It is not: sign.pink is a Kamo-owned organization (id ...

Kamo·2w ago
Docskamo-internal

Design the EHR/EMR vertical and the parent/child app catalog

Two specs from the pre-build analysis of ~30 repos and the 2026 ambulatory EHR market. The program design records the six decisions that bind every sub-project...

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
Fixkamo-internal

Take the chat-core that stops a sent message showing twice

@kamo/chat-core 0.1.6. The conversation reducer now adopts the pending optimistic row when the member's own message comes back over STOMP, instead of appending ...

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
RefactorSecurityService

Separate the credential check from org authorization

Signing in was two questions fused into one query. "Are these credentials good" is answered by the users row -- the password lives there, so it was never org-sc...

Kamo·2w ago
FixSecurityService

Stop requiring DNS verification to sign in

OrgHostResolver.resolveByDomain filtered on od.is_dns_verified = TRUE, so a domain row that existed but had not finished verifying resolved to nothing and login...

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
Docskamo-login

Plan the host-independent tenancy rollout

Six phases, each independently shippable, because pushing deploys: the host path keeps working until Phase 6 removes it. Phase 1 is the crux and is additive --...

Kamo·2w ago
Docskamo-login

Design host-independent tenancy

Org identity comes from the hostname today: OrgHostResolver.resolveByFqdn turns <alias>.<domain> into (orgId, providerId), and its SQL requires od.is_dns_verifi...

Kamo·2w ago
August 23, 2026
FixVOIPService

Stop RingCentral OAuth signing white-label tenants out

Two faults, both on the same hop, and each one hides the other. RingCentral rejects every scope value this app can ask for — "invalid_request / Parameter [scop...

Kamo·2w ago
Fixkamo-marketing

Show cents on an add-on rate that has them

Additional Storage is $2.50 per 10 GB block, and the catalog stores that as a number — so 2.50 arrives as 2.5 and rendered straight into the card it read "+$2.5...

Kamo·2w ago
FixInitializerService

Settle Additional Storage at $2.50 per 10 GB block

Confirms the block size and rate as $2.50 per 10 GB rather than the $4 per 25 GB the production row had drifted to. The seeder, the catalog row, the Stripe pric...

Kamo·2w ago
FixInitializerService

Price Additional Storage as $4 per 25 GB unit, FLAT not metered

Additional Storage is bought by the unit, belongs to no plan on any tier, and is not seat-based. The seeder still described it as $2.50 per 10 GB block, which i...

Kamo·2w ago
ChoreSecurityService

Attach stack traces to their log line, and fix levels I got wrong

printStackTrace() writes to stderr directly, so 186 of them survived the println sweep untouched — still unconditional, still unattributed, and now detached fro...

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