KamoCRM

Live Change Log

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

18,584
Total Changes
6,665
Features
5,582
Fixes
30
Projects
Filter by project
All Projects18,584AIService282APIService179BillingService166ConversionService118DaemonService147DocsService258ESigService99EmailService629InitializerService344KBService162KlusterServices771MCPGatewayService277MediaService622RAGService79SecurityService2,025TranslateService62VOIPService265VectorService11kamo-apps29kamo-asterisk-support28kamo-capcha17kamo-capcha-widget4kamo-internal8,756kamo-login342kamo-marketing642kamo-nowww20kamo-register213kamo-shared-library1,861kamo-signer-monorepo61kamolos115
Filter by type
All TypesBuild23CI527Chore794Docs3,288Feature6,665Fix5,582Other1,001Performance174Refactor284Revert23Style45Test177Upgrade1
September 2, 2026
FeatureInitializerService

Commerce_quotes.billing_basis

The per-quote snapshot of the org's quoteConversionBilling choice, so a quote keeps the terms it was raised under after an administrator changes the setting. Nu...

Kamo·2mo ago
Featurekamo-shared-library

Bill the whole term up front, and say so on the quote

An org that charges up front saw the monthly rate on a three-year deal. The setting deciding that already existed — **************** — but it reached only Quote...

Kamo·2mo ago
FixEmailService

Make a listed message searchable, not merely stored

The index is written from two directions. Opening a message runs the full indexer, which writes the row and then computes its search_vector. Listing a folder wr...

Kamo·2mo ago
FixEmailService

Make label: search read the table that records labels

The clause tested si.label_ids, an array column on the search index. Nothing has ever written it — labelling a message inserts into email_metadata.message_label...

Kamo·2mo ago
Fixkamo-internal

Name the remaining twelve switches, and guard the trap that unnamed them

MUI 7 drops `inputProps` on Switch — silently, with no warning and no type error, so the aria-label never reaches the DOM. Nearly every switch in this app puts ...

Kamo·2mo ago
Fixkamo-internal

A search hit reads the same on your own messages as on everyone else's

The highlight inherited the bubble's text colour and drew itself as a 55% wash, and both of those quietly failed in the same place. The member's own messages ar...

Kamo·2mo ago
PerformanceEmailService

Index a message in one statement instead of a select-then-write

The search index row's key is assigned rather than generated, so handing a built entity to save() was a merge: Spring Data SELECTed the whole row — body text in...

Kamo·2mo ago
Fixkamo-signer-monorepo

State the first invoice on an option that has a setup fee

The card already listed the setup fee, but the only figure that summed it with the period price — the total over term — was gated on the commitment running long...

Kamo·2mo ago
Fixkamo-internal

Show the one-time setup fee in the option's figures

The card, the live rail and the print preview all led with the option's period total, and the only figure carrying the setup fee — the whole-term contract total...

Kamo·2mo ago
Fixkamo-shared-library

The one-time setup fee belongs in the quote's total

A setup fee typed on an option reached exactly one figure — QuoteOptionTotals put it in contractTotal — and applyOptionHeadlineTotals then built the quote's hea...

Kamo·2mo ago
ChoreInitializerService

Scan the Report Studio's repositories

**************** holds the saved views, shares, favorites, recents, schedules and schedule runs. The reports themselves are code rather than rows — only a membe...

Kamo·2mo ago
FeatureDaemonService

Tick SecurityService's scheduled-report sweep

Every five minutes. A schedule is set to the minute, so a finer tick buys nothing a member would notice and a coarser one makes an 8:00 report arrive at 8:15. ...

Kamo·2mo ago
FeatureSecurityService

Run the reports that are due, and send them

One internal endpoint, X-Internal-Auth gated and constant-time compared, that DaemonService ticks. The cron stays in the daemon because it is replicas: 1 with s...

Kamo·2mo ago
FeatureEmailService

Let a transactional send carry one attachment

Added for scheduled reports, which are a rendered PDF or workbook that has to reach people who may have no account — a link would not be a delivery for them. T...

Kamo·2mo ago
Featurekamo-shared-library

The email a scheduled report arrives in

REPORT_SCHEDULED, registered in CANONICAL_KEYS — absent from that list a template is a permanent 404, whatever files exist beside it. The body states the data ...

Kamo·2mo ago
Fixkamo-internal

Give the mail columns back their own scrollbars

The offline-banner fix stacked MessageBrowser's root into a flex-col and moved the three mail columns into a row of their own. That row was `flex flex-1 min-w-0...

Kamo·2mo ago
FeatureSecurityService

The lists a share dialog picks from, and a share target that fits every id

GET **************** returns the organization's people, departments and roles as picker options, in one call and in one shape. Built on the reporting option pro...

Kamo·2mo ago
Featurekamo-internal

Step through every search hit, not only the newest

The search at the top of a chat window marked every occurrence of the query and then scrolled to exactly one of them — the newest — with nothing to say how many...

Kamo·2mo ago
Featurekamo-shared-library

A service-work report, and a share target that fits every id

ServiceWorkReport is the tenth seed report and the one that makes row-level scope real rather than merely present. Commerce carries the platform's own/all pair ...

Kamo·2mo ago
Testkamo-internal

Guard the confirmation on a single-message delete

A member reported deleting the wrong email from /messages: the row's trash icon fired straight through to the API, so one stray click on the right edge of a row...

Kamo·2mo ago
Refactorkamo-internal

Drop the container ref nothing reads

containerRef was declared and attached to MessageBrowser's root element, but containerRef.current is never read anywhere in the file — it has been dead since it...

Kamo·2mo ago
Fixkamo-internal

Give the SEND TO AI switch an accessible name

The switch set its aria-label through `inputProps`, which MUI 7 drops on Switch without a warning — so the label never reached the DOM. The words SEND TO AI bes...

Kamo·2mo ago
Fixkamo-marketing

The summary line double-counted sections

A section page is itself one of the articles, so "291 articles, 16 areas, 29 sections" invited the reader to add up three numbers that do not add up. One number...

Kamo·2mo ago
PerformanceKBService

Stop repeating the ancestor chain on every node of a tree

A node inside a tree already knows where it is -- its position is the tree. Sending the ancestor chain on each one meant every article carried two ancestor refs...

Kamo·2mo ago
Fixkamo-internal

Open Send To AI from the report window instead of dispatching

The SEND TO AI switch handed the report over the moment it was filed. It POSTed a bodyless dispatch, which left SecurityService to choose the instruction, the m...

Kamo·2mo ago
Featurekamo-internal

Pin the well-known folders to the top of the sidebar

Inbox, Drafts, Sent, Junk, Trash and Archive stop moving. They hold that order at the top of the folder list, and everything the member made sits underneath und...

Kamo·2mo ago
Featurekamo-marketing

Rebuild the index as a map of the product

It was one recursive list of all three hundred articles, indented by depth. Everything was on the page and nothing was findable, and the page weighed 3.9 MB. T...

Kamo·2mo ago
Fixkamo-shared-library

ReportDefinition never shipped the narrower rights its resolver reads

ReportScopeResolver, its test and this class's own javadoc all name alsoGrantedBy, and ReportSecurityScope has had SELF/TEAM/ORGANIZATION since the framework la...

Kamo·2mo ago
Fixkamo-internal

Reach the conversation on screen when it is pages down the list

Switching the navigator to the right tab was only half an answer. The list pages by last activity, 30 rows at a time, and the conversation a member has maximize...

Kamo·2mo ago
Featurekamo-internal

The Report Studio — a library, and one renderer for every report

/reports is a shelf, not a card grid: two hundred identical rounded boxes is a wall to scan, and a row gives a report's name room to be read. Saved views nest u...

Kamo·2mo ago
FixKBService

A list read shipped every article's body, and a category page listed nothing

Two defects on the public reads, both visible on kamocrm.com/help-center. The index served 3.9 MB of HTML. tree-by-parent-slug returns every node with its full...

Kamo·2mo ago
Fixkamo-internal

Stop the offline banner standing as a column beside the mail

Same defect the search results bar had, in the same container. MessageBrowser's root was a horizontal flex row whose children are the columns of the mail client...

Kamo·2mo ago
FeatureSecurityService

Run, export and schedule the Report Studio's reports

The service half of the framework: the catalogue, the run, the pickers, four exporters, saved views and schedules. Authorization is explicit on every path, bec...

Kamo·2mo ago
Featurekamo-shared-library

The Report Studio framework, and nine reports built on it

A report is now a Java class here and nothing anywhere else. ReportDefinition describes what a report is, what it may be asked, which columns it has and how eac...

Kamo·2mo ago
Docskamo-internal

Say that the status-label save is a whole set, not a patch

The endpoint's meaning changed underneath this client: a status left out of the list is now a deletion rather than a no-op, which is what lets a label be remove...

Kamo·2mo ago
Featurekamo-internal

The importer, and three things it taught us

Publishes the corpus by driving the real KBService API rather than writing rows -- a direct INSERT skips the version row, the kb.article.published event that is...

Kamo·2mo ago
Fixkamo-marketing

Keep made-up article paths out of the index

The canonical check already stops a wrong path rendering the article -- it serves the not-found page instead. What it cannot do is change the status code: this ...

Kamo·2mo ago
TestSecurityService

Pin the status-label body an org sends to drop a label

The two shapes that used to fail: an empty list, which is what clearing the last remaining label sends and what the handler rejected as malformed, and an entry ...

Kamo·2mo ago
Fixkamo-internal

Send a cleared status label as a removal, not as silence

Emptying a custom label box and saving did nothing. The save built its payload from the labels that had text in them, so a box the org had just cleared was not ...

Kamo·2mo ago
FixSecurityService

Accept a blank status label as the removal it is

The PUT is the org's complete set of custom labels, so it has to be able to carry an emptied box. Two things stopped it: an empty list was rejected as a malform...

Kamo·2mo ago
Fixkamo-shared-library

Let an org put a custom status label back to blank

A status label had no way to be removed. The settings screen saved through an upsert-only bulk write, so the only thing a request could say was "this status is ...

Kamo·2mo ago
Fixkamo-internal

Do not claim nothing matched when a filter hid the matches

The empty-list explanation added with the search results bar keyed off the query alone, so it also fired when the search had matched plenty and the Unread or St...

Kamo·2mo ago
FixKBService

Article translation has never worked

deleteByArticleUidAndLocale is a @Modifying query and JPA refuses to run one outside a transaction. Nothing on this path ever opened one, so every locale of eve...

Kamo·2mo ago
Fixkamo-internal

Stop mail search opening a strip down the side of the screen

MessageBrowser's root element is a horizontal flex row whose children are the columns of the mail UI. The search results bar was written as a bottom bar -- bord...

Kamo·2mo ago
Fixkamo-internal

Follow the maximized chat window's tab in the navigator

Maximizing a chat popup left the conversation navigator on whatever tab it was already showing. `visibleRows` drops every row outside the active bucket, so the ...

Kamo·2mo ago
ChoreSecurityService

Rebuild against the shared library that persists the quote contact

The market writer landed one commit after this service was last built, and CI clones kamo-shared-library at image-build time — so the deployed jar still has the...

Kamo·2mo ago
Docskamo-internal

The Report Studio design — Java-defined reports, a generic renderer

Reports are defined as Java classes in kamo-shared-library and rendered by one capability-driven frontend, so adding a report is a new class and nothing else. ...

Kamo·2mo ago
Featurekamo-shared-library

Persist a market's quote-contact rule, and refuse a half-stated one

The DTOs carried quoteContactMode and quoteContactMemberId but no writer read them, so the setting round-tripped through the form and was silently dropped. Both...

Kamo·2mo ago
Featurekamo-internal

Choose who a quote names as the customer's contact

The market dialog gains "Quote's Future Contact" under Enable quotes: the lead's assigned agent, a choice made per quote, or one explicit person picked with the...

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