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 5, 2026
ChoreVOIPService

Make the RingCentral member redirect URI configurable

The sign-in hop's redirect URI was only the @Value default. It belongs beside the other two redirect properties: unlike them it is never re-hosted onto the tena...

Kamo·1mo ago
FixVOIPService

Let a RingCentral member sign in instead of minting a JWT

A member's phone-settings tab asked for a JWT credential, and that was the only way to connect them. A RingCentral JWT belongs to one user and is minted by that...

Kamo·1mo ago
FixVOIPService

Tell a RingCentral JWT from the app credentials pasted into its box

An org pasted its RingCentral app's credentials JSON — the {"clientId": …, "clientSecret": …, "server": …} blob the developer console shows on the same page as ...

Kamo·1mo ago
September 4, 2026
FeatureVOIPService

Fall back to the org's own hostname for the Teams redirect

A redirect the org typed into its own registration still wins outright — Microsoft requires the URI replayed on the token exchange to match the authorization by...

Kamo·1mo ago
FeatureVOIPService

Lock the shared sweeps, and run two pods

Every @Scheduled sweep here whose effect is shared now takes a named distributed lease through SingletonTaskRunner before it does anything, so it runs once acro...

Kamo·1mo ago
FixVOIPService

Let a rollout finish what the old pod was doing

Deploys replaced the only pod of each service with nothing to catch the requests in flight. Three settings, applied across the fleet: - preStop sleeps 10s befo...

Kamo·1mo ago
FeatureVOIPService

Teams Phone falls back to the org's own Entra app

The per-phone-server credentials still win — that is the most specific source. What changes is the fallback underneath them: the org's own MICROSOFT_TEAMS regis...

Kamo·1mo ago
September 3, 2026
FeatureVOIPService

Let an on-premise PBX report a ringing extension

RingCentral and JustCall publish INBOUND_RINGING from their webhooks. FreePBX and KamoPBX publish nothing -- they are the customer's own Asterisk and nothing wa...

Kamo·1mo ago
FixVOIPService

Encode JustCall query values exactly once

The client built its query with build(true), which declares the values already encoded — so nothing was escaped at all. The character that matters is "+": every...

Kamo·1mo ago
RefactorVOIPService

Say plainly why every JustCall agent reads as ACTIVE

The user listing decided its status with "available is Yes or No -> ACTIVE, else UNKNOWN", which is a roundabout way of asking whether JustCall answered at all,...

Kamo·1mo ago
FeatureVOIPService

Wire JustCall in through the phone provider abstraction

JustCall (api.justcall.io/v2.1) as a full PhoneProvider: call history, texts, voicemail, recordings, the agent directory and availability, plus signed account w...

Kamo·1mo ago
September 2, 2026
FixVOIPService

Apply FreePBX config after every write, or the extension never reaches Asterisk

Extension 8777 (Aiden Perry, kamocrm) was created from KamoCRM on 2026-09-02 and never rang. The FreePBX GraphQL `addExtension` mutation had written `users`, `d...

Kamo·1mo ago
August 30, 2026
FixVOIPService

An account with no number to text from is a 409, not a 500

Starting a text threw IllegalStateException when neither the member nor the instance had an outbound number, which Spring turned into a 500 with a stack trace. ...

Kamo·1mo ago
August 27, 2026
FeatureVOIPService

Keyword interception at step 0 on the RingCentral rail (MS1 Task 4)

Today a STOP to a number no MEMBER_VOIP_CONFIG row owns hits the "No member found for to-number" branch and vanishes — and that branch is EXACTLY where an opted...

Kamo·1mo ago
FeatureVOIPService

SmsKeywordService — the one writer for inbound keywords (MS1 Task 3)

Closes the TODO Task 2 left behind. Until this commit a verified inbound STOP reached BulkTextInboundController, was recognised, was logged, and was then DROPPE...

Kamo·1mo ago
FixVOIPService

One source of truth for the platform settings

"Test connection" reported "no master account id" on a phone server whose provisioning had just succeeded, minutes earlier, using that same id. Two sources dis...

Kamo·1mo ago
FixVOIPService

A half-provisioned phone server could never be finished, and said the wrong thing

An org's KamoPBX server has been reporting Error: Phone provider instance not found: **************** since it was created. The instance was never missing —...

Kamo·1mo ago
FeatureVOIPService

Carrier-facing inbound SMS webhook (MS1 Task 2)

POST **************** -- form-encoded or JSON, guarded by the CARRIER'S OWN SIGNATURE. Why a new endpoint. /api/voip/webhook cannot receive a STOP and fails si...

Kamo·1mo ago
FixVOIPService

Outbound external calls were missing from FreePBX call history

On an outbound external call FreePBX rewrites the CDR `src` to the trunk's outbound caller ID — the org's own DID — so a call ext 8080 placed to 9493747110 is r...

Kamo·1mo ago
FeatureVOIPService

Implement KamoPBX extension, user and device management

The provider advertised extensionManagement, userManagement and deviceManagement as true while implementing none of them, so the UI would have shown buttons tha...

Kamo·1mo ago
FeatureVOIPService

Decrypt the KamoPBX credential; test the refusal path

The master credential is stored as ciphertext by the platform settings UI, so it must be decrypted before use — handing ciphertext to the API as a password woul...

Kamo·1mo ago
FeatureVOIPService

Read KamoPBX platform config from the database

Adding a KamoPBX phone server failed with a raw Kubernetes DNS error — 'I/O error on PUT ... **************** — shown to an organization admin who can neither r...

Kamo·1mo ago
FeatureVOIPService

Provision a KamoPBX account when a phone server is created

Adding a KamoPBX phone server now creates the underlying account and writes the account id and realm back to configJson. Any configJson the client sent is DISCA...

Kamo·1mo ago
FeatureVOIPService

Implement the KamoPBX provider

Replaces the stub. KamoPBX is Kamo's own platform, so the organization holds no credential at all: KamoPBXAccountProvisioner creates the account when a phone se...

Kamo·1mo ago
FixVOIPService

A recording whose bytes are gone answers 410, not 500

Same split as the imaging proxy and the docs download. A call recording that is not in storage is permanently not there, and a player handed a 500 shows nothing...

Kamo·1mo ago
FixVOIPService

The extension sweep no longer erases every member assignment

MemberVoipConfigController.put writes an assignment to two places - MEMBER_VOIP_CONFIG and **************** - and **************** then cleared the second on it...

Kamo·1mo ago
August 26, 2026
FixVOIPService

Give the text-conversations coder a tiebreaker so tied timestamps aren't dropped

lastActivityAt, so a conversation sharing that exact timestamp was excluded from the lost from the list permanently, not just misordered. Reachable in practice ...

Kamo·1mo ago
FixVOIPService

Gate the voicemail nav count on VIEW_VOICEMAIL

**************** handed any authenticated member holding a MemberVoipConfig row the instance-wide unread-voicemail count with no rights check at all, even thoug...

Kamo·1mo ago
FeatureVOIPService

Read and write the line-window gate

GET surfaces lineWindowEnabled; PUT accepts it as a nullable Boolean so that absent means "not mentioned" and preserves the stored value. Every existing caller ...

Kamo·1mo ago
FeatureVOIPService

Authenticate RingCentral with a JWT, per phone server

RingCentral was the last provider whose credentials came from a Kamo-wide registration plus two browser consent hops — one for the org, one per member. Both are...

Kamo·1mo ago
FeatureVOIPService

Missed-call and voicemail counts for the softphone indicator

Reported as separate lines rather than a total: the icon shows the sum and its dropdown shows the breakdown, so a pre-summed wire value would make the dropdown ...

Kamo·1mo ago
August 25, 2026
FeatureVOIPService

An unread snapshot, a mark-read, and a live frame

Its own NATS subject rather than the existing message one: the browser's handler for /topic/voip/message/ plays the arrival sound and opens a tool window for ev...

Kamo·1mo ago
ChoreVOIPService

Pin kamo-shared-library 1.6.0

The library moved to 1.6.0 while consumers stayed on 1.5.0. Consumer CI builds the library from a fresh clone into a cold ~/.m2 and ci-settings.xml mirrors Mave...

Kamo·1mo ago
August 24, 2026
FeatureVOIPService

The blocked capability now outranks the right, and god mode

PhiPlaybackAuthorizer gated PHI call playback on VIEW_CALL_LOGS. That was the whole check because ServiceType.VOIP mapped to the blocked VOIP_RECORDING module, ...

Kamo·1mo ago
August 23, 2026
FixVOIPService

Stop RingCentral OAuth signing white-label tenants out

Two faults, both on the same hop, and each one hides the other. RingCentral rejects every scope value this app can ask for — "invalid_request / Parameter [scop...

Kamo·2mo ago
August 16, 2026
FixVOIPService

Size the pod above its own JVM heap ceiling [skip ci]

The image starts the JVM with -XX:MaxRAMPercentage=70 -XX:+AlwaysPreTouch, so the heap alone may take 70% of the container limit and pre-touch keeps every commi...

Kamo·2mo ago
August 15, 2026
FixVOIPService

Working with voicemail takes a right, not just handling PHI

VoipVoicemailController required VIEW_CALL_LOGS on exactly one path — playback, and only when the organization handles PHI. Listing voicemails with their transc...

Kamo·2mo ago
August 10, 2026
ChoreVOIPService

Rebuild against shared-library @Lob LONGVARCHAR fix

Hibernate's PostgreSQL dialect read @Lob String columns as OIDs via getLong(). Affects notes, contacts, calendar, OAuth tokens, IMAP passwords, email campaign b...

Kamo·2mo ago
FeatureVOIPService

Point at YugabyteDB and use PostgreSQLDialect

CockroachDB has been replaced by YugabyteDB. Connection strings move from cockroachdb-public:26257 to yb-tserver-service:5433, and the Hibernate dialect from **...

Kamo·2mo ago
August 9, 2026
CIVOIPService

Retry the shared-library build, which the LAN uplink keeps corrupting

Three builds died today on "Tag mismatch" pulling a jar — and the mirror added an hour ago did not help, because kbservice, mcpgatewayservice and ragservice hit...

Kamo·2mo ago
CIVOIPService

Mirror Maven Central through the Google GCS copy

Every Docker stage starts from a cold ~/.m2 and refetches the whole dependency tree, so Central sees the full weight of every concurrent service build. It answe...

Kamo·2mo ago
August 6, 2026
ChoreVOIPService

Rebuild for the unified imaging bucket

Picks up kamo-shared-library 3045cc3: ImageAssocType.getBucket() now returns the single "imaging" bucket for every association, so a deduplicated file is stored...

Kamo·2mo ago
August 5, 2026
PerformanceVOIPService

Stop re-querying call history per extension when the provider is instance-wide

RingCentral's endpoint is extension/~ and ignores the argument, so it returns the same log for every extension. Once a page adds nothing new, the remaining exte...

Kamo·2mo ago
FixVOIPService

Isolate call ingest per row and link only after it commits

Two faults with one root: ingest participated in the sweep's transaction. A throw inside a participating transaction marks the SHARED transaction rollback-only...

Kamo·2mo ago
FixVOIPService

Skip soft-deleted extensions in the call-history sweep

syncExtensions soft-deletes by flipping status to UNKNOWN rather than removing the row, so the list accumulates every extension an instance has ever had. Each o...

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

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