KamoCRM

Live Change Log

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

15,120
Total Changes
5,169
Features
4,935
Fixes
30
Projects
Filter by project
All Projects15,120AIService197APIService161BillingService143ConversionService107DaemonService129DocsService215ESigService88EmailService518InitializerService318KBService105KlusterServices697MCPGatewayService85MediaService546RAGService71SecurityService1,658TranslateService55VOIPService205VectorService11kamo-apps25kamo-asterisk-support24kamo-capcha17kamo-capcha-widget4kamo-internal6,937kamo-login330kamo-marketing625kamo-nowww20kamo-register213kamo-shared-library1,455kamo-signer-monorepo53kamolos108
Filter by type
All TypesBuild11CI523Chore738Docs2,167Feature5,169Fix4,935Other986Performance157Refactor274Revert23Style42Test94Upgrade1
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·1mo 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·1mo 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·1mo 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·1mo 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·1mo 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·1mo 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·1mo ago
August 3, 2026
FeatureVOIPService

Persist the VOIP PHI trail to phi_access_log

Call recordings, voicemail audio and transcripts were audited into the log stream, which keeps 14 days against a six-year §164.528 obligation and cannot be quer...

Kamo·1mo ago
FixVOIPService

Scan the shared MFA repositories

MfaEnrollmentService is a @Service in kamo-shared-library, so the wildcard @ComponentScan("com.kamo") in this application constructs it whether or not this serv...

Kamo·1mo ago
FeatureVOIPService

Require VIEW_CALL_LOGS for call playback in PHI-handling orgs

Recording and voicemail playback checked tenancy and nothing else: any member of the owning org could pull any call in it, transcript included, on extensions th...

Kamo·1mo ago
FeatureVOIPService

Record call recording, voicemail and transcript access

Recording playback left no trace. A recorded call is the densest PHI the platform stores — the unredacted conversation — and "who listened to this call" was una...

Kamo·1mo ago
ChoreVOIPService

Commit outstanding work in progress

Staged and committed as-is so nothing is left uncommitted in the working tree. 5 files changed, 549 insertions(+), 2 deletions(-)

Kamo·1mo ago
FixVOIPService

Harden the kubectl download against flaky egress [skip ci]

dl.k8s.io over the runner's egress intermittently drops mid-transfer: curl: (56) OpenSSL SSL_read: decryption failed or bad record mac which fails the deploy ...

Kamo·1mo ago
July 22, 2026
FixVOIPService

Stop pinning the expired wildcard-kamocrm-com secret

wildcard-kamocrm-com was a legacy multi-SAN secret that cert-manager orphaned when its Certificate was repointed at a per-host secret. Nothing renewed it and it...

Kamo·2mo ago
July 16, 2026
FeatureVOIPService

TURN-REST credentials endpoint for the mobile softphone

GET /api/voip/turn/credentials mints ephemeral coturn creds (HMAC-SHA1 over "<expiry>:<memberId>" with the shared static-auth-secret) so native/cellular WebRTC ...

Kamo·2mo ago
July 15, 2026
FeatureVOIPService

Accept X-***-Token on REST + signed ?st= stream tokens on audio endpoints

OTKValidationFilter precedence: X-OTK → X-***-Token → ?st= (GET, audio streaming paths only, verified via shared StreamTokenCodec with internal.auth.secret; cla...

Kamo·2mo ago
July 11, 2026
FixVOIPService

Guard /internal/voip with InternalAuthFilter as documented — it 401'd on session auth

VoipInternalSyncController always documented InternalAuthFilter as its guard, but /internal/voip was never in PROTECTED_PREFIXES nor excluded from the OTK sessi...

Kamo·2mo ago
July 8, 2026
FeatureVOIPService

Allow admins to connect RingCentral on a member's behalf

The per-member RingCentral flow was self-serve only, so an admin managing another member's profile saw "they must connect it themselves". Sysadmins commonly cre...

Kamo·2mo ago
FeatureVOIPService

Per-member RingCentral OAuth identity + softphone SIP fixes

Softphone SIP credential fixes: - getSipCredentials: map outboundProxyBackup + stunServers (web-phone v2 needs them for WSS failover + ICE/media); throw Provi...

Kamo·2mo ago
FixVOIPService

Constant-time internal-auth secret compare (timing oracle)

Replace String.equals with MessageDigest.isEqual so response latency cannot leak the X-Internal-Auth shared secret byte-by-byte. Fleet-wide sweep of the copy-pa...

Kamo·2mo ago
July 7, 2026
FixVOIPService

Return 200 allFalse for unconfigured org capabilities

GET /api/voip/capabilities threw ProviderNotConfiguredException (422) when an org had no phone provider, logging a red console error on every page load for phon...

Kamo·2mo ago
July 3, 2026
FixVOIPService

Exclude /api/voip/sms/templates from OTK session filter

The doc-07 SMS template endpoints are session-less internal calls guarded by InternalAuthFilter (X-Internal-Auth), but OTKValidationFilter still ran on them and...

Sage·2mo ago
FeatureVOIPService

Doc-07 SMS template system — /api/voip/sms/templates + GSM-7/UCS-2 segment guard

**************** over the shared-lib SmsTemplate entities: renders {{var}} and sends via the EXISTING BulkTextProvider primitive (no second carrier path); SmsSe...

Sage·2mo ago
July 2, 2026
ChoreVOIPService

Wire mlos-internal-auth (INTERNAL_AUTH_SECRET) into deployment [skip ci]

Guards the new /api/bulktext/send endpoint. Shares the existing production internal-auth value (mlos-internal-auth) so SecurityService's recovery SMS authentica...

Sage·2mo ago
FixVOIPService

Implement POST /api/bulktext/send internal transactional SMS

SecurityService's BulkTextSmsClient (password-recovery + account-settings SMS) has always POSTed **************** to /api/bulktext/send, but the controller was ...

Sage·2mo ago
July 1, 2026
ChoreVOIPService

Rebuild against latest kamo-shared-library

Sage·3mo ago
June 13, 2026
May 16, 2026
April 29, 2026
CIVOIPService

Scope concurrency to build jobs, not Kubernetes deploys

Workflow-level concurrency serialized the whole pipeline (including kubectl rollouts). Move the group to the build job only so deploy jobs from different runs c...

Kamo·5mo ago
FixVOIPService

Build recording MinIO object key like imaging stream

Omit the extension when FILE_EXT is null/empty so the object name matches RecordingImagingService and ImagingController. Java string concat with null produced {...

Kamo·5mo ago
FixVOIPService

Resolve call history extension from member_voip_config, not phone_extension

**************** was NULL for some extensions even when member_voip_config correctly mapped the member to their extension. Using member_voip_config (same source...

Kamo·5mo ago
FixVOIPService

Surface imaging fallback when provider has no call history

KamoPBXProvider.getCallHistory now returns null instead of throwing **************** so the 501 response no longer bypasses the imaging fallback. The provider c...

Kamo·5mo ago
April 28, 2026
FeatureVOIPService

Fall back to imaging recordings for call history + voicemails

FreePBX 17 doesn't expose voicemail messages over REST or GraphQL on this install (the GraphQL voiceMail type returns mailbox config, not messages, and /admin/a...

Kamo·5mo ago
FixVOIPService

Resolve member→extension before VM/CDR provider lookup

CallController was passing memberId where FreePBX (and other PBX-style providers) expect an extension number — voicemail listing returned empty because no PBX e...

Kamo·5mo ago
ChoreVOIPService

Trigger redeploy for shared library update

Kamo·5mo ago
ChoreVOIPService

Trigger redeploy for shared library update

Kamo·5mo ago
April 27, 2026
FeatureVOIPService

Recording playback, voicemail archive, paginated voicemail, history enrichment

- New RecordingController with bulk lookup, range-streamed audio for master + per-channel tracks, and metadata for the media-player tool window - CallController...

Kamo·5mo ago
ChoreVOIPService

Trigger redeploy for shared library update

Kamo·5mo ago
FixVOIPService

Capture newExtNumber as final for lambda capture in MemberVoipConfigController

newExtNumber is conditionally reassigned inside the if (isVoipEnabled && ...) block, which makes it not effectively final. The TeamMember sync block reads it fr...

Kamo·5mo ago
FeatureVOIPService

Add call features API — call forward + auto-answer wired through provider abstraction

- Add CallFeaturesDto and SetCallFeaturesRequest POJOs - Add callForward/autoAnswer flags to ProviderCapabilities - Add default getCallFeatures/setCallFeatures ...

Kamo·5mo ago
April 26, 2026
FixVOIPService

Don't wipe member assignment on sync from providers that lack metadata

**************** unconditionally overwrote PhoneExtension.assignedMemberId with whatever the provider returned. FreePBX (and any provider that doesn't track whi...

Kamo·5mo ago
FeatureVOIPService

WSS-aware SIP credentials for browser softphones

The /api/voip/sip/credentials endpoint now returns credentials a browser-side SIP stack can actually use: WSS transport, public domain, and a wsServers URL. - ...

Kamo·5mo ago
FeatureVOIPService

Persist connection test result to isConnected field

- test() endpoint saves isConnected=true/false to DB after every health check - update() resets isConnected to null when configJson changes (credentials may h...

Kamo·5mo ago
FixVOIPService

Use extensionId as external ID, not Relay node id

FreePBX returns the same Relay id (ZXh0ZW5zaW9uOg== = "extension:") for every extension because the id field is not populated. Using it caused all extensions to...

Kamo·5mo ago
FixVOIPService

Rewrite all GQL queries/mutations against live schema introspection

Verified every field name and type against the actual FreePBX 17 schema. Full set of corrections: Queries: - fetchAllExtensions: remove non-existent 'voicemail...

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