KamoCRM

Live Change Log

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

17,494
Total Changes
5,983
Features
5,282
Fixes
30
Projects
Filter by project
All Projects17,494AIService251APIService174BillingService157ConversionService110DaemonService138DocsService223ESigService91EmailService576InitializerService329KBService151KlusterServices738MCPGatewayService248MediaService602RAGService79SecurityService1,846TranslateService62VOIPService249VectorService11kamo-apps26kamo-asterisk-support27kamo-capcha17kamo-capcha-widget4kamo-internal8,349kamo-login335kamo-marketing641kamo-nowww20kamo-register213kamo-shared-library1,657kamo-signer-monorepo56kamolos114
Filter by type
All TypesBuild16CI523Chore773Docs3,254Feature5,983Fix5,282Other994Performance165Refactor278Revert23Style42Test160Upgrade1
September 7, 2026
Featurekamo-shared-library

New-email and unread-chat kinds, and a repeating tone

Two kinds a member can be told about and mute like any other. Both announce a condition that stays true rather than a moment that passed, so both are raised onc...

Kamo·1mo ago
Chorekamo-internal

The last two files git was treating as binary

Finishing the sweep that started when my own billingDraft.ts committed as "Bin 0 -> 6882 bytes". Scanning every tracked text file for a NUL byte found three mor...

Kamo·1mo ago
FixVOIPService

A frozen CHECK blocked every Telnyx AND JustCall provider from being created

Adding a Telnyx text provider 500'd. The log named it plainly and the screen said nothing useful: constraint **************** Failing row contains (..., 6)...

Kamo·1mo ago
Fixkamo-internal

The wallpaper was painting under the body, not failing to load

The launchpad backdrop — the plain gradient, the org watermark and the wallpaper slideshow it carries — has been completely invisible since 03743d02. Nothing fa...

Kamo·1mo ago
FixBillingService

A price Stripe has never heard of is a fault, not a silence

The reconciler compared mapped prices against the catalogue and returned early whenever nothing was mapped at all. So a term the catalogue had gained since the ...

Kamo·1mo ago
Fixkamo-internal

An expired card can no longer be the one you are billed to

Answering "is changing the default still there on Payment Info" — it was, and reading it turned up a defect worth more than the answer: nothing stopped an EXPIR...

Kamo·1mo ago
Featurekamo-internal

Show the URL a carrier has to be told to post to

Adding a text provider covers sending. Receiving needs the carrier told where to deliver, which happens in the carrier's own console — and the form never said w...

Kamo·1mo ago
FeatureVOIPService

Serve the inbound webhook URL, from one definition

An administrator adding a text provider has to paste Kamo's inbound URL into the carrier's own console, and nothing told them what it was. Missing that step has...

Kamo·1mo ago
FixAPIService

Forward carrier SMS webhooks, which reached nothing at all

Traefik sends every path on api.kamocrm.com to this gateway with no path split, and this class forwarded /api/voip/** and nothing else. So /api/bulktext/inbound...

Kamo·1mo ago
FixAPIService

Forward carrier SMS webhooks, which reached nothing at all

Traefik sends every path on api.kamocrm.com to this gateway with no path split, and this class forwarded /api/voip/** and nothing else. So /api/bulktext/inbound...

Kamo·1mo ago
September 6, 2026
Fixkamo-internal

A NUL byte in two source files, which made git call them binary

Caught on a last pass over my own work: `billingDraft.ts` committed as "Bin 0 -> 6882 bytes". A separator written as a space had reached the file as a raw NUL b...

Kamo·1mo ago
FixEmailService

Watch a mailbox for the phone, not only for the browser

An IMAP IDLE listener is the only thing that notices a message arriving; it publishes email.inbox.<addr>, which is what eventually asks MediaService to buzz a p...

Kamo·1mo ago
FixMediaService

Stop the presence gate silencing every mail notification

A member with a live MediaService socket was treated as having already seen every non-call push, mail included. That is true of what travels on that socket — a ...

Kamo·1mo ago
Fixkamo-internal

Pay without leaving the order, and never lose it again

Sending somebody to another page to add a card was the wrong answer, and it was wrong at the worst possible moment. The console noticed there was no card and li...

Kamo·1mo ago
Fixkamo-internal

The app shell was capping every page under every scrollbar

My last fix was in the wrong file. Removing the stacking context from the launchpad changed nothing, because the one that matters is a level above it, in the sh...

Kamo·1mo ago
FixVOIPService

Ask whether THIS NUMBER can text, not whether the org can

SmsGateway grew a number-aware availability() when routing moved onto the number, and then nothing called it with a number — both SmsController call sites used ...

Kamo·1mo ago
Fixkamo-internal

The commitment term travels with the plan, not just the plan

Carrying the plan code alone was half a fix, and the missing half was the half that carries the price. Somebody who set three years on /myplan, saw $49 a seat a...

Kamo·1mo ago
Fixkamo-internal

Opening an attachment no longer throws React #310

Clicking a thumbnail threw "Minified React error #310 — rendered more hooks than during the previous render" over the whole page. Mine, from the attachment-aut...

Kamo·1mo ago
Docskamo-internal

Finish the spec's inventory, and add the order to check things in

The "where it lives" table was written before the setup service, the media handoff, the CARRIER_TO_PHONE_SERVER rail and the phone server's default text route e...

Kamo·1mo ago
RefactorVOIPService

Delete the Telnyx code nothing calls

Three methods I added that no caller reaches, removed while the reason is still fresh — this feature's worst bug was TelnyxProvider.provision() being defined an...

Kamo·1mo ago
FixVOIPService

The "you cannot text" message stopped one step short of the fix

FreePBX and Teams told a member to add an SMS provider under Phone → Providers. That was complete advice until numbers gained their own text route; now adding a...

Kamo·1mo ago
Docskamo-internal

The two inbound shapes, and the rule that keeps the endpoint safe

Records what voipservice 9e9e814 and ea6d631 established, because the reasoning is not recoverable from the diff. A Telnyx messaging profile has exactly one we...

Kamo·1mo ago
FixVOIPService

Only the carrier that owns a webhook URL may verify its posts

The phone-server inbound path added in the previous commit verified against whatever provider carried the number. That is a forgery surface, and not hypothetica...

Kamo·1mo ago
FixVOIPService

A Telnyx phone server could send texts and never receive one

Telnyx is both a phone server and a carrier, and a Telnyx messaging profile has exactly one webhook URL. So an organization that added Telnyx as a PHONE SERVER ...

Kamo·1mo ago
Featurekamo-internal

One setting that covers every number on a phone system

The approved routing design had three tiers and only two of them were reachable. A number could name its own text provider, and failing that the phone server wa...

Kamo·1mo ago
Testkamo-internal

The /myplan to console journey, end to end

The preselect landed across two sessions and two files, so the thing worth pinning is the journey rather than either half: a plan chosen on /myplan arrives sele...

Kamo·1mo ago
Fixkamo-internal

One price on the screen, and a purchase that cannot fail silently

The console showed a customer three different numbers for one plan and let them buy with no card. Rendering it against the live catalogue, Business at five seat...

Kamo·1mo ago
Featurekamo-internal

React to a status change, not only to a comment

"🎉" on a Fixed event is the single most natural thing anybody wants to say in a bug thread, and offering reactions only on comments meant typing one to say it....

Kamo·1mo ago
Docskamo-shared-library

What the thread design got wrong, as built

Two schema faults that only appeared on deploy — the hand-applied column that was flagged and not applied, and a frozen ddl-auto CHECK on media_sessions that wo...

Kamo·1mo ago
Featurekamo-internal

Live thread updates, and reactions that are actually reachable

Two halves of the thread were built and then left unconnected. The server has published every comment and status event to `chat.session.{guid}` since the featu...

Kamo·1mo ago
FeatureMediaService

The thread page names its reader, and drops an unused helper

`viewerMemberId` on the thread page, so the console can tell the viewer's own reactions from everybody else's without a second call to /api/user-info. A ref fil...

Kamo·1mo ago
FeatureVOIPService

Actually create the Telnyx account setup, carry MMS, and let a carrier-only org hold threads

Three gaps, and the first was the feature not working at all. TELNYX PROVISIONING WAS DEFINED AND CALLED BY NOTHING TelnyxProvider.provision(), ensureMemberCr...

Kamo·1mo ago
Fixkamo-internal

Stop the launchpad capping its own dropdowns under every scrollbar

The admin bar's dropdowns were painting under the App Shelf's scrollbar, and lowering the shelf's z-index last time did not help — because the number was never ...

Kamo·1mo ago
Featurekamo-shared-library

A text conversation can exist without a phone server

VOIP_CONVERSATIONS.INSTANCE_ID was NOT NULL, which quietly decided that every text thread belongs to a PBX. An organization that buys numbers and messaging from...

Kamo·1mo ago
Featurekamo-internal

The plan you picked travels to the page that sells it

"Move to Business" opened the billing console with nothing selected. The choice the person had just made was dropped on the floor and they were asked to make it...

Kamo·1mo ago
FixBillingService

Charge what the screen says, and refuse rather than pretend

An audit of the Plans & Billing console against live Stripe keys found the seam between the screen and Stripe broken in every direction at once, and silent in a...

Kamo·1mo ago
Featurekamo-shared-library

The two letters a customer gets when their card fails

BillingService has wanted to send these since DunningNotifier was written. It posted them to **************** — an endpoint that has never existed on EmailServi...

Kamo·1mo ago
Testkamo-internal

Pin KamoCRM's own sales details, and that no org can change them

The address and number are constants a single edit away from becoming a tenant lookup, which would route a customer asking about a KamoCRM plan back to their ow...

Kamo·1mo ago
FixVOIPService

Populate a new number before persisting it, not after

save() built an empty OrgPhoneNumber, persisted it, and then filled in E164 and PHONE_CANON — both NOT NULL. It works today because the UUID generator needs no ...

Kamo·1mo ago
Featurekamo-internal

A plan card says what it adds to the one below it

The picker gave a price, a seat ceiling and one sentence. Choosing between $46 and $80 a seat on that is a decision with one obvious answer, and for most teams ...

Kamo·1mo ago
Fixkamo-internal

Attachments authenticate like chat's, instead of showing broken

Every attachment on a bug report rendered as a broken tile. In production: seven content requests, seven 401s, zero successes — while the report's own JSON load...

Kamo·1mo ago
Featurekamo-internal

One way to reach sales, and a seat control that knows the plan's limit

ContactSalesDialog holds KamoCRM Inc.'s own details — Sales@KamoCRM.com and (949) 298-9960 x1 — as constants, deliberately. Every other address on this platform...

Kamo·1mo ago
Featurekamo-internal

A Numbers screen, so calls and texts can come from different companies

An organization buys its numbers from one company and answers the calls with another. That is ordinary, and Kamo could not describe it: texting was a property o...

Kamo·1mo ago
Fixkamo-internal

Anchor it to the first cell, and stop the scrollbar collapsing it

Three things, and two of them are the same mistake: asking a question about a portalled element as though it were a child. THE SCROLLBAR COLLAPSED THE PANE. Sc...

Kamo·1mo ago
FeatureVOIPService

Route texts by NUMBER, and add Telnyx on both sides of it

An organization can buy its DIDs and its texting from one company and answer the calls with another. Kamo could not express that: a member's texting was a prope...

Kamo·1mo ago
Fixkamo-marketing

One source of truth, and a build that can actually reach it

Every price on this site had a second copy in the repo, and the second copy was the one being served. kamo-prices.ts said so in its own comment: the fallback t...

Kamo·1mo ago
Featurekamo-shared-library

Telnyx, the first provider that is both a phone server and a carrier

Telnyx sells SIP trunking, DIDs and messaging, and an organization can buy those halves independently. The case this is for: DIDs and texts bought from Telnyx, ...

Kamo·1mo ago
FixInitializerService

Drop the frozen type_id CHECK that blocked every bug thread

`media_sessions` is created by Hibernate's ddl-auto, not by a migration, so it carries the constraint ddl-auto writes for an `@Enumerated(ORDINAL)` column — fro...

Kamo·1mo ago
Featurekamo-internal

The shelf replaces the per-app cards, and four fixes to its rows

The launchpad was a wall of one card per app. The App Shelf lists every one of those apps in a single pane, with what each does and everything inside it, so the...

Kamo·1mo ago
FeatureBillingService

A plan's startup fee, and the live offer, on the wire

PlanDto carried only the recurring rate, so every surface quoting a plan quoted a price the customer would not be charged: KamoCRM's startup fee is $99 a seat, ...

Kamo·1mo 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