KamoCRM

Live Change Log

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

18,406
Total Changes
6,537
Features
5,540
Fixes
30
Projects
Filter by project
All Projects18,406AIService276APIService177BillingService161ConversionService117DaemonService146DocsService240ESigService93EmailService622InitializerService344KBService162KlusterServices769MCPGatewayService277MediaService620RAGService79SecurityService1,997TranslateService62VOIPService265VectorService11kamo-apps26kamo-asterisk-support28kamo-capcha17kamo-capcha-widget4kamo-internal8,699kamo-login342kamo-marketing642kamo-nowww20kamo-register213kamo-shared-library1,826kamo-signer-monorepo57kamolos114
Filter by type
All TypesBuild23CI525Chore794Docs3,286Feature6,537Fix5,540Other1,001Performance174Refactor282Revert23Style45Test175Upgrade1
July 19, 2026
FixAIService

Anthropic dropped every system message but the last

buildRequestBody assigned rather than accumulated the system field, so with more than one system message only the final one reached the model. In practice that ...

Kamo·3mo ago
FixAIService

Locked rules survive a section or whole-document override

An author taking over a rule section by hand replaced the entire section body, which silently discarded the locked pack rules inside it - so 'never quote a rate...

Kamo·3mo ago
FixSecurityService

Stamp the borrower quote's actor from the session

The quote requires createdByMemberId and the browser must never supply it. memberId(req) is hoisted out of the party-check branch so it resolves for stewards to...

Kamo·3mo ago
Fixkamo-internal

Correct the CATALOG_SOURCE ordinal — every rate-sheet upload was rejected

ImageAssocType.CATALOG_SOURCE is id 14 but ordinal 12: the ids skip 6, so id is not ordinal+1 past SYSTEM_WIDE. The panel sent 13, which is out of range for a 1...

kamo·3mo ago
July 18, 2026
FixAIService

Streamed replies were dropped, persisting blank assistant messages

Every successful chat completion came back as an EMPTY assistant bubble. The assistant rows were being saved with content_len=0 and is_error=false, so there was...

Kamo·3mo ago
FixSecurityService

Send AIService the secret it actually validates

The vision-capability proxy authenticated with internal.auth.secret, but AIService validates **************** — a different secret. Confirmed live: the console ...

Kamo·3mo ago
FixSecurityService

LoanTransactionService ctor gained LeadRealtimePublisher param

assignLoanOfficer now publishes the chat-routing event, so the service ctor takes a 10th arg (LeadRealtimePublisher). Update the unit test's direct instantiatio...

Kamo·3mo ago
Fixkamo-internal

Resolve the k1m1 npm registry host inside the build container

kamo-internal has not deployed since 2026-07-16: every build died in npm ci with ENOTFOUND k1m1 while fetching the private @kamo/* packages, which package-lock....

kamo·3mo ago
FixAIService

Try the next model when a vision model rejects the image

Probing production again after the modality fix, routing moved from a text-to-speech model to o3-mini — an o-series reasoning model that also takes no image inp...

Kamo·3mo ago
FixAIService

Stop routing vision to text-to-speech models

Found by probing production: org 1188756624575266822's vision calls resolved to gpt-4o-mini-tts-2025-03-20 — a TEXT-TO-SPEECH model — so every vision call retur...

Kamo·3mo ago
FixConversionService

A bad assocType index is a 400, not a 500

The upload/register paths indexed ImageAssocType.values() with the client's raw index, so an out-of-range value surfaced as an ArrayIndexOutOfBoundsException (5...

Kamo·3mo ago
July 17, 2026
Fixkamo-internal

Filter non-ACTIVE members from live-participant pickers

Defense-in-depth behind the SecurityService gates: never render a non-ACTIVE team member as a selectable/live participant. Add teamMembershipStatus to the membe...

kamo·3mo ago
FixMediaService

Exclude non-ACTIVE members from chat participation & routing

A non-ACTIVE **************** member must not appear as, or be targeted as, a live chat participant. Gate every chat path on the shared-lib **************** pre...

Kamo·3mo ago
FixSecurityService

Enforce ACTIVE member status on every session & off-boarding path

The ACTIVE-member login gate previously lived only in the password-login controller. Extend it to every session-minting path via the shared-lib ****************...

Kamo·3mo ago
Fixkamo-shared-library

Gate live sessions & participation on ACTIVE member status

Add **************** as the single source of truth for the "only ACTIVE members may sign in or appear as a live participant" invariant: base members must be rec...

Kamo·3mo ago
FixAIService

Load history images via query, not lazy getImages() (WS path)

**************** runs on the WebSocket path (called from AiChatWebSocketHandler), which is NOT an HTTP request, so open-session-in-view does not apply. Iteratin...

Kamo·3mo ago
FixSecurityService

Rate-lock commit gate + cross-org loan resolution + borrower vendor-order projection

Verified defects from the session review: - CRITICAL: commitLock hardcoded **************** which the RCE commit engine rejects with a 400 (only LOCK_ELIGIBLE...

Kamo·3mo ago
July 16, 2026
FixSecurityService

Mirror native e-sign completion to the disclosure stub + fix sent status

(1) BorrowerSignatureService now mirrors a terminal native envelope status back onto the locked disclosure stub (doc 05 §4.2 map) on the borrower's my-signature...

Kamo·3mo ago
Fixkamo-shared-library

**************** (was findById)

VendorOrder extends BaseUuidEntity (key = uid, not id); the derived-query parse failed at boot ("No property 'id' for VendorOrder"), crash-looping MLOSVendorSer...

Kamo·3mo ago
FixSecurityService

Revive soft-deleted member pref on upsert instead of 500

Per-member UI preferences (nav layout, hex-head sizes, etc.) are stored one row per (member_id, pref_key) in MEMBER_UI_PREFERENCES, guarded by the unique constr...

Kamo·3mo ago
FixAIService

Allow SWITCH_MODEL to reset a session to Auto

handleSwitchModel always UUID-parsed modelId and errored on null, so a session could never be reverted to automatic model selection mid-chat. Parse modelId as a...

Kamo·3mo ago
FixKlusterServices

Explicit priority so the OTA updates route wins over the general theme route

Traefik ranks by rule-string length; the general /public/ theme route is longer, so the expo-updates header injection never ran. priority:100000 forces the win.

Kamo·3mo ago
FixSecurityService

Accept X-***-Token header on my-networks + all-networks

getMyNetworks/getAllNetworks only read the OTK request-attr or the *** cookie, — no org beyond the device-exchanged primary ever loaded, and the active org had ...

Kamo·3mo ago
Fixkamo-internal

Tightly-cropped Copilot icon + bare NavPri entry

Added a trimmed icon.png (glyph fills ~82% of the frame) and pointed the home pill, NavPri entry, Interaction Center tab, and QR center at it. Stripped the NavP...

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

Resolve public-chat system member per-org (drop hardcoded snadjafinia alias)

createSupportSession, createPublicTicket, and the owner notification helpers all resolved the org's "system member" via a hardcoded usernameAlias="snadjafinia" ...

Kamo·3mo ago
FixSecurityService

Trainer must not clobber its own claim or an operator's pause

After the atomic claim() bulk-updates the row to RUNNING, mirror that in the in-memory entity — the pool thread has no open session, so a later full-row save wo...

Kamo·3mo ago
July 14, 2026
FixKlusterServices

Raise guacamole memory 1Gi→2Gi to stop OOM mid-RDP-session

The Tomcat webapp idles near ~800Mi, so a 1Gi ceiling left almost no headroom. Opening an RDP session pushed RSS over 1Gi and the container was OOMKilled (exit ...

Kamo·4mo ago
Fixkamo-internal

Load history via per-tab OTK path + retry/error UI; drop preview toggle

- Root cause of empty chat history on long-lived tabs: media proxy routes forwarded only the *** cookie (lapses ~30min) instead of the per-tab X-***-Token; ...

kamo·4mo ago
FixMediaService

Stop putting message content into missed-message emails

Remove messagePreview computation, the ledger PREVIEW write, and the messagePreview template variable; drop the includePreview preference. Emails now carry send...

Kamo·4mo ago
Fixkamo-shared-library

Drop message-body preview paragraph from missed-message email templates

Security: notification emails no longer render any message content; the member signs in to read messages. Sender + count + CTA only.

Kamo·4mo ago
July 13, 2026
July 12, 2026
FixDaemonService

Crystalline/metamorphic basement classifies correctly (was VOLCANIC)

Macrostrat 'metamorphic and undivided crystalline (...may include volcanic...)' tripped the volcan substring; check metamorphic/crystalline before volcanic. Als...

Kamo·4mo ago
FixDaemonService

Ridge petrology search to 25km, no relief gate

The gazetteer point often sits in the valley floor with the range 15-20km off; the 15km search + relief gate missed them (Yucca Valley returned alluvium despite...

Kamo·4mo ago
FixDaemonService

Petrology reads the ridge bedrock, not the valley floor

A town centroid usually sits on valley ALLUVIUM while the mountains the scene draws are bedrock — so a granite-ringed desert town returned 'alluvium' and got no...

Kamo·4mo ago
FixSecurityService

Register mlos.notification JPA repos so SecurityService starts

EconsentService autowires DisclosureTextRepository **************** but that package was absent from @EnableJpaRepositories — the context failed to start, Crash...

Kamo·4mo ago
July 11, 2026
FixSecurityService

Prepare-signin authenticates on api.<root> — the auth path can't resolve the myloan.* alias

Same constraint as in-cluster login: provider resolution keys on the canonical api host, not the portal alias, so a correct password still 401'd.

Kamo·4mo ago
FixESigService

AntPathRequestMatcher — immune to multi-servlet contexts

Belt-and-braces with the shared-lib SoapClientOnlyGuard (c4a3b2c): the 891c58c build raced the guard's push into shared-lib main and kept crash-looping on 'more...

Kamo·4mo ago
Fixkamo-shared-library

The servlet guard must define the SERVLET bean — Boot conditions on the type, not the registration

f8bcc82's ServletRegistrationBean alone name-collided with the auto-config **************** WebServicesAutoConfiguration's bean is **************** Define the s...

Kamo·4mo ago
Fixkamo-shared-library

Disabled MessageDispatcherServlet registration — kills the multi-servlet landmine for real

Removing the web-services STARTER (55eae0a) was not enough: spring-ws-core itself carries MessageDispatcherServlet, and Boot's WebServicesAutoConfiguration cond...

Kamo·4mo ago
Fixkamo-shared-library

Spring-ws CLIENT-ONLY — the server starter made every consuming service multi-servlet

**************** auto-registers a MessageDispatcherServlet in EVERY service that depends on shared-lib; with Spring Security 6 that breaks any string requestMat...

Kamo·4mo ago
Fixkamo-shared-library

UpdateLoanFile PATCH must not null absent fields — status-only patch wiped loanNumber/dates

Any partial loan-file patch (the portal's submit sends only {statusId:2}) unconditionally overwrote loanNumber, channelId, and every lifecycle date with null. G...

Kamo·4mo ago
Fixkamo-internal

Never render literal "null" in lead view header name

The header and headerName memo built the contact name with template literals, so a NULL middle/last name stringified to the word "null" (e.g. "Sage null"). Buil...

kamo·4mo 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