KamoCRM

Live Change Log

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

17,374
Total Changes
5,891
Features
5,258
Fixes
30
Projects
Filter by project
All Projects17,374AIService242APIService174BillingService157ConversionService110DaemonService137DocsService223ESigService91EmailService568InitializerService329KBService151KlusterServices738MCPGatewayService235MediaService592RAGService79SecurityService1,822TranslateService62VOIPService248VectorService11kamo-apps26kamo-asterisk-support27kamo-capcha17kamo-capcha-widget4kamo-internal8,321kamo-login335kamo-marketing641kamo-nowww20kamo-register213kamo-shared-library1,631kamo-signer-monorepo56kamolos114
Filter by type
All TypesBuild16CI523Chore773Docs3,252Feature5,891Fix5,258Other993Performance165Refactor278Revert23Style42Test159Upgrade1
September 2, 2026
Featurekamo-shared-library

PdfRedactor, so a covered word is actually gone

A filled rectangle drawn over an account number hides it from the eye and from nothing else: the glyphs stay in the page's content stream, and a copy-paste or a...

Kamo·1mo ago
Fixkamo-shared-library

Flush the link, so a refused write reaches the catch that reports it

link() is @Transactional(REQUIRES_NEW), so its transaction commits in the proxy after the method body returns. A plain save() of an entity whose id is generated...

Kamo·1mo ago
Fixkamo-shared-library

Return the contact's country, state and time zone

LeadDTO carried neither Lead.country, Lead.subdivision nor Lead.timezone, so the three fields were write-only: UpdateLeadRequest accepted them and LeadService w...

Kamo·1mo ago
Fixkamo-shared-library

An address is several lines, so send it as several lines

Splitting the suite out of addressLine was not enough — it left the street and the city sharing a line with the unit printed beneath them, which is worse than t...

Kamo·1mo ago
Featurekamo-shared-library

A setup fee on a single-price quote, and the suite on its own line

Two things a quote could not state. A one-off setup fee lived only on QuoteOption, where each alternative carries its own. A flat sheet has no option to hang o...

Kamo·1mo ago
Refactorkamo-shared-library

Expose repricing as a static so a backfill can reuse it

Quote money columns are written, not computed on read, so an engine correction leaves existing rows carrying the old arithmetic until something saves them. A mi...

Kamo·1mo ago
Testkamo-shared-library

Pin the quote letter's dotted templateKey, as the HR family already is

The constant is not the templateKey. CanonicalTemplateLoader.load derives only the FILENAME from the constant (QUOTE_SENT -> quote-sent.json) and reads template...

Kamo·1mo ago
Fixkamo-shared-library

Restore the timestamp that every lead association depends on

A method was inserted between @CreationTimestamp and the dateCreated field it annotates, so the annotation bound to subject() instead. These entities are read b...

Kamo·1mo ago
Fixkamo-shared-library

A unit price is a MONTHLY rate, so the term multiplies it

The engine treated an option's line-item sum as the price for the whole billing period and divided down to reach a monthly figure. It is the other way round. P...

Kamo·1mo ago
Featurekamo-shared-library

Let an event invite its guests, and put it on their calendar

Saving an event told nobody. The guest list was materialized and the audience stored, and the people on it heard nothing until a reminder fired — which reaches ...

Kamo·1mo ago
Fixkamo-shared-library

A three-year deal totals three years, not one month of it

Two faults, both showing a monthly figure where the term's value belonged. 1. The headline took periodTotal + setup. On a MONTHLY option committed to 36 mon...

Kamo·1mo ago
Docskamo-shared-library

The check constraint a fourth visibility would break

Hibernate wrote `check (visibility in **************** 'PLATFORM_ADMIN_ONLY'))` when it created report_catalog. ddl-auto adds columns and never rewrites a const...

Kamo·1mo ago
Featurekamo-shared-library

Let the platform decide who may see each report

MANAGE_REPORTS, appended to PlatformRightType, and a REPORT_CATALOG override row per report holding one of ALL_ORGS, PLATFORM_ORG_ONLY or PLATFORM_ADMIN_ONLY. ...

Kamo·1mo 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·1mo 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·1mo 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·1mo 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·1mo 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·1mo 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·1mo 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·1mo 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·1mo ago
Featurekamo-shared-library

A market decides who a quote names as the customer's contact

QuoteContactMode gives a LeadMarket three answers: the lead's assigned agent (resolved per read, which is what every quote does today and what a null column mea...

Kamo·1mo ago
Featurekamo-shared-library

Article-to-article relations

KB_ARTICLE_RELATIONS holds the curated "see also" links between articles in one knowledge base. Rows are per direction and the pair is kept symmetric by KbArtic...

Kamo·1mo ago
August 31, 2026
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·1mo 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·1mo ago
August 30, 2026
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·1mo ago
Fixkamo-shared-library

Declare removedByMemberId, or the relay drops it in silence

The NATS payload for MEMBER_REMOVED carries who did the removing, but the NATS→STOMP relay projects every frame through ChatMessageDto — so a field this class d...

Kamo·1mo ago
Featurekamo-shared-library

A chat can be named, starred, and have somebody removed from it

Three fields and one method, all of which the chat feature already had the shape for and none of which it could record. MEDIA_SESSION_CHAT gains TITLE. That ta...

Kamo·1mo ago
August 29, 2026
Featurekamo-shared-library

The deposit account an organization asks customers to pay into

Six columns on `orgs` and the wire contract for printing them on a quote, so a company that receives one knows where to send the money without telephoning to as...

Kamo·1mo ago
Featurekamo-shared-library

A domain is claimed by proving it, not by typing it

Three rules, and they only make sense together. **Naming a domain claims nothing.** An FQDN was globally unique here, so the first organization to enter "acme....

Kamo·1mo ago
August 28, 2026
Featurekamo-shared-library

A security model says where each member type lands on "/"

Three columns on ChildOrgSecurityModel — DEFAULT_MEMBER_HOME_SCREEN, **************** DEFAULT_ORG_OWNER_HOME_SCREEN. Each holds HOME_SCREEN_DEFAULT or REQUIRES_...

Kamo·1mo ago
Chorekamo-shared-library

Remove the CREATE_FREE_ORG_WIDGET block with its widget

The Create My Free Org launchpad widget was removed (kamo-internal ab740dd3), so its five rights go with it: CREATE_FREE_ORG_WIDGET (288) and the four policy ch...

Kamo·1mo ago
Featurekamo-shared-library

Create My Free Org widget rights and Getting Started wizard progress

Adds RoleRightType 288-292 (CREATE_FREE_ORG_WIDGET and its four ADDED/OPTIONAL/ REQUIRED/MOVABLE policy children), hung off CREATE_CHILD_ORG (131). Adds OrgSetu...

Kamo·1mo ago
Docskamo-shared-library

Record that Organization.YEAR_EST is optional and may be cleared

The column was always nullable and both server paths already handled null — CreateOrganizationPayloadParser maps an empty or unparseable value to null, and patc...

Kamo·1mo ago
Featurekamo-shared-library

A security group per app, and the master notes as widgets

Ten new rights, 278-287: NOTES_MASTER_MINE_WIDGET and NOTES_MASTER_OURS_WIDGET, each with the four policy children every home widget carries. Both hang off VIEW...

Kamo·1mo ago
August 27, 2026
Featurekamo-shared-library

The credit note, the only correction path for a finalized invoice

B3: Kamo owns everything before finalize() and the provider owns everything after, and every provider on the roadmap treats a finalized invoice as immutable. So...

Kamo·1mo ago
Featurekamo-shared-library

The document counter, and a number that cannot fork

Every existing document number on this platform is a check-then-insert race with no unique constraint behind it: quote numbers are COUNT(...)+1, subscription in...

Kamo·1mo ago
Featurekamo-shared-library

The invoice entity, with every tax field and no tax engine

Kamo's own invoice, written only by InvoicingService. Nothing on it is supplied by a caller: every figure is derived from the lines on every write, which is the...

Kamo·1mo ago
Featurekamo-shared-library

MANAGE_BILLING_PROVIDER (277), a child of commerce settings

Task 8, mirror 1 of 6 (the Java enum) and mirror 2 (the parent(...) line). Id 277 was re-derived from origin/main immediately before allocating it, NOT taken f...

Kamo·1mo ago
Fixkamo-shared-library

Filter every durable consumer to its own subject

A durable created through NatsMessageService.subscribe carried no filter subject, so it received the WHOLE stream regardless of the subject it was asked for. Th...

Kamo·1mo ago
Featurekamo-shared-library

Per-viewer read state for system bug reports

SystemBugView is per VIEWER, not per bug — a firstViewedAt column on SystemBug would let whoever opened a report first clear it off every other manager's badge....

Kamo·1mo ago
Featurekamo-shared-library

The canonical letter a bug reporter gets when their report moves

A member who files a bug or an enhancement had no way to learn what happened to it short of opening the tab and looking. This adds the template that tells them,...

Kamo·1mo ago
Featurekamo-shared-library

Attribute free extensions to the server they are on

An org running a busy FreePBX server beside a new, empty KamoPBX server saw "21 billable extensions — $63.00 / month" while looking at the KamoPBX one. Both num...

Kamo·1mo ago
Featurekamo-shared-library

The company phone toggles an individual signature can carry

Two org-wide flags on email_signature_field_config: user_company_phone_main and user_company_phone_toll_free. They put the organization's published line on a me...

Kamo·1mo ago
Featurekamo-shared-library

The inbound-keyword receipt, and re-key consent by campaign (MS1 Task 3)

Two things the consent ledger needs before an inbound STOP can be recorded tenant-scoped and exactly once. `SmsInboundReceipt` (comms_sms_inbound_receipt) is t...

Kamo·1mo ago
Featurekamo-shared-library

The sync journal, and a terminal run that really is frozen

BL1 Task 5, shared-library half. Five journal enums, three entities and three repositories under **************** No stereotypes: BillingWormGuard is a plain fi...

Kamo·1mo ago
Featurekamo-shared-library

E.164 normalizer and SMS keyword interpreter (MS1 Task 1)

Two pure classes with no I/O and no Spring stereotype, so every service can load them and SharedLibBeanSafetyTest stays green. E164.normalize(raw, defaultRegio...

Kamo·1mo ago
Featurekamo-shared-library

The provider connection row, one per org

BL1 Task 1. A near-verbatim transliteration of the payroll provider enums and PayrollConnection into **************** Enums, one entity and one repository — no ...

Kamo·1mo ago
Docskamo-shared-library

The bug-report association holds video too

SYSTEM_BUG_SCREENSHOT now carries screen recordings alongside screenshots. The constant keeps its name and its id — id 17 is written into assoc_id on every row ...

kamo·1mo ago
Featurekamo-shared-library

CreateJob, so a work order can be raised without an order

The one verb the service-job surface was missing. Until now the only thing on the platform that could produce a ServiceJob row was **************** off a paid o...

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