Live Change Log

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

17,987
Total Changes
4,647
Features
4,558
Fixes
32
Projects
Filter by project
All Projects17,987AIService112APIService138BillingService133ConversionService85DaemonService107DocsService189ESigService78EmailService386InitializerService302KBService74KlusterServices547MCPGatewayService43MediaService462RAGService61SecurityService1,528TranslateService45VOIPService173VectorService8kamo-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,647Fix4,558Other6,781Performance136Refactor274Revert23Style48Test71Upgrade1
August 27, 2026
FixSecurityService

Gate the order and pricing surfaces on a right

Thirty-nine endpoints were protected only by "are you signed in". Every order handler on POSController and every pricing and tax handler on CommerceMarketContro...

Kamo·2w ago
FixKlusterServices

SIP registration works end to end

An endpoint can now REGISTER from the public internet and Kazoo's API reports it: **************** 200 OK via 47.181.8.87:5060. Four separate faults, each of w...

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
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
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
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
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
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
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
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·2w 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·2w 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·2w 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·2w 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·2w 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·2w 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·2w 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·2w 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·2w 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·2w 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·2w 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·2w ago
Fixkamo-marketing

The seat headline read a default, not a ceiling

The card printed "Up to 5 users" from plan.maxSeats, directly above its own feature list reading "Users (25)" and a comparison column reading 25 - the same card...

Kamo·2w ago
FixInitializerService

Catalog rows that made the pricing page contradict itself

COMMERCE_POS is ServiceType.POS(21), whose real name is "Lines of Business" - the umbrella switch for what an org sells, rents, services or lends. It was labell...

Kamo·2w ago
FixSecurityService

A CCD preview is not a disclosure

Previewing a summary recorded a disclosure naming the recipient — so a patient asking who has their record under §164.528 would be told it went to somebody who ...

Kamo·2w ago
FixInitializerService

Three catalog rows that made the pricing page contradict itself

Seat counts. The plan card headline reads max_seats ("Up to 5 users") while the feature list beneath it and the comparison table read the USERS feature row, whi...

Kamo·2w ago
Fixkamo-marketing

The page contradicted itself, and the calculator billed email per user

Included-in badge named the wrong plan. All four per-seat modules are included in Business and Enterprise, and the badge picked the FIRST id in includedInPlanId...

Kamo·2w ago
Fixkamo-shared-library

The document upload publishes its row only once the bytes land

The buffered uploadDocument was the one store that wrote its ImgDat with isMissing=false BEFORE sending anything, and merely re-set it to false after a successf...

Kamo·2w ago
Fixkamo-shared-library

A failed upload must not become a dedup match

A member sent an 11 MB .wav to a chat, got "Cannot invoke ObjectWriteResponse.etag() because response is null", sent it again, and the second one delivered inst...

Kamo·2w ago
FixKlusterServices

Bound the Go heap with GOMEMLIMIT and declare a real memory request

Root cause of the crash-loop was not a leak. The 485Mi steady state that kept tripping the old 512Mi limit was two normal things stacked: ~350Mi Go heap at ...

Kamo·2w ago
Fixkamo-internal

An inbound call reads properly and respects the status pill

Three things wrong with the softphone tool window's incoming-call overlay. The number was painted exactly as the INVITE carried it, so a caller arrived as "+15...

kamo·2w ago
FixSecurityService

Nothing returned an account id, so nothing could be withdrawn

Withdrawing portal access and granting a proxy both take an account id, and no endpoint ever returned one. A practice could invite a patient to the portal and t...

Kamo·2w ago
FixKlusterServices

Raise memory limit to 1Gi and relax liveness probe timeout

Traefik sat at ~485Mi against a 512Mi limit (95%). The cgroup recorded 47836 memory.max hits with oom_kill 0 — never OOM-killed, because enough of the footprint...

Kamo·2w ago
Fixkamo-internal

Price-list entry read and update spoke to the wrong endpoint

Two silent client/server mismatches made the retail price-list entry screen's write path dead: - the entries list was unwrapped with the key "entries", but C...

kamo·2w ago
FixVOIPService

The extension sweep no longer erases every member assignment

MemberVoipConfigController.put writes an assignment to two places - MEMBER_VOIP_CONFIG and **************** - and **************** then cleared the second on it...

Kamo·2w ago
FixMediaService

A reaction toggled twice at once is a no-op, not a 500

setReaction read, then saved, then caught the constraint violation the read was supposed to prevent — which does not work: the violation surfaces at flush, afte...

kamo·2w ago
Fixkamo-shared-library

Let the database decide whether a reaction is already there

The unique constraint on (message, member, emoji) was doing nothing useful. A read-then-save loses the race with the member's own second click, and catching the...

kamo·2w ago
Fixkamo-internal

A failed reaction or edit does not stick to the message

Takes @kamo/chat-core 0.1.9, which rolls an optimistic edit or reaction back when the connection drops rather than only when the server refuses. The bubble's sa...

kamo·2w ago
Fixkamo-internal

The workspace you chose is the one you land in

Choose "ABC Mortgage" at sign-in and you arrived in a workspace wearing KamoCRM's logo and colours, with a left-hand menu offering White Labeling, Plans & Billi...

kamo·2w ago
FixEmailService

Stop the unread card offering mail that was read and deleted

The home-page unread-mail widget reads email_metadata.search_index directly — it must not spend an IMAP connection, which is the whole reason it exists — and th...

kamo·2w ago
Fixkamo-internal

Keep support tickets out of the per-member unread badge

perSender is what puts a number on a person — their member-directory row, their hex head — so it has to mean "unread messages from them". It was summing every s...

kamo·2w ago
Fixkamo-shared-library

An unread count names a sender only when a single member is the answer

senderId is what pins an unread badge to a person — their member-directory row, their hex head — so it has to mean "these messages are from them". It was set fo...

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