KamoCRM

Live Change Log

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

19,292
Total Changes
7,055
Features
5,846
Fixes
30
Projects
Filter by project
All Projects19,292AIService291APIService184BillingService169ConversionService125DaemonService153DocsService284ESigService106EmailService678InitializerService359KBService167KlusterServices783MCPGatewayService283MediaService644RAGService80SecurityService2,131TranslateService62VOIPService279VectorService11kamo-apps31kamo-asterisk-support32kamo-capcha17kamo-capcha-widget4kamo-internal9,026kamo-login362kamo-marketing642kamo-nowww20kamo-register224kamo-shared-library1,951kamo-signer-monorepo73kamolos121
Filter by type
All TypesBuild23CI528Chore810Docs3,305Feature7,055Fix5,846Other1,009Performance176Refactor286Revert23Style46Test184Upgrade1
August 9, 2026
Featurekamo-internal

The rest of essential setup on the administrator bar

Security Roles, Departments and Job Titles join the configuration group, left of the audit pair. They are the three Essential Setup tabs the bar was missing — B...

kamo·3mo ago
Featurekamo-internal

Access blocks in the administrator bar, audit links to the trailing edge

Access Blocks and System Access Logs are the two screens on the bar that answer 'who got in and who did not' rather than configuring anything, so they group tog...

kamo·3mo ago
Featurekamo-internal

Name and edit address books, and rebuild the page around them

Adding a book POSTed a hard-coded placeholder name with no prompt, and nothing anywhere could rename one — so every book an org had was called the same thing, p...

kamo·3mo ago
FeatureEmailService

Persist and serve the whole contact, not just its name

The REST layer serialised the JPA entities directly. A Contact has no mapping to its emails, phones, addresses, organisations, URLs, IMs or relationships — thos...

Kamo·3mo ago
Featurekamo-internal

Administrator bar above the launchpad cards

Five screens an org administrator opens constantly — team members, behavior & labeling, stats & costs, apps & features, system access logs — each two or three c...

kamo·3mo ago
FeatureBillingService

Read imaging usage from one deduplicated pass

Follows the shared-library change to one charge per distinct file per organization. Both the summary and the daily snapshot writer take a single imaging pass an...

Kamo·3mo ago
Featurekamo-shared-library

Count each file once per organization, not once per upload

Billing was per imgs record, so an organization that uploaded the same file five times was charged five times. The owner's rule is one charge per distinct file ...

Kamo·3mo ago
Featurekamo-internal

Skip the upload when the platform already has the file

Sending the same video to three people meant three full uploads. Dedup collapsed them into one stored object, but only once each transfer had finished — so the ...

kamo·3mo ago
FeatureMediaService

Attach an already-stored file without uploading it again

Forwarding a 2 GB video to three colleagues cost three full uploads. Storage deduplicated them into one object, but only after each transfer had completed and b...

Kamo·3mo ago
Featurekamo-internal

Show generated preview storage as its own line

Thumbnails and preview images now count toward the organization's total, so the client should be able to see what they cost rather than find them folded into an...

kamo·3mo ago
FeatureSecurityService

Measure the thumbnails and tracks generated from each file

Object keys are content-addressed as **************** so the segment before the first underscore identifies the file a derivative came from. Sizes are summed pe...

Kamo·3mo ago
FeatureInitializerService

Schema for measured thumbnail and track storage

img_dat_derivatives records, per stored file, the real byte size of everything Kamo generated from it. It replaces img_dats.THUMB_FILE_SIZE as the source for th...

Kamo·3mo ago
Featurekamo-shared-library

Bill generated thumbnails to the organization

Thumbnails and per-channel tracks are storage an organization's uploads cause, so on the owner's instruction they now count toward that organization's total rat...

Kamo·3mo ago
Featurekamo-internal

Let a member keep a video or audio attachment, not just play it

The player answers one intention. Wanting the file on disk is a different one, and video and audio were the two attachment kinds with no way to do it — a docume...

kamo·3mo ago
Featurekamo-internal

Show branding and Docstive document storage

Both are written straight to the object store with no size recorded in the database, so they read as zero until a sweep measures them. They now have their own l...

kamo·3mo ago
FeatureSecurityService

Measure branding and Docstive document storage

These are the only two things an organization stores that carry no size anywhere in the database — branding assets go straight into the public bucket under the ...

Kamo·3mo ago
FeatureInitializerService

Schema for object-store-only storage measurement

object_storage_days records what a sweep reads back from MinIO for the two things that carry no size in the database: branding assets and the docs workspace. Bu...

Kamo·3mo ago
Featurekamo-shared-library

Count branding and Docstive document storage

Almost everything an organization stores records its own size somewhere — an imgs row, a kb_media row, a mailbox measurement. Two things do not. Branding assets...

Kamo·3mo ago
Featurekamo-internal

Show text message attachment storage

MMS attachments live inline in the database as data: URIs rather than as files, so they had no size record and were never counted. They now have their own line.

kamo·3mo ago
Featurekamo-shared-library

Count text message attachments

MMS attachments are stored, and were not counted. They are also not what they look like: VoipMessageService encodes the attachment as a data: URI and writes it ...

Kamo·3mo ago
Featurekamo-internal

Show every storage category separately

Call recordings, voicemails, chat attachments, HR resources and marketing materials each get their own line instead of sharing one "Documents and images" row wi...

kamo·3mo ago
Featurekamo-shared-library

Count each kind of stored file as its own category

Call recordings, voicemails, chat attachments, HR resources, marketing materials, meeting recordings and every kind of document are all rows in imgs, distinguis...

Kamo·3mo ago
FeatureEmailService

Measure each org's own KamoMail mailboxes

Walks every mailbox Kamo hosts and records, per arrival day, the RFC822 bytes it holds — headers, body and encoded attachments, across every folder including Tr...

Kamo·3mo ago
FeatureInitializerService

Schema for per-mailbox storage measurement

**************** holds, per mailbox and per arrival day, the RFC822 bytes that mailbox is holding. Storage accounting had no honest source for mailbox bytes: th...

Kamo·3mo ago
Featurekamo-shared-library

Measure the mail Kamo actually hosts, per mailbox

EMAIL was sourced from email_metadata.search_index, which was wrong in both directions. It missed KamoMail entirely — an org on KAMO_MAIL has its messages and a...

Kamo·3mo ago
Featurekamo-internal

Say why mailbox storage can read zero

Mailbox bytes count only the mail Kamo actually hosts. An organization on Microsoft 365 or Google Workspace has its messages on that provider's disks, so its Ma...

kamo·3mo ago
FeatureBillingService

Let a platform admin run the snapshot sweep on demand

The sweep is what makes period removals and lifetime totals for the hard-deleting domains answerable at all, so days lost to an outage are lost permanently unle...

Kamo·3mo ago
Featurekamo-internal

Show storage usage on the account stats tab

The tab said "No usage data available for this period" for every organization. billingApi.getCurrentUsage() is a stub returning { meters: [] }, and UsageMeters ...

kamo·3mo ago
FeatureBillingService

Report what an organization is storing

The account stats tab has always said "No usage data available for this period", for every organization, because getCurrentUsage() in kamo-internal is a stub re...

Kamo·3mo ago
FeatureInitializerService

Schema runner for org_storage_snapshots

Mirrors OrgStorageSnapshot as explicit DDL, per the house style — ddl-auto creates the table first, so the CREATE is a fallback and the SET DEFAULTs are what ac...

Kamo·3mo ago
Featurekamo-shared-library

Per-organization storage usage model

Nothing has ever summed storage per organization. Six entities carry a byte count per file, and no code aggregated any of them, which is why the account stats t...

Kamo·3mo ago
FeatureInitializerService

Declare the **************** app split

The backfill only ever filled a plan row that was missing — deliberately, so it could not silently move a tier — which left apps that had never been priced wher...

Kamo·3mo ago
Featurekamo-internal

Split Apps & Features into Available / Not available / Deprecated

One flat list mixed apps the platform offers with ones it does not and ones it has retired, so the operator had to read every chip to tell them apart. The buck...

kamo·3mo ago
FeatureSecurityService

A tenant-readable app catalog for Branch Types

Branch Types -> Allowed Apps started loading its app list from /platform-config/app-catalog, which requires a top-level org owner. The host page is gated on CON...

Kamo·3mo ago
August 8, 2026
Featurekamo-internal

Add an Apps & Features tab and fix the Allowed Apps list

The new tab, to the right of Organizations, controls what every organization is offered: availability, development stage, display name, description, an operator...

kamo·3mo ago
FeatureSecurityService

Serve the app catalog and read features through it

FeatureController derived "is this app offered" from the enum's stage in four separate places, so the answer could only be changed by redeploying the platform. ...

Kamo·3mo ago
Featurekamo-shared-library

Make app availability and stage editable at runtime

Every attribute the apps settings page renders — display name, description, stage, deprecation — was a compile-time constant in the ServiceType enum, and "Avail...

Kamo·3mo ago
FeatureInitializerService

One properly categorised catalog row per app, on every entitlement root

Nine apps — POS, Marketing Tools, Calculator, Club, Inventory, Legal, Games and the two origination systems — had no catalog representation at all: no pricing r...

Kamo·3mo ago
Featurekamo-internal

Server-paginated organizations console

The tab loaded every organization in one request and rendered a card each, with the backend fanning out per org, then per account, then per subscription. Search...

kamo·3mo ago
FeatureSecurityService

Fail closed on apps a plan never mentions

Turns kamo.entitlement.fail-open off now that AppEntitlementCatalogMigration has run against prod and every active plan on both entitlement roots (KamoCRM, Sign...

Kamo·3mo ago
FeatureBillingService

Serve the org directory as a filtered, sorted, paginated page

GET /orgs takes page/size/q/sort/dir plus seven filters and returns the house page envelope with estate-wide aggregates. GET /orgs/{orgId} serves full detail fo...

Kamo·3mo ago
FeatureBillingService

Batched page hydration at a constant query count

Parent titles, primary domain, the plan/market behind the entitlement and the subscription-catalog flag are each one batched IN (:ids) over the whole page, so a...

Kamo·3mo ago
FeatureBillingService

Directory row/page DTOs and the native query repository

PlatformOrgRow carries the two facets separately: entitlement (inbound subs targeting the org -- what governs it) and billing held (accounts the org owns -- non...

Kamo·3mo ago
FeatureBillingService

Org directory SQL with per-facet CTEs

Held accounts, inbound subscriptions, members, licensees and children each aggregate in their own CTE before being joined to orgs. Joining them in one pass woul...

Kamo·3mo ago
FeatureBillingService

Validated, clamped org directory request

Size clamps to [1,100] and an unrecognised sort falls back to title, so a hand-edited URL can neither request the whole estate nor reach the SQL as free text. T...

Kamo·3mo ago
FeatureBillingService

Derive entitlement mode through one shared, deterministic resolver

TrialAdminService picked its trial subscription with findFirst() over an unordered list, so an org holding both a pending and an active trial could report eithe...

Kamo·3mo ago
FeatureInitializerService

Backfill app entitlement rows into the platform plan catalog

Entitlement now resolves on a typed service_type column, but no catalog row carried one, so every plan still resolved to 'everything included' via the fail-open...

Kamo·3mo ago
FeatureSecurityService

Gate mortgage and personal-loan verticals on app entitlement

A MORTGAGE market appeared on /commerce whenever POS was on, regardless of the MLOS app, and /features/enable had no billing check at all — the padlock in the s...

Kamo·3mo ago
Featurekamo-internal

Rename LOS to MLOS, add Personal Loan Origination System, gate commerce verticals

Apps tab now shows 'Commerce: Mortgage Loan Origination System' (the title is served from the backend enum, not the TS mirror) and a new 'Commerce: Personal Loa...

kamo·3mo ago
Featurekamo-shared-library

Resolve app entitlement by ServiceType; rename LOS to MLOS

Entitlement resolved ServiceType.name() against **************** The catalog's codes are marketing codes (USERS, VIDEO_CONF, HR_SYSTEM, ...) and never matched, ...

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