KamoCRM

Live Change Log

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

18,582
Total Changes
6,663
Features
5,582
Fixes
30
Projects
Filter by project
All Projects18,582AIService282APIService179BillingService165ConversionService118DaemonService147DocsService258ESigService99EmailService629InitializerService344KBService162KlusterServices771MCPGatewayService277MediaService622RAGService79SecurityService2,025TranslateService62VOIPService265VectorService11kamo-apps29kamo-asterisk-support28kamo-capcha17kamo-capcha-widget4kamo-internal8,756kamo-login342kamo-marketing642kamo-nowww20kamo-register213kamo-shared-library1,860kamo-signer-monorepo61kamolos115
Filter by type
All TypesBuild23CI527Chore794Docs3,288Feature6,663Fix5,582Other1,001Performance174Refactor284Revert23Style45Test177Upgrade1
September 4, 2026
FeatureSecurityService

Serve an org's branding from the host it is browsed on

A white-label sign-in screen is reached at login.<customer domain> with no ?org= on the URL and nothing in sessionStorage, so the front end has no way to name t...

Kamo·2mo ago
Featurekamo-shared-library

Careers is a platform alias, not an org's own

OrgResolutionService.byHost reads a leading label that is not a known platform alias as an ORGANIZATION's alias within the domain behind it, so without this ent...

Kamo·2mo ago
September 3, 2026
Fixkamo-internal

The tab strip declared minHeight twice, so the build never type-checked

Adding icons to the panel tabs appended a second `minHeight` to the same `& .MuiTab-root` literal instead of replacing the old one. TypeScript rejects a duplica...

Kamo·2mo ago
FixMediaService

The incoming-call deep link must use kamocopilot://

KamoMobile's kamomobile:// scheme is step 2 of a rename that has not happened. The published binary registers kamocopilot alone, and a deep link to an unregiste...

Kamo·2mo ago
Featurekamo-internal

Footer Badges — a row of images under the signature

The Content tab's 'Footer Image' was one picture chosen from three fixed sources and sized by a percentage. It is now 'Footer Badges': the same three plus anyth...

Kamo·2mo ago
FeatureInitializerService

Email_signature_badges, and the columns that order them

The footer badge library plus footer_badges / footer_badge_spacing / footer_badge_height on email_signature_templates. A runner and not just ddl-auto for the u...

Kamo·2mo ago
FixKlusterServices

The AI hand-off raced tmux, so nothing was typed and nothing named

Caught by running it on the machine: the terminal opened at the right path, with no command in it and no title. One race, both symptoms. `bootstrap` runs strai...

Kamo·2mo ago
FeatureEmailService

A library of footer badges, and the row each scope prints

The signature footer went from one image to a row of them. The library is org-wide; the selection and its order are per scope, so an image uploaded while editin...

Kamo·2mo ago
FeatureConversionService

Resize an image by height, keeping its format and transparency

Backs the email signature footer badges, which are downscaled to 150px tall on upload. resize-bg could not be reused. It exists to make a wallpaper cheap to sh...

Kamo·2mo ago
Featurekamo-shared-library

The schema behind a row of footer badges

The email signature footer held one image, named by footer_image_source and sized by a percentage. It now holds a ROW of them: the three built-in sources plus a...

Kamo·2mo ago
Featurekamo-internal

Add the VOIP_CALL_EVENTS scope

Lets an org issue kamo-asterisk-support a key for reporting ringing extensions, separately from VOIP_RECORDING_UPLOADS. Uploading a recording after the fact and...

Kamo·2mo ago
Featurekamo-asterisk-support

Report ringing extensions so a member's mobile rings

The AMI client logs in with 'Events: off' and only sends actions, so nothing on a customer's FreePBX ever told the platform a call was arriving. That silence is...

Kamo·2mo ago
FeatureAPIService

API-key surface for live call events from a customer PBX

Companion to VoipRecordingUploadController, on a deliberately separate VOIP_CALL_EVENTS scope: uploading a recording after the fact and making somebody's phone ...

Kamo·2mo ago
FeatureVOIPService

Let an on-premise PBX report a ringing extension

RingCentral and JustCall publish INBOUND_RINGING from their webhooks. FreePBX and KamoPBX publish nothing -- they are the customer's own Asterisk and nothing wa...

Kamo·2mo ago
FeatureMediaService

Ring a member's phone for an incoming call

VoipStompRelayController relayed voip.call.* ringing events to the browser and deliberately never pushed them, reserving incoming-call alerting for 'the future ...

Kamo·2mo ago
Featurekamo-internal

Send to AI opens the terminal it runs in, and the tabs get icons

A dispatch now comes back naming a terminal, and the console opens it. That is not a courtesy view of something already underway — the hand-off is PREPARED on t...

Kamo·2mo ago
FeatureKlusterServices

Pin the session id, and link the terminal session into VS Code

`--session-id <uuid>` is chosen at prepare time rather than left to the CLI, which is what makes the editor hand-off deterministic: the id is known before the s...

Kamo·2mo ago
Fixkamo-internal

Apply in one request, and say why a role cannot be applied to

Follow-up to a review of my own commit. Six real findings. APPLYING IS NOW ONE REQUEST. The résumé used to upload after the application was created, and a fail...

Kamo·2mo ago
FixDocsService

A REQUIRED resume is now actually enforced

A review of my own commit found the enforcement it claimed. JobApplicationService carried the comment "a REQUIRED resume is enforced at that point by requireRes...

Kamo·2mo ago
FeatureSecurityService

Send to AI now runs in a Remote Terminal the operator can watch

The dispatch prepares the hand-off on the dev machine — screenshots, video and the composed prompt written to disk — and answers with the terminal it will run i...

Kamo·2mo ago
Featurekamo-shared-library

A dispatch names the terminal it is running in

Send to AI is hosted in a Remote Terminal now, so the answer has to say which one — the console opens that window, and opening it is what starts the session. B...

Kamo·2mo ago
FeatureKlusterServices

Host a Send-to-AI dispatch in a Remote Terminal

composed prompt — and answers with an opaque TOKEN. A terminal that connects command typed into it. THE TOKEN IS THE WHOLE SECURITY DESIGN. `bootstrap=<command...

Kamo·2mo ago
Fixkamo-internal

The navigator had no surface of its own, so it was transparent

ChatNavigatorPanel draws no background — it is a positioned, animated shell, and the column inside it is what makes it opaque. ChatSwitcherColumn supplies `bg-w...

Kamo·2mo ago
Featurekamo-internal

Jobs Available on /hr, and a Careers tab for every member

Two surfaces over one feature. /hr/careers is where HR writes the adverts and reads who applied; **************** is the internal board an employee browses and ...

Kamo·2mo ago
FeatureInitializerService

Scan hr.careers, and drop the frozen work-location CHECK

Two changes, both required before the careers entities can reach the database. The @EnableJpaRepositories list is an explicit array while @EntityScan is wildca...

Kamo·2mo ago
FeatureSecurityService

Seed the two careers rights onto HR's existing authoring group

MANAGE_JOB_POSTINGS and VIEW_JOB_LISTINGS are inserted as NOT_SPECIFIED like every new right, so without a seed the /hr/careers tab and the member Careers tab w...

Kamo·2mo ago
FeatureDocsService

/api/docs/careers — job postings, the member board, and applying

Two controllers behind one feature, and the split is the point. /careers/** is HR's and requires MANAGE_JOB_POSTINGS; /careers/member/** is the employee's and r...

Kamo·2mo ago
Featurekamo-shared-library

Job postings and applications — the schema behind /hr/careers

Two entities, six enums and two repositories under com.kamo.z.shared.hr.careers, plus the three shared types the feature had to widen. JobPosting is three grou...

Kamo·2mo ago
FixKlusterServices

The terminal list was always empty — tmux escapes control chars

The field separator was a unit separator (0x1f), which is the obvious choice and silently wrong: tmux OCTAL-ESCAPES control characters in `-F` format output, so...

Kamo·2mo ago
Featurekamo-internal

A list of your live shells, in the panel and beside the window

Terminals joins the Interaction Center to the right of Sales Scripts, gated on a provisioned dev machine — the same gate as the Linux Desktop nav option, read o...

Kamo·2mo ago
Fixkamo-internal

Composed mail broke lines mid-word, for every recipient

Quill 2's getSemanticHTML() -- the value react-quill-new hands to onChange, and so every byte of body a member types -- ends its text conversion with .replaceAl...

Kamo·2mo ago
Featurekamo-internal

A "why can't I accept?" override on the filter bar

Right-aligned on the /leads filter bar, wearing the Leads nav icon with the same prohibited emblem — so the thing on the nav that says "you are blocked" and the...

Kamo·2mo ago
FeatureSecurityService

List, rename and end a member's terminals

GET **************** DELETE and PATCH on /terminals/{id}. Every one of them resolves the Linux account from the CALLER'S OWN SESSION and passes no account name...

Kamo·2mo ago
Fixkamo-register

Clip the background carousel so its zoom-in stops flashing a scrollbar

The incoming frame animates in from scale 1.04, and its wrapper did no clipping, so the overscale hung ~2% of the viewport past the bottom edge. A transform ove...

Kamo·2mo ago
FeatureKlusterServices

List, rename and end a member's terminals

GET /terminals?user=X, POST /terminals/<id>/kill, POST /terminals/<id>/title. THERE IS NO DATABASE BEHIND THIS, and that is the design rather than a shortcut. ...

Kamo·2mo ago
Featurekamo-internal

A password shortcut in the hero, and a narrower gate

Two halves of the same subject. The shortcut. Changing your password was three rooms deep behind the rail — the one thing the room layout made genuinely harder...

Kamo·2mo ago
FixSecurityService

Only the member or god may set a member's password

MANAGE_MEMBER_SECURITY passed the change-password gate, which made "can administer members" and "can take over any member's account" the same right. They are no...

Kamo·2mo ago
FixSecurityService

Every terminal handshake was 403 behind the edge proxy

The reported symptom was a terminal that opened and immediately said "Disconnected", with nothing to act on. Reproduced end to end: the ticket mints fine (200) ...

Kamo·2mo ago
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·2mo 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·2mo 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·2mo 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·2mo 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·2mo 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·2mo 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·2mo 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·2mo 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·2mo 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·2mo 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·2mo 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·2mo 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