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
August 27, 2026
FeatureInitializerService

Seed KamoPBX platform defaults

Hibernate ddl-auto adds the SYSTEM_CONFIGURATION columns; @ColumnDefault only applies to newly inserted rows, so the existing singleton needs backfilling. Seed...

Kamo·4w ago
FixInitializerService

Seed Starter at 5 seats and Business at 25

The USERS rows read 25 and 100 while max_seats, the card headline and the plan quiz all said 5 and 25. The volume-discount bands that run past those ceilings ar...

Kamo·4w ago
FixInitializerService

Catalog rows that made the pricing page contradict itself

COMMERCE_POS is ServiceType.POS(21), whose real name is "Lines of Business" - the umbrella switch for what an org sells, rents, services or lends. It was labell...

Kamo·4w ago
FixInitializerService

Three catalog rows that made the pricing page contradict itself

Seat counts. The plan card headline reads max_seats ("Up to 5 users") while the feature list beneath it and the comparison table read the USERS feature row, whi...

Kamo·4w ago
FeatureInitializerService

Per-extension PBX billing schema, backfill and catalog

PbxBillingSchemaMigration is @Order(0) because it adds a column. The shared-library entity maps phone_cost_mode from the moment the build starts, so any runner ...

Kamo·4w ago
August 26, 2026
FeatureInitializerService

One shared calendar per org, one primary per member

Provisioning had nothing underneath it, so two simultaneous first loads both inserted. Collapses what that already made — twenty duplicate rows across seven org...

Kamo·4w ago
FeatureInitializerService

Schema for member-connected inboxes

The old member-only unique on member_imap_configs is discovered by shape rather than by its Hibernate-generated name, and dropped only after the wider key exist...

Kamo·4w ago
FeatureInitializerService

Both mail add-ons are priced per mailbox

Prices unchanged at $5 and $2; only the unit changes. Copy now states what actually counts, and that aliases are unlimited and free.

Kamo·4w ago
FeatureInitializerService

Schema for per-mailbox billing

Kamo·4w ago
FeatureInitializerService

One primary member per mailbox

is_primary was unique per member only, so two members could both claim a mailbox — and PrimaryMailboxIdentityLookup returns null on an ambiguous address, so tha...

Kamo·4w ago
FeatureInitializerService

DDL for the per-member line-window gate

Adds **************** defaulting to false. A column rather than a feature flag because there is no flag system here and MemberCapabilities is a closed, fail-cl...

Kamo·4w ago
FeatureInitializerService

Widen the comms spine to an owner, in the order that keeps it safe

LEAD_CONTACT_POINTS and LEAD_COMMUNICATIONS gain the document manager's (assoc_type, assoc_object_id) pair so an account, a patient or a commerce record can own...

Kamo·4w ago
FeatureInitializerService

Add the RingCentral JWT and direct-number columns

Order 0, because the shared-library entities map both columns from the moment this build starts: every runner that loads a PhoneExtension or a MemberVoipOAuthTo...

Kamo·4w ago
August 25, 2026
ChoreInitializerService

Pin kamo-shared-library 1.6.0

The library moved to 1.6.0 while every consumer stayed on 1.5.0. Consumer CI builds the library from a fresh clone into a cold ~/.m2 and ci-settings.xml mirrors...

Kamo·4w ago
FeatureInitializerService

Create member_availability_window, retire the dated slot table

Creates member_availability_window, adds **************** and rebuilds webinar_child_org_restriction around the type plus an optional weekday. Drops webinar_ava...

Kamo·4w ago
FeatureInitializerService

Read pointers for SMS, AI chat, webinars and missed calls

Three of the five conversation surfaces had no server-side notion of read at all. All four columns are nullable with no backfill: null means never looked, which...

Kamo·4w ago
FixInitializerService

Drop the frozen ordinal CHECK constraints Hibernate froze at create

Hibernate writes CHECK (col >= 0 AND col <= N) over an @Enumerated(ORDINAL) column at CREATE TABLE, where N is the highest ordinal that existed that day, and dd...

Kamo·4w ago
FeatureInitializerService

Move status off the ordinal and onto the name

Adds STATUS_NAME / STATUS_APPLIED_NAME, fills them from the ordinals, then drops the ordinal columns — in that order, which is the only order that keeps the dat...

Kamo·4w ago
FeatureInitializerService

A system report is a bug or an enhancement

ALTER rather than folded into the CREATE, because the table already exists everywhere this has reached. DEFAULT 0 is BUG, which is what every row filed before t...

Kamo·4w ago
FeatureInitializerService

Make orgs.alias unique platform-wide

The column was never constrained. Survivable while an alias was only resolved as (security_provider_id, alias) behind a host, since two orgs under different pro...

Kamo·4w ago
FeatureInitializerService

Put tenant_id back at the front of the clinical resource keys

ddl-auto built PRIMARY KEY (logical_id, resource_type, tenant_id) on fhir_resource_current and fhir_resource_version, because Hibernate emits @EmbeddedId column...

Kamo·4w ago
FeatureInitializerService

Create the System Bugs tables

No CHECK constraint on the ordinal columns: support_ticket_status_check is what happens when Hibernate freezes one at an enum's size and the enum then grows, an...

Kamo·1mo ago
August 24, 2026
FeatureInitializerService

Price the commerce children and the EHR, with a totality guard

Neither pricing map had a totality check, and the two failure modes are different and both silent. Missing from CATALOG, an app lands nowhere on the pricing mat...

Kamo·1mo ago
FeatureInitializerService

Extend market grandfathering into the app-tree backfill

grandfatherExistingGatedMarkets already walked each org's active markets, resolved getRequiredService() and enabled the missing app — it was just restricted to ...

Kamo·1mo ago
FeatureInitializerService

Rich-text description columns on webinar_type

Mirrors the shared-lib entity change. Two things the table needs before MediaService maps them. The description column has to be unbounded: it holds a Lexical ...

Kamo·1mo ago
FeatureInitializerService

Remember the last workspace a member signed in to

users.last_org_id backs the workspace picker. An organization is no longer named by the hostname, so a member who belongs to several chooses one after signing i...

Kamo·1mo ago
August 23, 2026
FixInitializerService

Settle Additional Storage at $2.50 per 10 GB block

Confirms the block size and rate as $2.50 per 10 GB rather than the $4 per 25 GB the production row had drifted to. The seeder, the catalog row, the Stripe pric...

Kamo·1mo ago
FixInitializerService

Price Additional Storage as $4 per 25 GB unit, FLAT not metered

Additional Storage is bought by the unit, belongs to no plan on any tier, and is not seat-based. The seeder still described it as $2.50 per 10 GB block, which i...

Kamo·1mo ago
DocsInitializerService

Correct what the add-on binding gap actually was in production

The previous commit's reasoning was inferred from the loader, not measured. It claimed every KamoCRM add-on row had service_type NULL and that hosted mail was t...

Kamo·1mo ago
FixInitializerService

Bind add-ons to the app they sell, and stop Business granting mail free

**************** is the column **************** matches on. KamoCRMPricingLoader never wrote it, so every KamoCRM add-on row has it NULL and that comparison can...

Kamo·1mo ago
August 22, 2026
FixInitializerService

Drop the frozen ordinal CHECKs that were failing every new enum value

imgs_assoc_id_check allowed assoc_id 0..13. ImageAssocType.PICTURE_FRAME is ordinal 14, so EVERY Picture Frame upload violated it. Hibernate writes CHECK (col ...

Kamo·1mo ago
FeatureInitializerService

Merge the two modified records into one with two layers

Where a document has both kinds, the CLASSIC row survives — it is the one that may hold edited bytes — the design is repointed onto it, and the FORM_FILLABLE ro...

Kamo·1mo ago
FeatureInitializerService

Create the picture_frames table

One row per Picture Frame widget a member has arranged on their launchpad. A table rather than a preference blob because the photos and videos in a frame are i...

Kamo·1mo ago
FeatureInitializerService

Add the master-scope columns to notes

MASTER_SCOPE ('MEMBER' / 'ORG' / NULL) and ORGANIZATION_ID, plus the two indexes the entity declares and a partial unique index per scope so one live master not...

Kamo·1mo ago
FeatureInitializerService

Move existing designs onto FORM_FILLABLE rows

Before versions existed, putting form fields on a document attached an esign_templates row straight to the original, and the Modified tab was "originals that ha...

Kamo·1mo ago
FeatureInitializerService

Add imgs.modified_kind and imgs.original_img_id

Both stay nullable — null kind means the row is an original, so there is nothing to backfill and no NOT NULL step, unlike the usual column-add shape. The parti...

Kamo·1mo ago
FeatureInitializerService

Add the DDL for an event's guest audience

Kamo·1mo ago
August 21, 2026
FeatureInitializerService

Create the chat policy schema

Six tables: the versioned ruleset, its rules and their clauses, the reply grants behind "reply only while their window is open", and the trail of what the polic...

Kamo·1mo ago
FeatureInitializerService

Add binders.is_scratch

Four statements rather than one ALTER: binders is populated, and Yugabyte rejects the whole ADD COLUMN … NOT NULL statement rather than the clause, so the colum...

Kamo·1mo ago
FeatureInitializerService

Add ****************

Records who filed a reservation when that is not the agent it names, so somebody managing opportunities can raise one on a sales agent's behalf without the reco...

Kamo·1mo ago
FeatureInitializerService

Composite indexes for geolite_locations

Country alone was the only index on an 80,429-row table. Measured on production: city resolution (country + subdivision) index-scanned all 18,870 US rows to kee...

Kamo·1mo ago
FeatureInitializerService

Index member_rights_applied on (member_id, the_right)

The table had no indexes at all, while every finder on it filters by MEMBER_ID. At 10,524 rows a single member's rights lookup was a full sequential scan — meas...

Kamo·1mo ago
August 20, 2026
FeatureInitializerService

Composite lead indexes, and unblock the run that creates them

The /leads grid now filters and pages in the database instead of shipping the whole organisation to the browser. With only IX_LEADS_ORG_ID that would relocate t...

Kamo·1mo ago
FeatureInitializerService

Retire ****************

Tracking codes are shared as ?discount=<uuid> now. The old <memberId>.<n> token published a real member id in every shared link and made the space walkable — on...

Kamo·1mo ago
August 19, 2026
FeatureInitializerService

Add users.is_fake, in the only statement order a populated table allows

Mirrors the new `User.isFake` field. Four statements, and the order is the whole migration: YugabyteDB rejects `ADD COLUMN … NOT NULL` on a populated table — re...

Kamo·1mo ago
August 15, 2026
FeatureInitializerService

Add the kamomeet_logo_overlay column

Third overlay surface: the KamoMeet pre-meeting screen. Same shape as the other two — nullable, no backfill, no DEFAULT. The drift guard needed only its field ...

Kamo·1mo ago
FeatureInitializerService

Purge the reports and dashboard rows, and stop seeding VIEW_DASHBOARD

VIEW_DASHBOARD (0), VIEW_REPORTS (1) and EXPORT_REPORTS (2) were deleted from RoleRightType today, along with the two pages they named. This removes what they l...

Kamo·1mo ago
FeatureInitializerService

Add the loading_logo_overlay column

Second surface for the logo overlay feature: the loading screen shown between page navigations, alongside the home page masthead. Both ALTERs live in the one r...

Kamo·1mo ago
FeatureInitializerService

Add the home_logo_overlay column

Backs the Home Page Logo Overlay setting: the solid colour an org can paint over the masthead logo on the kamo-internal home page. Holds a token rather than a ...

Kamo·1mo ago
FeatureInitializerService

Purge VIEW_EMAIL_LOGS rows, and stop a test rotting when ordinals shift

VIEW_EMAIL_LOGS (64) was deleted from RoleRightType today for naming a feature that was never built. This removes what it left behind — measured at 42 role rows...

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