KamoCRM

Live Change Log

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

15,120
Total Changes
5,169
Features
4,935
Fixes
30
Projects
Filter by project
All Projects15,120AIService197APIService161BillingService143ConversionService107DaemonService129DocsService215ESigService88EmailService518InitializerService318KBService105KlusterServices697MCPGatewayService85MediaService546RAGService71SecurityService1,658TranslateService55VOIPService205VectorService11kamo-apps25kamo-asterisk-support24kamo-capcha17kamo-capcha-widget4kamo-internal6,937kamo-login330kamo-marketing625kamo-nowww20kamo-register213kamo-shared-library1,455kamo-signer-monorepo53kamolos108
Filter by type
All TypesBuild11CI523Chore738Docs2,167Feature5,169Fix4,935Other986Performance157Refactor274Revert23Style42Test94Upgrade1
August 27, 2026
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·4w 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·4w 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·4w 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·4w ago
Featurekamo-internal

Platform settings card, and stop showing FreePBX copy

Three problems on the KamoPBX phone-server page, all mine: - The PHONE_SERVER_ID card was ungated, so every provider — KamoPBX, RingCentral and Teams include...

Kamo·4w ago
FeatureVOIPService

Read KamoPBX platform config from the database

Adding a KamoPBX phone server failed with a raw Kubernetes DNS error — 'I/O error on PUT ... **************** — shown to an organization admin who can neither r...

Kamo·4w ago
Featurekamo-shared-library

KamoPBX platform settings on SYSTEM_CONFIGURATION

KamoPBX is Kamo's own platform, so all of its configuration is platform-wide: base URL, master account id, account name, admin credential, SIP realm suffix and ...

Kamo·4w ago
FeatureInitializerService

Seed KamoPBX platform defaults

Hibernate ddl-auto adds the SYSTEM_CONFIGURATION columns; @ColumnDefault only applies to newly inserted rows, so the existing singleton needs backfilling. Seed...

Kamo·4w ago
FixInitializerService

Seed Starter at 5 seats and Business at 25

The USERS rows read 25 and 100 while max_seats, the card headline and the plan quiz all said 5 and 25. The volume-discount bands that run past those ceilings ar...

Kamo·4w ago
Fixkamo-marketing

Starter is 5 seats, Business is 25

I had this right, then reversed it on bad reasoning and shipped 25 / 100. The volume-discount bands (Starter 11-25, Business 26-50, 51-100) are seat PRICING ro...

Kamo·4w ago
ChoreKlusterServices

Scale edge to 0 until its config is rewritten

Kamailio cannot start on 2600Hz's vendored configs — they need 2600Hz's patched build (spec 16). Leaving it at replicas:1 restart-storms k3m1 indefinitely for n...

Kamo·4w ago
Docskamo-login

2600Hz ships a patched Kamailio (spec 16)

kazoo-configs-kamailio does not run on stock Kamailio. bflags and import_files are both absent from kamailio/kamailio's own src/core/cfg.lex, and both are rejec...

Kamo·4w ago
FixBillingService

The platform org is not gated by its own catalog

The platform org was told "Requires the KamoPBX Hosting add-on" on its own phone-server screen, for an add-on it publishes. It owns the plan catalog, the add-o...

Kamo·4w ago
DocsKlusterServices

The NAT is in place; a closed port means no listener

The router forwards for 5060/5061 TCP+UDP and 20001-29999/UDP to 192.168.4.36 are confirmed. My gate reported PHASE 0 BLOCKED against them while Kamailio was cr...

Kamo·4w ago
Docskamo-internal

Close out SW6a

Nine departures. The plan's Spring claim was measured false, its sketched test was near-tautological, and its ServiceTrade-labels-are-new claim was wrong — ther...

kamo·4w ago
Featurekamo-internal

The work-order grid reads real service jobs

Every row in this grid was a dead link by construction. generateMockWorkOrders minted ids String(8000 + i), the row click pushed /commerce/service/8001, and the...

kamo·4w ago
Featurekamo-marketing

Plan cards show what a tier ADDS, not everything it has

The cards listed every included feature - 16 on Free, 30 on Starter, 52 on Business, 57 on Enterprise. Four cards of wildly unequal height, each a wall of text,...

Kamo·4w ago
Featurekamo-internal

Pull a patient's history from the practices they used to attend

The outbound half of exchange, on the records tab beside the release surface — records leaving and records arriving are one person's job, and somebody who has j...

kamo·4w ago
FeatureSecurityService

The outbound half of TEFCA — ask, don't only answer

Everything built so far answers other people's queries: discovery, document query, document retrieve, the match-review queue, the accounting. A practice could b...

Kamo·4w ago
Featurekamo-shared-library

A line for documents retrieved from other organizations

Its own domain rather than a share of DOCUMENTS, for the reason bulk exports got one: a practice that queries a health information network routinely accumulates...

Kamo·4w ago
FeatureVOIPService

Provision a KamoPBX account when a phone server is created

Adding a KamoPBX phone server now creates the underlying account and writes the account id and realm back to configJson. Any configJson the client sent is DISCA...

Kamo·4w ago
Featurekamo-internal

KamoPBX is selectable

The provider is implemented in VOIPService, so the coming-soon gate comes off. Description no longer names the upstream project and says what actually matters t...

Kamo·4w ago
FeatureSecurityService

Right-gated service job API

**************** — list, get, update, and PATCH status. Copies ServiceTaskBookController's idiom: orgId(req) or 401, a right check or 403, a String path variabl...

Kamo·4w ago
Featurekamo-shared-library

An org-scoped read/write API for service jobs

ServiceJob has been a mapped entity with repositories and passing tests and no way to read a row. This gives it the header the finished work-order UI already re...

Kamo·4w ago
Featurekamo-login

Reveal the preselected workspace, and give the list the org's scrollbar

Two things about the workspace picker, both about the same list. The workspace a member used last is preselected and named on the button, because this screen i...

Kamo·4w ago
FeatureVOIPService

Implement the KamoPBX provider

Replaces the stub. KamoPBX is Kamo's own platform, so the organization holds no credential at all: KamoPBXAccountProvisioner creates the account when a phone se...

Kamo·4w ago
Docskamo-internal

Stop telling implementers to run git commit --allow-empty

--allow-empty PERMITS an empty result, it does not force one. With no pathspec it still commits the index, and these checkouts always have another session's wor...

kamo·4w ago
Docskamo-internal

Stop telling implementers to run git commit --allow-empty

--allow-empty PERMITS an empty result, it does not force one. With no pathspec it still commits the index, and these checkouts always have another session's wor...

kamo·4w ago
Fixkamo-marketing

Unbreak the build - undo a sweep I caused

c8ec175 was meant to be an empty rebuild commit. It was not: `git commit --allow-empty` PERMITS an empty result, it does not force one - it still commits the in...

Kamo·4w ago
FeatureKlusterServices

Apps, media, edge manifests and network policy

- config.ini carries a [zone] block from day one so a second region is a config edit, not surgery. Secrets are substituted by an entrypoint at container start...

Kamo·4w ago
Fixkamo-internal

The Interaction Center bucket tabs never wrap to two lines

Six full-width tabs share the 550px conversations pane, leaving ~80px each, and "Team Members" did not fit — it wrapped and doubled the strip's height. Both mem...

kamo·4w ago
FixKlusterServices

K3m1 is 47.181.8.87 (pbx.k3.kluster.kamocrm.com)

Reverts an incorrect change of mine. I had propagated 42.181.8.87 and edited coturn/deployment.yaml's comment, which was right all along. Verified by DNS: pbx...

Kamo·4w ago
Featurekamo-internal

**************** and lock the Enterprise card

Registers the right client-side - list, colour, icon - and adds it to the coverage test's non-tab set with a note on what it actually gates, since it guards an ...

kamo·4w ago
Fixkamo-internal

An attachment that cannot be read says so, instead of nothing

A media element gives you one bit — it failed — and no status code, and it latches on that bit: it never retries, so whatever went wrong the control simply stay...

kamo·4w ago
FixSecurityService

A picture-frame image whose bytes are gone answers 410, not 500

The frame stream caught everything as stream_failed and returned 500, so a photo whose object is not in storage rendered as a broken image with no explanation -...

Kamo·4w ago
FeatureBillingService

Refuse a self-serve Enterprise subscription

Enterprise is negotiated. Hiding the price is presentation; this is the boundary. A request naming the Enterprise plan is refused unless the caller holds ******...

Kamo·4w ago
FixVOIPService

A recording whose bytes are gone answers 410, not 500

Same split as the imaging proxy and the docs download. A call recording that is not in storage is permanently not there, and a player handed a 500 shows nothing...

Kamo·4w ago
FeatureSecurityService

Withhold Enterprise pricing from the catalog

Enterprise is negotiated with KamoCRM directly, so its rate is not ours to publish. Every surface that quotes a plan price reads this one endpoint - the public ...

Kamo·4w ago
FixDocsService

A document whose bytes are gone answers 410, not 500

The streaming download caught every storage failure as one unexpected error and returned 500, which tells a reader nothing and leaves a viewer with a blank erro...

Kamo·4w ago
FixMediaService

An attachment that cannot be read says so instead of 500ing

The imaging proxy already answers 410 for revoked access and for a removed message, but let openRange's IOException escape uncaught — so the one case where the ...

Kamo·4w ago
Featurekamo-internal

Show what the chart says before the prescription is written

The server now refuses a prescription that conflicts with a recorded allergy, a drug the patient is already on, or a patient nobody has ever asked about allergi...

kamo·4w ago
FeatureKlusterServices

CouchDB and RabbitMQ on k3m1

CouchDB q=8 / n=1, verified live. q is fixed at database creation and KamoPBX creates a database per account plus monthly MODBs, so q is sized now for the event...

Kamo·4w ago
Featurekamo-shared-library

Tell "the bytes are gone" apart from "storage is down"

openRange collapsed every node failure into one IOException, so a caller could do nothing with it but return 500. A browser's <img>/<video>/<audio> cannot rende...

Kamo·4w ago
Featurekamo-shared-library

MANAGE_ENTERPRISE_SUBSCRIPTIONS

Enterprise is negotiated, never self-serve. This right gates both halves of that: seeing what it costs, and putting an organization on it. Category.OPERATIONS ...

Kamo·4w ago
Docskamo-internal

Correct four SW6a claims, one measured false

A plain @Autowired List of an interface with no implementations does NOT resolve to an empty list — it throws UnsatisfiedDependencyException. Measured, not reas...

kamo·4w ago
Docskamo-internal

Correct three SW6a claims, one of them measured false

An earlier draft said a plain @Autowired List of an interface with no implementations resolves to an empty list. It throws UnsatisfiedDependencyException — meas...

kamo·4w ago
Fixkamo-shared-library

Actually call the fulfillment policy

SW3 implemented FulfillmentPolicy as the first member of an interface that had none, and nothing ever called it — a grep across kamo-shared-library and Security...

Kamo·4w ago
Refactorkamo-internal

The tab's own session names its organization; `?org=` leaves the URL

Builds directly on 05ff51b3, which established the right source of truth — the tab asks its own session which workspace it is in, over a call the per-tab token ...

kamo·4w ago
FeatureSecurityService

Check the chart before writing a prescription

Prescribing was added with the allergy table, the interaction-checking query and a "safety context" endpoint all sitting beside it, unread. A system that record...

Kamo·4w ago
Chorekamo-marketing

Rebuild to pick up the early-bird offer copy

The dictionary change landed after the last build, and messages/ is pulled at build time.

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