KamoCRM

Live Change Log

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

18,586
Total Changes
6,667
Features
5,582
Fixes
30
Projects
Filter by project
All Projects18,586AIService282APIService179BillingService166ConversionService118DaemonService147DocsService258ESigService99EmailService629InitializerService344KBService162KlusterServices771MCPGatewayService277MediaService622RAGService79SecurityService2,025TranslateService62VOIPService265VectorService11kamo-apps29kamo-asterisk-support28kamo-capcha17kamo-capcha-widget4kamo-internal8,758kamo-login342kamo-marketing642kamo-nowww20kamo-register213kamo-shared-library1,861kamo-signer-monorepo61kamolos115
Filter by type
All TypesBuild23CI527Chore794Docs3,288Feature6,667Fix5,582Other1,001Performance174Refactor284Revert23Style45Test177Upgrade1
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·3mo 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·3mo 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·3mo 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·3mo 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·3mo ago
Fixkamo-marketing

Submit the lead at step 1 instead of only on booking

handleFormSubmit checked the *** and advanced the step — it made no network call at all, so the contact details a visitor typed were only ever persisted if they...

Kamo·3mo 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·3mo 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·3mo ago
Fixkamo-internal

Withhold the reply box from senders that cannot receive one

Sending a quick reply to a KamoCRM notification put the literal text `{"error":"Invalid Addresses"}` in the reply box. The mail server had rejected NoReply@Kamo...

kamo·3mo ago
FixEmailService

Address replies at Reply-To, and stop leaking SMTP exceptions to the UI

A quick reply to a KamoCRM notification failed with `{"error":"Invalid Addresses"}` rendered verbatim in the reply box. That string is Jakarta Mail's own wordin...

Kamo·3mo 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·3mo ago
ChoreVOIPService

Drop the now-dead mailbox parameter and local

Follow-up to c7cb180: once the mailbox left the voicemail id, toVoicemailEntry's mailbox argument and the graphReady local had no remaining readers.

Kamo·3mo ago
Fixkamo-internal

Outbound Teams call party, live audio devices, provider-aware prompt

Three confirmed findings from the review of 08cecc6d. Outbound Teams calls showed the wrong remote party. TeamsAcsSession derived remoteNumber/remoteName from ...

kamo·3mo ago
FixVOIPService

Close a cross-mailbox hole and six more Teams defects

Adversarial review of 6df0008 confirmed 24 findings. The important ones: CRITICAL — any member could delete a colleague's mail. Teams voicemail ids were compos...

Kamo·3mo 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·3mo 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·3mo 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·3mo 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·3mo 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·3mo 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·3mo 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·3mo 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·3mo 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·3mo 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·3mo 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·3mo 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·3mo ago
Fixkamo-internal

Fit the trail in one pane — no wrapped intro, no double scrollbar

Three things made the tab feel cramped: The intro was capped at 900px, which broke a 170-character sentence onto a second line for no reason; it now uses the w...

Kamo·3mo 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·3mo 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·3mo ago
Refactorkamo-internal

Move System Debug under Platform Administration

**************** diagnostics are operator tooling, not an access rule, so the tab now sits at **************** behind the platform-admin guard instead of MANAGE...

kamo·3mo ago
Fixkamo-internal

PHI access audit tab layout + its missing menu entry

The tab rendered its content flush against the card border: SettingsView's tab panel supplies no padding of its own, and this tab was the one manager that never...

Kamo·3mo 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·3mo 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·3mo ago
FixSecurityService

Fall back through every number the agent holds

An extension with no org line to hang it off is undialable, so the resolver falls back to a number the member actually has rather than publishing nothing.

Kamo·3mo ago
Fixkamo-shared-library

Publish the agent's cell when it is the only number they have

An agent's number can live in any of three columns and commonly sits in only one: e_phone_number on the team member, m_phone_number and m_cell_number on the mem...

Kamo·3mo ago
Fixkamo-internal

Cleaner invite mark in the chat message

The chat invite led with the video-camera emoji, which the message renderer scales to 1.4em — so it landed as an oversized colour sticker rather than an icon. R...

kamo·3mo 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·3mo ago
FixKlusterServices

STUN answered on the wrong node, so kamocrm.com:3478 was dead

coturn is hostNetwork with no nodeSelector, so it was scheduled on k3m1 (public 47.181.8.87). Its own --external-ip, and every client's `stun:kamocrm.com:3478`,...

Kamo·3mo ago
FixEmailService

Stop classifying a multipart/related HTML root as an attachment

Every transactional email we send with an inlined org logo arrived in our own /messages viewer with a correct subject and a completely empty body. isAttachment...

Kamo·3mo ago
FixKlusterServices

Bridge advertised only private ICE candidates — no meet had media for 35 days

The bridge never completed a single ICE connection in the 35 days this pod has been up (0 successes, 18 terminations). Every conference joined over XMPP fine an...

Kamo·3mo 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·3mo 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·3mo 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·3mo 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·3mo ago
FixSecurityService

Send the company line as text, not markup

Pairs with the template fix in kamo-shared-library. Per-org template rows are insert-only, so the rows seeded before the markup change still wrap this variable ...

Kamo·3mo ago
Fixkamo-shared-library

The opportunity templates own their own markup again

The company line was changed to arrive as a complete <p> element from the sender, so an absent company would not leave an empty paragraph. That was the wrong tr...

Kamo·3mo ago
FixSecurityService

An approver who files a request still gets the approver email

The actor was stripped from every audience, so an approver who raised a request was cut from their own notification about it — and in an organization with a sin...

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