KamoCRM

Live Change Log

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

18,882
Total Changes
6,821
Features
5,699
Fixes
30
Projects
Filter by project
All Projects18,882AIService287APIService179BillingService166ConversionService121DaemonService152DocsService275ESigService103EmailService651InitializerService350KBService163KlusterServices778MCPGatewayService280MediaService629RAGService79SecurityService2,064TranslateService62VOIPService266VectorService11kamo-apps29kamo-asterisk-support29kamo-capcha17kamo-capcha-widget4kamo-internal8,882kamo-login346kamo-marketing642kamo-nowww20kamo-register216kamo-shared-library1,893kamo-signer-monorepo73kamolos115
Filter by type
All TypesBuild23CI528Chore798Docs3,295Feature6,821Fix5,699Other1,007Performance175Refactor286Revert23Style45Test181Upgrade1
August 9, 2026
Fixkamo-shared-library

Stop a page load from persisting the entitlement projection

computeEffectiveFeatures added the caller's Hibernate-managed OrgFeature rows straight to its output and then flipped isActive on them. Its own javadoc calls th...

Kamo·3mo ago
FixSecurityService

Stop iterating ServiceType.values() against the resolved catalog

resolveAll() omits the deprecated aliases that share an id with a live app (DOC_MANAGER/DOCS, AI_CHAT/AI_SUPPORT), because those have no catalog row of their ow...

Kamo·3mo ago
August 8, 2026
FixInitializerService

Bind the rename cutover as a Timestamp, not a String

CockroachDB refuses <timestamp(6)> < <varchar> rather than casting, so the app-config repair threw on its first statement every boot: 'unsupported comparison op...

Kamo·3mo ago
FixInitializerService

Repair the second name-persisted site of the LOS rename

**************** is @Enumerated(STRING) and holds RoleRightType names, so a default role granting mortgage stores "LOS_VIEW_PIPELINE". That is the third place t...

Kamo·3mo ago
FixSecurityService

Point the mortgage surface back at the mortgage rights

Companion to the shared-library change. These 13 controllers all guard mortgage endpoints — HMDA LAR, pipeline, application intake, disclosures, credit orders, ...

Kamo·3mo ago
Fixkamo-shared-library

Stop mortgage endpoints enforcing a personal-loan right

The LOS_* -> MLOS_* rename was applied to the enum declaration and nowhere else. Because the freed names were immediately re-declared as the personal-loan right...

Kamo·3mo ago
FixInitializerService

Bound the LOS rename repair to rows that predate the rename

The repair matched on the string alone and ran on every boot, so it stopped being idempotent the moment anyone granted the personal-loan app: a row holding 'LOS...

Kamo·3mo ago
FixInitializerService

Master model honours a runtime retirement; drop a dead guard

provisionMaxedOutMasterModel force-enables every app for the platform org, and that breadth is deliberate — pre-launch dogfooding is what the model is for. But ...

Kamo·3mo ago
FixSecurityService

Two more places that answered "is this app offered" from the enum

Both were missed when FeatureController moved onto the app catalog, and both would have disagreed with it the moment an operator published an app. Organization...

Kamo·3mo ago
FixInitializerService

Repair mortgage grants orphaned by the LOS to MLOS rename

ServiceType is persisted in two places and the 2026-08-08 rename only accounted for one. ORG_FEATURES.FEATURE_TYPE stores the numeric id, so keeping mortgage at...

Kamo·3mo ago
Fixkamo-marketing

Render Contact sales for add-ons with no list price

PageAddOn.price was typed number and built with Number(addon.pricePerUnit), so an add-on with no list price — the enterprise-negotiated origination systems — re...

Kamo·3mo ago
Fixkamo-internal

Show negotiated pricing instead of $0.00 for enterprise-only add-ons

The origination add-ons carry no list price — they are negotiated per agreement — and formatCurrency(null) renders $0.00, advertising an enterprise module as fr...

kamo·3mo ago
FixBillingService

Hide unreleased apps from the Plans & Billing catalog

**************** back the tab where a customer chooses what to subscribe to, so it must not offer a product still in the Not Available list — the same rule the ...

Kamo·3mo ago
FixSecurityService

Never offer an unreleased app on a buying surface, bundles included

The stage filter only ran for the public marketing proxy. This endpoint also feeds the in-app SubscriptionOrderWizard, which is where a customer actually pays, ...

Kamo·3mo ago
FixBillingService

Keep the is-prefix on PlatformAccountSummary's wire names too

Same Lombok/Jackson hazard as PlatformOrgRow: isTopLevel() loses its `is` on serialization, so the DTO put `topLevel`/`platformProduct` on the wire while the fr...

Kamo·3mo ago
Fixkamolos

Declare security matchers explicitly before the next build breaks startup

kamo-shared-library 1.5.0 was republished today with spring-ws-core as a new transitive dependency, so Spring Boot now auto-registers a second servlet (MessageD...

Kamo·3mo ago
FixBillingService

Keep the is-prefix on the wire for isTopLevel/isPlatformProduct

Lombok generates isTopLevel() for a `boolean isTopLevel` field and Jackson strips the `is` prefix, so the live endpoint was serializing `topLevel` and `platform...

Kamo·3mo ago
FixInitializerService

Grandfather orgs already running a gated commerce market

Gating MORTGAGE behind MLOS made the gate unsatisfiable for tenants: MLOS is still PLANNING, and FeatureController.enable refuses a non-COMPLETED app for a chil...

Kamo·3mo ago
FixBillingService

Declare security matchers explicitly so the service can start

The service has not deployed since 2026-07-03; every pod since has crash-looped before the context loaded: This method cannot decide whether these patterns a...

Kamo·3mo ago
FixInitializerService

Seed app entitlement for every root, and stop inventing plan tiers

Two defects found by checking prod before flipping kamo.entitlement.fail-open. Sign Pink is a second entitlement root (isPlatformProduct, with its own FREE/BUS...

Kamo·3mo ago
Fixkamo-internal

Raise the Next body cap that was truncating every large upload

THE cause of the failing 3 GiB attachments, and it was ours, not the network. **************** was '500mb'. It is not a rewrite/middleware setting: Next wraps ...

kamo·3mo ago
FixMediaService

Fail a dead upload in minutes instead of holding it for an hour

connectionUploadTimeout is the tolerated SILENCE between reads, not a budget for the whole transfer. Setting it to an hour to 'match Traefik' confused the two: ...

Kamo·3mo ago
Fixkamo-internal

Stop a dead upload spinning forever, and say what 100% means

A stalled upload sat at 100% with the bar full and no way out. Three separate reasons, all of them mine. XMLHttpRequest has no useful read timeout: when bytes ...

kamo·3mo ago
Fixkamo-internal

Let an in-flight upload finish instead of dying on a rollout

A 2 GiB chat attachment reached 100% and then failed with 'Bad Gateway' because a deploy landed on top of it: the pod took SIGTERM at 03:34:36 and the transfer,...

kamo·3mo ago
Fixkamo-internal

Make a failed upload say what happened, and log enough to diagnose it

A 2 GiB attachment failed at the end of a four-minute transfer with 'Upload failed: upload failed Internal Server Error' — a doubled prefix wrapped around a mes...

kamo·3mo ago
FixMediaService

Stop Tomcat's 60s connection timeout killing a long upload

A 2 GiB chat attachment failed after nearly four minutes of successful transfer with MultipartException wrapping a bare SocketTimeoutException, and the member w...

Kamo·3mo ago
Fixkamo-internal

Apply custom status labels to the status tabs

Every other status display on /leads resolves its description through resolveLabel() from useStatusLabels — the grid cell renderers, both filter dropdowns, and ...

kamo·3mo ago
FixKlusterServices

Stop the 60s entrypoint read timeout capping uploads

respondingTimeouts.readTimeout is the deadline for reading a WHOLE request, body included, and Traefik v3 defaults it to 60s where v2 had no limit. That silentl...

Kamo·3mo ago
Fixkamo-marketing

Stop the runtime theme sheet whitening the canvas on light-mode machines

DynamicMetaLoader appends theme.<domain>/css/globals.css to <head> after our own stylesheet, and that file still carries create-next-app boilerplate: :root{--ba...

Kamo·3mo ago
August 7, 2026
Fixkamo-internal

Report user idle time so an abandoned tab can expire

The client activity tracker only ever gated whether we asked to extend; it never told the backend anything. SecurityService renewed the session TTL on every req...

kamo·3mo ago
FixSecurityService

Only slide the *** TTL when a human is actually there

getSession() refreshed the Redis TTL on every read, and OTKPreAuthFilter resolves the session before any controller runs — so every API call renewed the session...

Kamo·3mo ago
Fixkamo-internal

Leave the individual out of a department signature too

A message sent from a department mailbox is written by the department: the reply lands there, not with whoever typed it, so signing it with a member's name and ...

kamo·3mo ago
Fixkamo-internal

Stop next/image breaking every proxied logo preview

The org branding screen **************** showed the full and simple logos as missing images even though the very same files render fine everywhere else in the a...

kamo·3mo ago
FixKlusterServices

Pin the remaining hostPath workloads to the node holding their data

Same fault as embedding-model, found by auditing every hostPath volume in the repo. A hostPath is node-local and nothing replicates it, so an unpinned pod can b...

Kamo·3mo ago
Fixkamo-internal

Sort departments alphabetically

The roster rendered department sections in whatever order the backend returned them. Sort the section keys A→Z (locale-aware); member order inside each section ...

kamo·3mo ago
FixMediaService

Catch OptimisticLockException, the type 40001 actually wraps as

Round 3 review fix: hibernate-core's **************** tests LockAcquisitionException (what SQLState 40001 converts to) against four specific types in order, non...

Kamo·3mo ago
Fixkamo-internal

Stop the first list row wearing a permanent focus ring

is but hide its ring until j/k is actually pressed; the first press just reveals it in place, and changing folders hides it again.

kamo·3mo ago
FixKlusterServices

Pin to the node its model weights are actually on

The model is a hostPath under /var/lib/embedding-model on k1m1, and nothing replicates it. When k3m1 joined, the new ReplicaSet's pod was scheduled there and ne...

Kamo·3mo ago
FixMediaService

Catch the exception type the claim conflict actually throws

Round 2 review fix: the statement-level 40001 (the common case, detected inside executeUpdate() rather than at commit) surfaces as **************** via Hibernat...

Kamo·3mo ago
Fixkamo-internal

Make the popup's disabled buttons readable

kamo·3mo ago
Fixkamo-shared-library

Stop the mailbox pointer from failing startup platform-wide

DepartmentService is a @Service, and every service carries @ComponentScan("com.kamo"), so all ~40 of them construct it. Giving it a MailboxRepository therefore ...

Kamo·3mo ago
FixMediaService

Return 409 on every lost claim race, add manager claim path

Round 1 review fixes for the accept-popup claim endpoint: - an ordinary lost race (loser's isClaimableBy already false post-commit) now raises TicketAlreadyCl...

Kamo·3mo ago
FixMediaService

Scan the email repositories DepartmentService now needs

MediaService CrashLooped on every pod since shared-lib 1.5.0: DepartmentService is a @Service, so the wildcard @ComponentScan("com.kamo") builds it here whether...

Kamo·3mo ago
FixESigService

The expiry sweep ran with no transaction

@Transactional is applied by a proxy and sweep() called expireDue() on this, so the annotation was inert. The expiry notices read the envelope's organization do...

Kamo·3mo ago
Fixkamo-signer-monorepo

A party who already signed gets their copy, not the document again

The session always started at "welcome", so a signer following the link in their completion email — or simply reopening the invitation — was walked through the ...

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