KamoCRM

Live Change Log

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

17,494
Total Changes
5,983
Features
5,282
Fixes
30
Projects
Filter by project
All Projects17,494AIService251APIService174BillingService157ConversionService110DaemonService138DocsService223ESigService91EmailService576InitializerService329KBService151KlusterServices738MCPGatewayService248MediaService602RAGService79SecurityService1,846TranslateService62VOIPService249VectorService11kamo-apps26kamo-asterisk-support27kamo-capcha17kamo-capcha-widget4kamo-internal8,349kamo-login335kamo-marketing641kamo-nowww20kamo-register213kamo-shared-library1,657kamo-signer-monorepo56kamolos114
Filter by type
All TypesBuild16CI523Chore773Docs3,254Feature5,983Fix5,282Other994Performance165Refactor278Revert23Style42Test160Upgrade1
September 3, 2026
FixSecurityService

Assert the mask obfuscates, and skip the gate for callers with no leads

LeadFieldMaskTest still expected a null e-mail. The mask now obfuscates rather than blanks — a blank field reads as "this lead has no e-mail", which is a differ...

Kamo·1mo ago
Testkamo-shared-library

Wire the accept-gate mock into the FFA spend test

acceptNextLead consults LeadAcceptEligibilityService before it reaches any of the credit logic these cases are about, and the test builds the service by reflect...

Kamo·1mo ago
Fixkamo-internal

A new terminal could reattach to an old shell after a refresh

The shell was keyed on the tool window's id, and @kamo/tool-core builds those as `${toolId}-${++idCounter}` from a counter that RESETS on every page load. So th...

Kamo·1mo ago
Featurekamo-internal

Prohibited nav emblem, Assign to Myself, and obfuscated contact masking

**The Leads nav icon says when you cannot accept.** A member who holds leads they have not worked gets a red block emblem over the Leads icon and a tooltip nami...

Kamo·1mo ago
FeatureSecurityService

Serve the widened accept gate, add self-assignment, and close two contact-mask bypasses

**Endpoints for the new gate.** /leads/available-summary and /leads/available now report both reasons a member is blocked — leads owed a note since they were as...

Kamo·1mo ago
Featurekamo-shared-library

Widen the accept gate, obfuscate masked contact info, let free-for-all leads be claimed

Three related changes to the lead-assignment core. **The accept gate now asks two questions, over every assigned lead.** LeadAcceptEligibilityService replaces ...

Kamo·1mo ago
Featurekamo-internal

Flags on languages, and stop copying platform lists

Completes c20bac57. Languages now carry their flag, the same one the NavTop switcher shows and from the same source — the closed value as well as every row in ...

Kamo·1mo ago
Docskamo-internal

Record what the Remote Terminal deploy actually taught

Three defects, all the same shape: present in the tree, absent from the thing that serves requests — an IngressRoute in a directory nothing applies, a client pa...

Kamo·1mo ago
RefactorKlusterServices

The reaper used `su` too — runuser, and no shell anywhere

Dropping su from the exec path left it in reap_idle, which runs on every terminal connect. Same three objections, and the last one is the one that bites: `su - ...

Kamo·1mo ago
Fixkamo-internal

The ticket request had no route behind it

The window fetched **************** and nothing served it. There is no catch-all under /api/security — every area is proxied by a route file of its own, and the...

Kamo·1mo ago
ChoreSecurityService

Move the terminal IngressRoute to where something applies it

This repo's workflow applies exactly configmap.yaml, deployment.yaml and service.yaml, so a fourth manifest beside them was never applied by anything — the rout...

Kamo·1mo ago
FixKlusterServices

The terminal's IngressRoute was in a directory nothing applies

It was written into securityservice/k8s/ beside the deployment, which reads as the obvious home and is not one: that repo's workflow applies exactly configmap.y...

Kamo·1mo ago
FixKlusterServices

Drop `su` — it swallowed SIGWINCH, so no terminal ever resized

Caught by running the protocol against the live machine, not by reading it: after a resize control frame, `tput cols` in the shell still reported the size the t...

Kamo·1mo ago
Fixkamo-internal

A custom-rendered field can be edited again

Completes c20bac57. Field's `renderValue` was returning in place of the whole read view, which included the button that opens the editor. So any field that ren...

Kamo·1mo ago
Featurekamo-internal

Rebuild My Profile as a hero and five rooms

**************** was one 1,999-line component rendering thirteen identical cards down a single column. One SectionCard helper gave all of them the same radius, ...

Kamo·1mo ago
FixSecurityService

A refused terminal handshake answered 200

Found by probing the deployed endpoint, not by reading it. Returning false from a HandshakeInterceptor aborts the handshake but sets nothing on the response, so...

Kamo·1mo ago
ChoreSecurityService

Rebuild — the last run died fetching actions/checkout

Run 5861 failed in two seconds, before any compilation: the runner could not reach data.forgejo.org to fetch actions/checkout. Nothing to do with the tree, and ...

Kamo·1mo ago
Featurekamo-internal

A real Linux terminal in a tool window, and a submenu to reach it

The Linux Desktop nav option becomes a menu instead of a launch — Remote Desktop with its sizes, Remote Terminal — exactly as the softphone owns call, voicemail...

Kamo·1mo ago
DocsSecurityService

State why the 101 is read before anything is written

The agent parses the request with a buffered reader and then pumps the raw socket, so a byte sent ahead of the status line would be stranded in that buffer and ...

Kamo·1mo ago
DocsKlusterServices

Pin the no-pipelining invariant on the PTY upgrade

self.rfile is a BUFFERED reader over the socket and pump reads the RAW socket, so a caller that sent bytes behind its request line would strand them in that buf...

Kamo·1mo ago
TestKlusterServices

Drive a real PTY and a real socket through the terminal pump

The existing tests pin argv and framing in isolation; these four prove the pieces actually move bytes. A shell is forked under a genuine pty.fork and pumped ove...

Kamo·1mo ago
Featurekamo-internal

A fourth window state — float, drag to detach, drag to reorder

A popup tool window has had three states: docked in the row along the bottom, maximized over the viewport, or minimized to a chat head. This adds FLOATING — det...

Kamo·1mo ago
FeatureSecurityService

Serve Remote Terminal — a real shell over a WebSocket

Bridges a browser to a PTY on the member's own dev machine. Binary frames are the terminal, text frames are control; on the far hop an HTTP 101 onto a length-pr...

Kamo·1mo ago
FeatureKlusterServices

Give the agent a PTY endpoint for Remote Terminal

GET /pty upgrades the connection to `kamo-pty` and becomes a shell: one PTY per browser tool window, `su - <user>` into `tmux new-session -A`, frames pumped bot...

Kamo·1mo ago
Featurekamo-shared-library

Record a dev-machine terminal in the access log

A member opening a shell on desktop-1 now has an event type of its own. That machine holds a cluster-admin kubeconfig and its accounts have passwordless package...

Kamo·1mo ago
Fixkamo-internal

Name a company by its company, with the contact as the qualifier

A record that is both an organisation and a person is now labelled "Harmony Home Loans (Nickolas McGarry)" everywhere one string has to stand for it. Company on...

Kamo·1mo ago
FeatureSecurityService

Send the company alongside the contact wherever a record is labelled

A record that is both an organisation and a person is named "Harmony Home Loans (Nickolas McGarry)" — the company leads, the contact qualifies. That rule lives ...

Kamo·1mo ago
Featurekamo-shared-library

Send an account's company alongside its contact for customer pickers

Six customer pickers read AccountSummaryDTO — the order editor, the service-job form, the subscription detail and wizard, and the pipeline signups tab — and eve...

Kamo·1mo ago
Fixkamo-internal

Drop the scope line above the Communication View timeline

"Every call, text, e-mail, note and chat message with the 9 leads matching these filters." — the filter bar sits directly above this timeline and already says w...

Kamo·1mo ago
Featurekamo-internal

Communication View — the whole filtered book as one timeline

Three changes to /leads. Quick search moves into the hero, above the CRM Settings links. In the filter row it was the last control on a line of eleven dropdown...

Kamo·1mo ago
Fixkamo-internal

Static CSS in the overlay — 19 interpolations were hanging every build

kamo-internal has been unable to produce an image since b08f3b34. `next build` did not fail, it HUNG: no output, no error, no timeout. `.next` frozen at 1.3 MB ...

Kamo·1mo ago
Featurekamo-internal

Add JustCall as a phone server type

Adds JustCall to the picker at **************** with its API key and secret, a contacts-import toggle, credential status on the providers tab, and the logo. Th...

Kamo·1mo ago
FeatureSecurityService

A communications timeline over the whole /leads filter, not one lead

GET **************** takes the SAME query string GET the lead detail page draws — across every lead the filter bar matches. "What has been said to the leads I a...

Kamo·1mo ago
CIkamo-internal

Reap superseded builds unconditionally — the sha check protected the orphan

The reaper added in 199e367e compared each container's commit against github.sha and KEPT the matches, on the theory that a matching sha meant "this run". That ...

Kamo·1mo ago
CIkamo-internal

Reap builds orphaned by cancel-in-progress — they were starving the real one

Builds had gone from 8 minutes to 30+. I blamed the heap and was wrong. Reading the runner instead of the numbers found it: THREE `next build` processes at 213%...

Kamo·1mo ago
FixVOIPService

Encode JustCall query values exactly once

The client built its query with build(true), which declares the values already encoded — so nothing was escaped at all. The character that matters is "+": every...

Kamo·1mo ago
RefactorVOIPService

Say plainly why every JustCall agent reads as ACTIVE

The user listing decided its status with "available is Yes or No -> ACTIVE, else UNKNOWN", which is a roundabout way of asking whether JustCall answered at all,...

Kamo·1mo ago
Performancekamo-internal

Stop the inline image toolbar re-rendering on every scroll frame

measure() runs on each scroll and resize event and built a fresh state object every time, so the toolbar re-rendered whether or not anything about the image had...

Kamo·1mo ago
FeatureVOIPService

Wire JustCall in through the phone provider abstraction

JustCall (api.justcall.io/v2.1) as a full PhoneProvider: call history, texts, voicemail, recordings, the agent directory and availability, plus signed account w...

Kamo·1mo ago
FeatureEmailService

Internal endpoint for importing contacts from an external system

VOIPService's JustCall integration needs to land a customer's contacts in the right member's address book, and this is where contacts are written: a Contact map...

Kamo·1mo ago
Fixkamo-internal

The Desktop size tooltip no longer covers its own options

The Tooltip wrapped the whole TextField, so it anchored to the same box the select's option list opens over — at the default bottom placement it landed directly...

Kamo·1mo ago
Featurekamo-shared-library

Add JUST_CALL as a phone provider type

Appended at ordinal 5. **************** is EnumType.ORDINAL and carries no CHECK constraint, so appending is safe and inserting anywhere else would silently re-...

Kamo·1mo ago
Buildkamo-internal

Give next build 8 GB, it has been thrashing against 4

Builds went from 7-9 minutes to 30+ a few commits ago and nobody had a reason why. Measured on the runner rather than guessed: `next build` sat at exactly 4.39 ...

Kamo·1mo ago
ChoreSecurityService

Rebuild against kamo-shared-library 8dc3ea4c

Picks up entitlement-cache invalidation on comp provisioning. This service owns both halves: it approves the order and it serves the cached entitlements, so wit...

Kamo·1mo ago
Fixkamo-internal

The upgrade offer no longer chases comped organizations

The pill suppressed itself for coverage.source === 'PAID' and nothing else, so a comped organization was shown "33% off your plan" — a discount on a price it do...

Kamo·1mo ago
Fixkamo-shared-library

Comping an account now drops its cached entitlements

SecurityService answers /api/security/entitlements/me out of Redis with a 15-minute TTL, invalidated by messages on kamo.entitlements.invalidate. Every self-ser...

Kamo·1mo ago
ChoreSecurityService

Rebuild against kamo-shared-library 31b72fe9

Picks up the draft-order reprice fix: changing a draft's seat count or billing cycle left every money field and line item describing the order's previous shape,...

Kamo·1mo ago
Fixkamo-shared-library

Editing a draft order's seats or cycle now reprices it

updateDraftOrder set seatCount and billingCycle and saved. Both are price drivers, and neither the order's money fields nor its line items were touched, so the ...

Kamo·1mo ago
Featurekamo-internal

A paper colour per block, and blocks that fit their text

BLOCKS NOW FIT THEIR CONTENT. The reader's blocks were all 200px tall whatever they held, because richTextExtension configures the editor with minHeight: 200px ...

Kamo·1mo ago
Featurekamo-internal

Add the JustCall provider logo

The VOIP logo folder had FreePBX, Microsoft and RingCentral but no JustCall mark, so any surface listing JustCall as a provider had nothing to render.

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