KamoCRM

Live Change Log

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

17,662
Total Changes
6,080
Features
5,341
Fixes
30
Projects
Filter by project
All Projects17,662AIService261APIService174BillingService158ConversionService110DaemonService138DocsService223ESigService91EmailService587InitializerService329KBService151KlusterServices744MCPGatewayService261MediaService604RAGService79SecurityService1,874TranslateService62VOIPService250VectorService11kamo-apps26kamo-asterisk-support27kamo-capcha17kamo-capcha-widget4kamo-internal8,413kamo-login340kamo-marketing642kamo-nowww20kamo-register213kamo-shared-library1,682kamo-signer-monorepo57kamolos114
Filter by type
All TypesBuild16CI523Chore776Docs3,257Feature6,080Fix5,341Other998Performance165Refactor278Revert23Style42Test162Upgrade1
August 22, 2026
Featurekamo-marketing

Set the headline in quotation marks

Quotes around the banner line, as asked — but rendered from CSS (`open-quote`/`close-quote` against `quotes: auto`) rather than typed into the string, for two r...

Kamo·2mo ago
Featurekamo-internal

Expression — colour, Spirit Animal and logo as one decision

Two corner controls become one. That split was an accident of the order the features shipped rather than a distinction anybody holds: a colour, a pattern and th...

kamo·2mo ago
Featurekamo-internal

Count on the Binders tab, and land on Selected Docs

The tab reads "Binders (n)" so the count the Selected Docs binder holds is visible from the strip — including (0), which is the case worth seeing, since it says...

kamo·2mo ago
Featurekamo-internal

The picture frame IS the pane, not something inside one

Every other widget is content in the launchpad's frosted glass card, with a header, a title and a corner control. A picture frame is not: rendered that way it i...

kamo·2mo ago
Featurekamo-internal

Show which layers of a modified document were worked on

A document has one modified record, so the Modified tab has one row per document. The column names the layers touched rather than which of two kinds a row was: ...

kamo·2mo ago
Featurekamo-marketing

Trade the NOW LIVE badge for the headline it was hiding

The top banner led with a six-character pill — bordered, uppercase, pulsing — and put the actual message after it. The pill now carries the message itself: "Run...

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

Picture Frame — a member's own photos and videos, in a frame they build

The first INSTANCED widget. A member hangs as many frames as they like, each with its own contents, its own moulding and its own place in the grid, all from one...

kamo·2mo ago
FeatureSecurityService

Frame and media endpoints, and seed the new rights

Self only, and enforced in the QUERY. Every read and write resolves the member from the session and every repository call takes that id, including the single-fr...

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

The schema, rights and storage domain behind frame widgets

A Picture Frame is a member's own photos and videos on their own launchpad, and a member may hang several. This is everything the platform needs to hold one. P...

Kamo·2mo ago
Featurekamo-internal

Put the four member shortcuts on one row

are one class of control, so they now share one row: the launchpad's top-right corner reads as a single strip rather than a two-line stack. styling; it uses th...

kamo·2mo ago
Featurekamo-internal

Position and colour for a pane's logo, and always let a member open the editor

THE EDITOR WAS UNREACHABLE FOR ANYONE THE ROLL HAD NOT DECIDED FOR. `brandOf` answered null until a mark existed and the control was gated on the answer, so a m...

kamo·2mo ago
Featurekamo-internal

Paint the master notes in the organisation's colours

"Our Master Note" is the organisation's PRIMARY and "My Master Note" its SECONDARY, each as a pastel — an 18% tint on white. The pair reads as a set at a glance...

kamo·2mo ago
Featurekamo-internal

Put the two master notes on every launchpad

"My Master Note" and "Our Master Note" are panes in the same sortable grid as everything else — dragged, resized and ordered like any other pane — and neither c...

kamo·2mo ago
FeatureKBService

Serve, provision and protect the two master notes

GET /api/notes/master answers both and provisions whichever is missing. PUT /api/notes/master/org writes "Our Master Note", addressed by organisation rather tha...

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

Model the master notes and the right that guards the org's

A master note is the one note a member — or an organisation — always has. "My Master Note" is provisioned per membership; "Our Master Note" is one per organisat...

Kamo·2mo ago
Featurekamo-internal

Brand a third of a member's panes with the org logo, and let them tune it

A third of a member's panes wear the same faint org mark /leads and /calendar carry, at pane scale. Which panes, and how, is rolled once and kept. WHAT THE ROL...

kamo·2mo ago
Featurekamo-internal

Edit in Classic Mode, and redraw when it saves

The form-fillable editor can now branch out to LibreOffice. The server derives the classic version on the way if the document has not got one, which is the poin...

kamo·2mo ago
Featurekamo-internal

Give the Linux options a Tux who hops

The icon beside "Linux Desktop" and "Dev Machine" was an 18.6 KB static penguin. It is now a 1.4 KB vector one who bounces, built from flat ellipse geometry so ...

kamo·2mo ago
FeatureDocsService

Announce a classic save to the member who made it

A WOPI save on a CLASSIC version now publishes docs.classic-saved.{memberId} so the Kamo PDF editor, if it is open on the form-fillable version, can redraw the ...

Kamo·2mo ago
FeatureMediaService

Relay "the classic version was just saved" to the editor

DocsService publishes docs.classic-saved.{memberId} after a WOPI save lands on a CLASSIC version; this puts it on /topic/docs/saves/{memberId} over the STOMP co...

Kamo·2mo ago
FeatureDocsService

Save As branches a new original, not a new copy of one

PutRelativeFile was unimplemented, so "Save As" in the LibreOffice editor did nothing. It now does what the member means by it: the bytes become a brand-new ORI...

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

Seed 13% of a member's panes with a colour, and offer glass everywhere

TWO THINGS. A SHARE OF THE LAUNCHPAD ARRIVES COLOURED. On a member's first load — once ever — each pane gets a 13% chance of a random palette colour. Enough th...

kamo·2mo ago
Featurekamo-internal

One Modify menu, and Modified as its own records

"Open in Docs" and "Edit PDF" are gone. Each row has Modify, which offers "Edit In Form Fillable Mode" always and "Edit in Classic Mode" only where the LibreOff...

kamo·2mo ago
FeatureDocsService

Derive modified versions instead of editing originals

Opening a document in the LibreOffice editor no longer hands over the original. It derives that document's CLASSIC version — once, reused every time after, and ...

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

Split a document into its original and its modified versions

imgs.modified_kind + imgs.original_img_id. Null kind means the row IS an original — the bytes a member uploaded — which is the correct reading for every row tha...

Kamo·2mo ago
Featurekamo-internal

Resizable, recolourable panes — and pinned notes join the grid

FOUR THINGS, one grid. CUSTOM SIZING. A widget can now declare `custom`, and all five do. The registry's width and height stay the DEFAULT — custom adds a hand...

kamo·2mo ago
Featurekamo-shared-library

Count an event's guests without loading them

Kamo·2mo ago
Featurekamo-internal

Three more widgets — unread mail, leads needing action, today's timecard

The widget system paid for itself: each of these is a registry entry and a component, inheriting the grid, the drag, the ordering, the per-member show/hide, the...

kamo·2mo ago
FeatureSecurityService

Seed the mail and lead widgets, and add a universal seed for the timecard one

The mail and lead widgets follow their data rights exactly as the calendar ones do — ACCESS_MAIL and VIEW_LEADS — so a holder gains no data they could not alrea...

Kamo·2mo ago
FeatureEmailService

Serve the home-page unread digest from the index, never from IMAP

A widget on the home page is on screen for everyone all day, whether or not anybody is reading mail — and a member's IMAP connections are a shared budget of ten...

Kamo·2mo ago
Featurekamo-shared-library

Three more home widgets, and the one that cannot have a parent

Unread mail hangs off ACCESS_MAIL and leads-needing-action off VIEW_LEADS, both by the same rule as the calendar widgets: a widget is gated by the right that go...

Kamo·2mo ago
Featurekamo-internal

Search departments and job types alongside people

kamo·2mo ago
Featurekamo-internal

Model an event's guest audience on the client

kamo·2mo ago
FeatureEmailService

Publish and accept an event's guest audience

Kamo·2mo ago
FeatureEmailService

Resolve an event's guest audience into people

Kamo·2mo ago
Featurekamo-shared-library

Map an event's guest audience and each attendee's source

Kamo·2mo ago
FeatureInitializerService

Add the DDL for an event's guest audience

Kamo·2mo ago
Featurekamo-internal

Put live widgets on the launchpad, starting with two calendar strips

A widget is a live pane that shares the grid, the drag and the ordering with the app cards rather than sitting beside them. Adding the next one is a single regi...

kamo·2mo ago
FeatureSecurityService

Seed the calendar widgets to everyone who can already read the calendar

Both widgets show a member exactly what /calendar already shows them, so a calendar reader gains no data they could not reach — which is what makes this a safe ...

Kamo·2mo ago
FeatureEmailService

Serve and announce the home-page calendar widgets

CalendarWidgetService answers what a widget actually needs and the calendar page hasEarlier/hasLater so an arrow greys out instead of offering an empty page. Th...

Kamo·2mo ago
Featurekamo-shared-library

Give every home widget a five-right policy, and page the calendar for it

Ten rights arrive as two five-right blocks — one per widget — hanging off VIEW_CALENDAR, because a widget must be gated by the right that governs the data it sh...

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