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 24, 2026
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 22, 2026
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
FeatureInitializerService

Purge the stored rows for the two retired notes rights

SHARE_NOTES (72) and MANAGE_NOTES_SETTINGS (73) were deleted from RoleRightType today for having no feature to gate. This removes what they left behind, counted...

Kamo·1mo ago
FeatureInitializerService

Add orgs.background_order

Nullable VARCHAR(20), no backfill and no DEFAULT — every client resolves an absent value to sequential, which is the behaviour every org had before the column e...

Kamo·1mo ago
FeatureInitializerService

Stand up the platform administrator list

Backfills it from the retired system_user_access grants so nobody who could operate the System User before this deploy loses it: direct member grants map one-to...

Kamo·1mo ago
FeatureInitializerService

Seed the meet rights before the gate can lock anyone out

MediaService now requires START_MEETING to create a meeting and VIEW_MEETINGS to resolve one. Measured on production before writing this: 42 security roles acro...

Kamo·1mo ago
August 14, 2026
FeatureInitializerService

Purge stored rows for the deleted chat-channel rights

Ids 74/75/76 no longer resolve. RoleRightsSyncService would sweep them on some future SecurityService boot anyway — silently, at an unpredictable moment, with n...

Kamo·1mo ago
FeatureInitializerService

Move notes from account ownership onto membership

Adds notes.member_id and attaches each note to its owner's earliest membership — the organisation the account has belonged to longest, which in practice is wher...

Kamo·1mo ago
FeatureInitializerService

Backfill ancestors so closure cannot remove access

MemberRightsAppliedService now denies any right whose parent chain is not granted. Every row written before the hierarchy existed knows nothing about ancestors,...

Kamo·1mo ago
FeatureInitializerService

Add the is_rich_text column, defaulted and backfilled to rich

Whether a note is edited as rich text or plain text cannot be read back out of its content: a rich note nobody has formatted yet is byte-for-byte a plain one. W...

Kamo·1mo ago
FeatureInitializerService

Seed every organization a default legal text

One hr_legal_settings row per org, unique on org_id, carrying **************** INSERT-ONLY, never an UPDATE. An org that has edited its own wording owns it; a ...

Kamo·1mo ago
FeatureInitializerService

Member notification tables, and an event's origin columns

Two halves of one feature. A callback scheduled on a lead is mirrored onto the scheduling member's calendar, and the point of the mirror is to get back to the l...

Kamo·1mo ago
FeatureInitializerService

Add is_answered to the mail search index

Adds **************** so the index records all three IMAP flags rather than two. The message list draws a reply marker from this one, and the index-backed listi...

Kamo·1mo ago
FeatureInitializerService

Index and REVOKE the payroll-provider tables

What Hibernate cannot express for the new hr_timecard_payroll_* tables. Two REVOKEs. PayrollDispatch and PayrollSyncIssue refuse updates and deletes in Java th...

Kamo·1mo ago
August 13, 2026
FeatureInitializerService

The void columns on hr_timecard_punch

Mirrors four new nullable columns on the TimecardPunch entity. A void is neither a delete nor a correction: it says the punch should never have existed — a doub...

Kamo·1mo ago
August 12, 2026
FeatureInitializerService

Create ACCOUNT_HISTORY

Mirrors the AccountHistory entity in kamo-shared-library. Written explicitly rather than left to ddl-auto because the defaults matter: ID and DATE_CREATED carry...

Kamo·1mo ago
FeatureInitializerService

The partial indexes that stop a double payment and a code collision

**************** is the teeth behind the export service's refusal to re-issue. A second committed file for one pay period double-pays an entire company, and the...

Kamo·1mo ago
August 11, 2026
FeatureInitializerService

KI registration and schema migration

Tables come from ddl-auto; this runner supplies only what Hibernate cannot -- the partial unique indexes on one open primary assignment and one open pay-rate wi...

Kamo·1mo ago
FeatureInitializerService

Schema for groups that can actually pay

Three runners: BillingGroupRosterMigration creates billing_pay_group_members — whom a group means to pay for, before it has bought anything. org_id is denormal...

Kamo·1mo ago
FeatureInitializerService

Create the HR Training schema

Registers com.kamo.z.shared.hr.training in the explicit @EnableJpaRepositories list — @EntityScan is broad so the entities are found either way, but repositorie...

Kamo·1mo ago
FeatureInitializerService

Create billing_pay_groups explicitly, and undo the legacy collision

Creating it in a migration rather than leaving it to ddl-auto, which produced a half-built table when the entity was pointed at the pre-existing billing_groups.

Kamo·1mo ago
FeatureInitializerService

Add the dunning clock columns

past_due_since and suspension_notified_at, both nullable. Null means paying and not-yet-told respectively.

Kamo·1mo ago
FeatureInitializerService

Drop the constraint that limited a member to one billing account

Finds the constraint by shape rather than by name — Hibernate generated it and the name is not stable across environments, so any unique constraint on account_m...

Kamo·1mo ago
FeatureInitializerService

Add the auto-expand columns

Kamo·1mo ago
FeatureInitializerService

Add the columns that make a price change detectable

Order(0), nullable, no backfill — a null amount reads as "we do not know what this price was created with" and the reconciler treats it as unknown rather than a...

Kamo·1mo ago
FeatureInitializerService

Reprice Additional Storage as $2.50 per 10 GB, org-wide

The add-on described an organization-wide shared pool and was then priced USAGE_BASED at $4 with "25 GB" stated only in prose. Nothing ever submitted a storage ...

Kamo·1mo ago
August 10, 2026
FeatureInitializerService

Add and backfill accounts.date_created

Hibernate cannot add this one itself: ddl-auto emits it NOT NULL, which CockroachDB refuses on a table that already has rows. So it is added nullable here, back...

Kamo·1mo ago
FeatureInitializerService

Move calendars onto memberships and give each org a shared one

Calendars and events were owned by an account and carried no organisation. This attaches each to its owner's earliest membership — the organisation the account ...

Kamo·1mo ago
FeatureInitializerService

Hand shared address-book contacts back to their owners

EmailService now scopes every contact read to contact_books.owner_id, which leaves the contacts already sitting in an ownerless organisation-default book unreac...

Kamo·1mo ago
August 9, 2026
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·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