KamoCRM

Live Change Log

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

17,395
Total Changes
5,910
Features
5,260
Fixes
30
Projects
Filter by project
All Projects17,395AIService242APIService174BillingService157ConversionService110DaemonService137DocsService223ESigService91EmailService568InitializerService329KBService151KlusterServices738MCPGatewayService235MediaService592RAGService79SecurityService1,830TranslateService62VOIPService248VectorService11kamo-apps26kamo-asterisk-support27kamo-capcha17kamo-capcha-widget4kamo-internal8,328kamo-login335kamo-marketing641kamo-nowww20kamo-register213kamo-shared-library1,637kamo-signer-monorepo56kamolos114
Filter by type
All TypesBuild16CI523Chore773Docs3,252Feature5,910Fix5,260Other993Performance165Refactor278Revert23Style42Test159Upgrade1
August 5, 2026
FeatureDaemonService

Drive the mail-to-lead association sweep

Five-minute tick against EmailService's internal sweep endpoint, mirroring VoipGlobalSyncJob. The schedule lives here because EmailService runs several pods and...

Kamo·2mo ago
FeatureEmailService

Associate lead correspondence, and fix the dead push indexer

Adds the mail half of the lead Communications tab, plus the ingestion it needed to exist at all. The platform has no working mail push: IMAP IDLE is hardcoded ...

Kamo·2mo ago
FeatureVOIPService

Persist calls and associate calls, texts and voicemail with leads

Calls were never recorded anywhere — VoipCallEventService published a NATS event for the browser and kept nothing, and RECORDINGS only exists when audio was cap...

Kamo·2mo ago
FeatureInitializerService

Schema and contact-point seed for lead communications

Hibernate creates the three new tables from the shared-lib entities; this adds what it cannot express — the partial unique index that keeps at most one open con...

Kamo·2mo ago
Featurekamo-shared-library

Point-in-time contact-point index and lead communication links

Adds the spine the lead Communications tab reads from. LEAD_CONTACT_POINTS records every phone number and e-mail a lead has ever had, as a window with activeFr...

Kamo·2mo ago
FeatureMediaService

Capture the demo lead before the booking step

The marketing site's demo form collected name, email, company, company size, industry and a message, then advanced to scheduling without telling anyone. Lead cr...

Kamo·2mo ago
Featurekamo-shared-library

Public demo-request lead capture primitives

A visitor who fills in the marketing site's demo form but never books a time left no trace: the lead was only ever written inside the booking transaction. Captu...

Kamo·2mo ago
Featurekamo-internal

Register Provider Setup in navigation, and write the quick tips

The Provider Setup tab rendered inside SettingsView but was reachable only by typing the URL — it was missing from both places that list settings destinations: ...

Kamo·2mo ago
Featurekamo-internal

Enforce geo and IP access rules on page loads

checkAccess evaluated the rules itself and matched nothing for its entire life: it compared rule types against **************** while the publisher writes the e...

kamo·2mo ago
FeatureAPIService

Enforce tenant access rules at the gateway

This filter has been inert since it was written. resolveOrgId read org:domain:<host> from Redis, nothing ever wrote that key, and the null return fell through t...

Kamo·2mo ago
FeatureSecurityService

Actually enforce geo and IP access rules

The rules were stored, cached to Redis and never consulted. AccessCheckController was the only caller of the evaluation and nothing called AccessCheckController...

Kamo·2mo ago
Featurekamo-internal

Platform registration card for the Zoom Marketplace app

Completes Zoom's one-click connect path. The backend already resolves PlatformOAuthProviderType.ZOOM, but with no card here a platform operator had nowhere to e...

Kamo·2mo ago
Featurekamo-internal

Microsoft Teams Phone provider, front to back

Adds Teams to **************** and wires the whole path through: provider selection, the Entra + Azure Communication Services config, tenant admin consent, the ...

kamo·2mo ago
FeatureVOIPService

Microsoft Teams Phone as a provider

Teams is not one API, so the provider glues three control planes together: • Graph, app-only — call history (getPstnCalls), presence reads, directory and...

Kamo·2mo ago
Featurekamo-internal

Provider Setup tab and capability-gated meeting settings

Adds the Provider Setup tab to /settings/features/meets and makes every other tab honest about the provider it is configuring. useMeeting no longer builds meet...

Kamo·2mo ago
Featurekamo-shared-library

MICROSOFT_TEAMS provider type

Appends MICROSOFT_TEAMS to VoipProviderType. The enum persists as ORDINAL on **************** so the position is load-bearing and the constant goes last; the cl...

Kamo·2mo ago
FeatureAPIService

Route the meeting provider OAuth callback

Zoom and Microsoft redirect the browser to this gateway after an org authorises Kamo's app. The popup lands here with no tenant session — the org travels in ?st...

Kamo·2mo ago
FeatureMediaService

Meeting provider abstraction with Zoom and Microsoft Teams

Meetings were Kamo Meets by construction — MeetService persisted a Meet room name and nothing else. This introduces the abstraction and two remote providers beh...

Kamo·2mo ago
FeatureInitializerService

Schema for the multi-provider meeting layer

Creates **************** and org_meeting_oauth_tokens, adds the provider-identity columns to MEETING_RECORDS and MEETING_RECORDINGS and the Zoom/Teams-capable s...

Kamo·2mo ago
Featurekamo-shared-library

Model meetings as provider-agnostic

Kamo Meets was the only possible backend: OrgMeetConfig was a flat Meet settings bag and a MeetingRecord held nothing but a room name. This adds the schema for ...

Kamo·2mo ago
Featurekamo-internal

Allow-list countries on the geo-blocking card

The card could only deny countries, so an org that serves one country had to enumerate every other one. It now has both lists: a mode toggle picks which list th...

kamo·2mo ago
FeatureSecurityService

Allow-list countries alongside geo blocks

The geo section only ever denied: a country was blocked or it was absent. Orgs that want to serve one country had to enumerate every other one, which is unmaint...

Kamo·2mo ago
Featurekamo-shared-library

Read quality on adjustments and guideline versions

An assembled price is a base cell PLUS the adjustments stacked onto it, so judging only the cell judges half the number: a cleanly-read 99.875 with a misread -1...

Kamo·2mo ago
Featurekamo-internal

Open links back into this app in the tab the member is already in

Mail in the reading pane opens every link in a new tab, which is right for the whole internet and wrong for us. Our notification emails are almost entirely link...

kamo·2mo ago
Featurekamo-shared-library

Per-cell extraction confidence + eligibility-matrix provenance

Two gaps in the confidence model, both on the money path. PER-CELL. A sheet-wide floor is the wrong grain for judging one price: a single badly-read coupon dra...

Kamo·2mo ago
Featurekamo-internal

Show the agent's phone, toll-free and email on the preview

Each on its own line: a run-on of two numbers and an address reads as one string and gets dialled wrongly.

kamo·2mo ago
FeatureSecurityService

Resolve the agent's published contact details

Email comes from the member's primary mailbox rather than TeamMember.emailWork — that column is free text predating mailbox provisioning and routinely disagrees...

Kamo·2mo ago
Featurekamo-shared-library

Publish every way to reach the agent, not just a name

Name and title alone tell a customer who owns the quote but not how to ask about it. The block now carries email and phone, resolved by the caller — the primary...

Kamo·2mo ago
Featurekamo-shared-library

Extraction confidence on the catalog spine + auto sign-off basis

A price is only as trustworthy as the sheet it was assembled from, and nothing on the pricing path carried that signal: confidence existed ONLY on pre-promotion...

Kamo·2mo ago
Featurekamo-internal

Quotes tab — every quote across the account's leads

A server-paged DataGrid beside Leads, with search over number and title, status, total range and created-date range. Filters share one debounce and collapse in...

kamo·2mo ago
FeatureSecurityService

GET /quotes/account/{uid} — paged, filtered, sorted

Dates arrive as ISO strings and parse leniently: a filter the client sends badly should narrow nothing rather than 400 the whole grid. A date-only "to" bound co...

Kamo·2mo ago
Featurekamo-shared-library

Page and filter an account's quotes in the database

An account view needs every quote across all its leads. Loading them to render a page degrades every month the account is in use, and any total shown would only...

Kamo·2mo ago
Featurekamo-signer-monorepo

Show the assigned agent on the customer's copy

Matches the staff preview: the letterhead names the org, this names the person to ask.

Kamo·2mo ago
Featurekamo-internal

Show the assigned agent on the preview

A "Your contact" panel above the footer — name, title, phone and email — so the customer knows who to ask about the price. Absent entirely when the lead is unas...

kamo·2mo ago
FeatureSecurityService

Resolve the agent alongside the customer, from one lead lookup

Both blocks come off the same lead, so the controllers fetch it once and derive each from it rather than hitting the service twice per render. Still org-scoped ...

Kamo·2mo ago
Featurekamo-shared-library

Name the lead's assigned agent on the document

The letterhead identifies the org, but a customer with a question about a price needs the person who owns the relationship. The quote now carries the lead's ass...

Kamo·2mo ago
Featurekamo-internal

Reassign the agent holding an opportunity

The approver's dialog gains an agent picker, drawn from the same pool the backend validates against. The grid's Agent column now shows who HOLDS the opportunity...

kamo·2mo ago
FeatureSecurityService

Reassign the holding agent, and email everyone it affects

An approver can now hand an opportunity to a different agent. The requester is never rewritten — applyPrimaryAgent records the move as its own history row with ...

Kamo·2mo ago
FeatureEmailService

Preview samples for the nine opportunity notifications

Without an arm here the admin Email Templates editor renders every placeholder blank, so anyone customising these nine would be editing an empty skeleton. One ...

Kamo·2mo ago
FeatureInitializerService

Reassignable primary agent on a reserved opportunity

PRIMARY_AGENT_MEMBER_ID is who holds the opportunity now; REQUESTED_BY_MEMBER_ID is left untouched forever. Nullable with no backfill on purpose — null means "n...

Kamo·2mo ago
Featurekamo-shared-library

Reassignable primary agent, and nine notification templates

An approver can hand an opportunity — and the commission with it — to a different agent. PRIMARY_AGENT_MEMBER_ID is who holds it now; REQUESTED_BY_MEMBER_ID is ...

Kamo·2mo ago
August 4, 2026
Featurekamo-internal

Overall commission, market defaults, and no pre-picked units

Three changes to how commission is captured. Nothing is pre-selected any more. Percent/Amount and One-time/Recurring both start unset on every commission split...

kamo·2mo ago
FeatureSecurityService

Agree an overall commission at approval, seeded from the market

The approver now records what the organization pays on the sale to the requesting agent and their group. Omit it on approve and the lead's market default applie...

Kamo·2mo ago
FeatureInitializerService

Commission columns for reserved opportunities and market defaults

Six nullable columns: the overall commission agreed on a reserved opportunity, and the market default that pre-fills it at approval. NUMERIC(19,4) to match the ...

Kamo·2mo ago
Featurekamo-shared-library

The overall commission on a sale, and market defaults for it

A reserved opportunity now records what the organization pays out of the sale to the requesting agent and the group they share with — the pot the per-colleague ...

Kamo·2mo ago
Featurekamo-internal

Render the client's details on the preview, from the lead

Removing the quote's own addressee fields left "Prepared for" blank, because customerName only ever came from a linked Account and lead-raised quotes have none....

kamo·2mo ago
Featurekamo-signer-monorepo

Show the client's details on the customer's copy

Company heads the block when there is one — a quote to a business is addressed to the business, with the contact named beneath it. Matches the staff preview exa...

Kamo·2mo ago
FeatureSecurityService

Resolve the addressee lead for both the staff and customer views

Org-scoped in both places. On the public page the scope comes from the share link's own organization, so a token can never surface a lead belonging to another t...

Kamo·2mo ago
Featurekamo-shared-library

Put the client's details on the document, read off the lead

Dropping the quote's own addressee fields left the document with nothing to say about the client: customerName only ever came from a linked Account, which lead-...

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