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
September 25, 2026
FixAIService

The boot backfill counts row-less-by-design models apart

Every AIService start logged 'capability rows written for 21 model(s)' though completions models no capability Kamo uses (ruling SP01-T21), so they stay row-les...

Kamo·3d ago
Fixkamo-shared-library

Send Arive the language CODE, not its name — every Create Loan was refused

Arive's Zapier field shows language names but its API takes ISO 639-2 codes (chi, eng, kor, spa, tgl, vie; zxx for Other). Kamo sent "English", so Arive answere...

Kamo·3d ago
FixAIService

A model list anyone can read no longer passes a wrong key

The Hugging Face router and OpenRouter answer GET /v1/models with 200 for no key and for a wrong key, so Test connection read OK and sync reconciled 140 models ...

Kamo·3d ago
FixSecurityService

A hire-step owner answering 401 has not shipped yet, so the step waits

VOIPService and ComputeService answer any path they do not serve from their session layer with 401, so Ava's EXTENSION and WORKSTATION steps went FAILED before ...

Kamo·3d ago
FixAIService

Auto routing never picks a row-less model the catalogue says Kamo cannot call

The legacy router let a model with no capability rows through on the name rule legacy-completions *-instruct) get no rows by design, and their names pass the A...

Kamo·3d ago
FixAIService

An AI session or the System User holds no platform right in AIService

Master §11 'SP02 final fixes': a session whose intelligenceType is ARTIFICIAL resolves no platform right by any route (owner flag, god window, administrator row...

Kamo·3d ago
FixSecurityService

An AI member never founds an organization

The second door to IMPORTANT-1 of the SP02 final review. POST /api/security/organizations needs no right for a standalone organization: any signed-in user may c...

Kamo·3d ago
FixEmailService

A calendar message's plain-text part says what its HTML says

The text/plain alternative of every calendar message was "You've been invited to: " + subject, so an instance cancellation read "You've been invited to: Cancell...

Kamo·3d ago
Fixkamo-internal

The member rights tab never offers to make an AI member an owner

SecurityService now answers 400 AI_NOT_OWNER when PATCH **************** sets isOrganizationOwner on an ARTIFICIAL member (SP02 final fix). The Organization Own...

Kamo·3d ago
FixSecurityService

Security-model writes require CONFIGURE_SYSTEM

Closes the SP02 final review's IMPORTANT-2. POST /api/security/models, PUT and DELETE /api/security/models/{id} and PUT /api/security/master-model only resolved...

Kamo·3d ago
FixSecurityService

An AI member is never an owner or a platform operator

Closes the door around the AI never-grantable floor that the SP02 final review found (IMPORTANT-1). Platform rights and the owner flag are not RoleRightTypes, s...

Kamo·3d ago
Fixkamo-shared-library

An AI member is never promoted to organization owner

**************** refuses isOrganizationOwner=true for an ARTIFICIAL target. The owner flag grants every platform right in the top-level organization and opens o...

Kamo·3d ago
FixEmailService

Let the WebDAV verbs through Spring Security's firewall

StrictHttpFirewall admits only GET, HEAD, POST, PUT, PATCH, DELETE and OPTIONS, and answered every PROPFIND, PROPPATCH, REPORT, MKCOL and MKCALENDAR to /dav/** ...

Kamo·3d ago
Fixkamo-internal

The Repeat field says what a series save does; no repeat for a lead callback

The repeat now follows a move of the start's date, as the calendar service moves a series: a weekly repeat's days move with it, and an existing series' end date...

Kamo·3d ago
FixEmailService

A moved series keeps its days, its end and its exceptions; a lead callback never repeats

A whole-series move (ALL, or THIS_AND_FOLLOWING) now carries the rule with it (spec D-9): UNTIL moves by the same local step, so the last instance stays; a week...

Kamo·3d ago
FixAIService

Family calls speak HTTP/1.1 on cleartext, never an h2c upgrade

The JDK client defaults to HTTP/2 and sends "Upgrade: h2c" with the first request to an http:// host. uvicorn (httptools) refuses the upgrade and drops the requ...

Kamo·3d ago
FixKlusterServices

Size the reranker's TEI thread pools to its 1-CPU limit

The reranker runs embedding-model's TEI 1.9.4 under the same 1-CPU limit, so it takes the same sizing (KamoAI SP00 final review I-1): one tokenization worker, a...

Kamo·3d ago
Fixkamo-internal

Member initials in the ink that reads on their fill, and My tasks' scope toggle at 4.5:1

axe on the SP06 task screens (drawer, My tasks, lead Tasks tab) found white initials on memberColor's 55%-lightness fills at 2:1 (cyan) and 4.1:1 (magenta) - wh...

Kamo·3d ago
Fixkamo-internal

The Repeat field wears the event dialog's field style

The Repeat select, the interval and unit fields and the end date and count fields were stock MUI outlined fields (16px on white, square) inside a dialog whose e...

Kamo·3d ago
FixKlusterServices

Record live kontak.kamocrm.com, desktop-1 sizing and the Docs host list

A .forgejo/ change makes the next deploy a full reconcile, which applies every manifest over live state. Four had drifted from live by hand or by another repo's...

Kamo·3d ago
FixEmailService

CalDAV reads are authorised, bodies are generated, and a phone's PUT is parsed

Calendars are listed as calendar collections of events, resources are named by the UID their calendar-data states (encoded in hrefs), writes pass the read gate,...

Kamo·3d ago
FixEmailService

The email.* host no longer reaches EmailService's server-to-server endpoints

The email-route IngressRoute sends every path on an email.* host straight to EmailService, past the API gateway, so the gateway's carve-outs (master spec sectio...

Kamo·3d ago
FixSecurityService

A verification resend that names its account goes to the account's own org

An organization with no domain has no register host of its own, so its members land on register.<platform apex>, whose host names the platform. The resend endpo...

Kamo·3d ago
FixEmailService

An organization with no domain still sends its letters

A domain is optional when an organization is created, but every transactional letter such an org sent threw "has no domains; cannot build NoReply from-address" ...

Kamo·3d ago
FixEmailService

Ics import and export work — rows in, rows out, series included

Import upserts each UID group (master, canonical rule, EXDATEs, edited and cancelled instances) with no reminders and no invitations; E11 reports {created, upda...

Kamo·3d ago
FixKlusterServices

Size every TEI thread pool to the 1-CPU limit, and let probes outlast a batch

TEI 1.5's ONNX backend starts one inference thread per physical host core (24 on k1m1) and reads no thread setting, so under the pod's 1-CPU quota the CFS throt...

Kamo·3d ago
Fixkamo-login

No anonymous write to the session Redis, and no session id in the sign-out log

POST /api/session stored any JSON under any KS= key, with a caller-chosen TTL and no authentication, through a Redis client pair of its own. The session Redis r...

Kamo·3d ago
Fixkamo-internal

The grids' empty sticky-row strips are no Tab stop on a phone

Chrome makes a scroller with nothing focusable inside a Tab stop of its own; at phone width ag-Grid's sticky-top strip (these grids have no sticky rows) took th...

Kamo·3d ago
Fixkamo-internal

The filter rail fits the screen with twenty kinds

The rail beside the notification history is sticky on wide screens. With the nine KamoAI kinds it lists up to twenty kinds (848px), taller than the 608px a 1440...

Kamo·3d ago
Fixkamo-internal

What the screens showed — readable chips and filters, labels clear of units, whole rail tabs, grids a keyboard can use

Found by rendering every SP01 screen at 1280 and 390 px with axe (Task 35): - warning chips (Degraded, Missing, Available, not verified) in amber ink, 5.0:1 - m...

Kamo·3d ago
Fixkamo-internal

A hot reassign always carries its call note; the note-less menu path is gone

Hot Reassign now makes one call: the note travels in the body of mark-reassignment, where SecurityService writes it and the mark together and refuses the mark w...

Kamo·3d ago
Fixkamo-internal

Security Models reads and saves real lists; the chat picker's choice is the conversation's

The access-policy BFF passes AIService's answers through unchanged, so a refused save shows its own reason.

Kamo·3d ago
Fixkamo-internal

No-seat banner's Plans & billing link takes its own line on a phone

At 390 px the Alert action squeezed the button into a three-line column ("PLANS / & / BILLING") beside the sentence. On xs the Alert now wraps and the action ta...

Kamo·4d ago
FixAIService

A QUERY key reaches the provider encoded once

ChatAuth.url returns a URI. WebClient reads a String as a URI template and encoded the already-encoded key again (+ became %252B), so any key holding +, /, = or...

Kamo·4d ago
FixSecurityService

A hot reassign's first note creates the lead's stream linked to the lead

The stream is created for the lead, as the lead view's feed creates it, so its MEDIA_SESSION_POST row carries LEAD_ID and POST_CREATED goes to media.feed.lead.<...

Kamo·4d ago
FixDaemonService

Pin DaemonService to k3m1, where the earthdata drive lives [skip ci]

k1m1 reaches /mnt/worldchunks only through a hard NFS mount of k3m1. That mount has hung, so the kubelet on k1m1 cannot stat the earthdata hostPath. A rollout t...

Kamo·4d ago
FixKlusterServices

Transcribe realtime turns over the pod's own loopback

Speaches 0.9.0-rc.3 posts every realtime turn to /v1/audio/transcriptions. With LOOPBACK_HOST_URL unset it makes that call in-process through httpx's ASGITransp...

Kamo·4d ago
Fixkamo-internal

The calendar's radios wear the organisation's colour

The Repeat field and the scope dialog bring the calendar its first radios. CalendarThemeScope painted buttons, checkboxes and switches in --color-primary but no...

Kamo·4d ago
September 24, 2026
Fixkamo-internal

Signature icons reach the recipient as small PNG parts

The signature's social-network icons, contact-line icons and header decorations are percent-encoded SVG data: URIs. extractInlineImages only decodes base64, so ...

Kamo·4d ago
FixConversionService

Logo-variants runs ffmpeg single-threaded, one logo at a time

The first boot backfill OOM-killed BOTH ConversionService pods (23:04:39 and 23:05:47Z): a 3919x1373 PNG logo and a 4096-wide seeded SVG. ffmpeg gives every fil...

Kamo·4d ago
Fixkamo-internal

Draw member photos at the variant their size calls for

Every uploaded member photo has _sm (50px), _md (150px) and _lg (350px) beside the original, but surfaces picked them ad hoc: MemberAvatar drew _sm up to 40px (...

Kamo·4d ago
FixKlusterServices

Reserve 768M for the OS so --memory 3G fits in the 4Gi pod

Seastar keeps max(1.5 GiB, 7%) of the cgroup limit plus ~94 MiB per shard back for the OS and refuses to start when --memory does not fit in what is left. With ...

Kamo·4d ago
FixVOIPService

Mint a RingCentral webhook verificationToken RingCentral accepts

RingCentral refuses a deliveryMode.verificationToken longer than 32 characters with CMN-101 "Parameter **************** value is invalid" (measured against the ...

Kamo·4d ago
Fixkamo-internal

A socket's one-time key is not a sign-in hand-off

Since 46191c47 every browser WebSocket authenticates with ?otk=<key>. The EmailService sockets connect through the same-origin /email-ws rewrite, so they pass t...

Kamo·4d ago
Fixkamo-internal

New mail shows on /messages as soon as the badge counts it

The badge and the list hear the same socket, and EmailService relays every arrival (verified on NATS: email.changed ARRIVED from both pods, then the unread snap...

Kamo·4d 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