KamoCRM

Live Change Log

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

18,399
Total Changes
6,534
Features
5,537
Fixes
30
Projects
Filter by project
All Projects18,399AIService276APIService177BillingService161ConversionService117DaemonService146DocsService240ESigService93EmailService621InitializerService344KBService162KlusterServices769MCPGatewayService277MediaService620RAGService79SecurityService1,996TranslateService62VOIPService265VectorService11kamo-apps26kamo-asterisk-support28kamo-capcha17kamo-capcha-widget4kamo-internal8,694kamo-login342kamo-marketing642kamo-nowww20kamo-register213kamo-shared-library1,826kamo-signer-monorepo57kamolos114
Filter by type
All TypesBuild23CI525Chore794Docs3,286Feature6,534Fix5,537Other1,001Performance174Refactor281Revert23Style45Test175Upgrade1
October 23, 2026
Featurekamo-shared-library

Quotes convert into subscriptions; tenant orders never comp the seller

- A quote in a SUBSCRIPTION market, or whose accepted rows were filled from the subscription catalog, converts into a SubscriptionOrder (plan, seats from the ...

Kamo·2w ago
FeatureEmailService

Refuse a mailbox past the organization's email licenses

Owner rule 2026-10-22: per-user add-ons bill the licenses purchased; how many mailboxes may be in use is limited only by them. Before a mailbox is put into use,...

Kamo·2w ago
FeatureVOIPService

Refuse a phone extension past the organization's licenses

Owner rule 2026-10-22: per-user add-ons bill the licenses purchased; how many extensions may be in use is limited only by them. Before an extension is put into ...

Kamo·2w ago
FeatureBillingService

License usage and per-unit license checks for per-user add-ons

Owner rule 2026-10-22: every per-user add-on bills the licenses purchased, like seats; how many mailboxes or extensions may be in use is limited only by them. ...

Kamo·2w ago
October 22, 2026
Featurekamo-shared-library

Turn renewal on or off for a live subscription; notes on any order

The console's auto-renew switch sent a field the draft-only order update did not have, so it never saved; and notes failed on any order past draft.

Kamo·2w ago
Fixkamo-shared-library

Approving a card order grants paid access too

AUTO_BILL orders waited for a Stripe checkout that subscription invoicing no longer uses; the ledger charges the saved card on each billing day instead.

Kamo·2w ago
FeatureSecurityService

Card customers are charged automatically on the billing day

For AUTO_BILL subscriptions the billing job charges each approved invoice to the customer's saved card on its billing day through BillingService's internal card...

Kamo·2w ago
FeatureBillingService

Internal card endpoints for subscription invoice auto-charge

GET **************** and POST /charge, guarded by the shared X-Internal-Auth secret (constant-time compare; 403 without it). A charge is an off-session PaymentI...

Kamo·2w ago
Featurekamo-shared-library

Card auto-charge bookkeeping on subscription invoices

AUTO_BILL invoices are charged on their billing day once approved and retried every three days, up to four attempts. Each attempt is numbered before it is made ...

Kamo·2w ago
FixSecurityService

The billing job takes each subscription and invoice in its own transaction

Its first run raised Harmony's October invoice and lost it when one audit insert failed, because the whole prepare step was one transaction.

Kamo·2w ago
Fixkamo-shared-library

Subscription events store JSON states; billing steps run one row per transaction

**************** are jsonb, and every caller wrote a bare status like ACTIVE - an invalid JSON insert that rolled back whatever it was auditing (order activatio...

Kamo·2w ago
Fixkamo-internal

The POS proxy passes a PDF or an empty reply through instead of failing it as JSON

The invoice PDF and any 204 went through response.json() and became a 500.

Kamo·2w ago
Featurekamo-internal

Subscription billing console — invoice drawer, draft editor, payments, market invoicing

Invoices tab: plain-language rows (period, total, amount due, due date, status) open a drawer with the lines, totals, payments received, where and when it was s...

Kamo·2w ago
FixBillingService

Stripe bills add-on licenses held, not mailboxes or extensions in use

Every add-on now takes its quantity from AddOnLicenses, the rule the order calculator and subscription invoices share: licenses bought, defaulting to the seat c...

Kamo·2w ago
FeatureSecurityService

Automatic subscription invoicing - drafts, owner review, email with PDF, payments, reminders

SubscriptionBillingJob (hourly, one pod, and at startup) runs the cycle: - raise each renewal invoice as a draft lead-days before its billing day - move subscri...

Kamo·2w ago
Featurekamo-signer-monorepo

The customer's invoice, online — branded, printable, with a PDF download

/[locale]/i/[token] resolves the invoice server-side (token in a POST body, never a URL) and renders it in the seller's own name and colour, falling back to a n...

Kamo·2w ago
FeatureEmailService

BILLING_INVOICE, gated on viewing subscription invoices

Raised by SecurityService to the selling organization's owners when a subscription invoice draft is waiting for review or a customer's invoice goes past due. Al...

Kamo·2w ago
Featurekamo-shared-library

License-based add-on pricing and a real subscription invoice lifecycle

One rule for add-on quantity (AddOnLicenses): every add-on bills the licenses PURCHASED, like seats - per-user add-ons default to the seat count, storage to the...

Kamo·2w ago
PerformanceTranslateService

Background work uses three engine slots per pod and is sent as low priority

One background slot per pod left three of the engine's four streams idle during a dictionary sync. Background callers (a wait above the 100-second default: the ...

Kamo·2w ago
PerformanceKlusterServices

Four streams of four threads, and a lane that keeps one free for chat

Measured on the nodes' CPU class with the dictionary sync's own traffic (15-key chunks): one stream of eight threads did 1.5 keys/s, two of eight 1.8, four of f...

Kamo·2w ago
Fixkamo-internal

Read subscription invoices, events and agreements under the keys the server sends

The server answers invoices/invoice, events and agreements/agreement; posApi read subscriptionInvoices, subscriptionEvents and subscriptionAgreements, so the In...

Kamo·2w ago
FeatureBillingService

Rebuild the Stripe mirror from Stripe nightly and on startup

Events older than 30 days cannot be fetched, so the September invoice and subscription events lost to the API-version mismatch are unrecoverable as events. Stri...

Kamo·2w ago
FixSecurityService

Catalog edits reach only the caller's organization; own-order callers cannot comp or price themselves

Every update and delete of a subscription plan, price, feature, add-on, bundle, volume discount, promotion or agreement template now checks that the row belongs...

Kamo·2w ago
Fixkamo-shared-library

Name the organization that owns a subscription catalog row

The catalog update/delete methods take a uid alone, so a caller holding the catalog right in any organization could edit another organization's plans, prices, a...

Kamo·2w ago
Fixkamo-marketing

A missing locale file renders English instead of throwing

i18n/request.ts and message-locales.ts imported messages/<locale>.json bare, so a build made while the dictionary had no file for a locale turned that locale's ...

Kamo·2w ago
FixBillingService

Read Stripe events from any API version, and replay the ones that failed

The live webhook endpoint renders events at 2026-03-25.dahlia; stripe-java pins 2024-12-18.acacia, so every invoice, payment and subscription event since has fa...

Kamo·2w ago
FixKlusterServices

Write Romanian with comma-below s and t

The model mixes the legacy cedilla forms into Romanian (6 of 90 such letters in the chat widget's regenerated file) and the dictionary's earlier Romanian did to...

Kamo·2w ago
ChoreKlusterServices

Drop the old engines' deploy steps, apply MADLAD's alias Services, update audit and docs

Completes 56b37fa, which removed the manifests: without this the workflow still ran steps for directories that no longer exist. The workflow now applies madlad/...

Kamo·2w ago
ChoreKlusterServices

Remove LibreTranslate, Bergamot and IndicTrans; MADLAD serves every pair

TranslateService speaks only to madlad now (translateservice 5c7605b), verified end to end: every Kamo locale including Tamil and Swahili, inbound ru->en and ta...

Kamo·2w ago
FeatureTranslateService

One engine, MADLAD-400, for every language pair

Replaces the LibreTranslate, Bergamot and IndicTrans providers with MadladProvider (klusterservices madlad/). Their languages did not overlap, and a pair none o...

Kamo·2w ago
PerformanceKlusterServices

Beam 4 only for labels, beam 2 up to 64 tokens

Cost is tokens x beam. Measured in the cluster with the old engines still running: one stream 77 chars/s and two 115 chars/s on short strings at beam 4. Sentenc...

Kamo·2w ago
FeatureKlusterServices

One translation engine for every pair, MADLAD-400-3B on CPU

Replaces LibreTranslate (Argos), Bergamot and Kamo IndicTrans, whose language sets did not overlap and whose gaps came back as English. MADLAD-400-3B-MT (Apache...

Kamo·2w ago
FixKBService

One pod translates an article, not every pod at once

The sweep's fleet-wide lock is held only while it queues work, which takes milliseconds, so each pod ran its own sweep a minute or two apart and queued the same...

Kamo·2w ago
FixTranslateService

Never send an engine a text longer than it takes

IndicTrans answers a request over 20,000 characters with a permanent HTTP 413, so a long help article could never be translated into Tamil; a LibreTranslate wor...

Kamo·2w ago
FixKBService

Translate an article's words, not its Lexical JSON

contentJson was sent to the translation engines as if it were a sentence. On 2026-10-22 one sentence of it came back from Russian with the sentence gone and the...

Kamo·2w ago
FixKlusterServices

Memory limit 14Gi -> 20Gi, request 10Gi -> 12Gi

Seven-day peak working set was 13.8 and 13.1 GiB against the 14Gi limit, so the kernel reclaimed the mmapped argos models and en->ru on a help article paid cold...

Kamo·2w ago
FixSecurityService

Creating a MORTGAGE market gives the organization its lender profile at once

A MORTGAGE market's lender profile (and its five config rows) was only created by the boot-time self-heal, so a market created while SecurityService was running...

Kamo·2w ago
October 21, 2026
Featurekamo-internal

The Pipeline's loan officer filter shows faces and opens the member card

Each officer in the filter's options, and the one selected, is their avatar and name wrapped in the shared MemberHoverCard. A click still selects.

Kamo·2w ago
Featurekamo-internal

The Pipeline's loan officer opens the shared member card

The loan officer on each deal is wrapped in MemberHoverCard, the popup every other surface uses for a member. It opens on hover and keyboard focus; a click stil...

Kamo·2w ago
Fixkamo-internal

Open deals are always expanded, the loan officer shows their photo, and the loan count reads one way

- Open view: every deal shows its loans, with no expand/collapse control. Past and All stay collapsed by default and expandable. - The loan officer avatar was...

Kamo·2w ago
Featurekamo-internal

A full-width, full-height HMDA LAR page; readable brand buttons on the loan page

- HMDA LAR: the register is an AG Grid that takes the whole width and every pixel under the header, and scrolls inside itself — the page no longer scrolls. Is...

Kamo·3w ago
Fixkamo-internal

Back from a loan returns to the screen it was opened from, and a loan always shows its full number

- The loan page's Back was hard-coded to /commerce, which opens the first market's home. Every opener (Pipeline, Board, document queue, applications tab) now ...

Kamo·3w ago
Featurekamo-internal

A new mortgage Pipeline — open deals first, past ones a click away, and every deal managed from its card

The Pipeline tab under a mortgage market is rebuilt around transactions: - Open | Past | All views (past = completed or cancelled), with counts - headline numb...

Kamo·3w ago
PerformanceSecurityService

The mortgage pipeline loads in a handful of queries, and a deal can be renamed and take a second loan

The pipeline's two reads were N+1 on the round trip: - GET /mortgage-apps loaded plain AppMortgage rows, and each one then fired a SELECT per inverse @OneToO...

Kamo·3w ago
Fixkamo-internal

A tool menu stays selected on any of its pages and the pages beneath them

The last change lit a tool menu (Mail, Docs, Support, IoT, Settings, Cameras) only when a row's href was exactly the page open, and most rows carried no href at...

Kamo·3w ago
Fixkamo-internal

Numbers and addresses open their popups, unseen records in plain words, plain labels, rights cases

Approval follow-up 2026-10-21 (controller review of the approvals pane). - The headline draws every phone number and email address the card names (card.conta...

Kamo·3w ago
FeatureSecurityService

Approve and always allow checks the rights a tool needs in one case only

Approval follow-up 2026-10-21: the Tool Plane's card now names the rights a tool's service enforces in some cases only (alwaysAllow.rightsWhen: a colleague's le...

Kamo·3w ago
FixMCPGatewayService

Declare every right a tool's service enforces; plain words for unseen records and numbers

Approval follow-up 2026-10-21 (controller review of the approvals UI). Rights (item 4): an audit of every tool's declared rights against the rights its downstr...

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