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 27, 2026
Otherkamo-internal

Show why the exchange network is unreachable

The outside-records panel could only say "not connected", which reads as an outage to wait out. The server now sends the reason alongside -- this practice has n...

Kamo·2w ago
OtherSecurityService

The exchange status says what would make it connected

The status endpoint is asked before the UI offers a network query, so a practice that is not onboarded sees an explanation instead of a button that always fails...

Kamo·2w ago
FeatureKlusterServices

Recorded-call notice on direct-dialled extensions too

A caller who dials an extension over the greeting now hears the notice as well. That path went through from-did-direct, where the Dial belongs to FreePBX's ext-...

Kamo·2w ago
Otherkamo-internal

Mirror the EHR stage, and guard the mirror

ServiceType.ts is a hand-maintained mirror of the Java enum and nothing was checking it. RoleRightType has had a parity guard since three EHR rights went missin...

Kamo·2w ago
OtherSecurityService

Never auto-provision Patient Records into a tenant

Two of the three paths that would hand a clinical record system to orgs that never asked for one, now that ServiceType.EHR is COMPLETED and therefore available....

Kamo·2w ago
FeatureKlusterServices

Recorded-call notice to both parties at once, then a bridge tone

When an agent answers a queued call, the caller hears the client notice and the agent hears the agent notice at the same time, then a shared 1000Hz tone marks t...

Kamo·2w ago
Otherkamo-shared-library

Publish Patient Records, and make that safe to do

ServiceType.EHR was held at TESTING long after the vertical was finished, because AppCatalogService derives availability from COMPLETED and three separate paths...

Kamo·2w ago
Fixkamo-shared-library

A vendor id leaves as a string, for every row

`commerce_vendors.uid` is `INT8 DEFAULT unique_rowid()` -- about 19 digits, where `Number.MAX_SAFE_INTEGER` has sixteen. A numeric id of that size is an IEEE-75...

Kamo·2w ago
Fixkamo-marketing

Quote our own price per seat, not per user

The competitor pages priced KamoCRM in a unit we do not sell in — "$29/user/month Starter, $64/user/month Business" — on the same pages that describe competitor...

Kamo·2w ago
Otherkamo-internal

Say what the prescribing safety check did not cover

The panel rendered a safety block only when there were warnings, so a prescription that came back clean said nothing at all -- and this platform has no licensed...

Kamo·2w ago
OtherSecurityService

Disclose that drug interactions are not checked

Prescribing ran three checks the practice's own data can answer and no drug-drug interaction check at all. Declining to build one was right -- interaction knowl...

Kamo·2w ago
FeatureInitializerService

4 GB per seat on every plan, and seats rather than users

Storage stops being a tier differentiator. The 2/4/5 ladder put one gigabyte between Starter and Business on a page that then had to explain what "pooled" meant...

Kamo·2w ago
FixInitializerService

Drop the CountryType frozen ordinal checks

CountryType has 196 constants, AFGHANISTAN(0) through ZIMBABWE(195), and every check written over it froze at 0..195. They are not one value away from failing -...

Kamo·2w ago
Refactorkamo-shared-library

The per-plan allowance is per seat, and says so

Rename only — PlanStorage.gbPerUser is private to this class and the three call sites are all in it. The comment above it was the misleading half: the allowance...

Kamo·2w ago
FixEmailService

Stop asking Graph for a message size the legacy type lacks

Every listing for Mike@OptionOne.com returned 400 RequestBroker--ParseUri ("Could not find a property named 'size' on type **************** and the mailbox was ...

Kamo·2w ago
Fixkamo-internal

The agreement sample quotes seats at catalog prices

The default agreement template shipped a worked example that contradicted the catalog on every line it mentioned: 50 users on a 25-seat plan, 25 GB of storage p...

kamo·2w ago
Fixkamo-marketing

Give the fallback cards the inherits eyebrow they were missing

The three upper fallback plans carried no inheritsFrom, so on a cold build — which is what a fresh deploy serves until the first revalidate — Starter showed "Up...

Kamo·2w ago
Fixkamo-marketing

One storage allowance, seats not users, and stop parsing prose

Storage is 4 GB per seat on every plan. The cards need no special case to stop repeating it: ladderFeatures already shows a tier's delta over the one below, so ...

Kamo·2w ago
Fixkamo-internal

The platform save dropped every KamoPBX field client-side

Entering the credentials in the UI reported success and changed nothing. systemConfigApi.update serialises an explicit allowlist rather than the caller's object...

Kamo·2w ago
FixKlusterServices

Zone must be named 'local' to match the node

The config.ini was loading correctly and the AMQP URI was right, but every node logged 'no local zone configured, adding default AMQP' and then retried ********...

Kamo·2w ago
TestKlusterServices

Probe SIP for real, and assert the white-label holds on the wire

A TCP connect to 5060 proves almost nothing — it succeeds against anything listening, and on UDP it cannot fail at all. That ambiguity is exactly what led me to...

Kamo·2w ago
Docskamo-internal

Close out SW6b

Eight departures. The one that mattered was in SW6a: PUT /{uid} accepted totals and sign-off verbatim, which made both of this plan's central rules decorative u...

kamo·2w ago
ChoreSecurityService

Rebuild against kamo-shared-library for SW6b work-order writes

An empty commit, built out of tree from origin's own tree — NOT 'git commit --allow-empty', which permits an empty result but does not force one and would have ...

Kamo·2w ago
Featurekamo-internal

The six work-order tabs persist

SW6b Task 4. Labour, parts, time, vendors, sign-off and notes were React `useState` on `commerce/service/[id]` and lost everything on reload. They now write to ...

kamo·2w ago
FeatureKlusterServices

Pass the advertised public IP to the media pod

Kamo·2w ago
FeatureSecurityService

Eight work-order endpoints for lines, notes, vendors, sign-off and the clock

SW6b Task 3, controller half. POST/PUT/DELETE /{jobUid}/lines/..., POST /{jobUid}/notes, POST/DELETE /{jobUid}/vendors/..., PATCH /{jobUid}/signoff and PATCH **...

Kamo·2w ago
Featurekamo-shared-library

Line, note, vendor, sign-off and clock writes on a job

SW6b Task 3, library half. Eight new operations on ServiceJobService, plus the wire records for them and the three reads the detail page needs. Three things th...

Kamo·2w ago
Docskamo-login

Record what is running and the traps that cost a build each

Nine failure modes discovered the hard way, each of which would otherwise be rediscovered: the gitignored vendor tree, make re-fetching over it, ripgrep honouri...

Kamo·2w ago
FixKlusterServices

Distinct Erlang node names for apps and ecallmgr

One image runs as two nodes. They need different names or they refuse to coexist, and both need the shared cookie that FreeSWITCH's mod_kazoo also uses.

Kamo·2w ago
FixKlusterServices

Run the OTP release, not make release

The image now ships a relx release rather than the source tree, so passing 'make release' to the entrypoint failed with 'No rule to make target release'. foreg...

Kamo·2w ago
DocsSecurityService

Say why the transaction guard stops at ehr/

The two rules generalise and both shapes exist elsewhere in this service, so the obvious next move is to widen the scan — and doing that would fail the build on...

Kamo·2w ago
DocsSecurityService

Say why the overload's @Transactional is inert on the afterCommit path

Prompted by a peer session finding a @Transactional(REQUIRES_NEW) Spring never advised — protected, and self-invoked, so the record of a failed query rolled bac...

Kamo·2w ago
DocsKlusterServices

Bootstrap script and operational README

bootstrap.sh creates the master account, promotes it to reseller and writes the non-secret platform configuration. Idempotent: a second run detects the existing...

Kamo·2w ago
TestSecurityService

Fail the build on a @Transactional Spring cannot advise

Two shapes get no transaction advice at all, and neither is visible at a call site or in a unit test: a non-public method, which the proxy cannot intercept, and...

Kamo·2w ago
FeatureVOIPService

Implement KamoPBX extension, user and device management

The provider advertised extensionManagement, userManagement and deviceManagement as true while implementing none of them, so the UI would have shown buttons tha...

Kamo·2w ago
FixSecurityService

The outbound audit row was written by an inert REQUIRES_NEW

It was a method on ExchangeQueryService annotated @Transactional(REQUIRES_NEW), called from two private helpers on the same class. Spring's transaction advice l...

Kamo·2w ago
FixSecurityService

Main did not test-compile — PhiExportAuditTest missed a constructor arg

SystemConfigurationController gained a twelfth parameter, PlatformSecretCipher, when platform secrets began being encrypted at rest. This test still passed elev...

Kamo·2w ago
Fixkamo-internal

Two icon buttons were announced with no name at all

MUI's Tooltip spreads its aria-label onto its DIRECT child. Both of these wrap the button in a <span> — the standard workaround so the tooltip still fires while...

kamo·2w ago
Featurekamo-shared-library

Job lines, notes and vendors so the work-order tabs can persist

Labour and parts become ServiceJobLine rows on the job rather than ServiceLineItem rows, because OrderLineItem.order is optional = false: a ServiceLineItem cann...

Kamo·2w ago
Featurekamo-internal

A failed clinical load must not render as an empty result

Two of these shipped before anyone noticed, and the guard found two more in the newest panel the moment it ran — failing to load what a patient's other practice...

kamo·2w ago
Fixkamo-internal

A failed load was rendering as a clinical fact

Two screens turned a fetch failure into an empty result, which on a chart is not a neutral outcome — it is an assertion. The trend graph caught an error and se...

kamo·2w ago
FeatureSecurityService

Expose platform settings through the system-config API

toDto is an explicit allowlist and updateConfig takes a typed body, so the seven new SYSTEM_CONFIGURATION columns would have been invisible and unsettable — the...

Kamo·2w ago
FeatureVOIPService

Decrypt the KamoPBX credential; test the refusal path

The master credential is stored as ciphertext by the platform settings UI, so it must be decrypted before use — handing ciphertext to the API as a password woul...

Kamo·2w ago
Testkamo-internal

Pin the reason dialog, and let app/patients be tested at all

app/patients/** was in no vitest include pattern, so a test written beside the clinical console's own kit was collected by nothing and would have passed by neve...

kamo·2w ago
FeatureKlusterServices

Swap the inbound greeting to KamoCRM-Main-Intro-3

Third take, 40s (down from 60s). Uploaded alongside the previous two rather than over them, so rolling back to either is a one-line change to KAMO_ATTENDANT_INT...

Kamo·2w ago
Refactorkamo-internal

Eight clinical reasons were being collected by window.prompt

Stopping a medication, closing an order loop, cancelling an appointment, merging two patients, declaring two records not a match, withdrawing portal access, dec...

kamo·2w ago
FeatureInitializerService

Per-seat storage, and a flat Enterprise pool

2 GB per seat on Free, 4 on Starter, 5 on Business. Enterprise stops scaling with seats entirely - a flat 150 GB for the organization - which "N GB per seat" ca...

Kamo·2w ago
Fixkamo-marketing

Stop putting green text on green, and switch storage to per seat

CONTRAST. I only fixed the solid gradient buttons last time and left green ink on green-tinted surfaces, which is the thing that actually reads badly. Audited e...

Kamo·2w ago
Docskamo-internal

Plan SW6b, making the six tabs persist

Labour and parts become ServiceJobLine rows on the job, not ServiceLineItem rows: OrderLineItem.order is optional=false, so a ServiceLineItem cannot exist witho...

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