Live Change Log

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

17,896
Total Changes
4,600
Features
4,522
Fixes
32
Projects
Filter by project
All Projects17,896AIService110APIService138BillingService133ConversionService85DaemonService107DocsService189ESigService78EmailService364InitializerService299KBService74KlusterServices542MCPGatewayService43MediaService460RAGService61SecurityService1,519TranslateService45VOIPService173VectorService8kamo-analytics6,157kamo-apps18kamo-asterisk-support19kamo-capcha17kamo-capcha-widget4kamo-internal4,565kamo-login318kamo-marketing584kamo-meet90kamo-nowww18kamo-register206kamo-shared-library1,320kamo-signer-monorepo50kamolos102
Filter by type
All TypesBuild24CI522Chore670Docs226Feature4,600Fix4,522Other6,781Performance136Refactor274Revert23Style48Test69Upgrade1
August 26, 2026
FixEmailService

A contested primary is a 409, not a 500

The catch-all turned an expected refusal into a server error, which lost the message the member needed and made a routine conflict look like an outage in the lo...

Kamo·2w ago
Fixkamo-internal

Ask a host that exists for the organization ?org= names

A new organization was created with its logo, colours and three backgrounds. All of it provisioned correctly into public/wienerschnitzel/ — 15 objects, the righ...

kamo·2w ago
FixSecurityService

An organization can be looked up by the reference ?org= carries

GET /org/ref/{ref} — the same projected record as /org/domain/{host}, for an organization named by its id or its web alias. Nothing could answer for one. The s...

Kamo·2w ago
FeatureSecurityService

The config body carries a scalar, and absence means unchanged

updatePOSConfig bound Map<String, List<String>>, a shape that cannot carry quoteConversionBilling at all. Widened to Map<String, Object>. A key that is absent ...

Kamo·2w ago
Featurekamo-shared-library

Each org chooses what an order takes from an accepted quote

There is no platform-wide right answer. A maintenance contractor on a three-year plan bills each period; a capital-equipment installer bills the contract up fro...

Kamo·2w ago
Featurekamo-internal

Say who holds a contested mailbox, and that aliases are free

The snackbar replaced the server's 409 message with a generic failure, so a manager could not tell which member held the mailbox. Adds the note that sharing a m...

kamo·2w ago
FixEmailService

Refuse a primary mailbox another member holds

Primary is a login identifier, so a silent takeover changes which account an address authenticates from a screen that never mentions logins. Assign still works ...

Kamo·2w ago
Fixkamo-internal

Every catalogued event fires where the event actually happens

Most of the sound catalogue was configurable and inaudible. Two causes, both silent by construction: a sound that never plays looks exactly like one the member ...

kamo·2w ago
FixSecurityService

Actually measure the bulk-export bucket

StorageDomain.BULK_EXPORTS shipped declared, documented as "measured by scanning the object store", and referenced by nothing. It reported zero for every practi...

Kamo·2w ago
Docskamo-internal

Plan SW5, the flat-rate task book

The spec's premise that no line carries a labour duration went stale hours ago — SW3 landed labourMinutes and taskCode on ServiceLineItem, and the javadoc on ta...

kamo·2w ago
FeatureInitializerService

One primary member per mailbox

is_primary was unique per member only, so two members could both claim a mailbox — and PrimaryMailboxIdentityLookup returns null on an ambiguous address, so tha...

Kamo·2w ago
Docskamo-login

Plan per-mailbox billing and the personal-mailbox backend

Plans B and C of 3. Self-review closed five gaps: nothing set mail_cost_mode, nothing server-side stopped a billing group buying mail add-ons, the invoice mailb...

Kamo·2w ago
Fixkamo-internal

Dropping in the goal scores, and aiming at it no longer gathers

Two complaints about the same gesture — taking a head to the goal. **Dropping in the goal did nothing.** Scoring lived entirely inside the throw RAF loop, whic...

kamo·2w ago
Docskamo-login

Correct the spec — StorageAutoExpandSweep already exists

The spec claimed no server-driven-quantity reconciler existed to reuse and listed the storage auto-expand columns as dead. Both false: the sweep reads them nigh...

Kamo·2w ago
Docskamo-login

Design per-mailbox e-mail billing and add-on gating

Bills e-mail by the mailbox rather than the seat, gates provider choice on the add-on that covers it, and attributes each mailbox to the billing group that shou...

Kamo·2w ago
Fixkamo-marketing

Read the platform's branding from its alias folder

The theme folder was derived from the hostname — kamocrm.com became kamocrm-com — which is where branding was written until a domain became optional and the org...

Kamo·2w ago
Fixkamo-signer-monorepo

A signing page wears the sender's brand, not Kamo's

getThemePath took a hostname and used its FQDN with dots turned into dashes as the bucket folder. That could only answer for an org that HAD a hostname, and a d...

Kamo·2w ago
Fixkamo-meet

The lobby wears the meeting owner's brand, not the platform's

The overlay derived its theme folder from the browser's hostname. On the shared meet host that is the platform's for every tenant, so the CSS, favicon and logo ...

Kamo·2w ago
Fixkamo-register

Brand the signup screen from the org's alias, not the host

register.kamocrm.com is the signup page for every organization with no register host of its own, so a host-derived theme folder painted all of them in the platf...

Kamo·2w ago
Fixkamo-login

Brand the sign-in screen from the org's alias, not the host

login.kamocrm.com is the sign-in screen for every organization that has no host of its own. The theme base was derived from that hostname, so all of them were p...

Kamo·2w ago
Featurekamo-internal

Paint each tab from its organization's alias, not from the hostname

The theme base was built from a hostname: drop the leading label, join the rest with dashes, and that is the bucket folder. It answered correctly while every or...

kamo·2w ago
FixMediaService

A child org's lobby offers its own backgrounds, not the platform's

The folder holding an org's meeting backgrounds and theme config was derived from a hostname — the request's, or the org domain the sidecar passed — by taking t...

Kamo·2w ago
FixESigService

The signer app gets the sender's brand, not Kamo's

Two separate ways the same wrong assumption showed up. The signing page's logo URL was https://<org fqdn>/theme/logo-full.<ext>, which is not a path anything s...

Kamo·2w ago
FixEmailService

Build the org logo URL from its alias, not its domain

Transactional email is sent to real inboxes, so the header and footer logos have to resolve without any client-side theme JavaScript — they are built exactly th...

Kamo·2w ago
FeatureSecurityService

Provision an organization's branding under its alias, and migrate what exists

The folder every logo, colour, favicon and background is written to was the organization's hostname with the dots turned into dashes. A domain is optional now, ...

Kamo·2w ago
Fixkamo-shared-library

Editing top-level lines no longer deletes every option's lines

Quote.lineItems is orphanRemoval=true and option rows set both quote and option — which is why QuoteMapper filters on getOption() == null twice. A bare clear() ...

Kamo·2w ago
Fixkamo-shared-library

An option quote keeps the tax and shipping staff entered

recalculate zeroed taxTotal and shippingTotal whenever a quote had options. Both were still stored on the row and still rendered by QuoteMapper, so a staff memb...

Kamo·2w ago
Fixkamo-shared-library

Terminal guards on cancel and revise, and stop swallowing bad input

cancel() and revise() had no isTerminal() guard, so an ACCEPTED quote could be flipped to CANCELLED or REVISED while acceptedAt and acceptedByName survived — a ...

Kamo·2w ago
Testkamo-shared-library

Actually exercise the terminal guards

The test that shipped with them asserted only that an ACCEPTED quote reports itself terminal — true before the guards existed and still true if both were delete...

Kamo·2w ago
Featurekamo-shared-library

An organization's branding lives under its ALIAS, not its domain

The folder an organization's logo, colours, favicons and backgrounds are written to in the public bucket was its hostname with the dots turned into dashes — wen...

Kamo·2w ago
Featurekamo-internal

A tap opens the tool, a right-click opens its menu

Clicking a hex head opened a context menu, which meant the common act — get my chat back — cost two clicks, and the menu itself was reachable no other way. The ...

kamo·2w ago
Fixkamo-internal

A healthcare market could not be edited

The edit screen still built its picker by mapping over a hardcoded array of seven verticals. HEALTHCARE was not among them, so a healthcare market opened to a s...

kamo·2w ago
Fixkamo-internal

Gate the population-level surfaces on their own rights

EXPORT_PATIENT_DATA, VIEW_QUALITY_MEASURES and MANAGE_PATIENT_PORTAL were added to Java in August and never mirrored into the client enum, so RoleRightType.THE_...

kamo·2w ago
Docskamo-internal

Define SW4's behaviour for a market-less quote

Task 1 made create() read marketUid but did not backfill, so every quote that exists today still has a null market. The converter must fall back to PurchaseLine...

kamo·2w ago
Fixkamo-shared-library

Stop dropping the market and the customer account

CreateQuoteRequest has always declared marketUid and accountUid and QuoteService.create has never read either, so Quote.market and Quote.customerAccount were NU...

Kamo·2w ago
Fixkamo-internal

The clinical rights were ungrantable

The permission editors render one section per enabled app and filter each role's rights by that section's serviceType. There was no EHR section, so all ~30 clin...

kamo·2w ago
Chorekamo-internal

Follow Java — the EHR is TESTING in both mirrors

Java moved the app off PLANNING now the vertical is built. Neither mirror is read for its stage — consumers match on id and copy comes from GET /api/security/fe...

kamo·2w ago
Chorekamo-shared-library

The EHR is in TESTING, not PLANNING

The vertical is built end to end — charts, scheduling, notes, orders, results, claims, FHIR and bulk export, C-CDA, TEFCA exchange, quality measures and the pat...

Kamo·2w ago
Docskamo-internal

SW4's billing choice is per-org configuration

Owner's call, and the right one: a maintenance contractor bills each period, a capital-equipment installer bills the term up front. Either hard-coded choice cha...

kamo·2w ago
Featurekamo-internal

Hand the patient a link, not a token

The invitation now has somewhere to go — the portal lives on apps.<practice> — so the panel shows the whole activation URL with a copy button rather than the op...

kamo·2w ago
FixAIService

Remove the unreviewed-reply unread-count endpoints

Paired with the kamo-internal removal of the AI unread badge: the count never told the member anything actionable (no push channel backs it, so non-zero only ev...

Kamo·2w ago
Fixkamo-internal

Remove the AI unread-count indicator entirely

It never told the member anything actionable: AIService has no push channel for assistant replies, so a nonzero count only ever meant "you minimized the window ...

kamo·2w ago
Featurekamo-internal

Release the record as FHIR as well as C-CDA

§164.524(c)(2)(ii) is the form and format the individual requested if it is readily producible. Both were already producible; only one was offered. A C-CDA is ...

kamo·2w ago
FeatureSecurityService

$everything records a disclosure when a recipient is named

The whole chart in one response is the largest single thing this system hands out, and until now it wrote a PHI audit row and nothing else. That was right for t...

Kamo·2w ago
Fixkamo-internal

The new workspace is opened by a click, from /network

Creating an org disabled the form, did the work, and then appeared to do nothing: no new tab, and the button back to reading "Create Organization". window.open...

kamo·2w ago
Featurekamo-internal

The unread badge goes red, pulses, and sits on the hexagon

Three things, all about a badge nobody notices. It was `--presence-color`, so it was GREEN whenever the member was online — the one state in which it is least ...

kamo·2w ago
Featurekamo-internal

Bank reconciliation on the healthcare revenue cycle

The last EHR endpoint without a caller, and it belongs beside the other six revenue-cycle queues rather than anywhere new. The gap between posted and banked. A...

kamo·2w ago
Docskamo-internal

Plan SW4, quote to order conversion

Five defects, not the spec's three. The converter deliberately does NOT mint a Commitment: processOrderPaid returns immediately when one exists, so hand-creatin...

kamo·2w ago
Featurekamo-internal

Who asked — unrecognised callers and Part 2 disclosures

Two compliance queues that were recorded server-side and never shown. UNRECOGNISED CALLERS. Every inbound exchange request that could not be attributed to a pa...

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