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
September 2, 2026
Fixkamo-internal

Ride down to your own message when you had scrolled up

Sending while scrolled up into the history left the member parked where they were, with their own message appended below the fold. From the seat it looks exactl...

Kamo·4w ago
Docskamo-internal

Design for the Help Center KB build, related articles, and public wiring

Covers the 248 source drafts under Documentation/, the tree they map to under the existing Help Center article, the new KB_ARTICLE_RELATIONS feature, and the th...

Kamo·4w ago
FeatureSecurityService

Page and search the org directory, and stop two row builders drifting

The networks endpoints answer with the whole set in one body. That is fine for a member of a dozen orgs and impossible for an operator on an estate meant to rea...

Kamo·4w ago
Otherkamo-internal

Take the two "could not start" fallbacks out of the source

Both SMS refusal paths quote the server when it gives a sentence and fall back to one of their own when it gives only a machine code. Those two fallbacks were E...

Kamo·4w ago
August 31, 2026
Featurekamo-marketing

Starter base up $10 on every term

69 / 59 / 49, from 59 / 49 / 39. The commitment ladder is untouched by design — still exactly $10 off for a year and $20 for three — which is the standard every...

Kamo·4w ago
Fixkamo-internal

Offer the billing term up front, and stop hiding it over Enterprise

Two separate ways this page withheld the choice. The org console HAD a three-term control, but it was tucked into the right of the "Choose plan" heading behind...

Kamo·4w ago
Fixkamo-internal

Quote the commitment saving in dollars on the plan cards

The discount is a flat $10 a year and $20 on three years, which is how the catalog sets it and how it is advertised everywhere else. Rendered as a percentage it...

Kamo·4w ago
Docskamo-internal

Say which subscription the launchpad pill's gate is about

"Not already paying" means the VIEWER's own seat — the same question the Plans & billing page answers when it decides whether to offer them one. Worth stating, ...

Kamo·4w ago
FixBillingService

Stop offering the internal platform-owner plan for sale

listPlansForMarket filtered on isActive alone, and active is not the same as on the menu. OWNER_UNLIMITED ("Platform Owner — Internal") is active, carries no pr...

Kamo·4w ago
Featurekamo-internal

The running offer, on Plans & billing and on the launchpad

The console quoted list prices while kamocrm.com advertised a third off the same plan, because nothing in kamo-internal could see that an offer existed. It now ...

Kamo·4w ago
FeatureBillingService

Serve the running offer, and say whether a seat is actually PAID for

Adds GET /markets/{id}/promotion. There was no way for an in-app buying surface to know an offer was running at all — the marketing site read promotions through...

Kamo·4w ago
Fixkamo-marketing

Set "/seat/month" to the right of its own line

The price keeps the left edge and the unit takes the right, so the two bracket the card's width instead of stacking flush left — which left the number looking l...

Kamo·4w ago
Featurekamo-marketing

The offer reaches the hero and the pricing strip

The hero had a countdown ribbon already, and it had been rendering NOTHING since the catalog moved to a percentage: `pickHeroOffer` filtered on FLAT_PER_SEAT be...

Kamo·4w ago
Fixkamo-marketing

Put "/seat/month" under the price, not beside it

Three-figure rates and "/seat/month" do not share a line on a four-across card. Inline at 1rem the label either wrapped mid-text or squeezed the number it was d...

Kamo·4w ago
Fixkamo-marketing

A promotion that fails to resolve must not widen to every plan

An EMPTY applicablePlanIds means "no restriction" downstream, so a restriction that fails to TRANSLATE must not be allowed to become an empty list. A Business-o...

Kamo·4w ago
ChoreSecurityService

Rebuild to pick up BillingCycle.TRIENNIAL

No source change. SecurityService clones kamo-shared-library at image-build time, and the catalog it serves is about to carry TRIENNIAL price rows. @Enumerated ...

Kamo·4w ago
Fixkamo-marketing

A promo code works on its own last day

The end date is the LAST day a code works, not the first day it does not — SubscriptionPromotions.check reads it that way on the server, and the offer band's co...

Kamo·4w ago
Featurekamo-marketing

A three-term commitment rail, and a promotion the page can prove

New prices: Starter $59/$49/$39 and Business $119/$109/$99 per seat per month on monthly, yearly and three-year terms. The rail replaces the monthly/annual pair...

Kamo·4w ago
Featurekamo-internal

Sell the three-year term, and stop four copies of the cycle drifting

The billing cycles were typed out by hand in five places. One of them, the plan-pricing editor, offered "BIENNIAL" — a value the server has never had — so choos...

Kamo·4w ago
FeatureBillingService

Bill the three-year term, and quote its rate to the console

BillingCycles gains TRIENNIAL, expressed to Stripe as three YEARs rather than thirty-six MONTHs so the renewal tracks the signup anniversary — the same reason A...

Kamo·4w ago
Featurekamo-shared-library

A three-year term, and the promotion rules that were never read

Adds BillingCycle.TRIENNIAL so a subscriber can commit for three years. The column is varchar with no CHECK constraint anywhere, so this needs no migration — bu...

Kamo·4w ago
Featurekamo-internal

Show the report title in Send To AI, editable

The dialog let an operator edit the instruction and the description but never showed the title, and the title was not in the message either — the session at the...

Kamo·4w ago
FeatureSecurityService

Put the report title in the message, and let it be corrected

A dispatch composed the operator's instruction and the bug description with the separator between them. The title was never in it, so the session opening the me...

Kamo·4w ago
Featurekamo-shared-library

Carry the report title through a Send To AI dispatch

The dispatch sent the operator's instruction and the bug description and nothing else, so the one line saying what the report is ABOUT never reached the session...

Kamo·4w ago
August 30, 2026
Fixkamo-internal

Land the header's Text, Chat and Note buttons on the tab they name

The lead view keeps its tab selection in the URL — `tab` for the main tab, `commsTab` for the Communications sub-tab — and a header quick action sets both: "Tex...

Kamo·4w ago
Fixkamo-internal

Say why a number could not be opened, instead of an empty dialpad

Opening the SMS tool on a phone number resolves a conversation for it first, and that resolve can be refused — VOIPService answers "no number to text from" with...

Kamo·4w ago
Featurekamo-internal

Reply to a message, and take the reader to what it answers

MediaService has carried a reply's parent and the quote to draw for it since "send the quote with a reply, not just the pointer"; this is the half that shows it...

Kamo·4w ago
Fixkamo-internal

Stop offering an edit once somebody else has read the message

Every chat window that draws a MessageBubble — the member chat popups, and the social and ticket conversations that share ChatBox — offered Edit on the sender's...

Kamo·4w ago
FixMediaService

Refuse an edit once another member has read the message

PATCH /api/media/messages/{id} was deliberately ungated on receipts, unlike the DELETE beside it. The reasoning written into it was that unsend makes read words...

Kamo·4w ago
Fixkamo-internal

Darken the xAI mark so it shows on the provider dropdown

Simple Icons ships the xAI glyph filled #FFFFFF, which is its brand color on a dark surface. The AI provider dropdown is white and the app forces light mode, so...

kamo·4w ago
Featurekamo-internal

Offer Move on a right-clicked message, not only on a ticked one

Right-clicking a message offered Reply, Reply all, Forward, Report Spam, Archive, Label and Delete. Filing it anywhere other than Archive meant dismissing the m...

kamo·4w ago
Featurekamo-internal

Go To Settings leads the Settings menu, above the app list

Reported with two screenshots — one org with eleven enabled apps, one with two — each circling "Go To Settings" at the bottom of the Settings sub-option menu wi...

kamo·4w ago
Fixkamo-internal

Let a bulk move reach the folders the member made

The "Move to folder" dialog behind the selection bar was built from a literal ['INBOX', 'Archive', 'Trash', 'Junk', 'Drafts'], so the only destinations it ever ...

Kamo·4w ago
Fixkamo-internal

Never leave a blank tab when a KamoDesktop launch stalls

The tab is opened blank inside the click gesture and only navigates once a link comes back. So anything slow upstream showed as a blank white page with no expla...

kamo·4w ago
FixSecurityService

The agent health preflight must fail in seconds, not twenty

health() inherited the client's 20-second default. It is a liveness check in front of every KamoDesktop launch, and when the dev machine ran out of memory on 20...

Kamo·4w ago
FeatureKlusterServices

64G swap on the dev machine, and catch access that fails intermittently

The blank white page was the VM out of memory. 16Gi of guest RAM with NO swap means "out of memory" goes straight to the OOM killer: applications die mid-work, ...

Kamo·4w ago
Featurekamo-internal

Make smart folders reachable, and make clicking one work

A smart folder is a saved search that sits where a folder sits: name a question once ("unread, with an attachment") and it is one click away, current every time...

kamo·4w ago
FixEmailService

Serve smart folders and labels as messages, not as index rows

Both endpoints answered out of email_metadata.search_index and handed the client what the table holds. A smart folder returned SearchIndexEntity — messageUid, f...

Kamo·4w ago
FeatureMediaService

Send the quote with a reply, not just the pointer

media_objs_msg.parent_id has been there all along and this endpoint has accepted parentId on the way in since threading was modelled, but a reply crossed the wi...

Kamo·4w ago
Fixkamo-internal

Make eslint actually run

`eslint .` reported nothing at all — not a clean tree, but a crash before it loaded a single file: TypeError: Converting circular structure to JSON at ...

Kamo·4w ago
Fixkamo-internal

The report form's questions move off the field's border

A member filed this against the report form itself: "What happened?" — and "What would you like to see?" on the enhancement side — had the field's border runnin...

Kamo·4w ago
Fixkamo-internal

A stamp that says which day, once the day is in doubt

Reported by a member: past chats cannot be identified or verified by the date they were sent or received — only a time is present. Their own history runs back t...

Kamo·4w ago
Fixkamo-internal

A new chat shows the exchange instead of going blank

Open a new AI chat, type a message, and the thinking bullets appeared and then nothing — no sent message, no reply, just the empty-conversation panel over a tra...

Kamo·4w ago
Fixkamo-internal

Let the sidebar's calendar checkboxes actually turn off

The checkbox beside each calendar was bound to `calendar.isVisible` and its onChange was `fetchEvents`. `isVisible` is sent by EmailService and written back by ...

Kamo·4w ago
FixMediaService

Spend the site deletes before the replacements are written

Editing a report came back "The bug could not be saved: Internal Server Error" whenever the reporter left a site ticked — so every edit about the title, the des...

Kamo·4w ago
Featurekamo-internal

Leave a group chat, and keep the line that records it

Leaving is offered at the foot of the roster popover, separated from the rows above it because it belongs to the member rather than to anyone in the list, and c...

Kamo·4w ago
FeatureMediaService

Leave a group chat, and keep join/leave lines in the transcript

Leaving is DELETE /sessions/{guid}/membership, not removeMember aimed at yourself — that route refuses self-removal on purpose. Removal is done TO somebody and ...

Kamo·4w ago
Fixkamo-shared-library

A join/leave row has to carry the name of who it is about

The id alone cannot be resolved in the one case these rows exist for. A "removed" or "left" line names somebody who is, by then, no longer in the session, so th...

Kamo·4w ago
Fixkamo-internal

The Favourites header must control an element that exists

Collapsing the section unmounted the list it named through `aria-controls`, leaving the header pointing at nothing. `aria-expanded` then describes a disclosure ...

Kamo·4w ago
FixMediaService

Forward removedByMemberId to the browser

The relay copies named fields off ChatMessageDto onto the STOMP frame, so a field it does not copy is dropped even once the DTO declares it. MEMBER_REMOVED now ...

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