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
October 14, 2026
FixAPIService

No literal internal-auth secret fallback β€” a blank public-chat secret answers 503

Seven @Value sites and application.yml fell back to the literal dev-secret-change-in-prod when **************** was missing, so a pod without its Secret sent a ...

KamoΒ·1w ago
October 13, 2026
FixAPIService

The connector relay never sends a reserved close code

When KamoCameraService rolled, the backend socket closed without a close frame (1006) and the relay passed 1006 to the connector; 1005, 1006 and 1015 only descr...

KamoΒ·1w ago
FixAPIService

The connector socket's client address is the right-most public X-Forwarded-For hop

CameraAgentWebSocketHandler took the FIRST X-Forwarded-For hop β€” the one a client can write itself β€” and that address is what KamoCameraService rate-limits unau...

KamoΒ·1w ago
September 28, 2026
FixAPIService

The FreePBX helper's one key rings a phone

kamo-asterisk-support holds a single API key, documented and issued as a VOIP_RECORDING_UPLOADS key, and sends its ring events with it. The ring endpoint accept...

KamoΒ·3w ago
FixAPIService

Give a public chat's own turns the message rate limit, not the session one

Every public-chat path lives under /sessions/, so the limiter's contains("sessions") test put the conversation itself on the session-creation budget: 3 requests...

KamoΒ·3w ago
September 24, 2026
FixAPIService

KamoAI internal endpoints never leave the gateway

Carves the seven KamoAI internal subtrees (master spec Β§7 item 13) out of the wildcard forwards, and with them the server-to-server endpoints that predate the p...

KamoΒ·4w ago
September 23, 2026
FixAPIService

Give the gateway a memory request and limit

The deployment had no resources: block at all. No request, so the scheduler could not reason about this pod's footprint; no limit, so nothing capped the JVM's -...

KamoΒ·4w ago
FixAPIService

Forward commission Stripe Connect webhooks, which reached nothing at all

CommissionService registers **************** directly with Stripe (OrgStripeSetupService), but no /api/commissions/** forward existed anywhere in this gateway -...

KamoΒ·4w ago
FixAPIService

Carve out VOIPService's internal SMS-template API, and never forward a client's own X-Internal-Auth

Two related gaps in the same trust boundary. /api/voip/sms/templates/** was forwarded wholesale by the /api/voip/** wildcard. VOIPService's InternalAuthFilter ...

KamoΒ·4w ago
FixAPIService

Derive X-Real-IP from the right-most hop, not the client's own

forward() set the outgoing X-Real-IP to X-Forwarded-For.split(",")[0] -- the LEFT-most hop, which is the one part of that header a client controls outright: a r...

KamoΒ·4w ago
FixAPIService

Bound upstream calls with a connect and a read timeout

Both RestTemplate beans were built from a bare JdkClientHttpRequestFactory with no timeout at all. One upstream that accepts the connection and then never answe...

KamoΒ·4w ago
FixAPIService

Stop logging session tokens, OTKs and auth headers on every request

forward() printed the entire copied-header map on every single call -- System.out.println("APIService: copied headers: " + outHeaders) -- which serializes X-***...

KamoΒ·4w ago
September 13, 2026
FixAPIService

Accept OCI image indexes when resolving the built digest [skip ci]

The images are pushed as OCI image indexes, so asking the registry for a single image manifest only answered 404, the digest came back empty and the check faile...

KamoΒ·1mo ago
FixAPIService

Restart when a same-commit rebuild leaves pods on the old digest [skip ci]

The rollout step tried to detect a same-commit rebuild by comparing the Deployment's image reference before and after `set image`. "Apply manifests" has already...

KamoΒ·1mo ago
September 10, 2026
FixAPIService

Never forward client-supplied identity headers upstream

forward(), forwardWebhook() and forwardCallback() copied every inbound header except Host (and, for the sessionless two, the credential headers) onto the upstre...

KamoΒ·1mo ago
September 7, 2026
FixAPIService

Forward carrier SMS webhooks, which reached nothing at all

Traefik sends every path on api.kamocrm.com to this gateway with no path split, and this class forwarded /api/voip/** and nothing else. So /api/bulktext/inbound...

KamoΒ·1mo ago
FixAPIService

Forward carrier SMS webhooks, which reached nothing at all

Traefik sends every path on api.kamocrm.com to this gateway with no path split, and this class forwarded /api/voip/** and nothing else. So /api/bulktext/inbound...

KamoΒ·1mo ago
September 5, 2026
FixAPIService

Prove the deploy by digest, not by tag

The preceding commit stops `set image` being a silent no-op. This asserts the outcome: after the rollout, the tag is resolved to a digest at the registry and th...

KamoΒ·1mo ago
FixAPIService

A rebuild of the same commit deployed nothing and reported success

The image is tagged with the commit SHA, so rebuilding the same commit produces an identical image reference. `kubectl set image` then changes nothing, the Depl...

KamoΒ·1mo ago
FixAPIService

Drop the /api/settings forward, which pointed at nothing

EmailService serves the sync-integration controller at **************** not /api/settings/integrations β€” so that forward reached a path the service does not map...

KamoΒ·1mo ago
FixAPIService

Route /api/contacts, /api/calendar and /api/settings to EmailService

KamoMobile's contacts and calendar screens 404'd on every request. Neither path was routed at the api host, so nothing reached EmailService and the service logg...

KamoΒ·1mo ago
September 4, 2026
FixAPIService

Give the rollout room for the 15s minReadySeconds now costs

progressDeadlineSeconds was 60. That is the window a rollout has to show progress before Kubernetes gives up and marks it failed, and the previous commit added ...

KamoΒ·1mo ago
FixAPIService

APIService never shut down gracefully at all

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
August 25, 2026
August 7, 2026
FixAPIService

Encode the decoded token exactly once on the way upstream

21670e5 routed SocialWebhookController through UpstreamUri's FULLY-PRE-ENCODED entry point, but its URL is a hybrid: `token` is an @PathVariable, so Spring hand...

KamoΒ·2mo ago
FixAPIService

Forward the caller's query bytes on the public-facing proxies

The gateway stopped double-encoding forwarded query strings in 3c24d32, but four other proxies in this service still concatenated already-percent-encoded bytes ...

KamoΒ·2mo ago
FixAPIService

Forward the caller's query bytes instead of encoding them twice

Every URL this gateway builds is assembled from getRequestURI() and getQueryString() β€” both already percent-encoded β€” and was then handed to RestTemplate as a S...

KamoΒ·2mo ago
August 3, 2026
FixAPIService

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Β·2mo ago
July 16, 2026
FixAPIService

Defer mandatory-origin to Phase 1 β€” OriginMatcher opt-in (empty allow-list / missing Origin allowed)

Phase-0 widgets still call via their server-side proxy, so origin-locking has no benefit yet and every live public-chat key has an empty allow-list. Strict enfo...

KamoΒ·3mo ago
July 15, 2026
FixAPIService

Only cache-invalidate genuinely-invalid keys, not origin-denied (prevents valid-key DoS)

On a cold Redis cache, a valid public-chat key with a wrong/absent Origin was cached as INVALID for 60s, denying the correct origin's requests for that window. ...

KamoΒ·3mo ago
FixAPIService

Bind WS relay handshake to Origin + add cold-cache key validation fallback

Extracts PublicChatController's private validateViaDownstream() into a shared PublicChatKeyResolver bean so PublicChatWebSocketHandler can reuse the same downst...

KamoΒ·3mo ago
April 27, 2026
FixAPIService

Carve /api/voip/recordings/** out of the wildcard VOIP forwarder

The /api/voip/** catch-all in APIGatewayController was shadowing the dedicated VoipRecordingUploadController POST /api/voip/recordings/upload mapping when Sprin...

KamoΒ·5mo ago
April 26, 2026
FixAPIService

Raise file upload size limit to 500MB

Spring Boot defaults cap multipart parts at 1MB, causing background image uploads to fail with 500 in request.getParts(). Match SecurityService's existing 500MB...

KamoΒ·6mo ago
April 25, 2026
FixAPIService

Move CORS to Traefik via kamo-middlewares, remove in-app CorsFilter

The CorsFilter @Bean in the Spring app was silently not applying headers after WebConfig.java was removed. CORS is now handled entirely at the Traefik layer by ...

KamoΒ·6mo ago
FixAPIService

Remove duplicate CorsFilter and strip upstream CORS headers in gateway

WebConfig.java defined a second CorsFilter bean competing with CorsConfig.java's bean, risking duplicate header writes. Deleted it so only one CorsFilter exists...

KamoΒ·6mo ago
April 21, 2026
FixAPIService

Set application/json for JSON bodies forwarded to SecurityService

RestTemplate to upstream could leave Content-Type incompatible with Spring @RequestBody, causing 415. After reading the raw body, force APPLICATION_JSON when th...

KamoΒ·6mo ago
April 19, 2026
April 11, 2026
FixAPIService

Validate Forgejo HMAC-SHA256 signature instead of plain secret header

Forgejo sends webhook secret as X-Gitea-Signature / X-Forgejo-Signature HMAC-SHA256 hash, not as a plain header value. Read body, verify HMAC, then forward to S...

KamoΒ·6mo ago
April 4, 2026
FixAPIService

Include SUBSCRIPTION_CATALOG in default scopes fallback

When MediaService doesn't return scopes in the validation response, default to including both PUBLIC_CHAT and SUBSCRIPTION_CATALOG scopes. This ensures public c...

KamoΒ·6mo ago
March 29, 2026
FixAPIService

Use getServerName() instead of getHeader(Host) for original host resolution

ForwardedHeaderFilter consumes X-Forwarded-Host and adapts getServerName() accordingly, while getHeader(Host) returns the raw HTTP Host which may be a K8s inter...

KamoΒ·6mo ago
FixAPIService

Use HTTP on port 80 for meet service URL to match other services

The HTTPS endpoint on 8443 causes SSL cert mismatch when routing through K8s internal DNS. All other services use HTTP on port 80.

KamoΒ·6mo ago
March 28, 2026
FixAPIService

Preserve upstream X-Forwarded-Host instead of overwriting with own Host

When an upstream proxy (Next.js) sets X-Forwarded-Host to the browser's original host, APIService now preserves it instead of overwriting with its own Host head...

KamoΒ·6mo 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