KamoCRM

Live Change Log

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

17,374
Total Changes
5,891
Features
5,258
Fixes
30
Projects
Filter by project
All Projects17,374AIService242APIService174BillingService157ConversionService110DaemonService137DocsService223ESigService91EmailService568InitializerService329KBService151KlusterServices738MCPGatewayService235MediaService592RAGService79SecurityService1,822TranslateService62VOIPService248VectorService11kamo-apps26kamo-asterisk-support27kamo-capcha17kamo-capcha-widget4kamo-internal8,321kamo-login335kamo-marketing641kamo-nowww20kamo-register213kamo-shared-library1,631kamo-signer-monorepo56kamolos114
Filter by type
All TypesBuild16CI523Chore773Docs3,252Feature5,891Fix5,258Other993Performance165Refactor278Revert23Style42Test159Upgrade1
August 26, 2026
Featurekamo-internal

SMS and AI counts, and a per-surface split

One MediaService snapshot covers three surfaces that belong on two different nav indicators, so the totals are separated from the server's declared sessionType ...

kamo·1mo ago
Featurekamo-internal

Confirm before a refresh takes a live call

The SIP session lives in the document and nothing on the server holds a handle to it, so a reload ends the call outright — with no BYE, leaving the far end on s...

kamo·1mo ago
Featurekamo-internal

Rebuild the availability editor around the day it describes

The editor was a stack of form rows that never showed what it was making. It now opens with the thing itself: a 24-hour rail with the block painted on it, in th...

kamo·1mo ago
Featurekamo-internal

One address for a conversation on any of five surfaces

chat/support/social share the chat: namespace because they share one unread snapshot; SMS and AI get their own, because a VoipConversation UUID and a media sess...

kamo·1mo ago
Featurekamo-internal

Routes for the notification spine's counts and mark-reads

The PUT routes answer 204 and must not call .json() on it — that turns a successful mark-read into a 500.

kamo·1mo ago
Featurekamo-login

The workspace picker shows each org's logo

Two letters standing in for a logo was a workaround for the response not carrying one. It does now, resolved server-side from the folder the org's theme was pro...

Kamo·1mo ago
FeatureSecurityService

The sign-in response carries each workspace's logo

The picker drew two letters per row because the response held a name and an alias and no image. A list of workspaces is read by mark long before it is read by n...

Kamo·1mo ago
Featurekamo-internal

Set up RingCentral with a JWT, and assign members their own number

Three screens, one change. The phone server's overview tab replaces "Connect with RingCentral" with the credential form the JWT flow actually needs — client id...

kamo·1mo ago
FeatureVOIPService

Authenticate RingCentral with a JWT, per phone server

RingCentral was the last provider whose credentials came from a Kamo-wide registration plus two browser consent hops — one for the org, one per member. Both are...

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

Give a member a RingCentral JWT and an extension its own number

Two columns, both nullable so nothing is backfilled and no existing row changes meaning. **************** holds a member's own RingCentral JWT. RingCentral onl...

Kamo·1mo ago
FeatureVOIPService

Missed-call and voicemail counts for the softphone indicator

Reported as separate lines rather than a total: the icon shows the sum and its dropdown shows the breakdown, so a pre-summed wire value would make the dropdown ...

Kamo·1mo ago
August 25, 2026
FeatureAIService

Unreviewed-response counts and a mark-read

Keyed by session guid, which is what a tool window carries. Not audited as a disclosure: it returns counts and never a word of a transcript, and recording a bad...

Kamo·1mo ago
FeatureVOIPService

An unread snapshot, a mark-read, and a live frame

Its own NATS subject rather than the existing message one: the browser's handler for /topic/voip/message/ plays the arrival sound and opens a tool window for ev...

Kamo·1mo ago
Featurekamo-internal

Availability for presenters only, and a way to understand it

Three things, all about the same layer. WHO SEES IT. The availability toggle was shown to everybody. Declaring hours is only meaningful for somebody a webinar ...

kamo·1mo ago
FeatureBillingService

Make a replayed Stripe event a no-op

Adds BillingWebhookEventClaimService on its own bean, with REQUIRES_NEW on every method, and wires it into processEvent ahead of the dispatch switch. A losing c...

Kamo·1mo ago
FeatureMediaService

GET /api/webinar/presenting

The webinar types the CALLER is a presenter for. The calendar asks this before it offers an availability layer at all: hours declared by a member no type lists ...

Kamo·1mo ago
Featurekamo-shared-library

Find the types a member presents, and parse-guard the queries

The calendar needs to answer one question before it offers an availability layer: is declaring hours meaningful for this person? Nobody is a presenter by defaul...

Kamo·1mo ago
FeatureMediaService

Tell a member about a webinar booked on their behalf

Not gated on a webinar right, unlike the ticket counters: the case this exists for is one where the member took no action at all, so requiring the right to requ...

Kamo·1mo ago
Featurekamo-internal

The new organization opens in its own tab

Creating one signed THIS tab into it, so a member who created an organization on someone's behalf was silently moved out of the one they were working in — and h...

kamo·1mo ago
FeatureMediaService

Count unreviewed bug reports for platform admins

Zero for an ungated caller rather than a 403: the nav polls this on every page load for every member, and an error they must routinely swallow is how real error...

Kamo·1mo ago
FeatureMediaService

Route unread snapshots to their own STOMP topic

Everything on voip.> went to one topic, whose browser subscriber plays the SMS arrival sound and opens a tool window for every frame. A badge refresh there woul...

Kamo·1mo ago
FeatureMediaService

Refresh unread badges when a visitor message lands

persistInbound announces its own message (publishRealtimeEvent=false, so a visitor's reply does not render as the owner's), and in doing so also skipped the unr...

Kamo·1mo ago
Featurekamo-internal

Write, sign and amend a visit note

The composer changes shape once a note is signed, and that is the whole design. Before signature it is a text area that autosaves. After signature the text area...

kamo·1mo ago
FeatureSecurityService

The visit and its documentation — the loop a practice runs on

Starting a visit is what grants the clinician the chart, and that is the design rather than a side effect. A clinician about to see a patient has no relationshi...

Kamo·1mo ago
FeatureSecurityService

The FHIR R4 endpoint, with the same access rules as the chart

An interoperability endpoint is where a system is most likely to acquire a quiet bypass: it is machine-to-machine, nobody watches it, and "the integration needs...

Kamo·1mo ago
Featurekamo-internal

Convert any logo to vector, and say what the scan found per step

Three things, all reported from the wizard itself. THE COMPACT LOGO NO LONGER DEMANDS AN SVG. The slot can only store a vector -- the backend writes it to a fi...

kamo·1mo ago
Featurekamo-shared-library

Render the chart as US Core FHIR R4

The JSON builder is hand-rolled rather than a Jackson ObjectMapper, and that is a scar rather than a preference. This platform ships a global Long->String seria...

Kamo·1mo ago
Featurekamo-internal

Workweek Days, Weekend Days and Every Day in the Day field

Declaring the same hours five times over was the only way to say 'I present on weekdays'. The Day field now offers the three groups above the individual days. ...

kamo·1mo ago
Featurekamo-internal

A healthcare market's commerce surface is its revenue cycle

The other verticals show orders and agreements because that is where their money is. A medical practice's money is in claims — and specifically in the ones noth...

kamo·1mo ago
FeatureSecurityService

The revenue cycle worklists, and the one restriction that outranks them

Every list here exists because its failure mode is a MISSING row rather than a wrong one, which is why none of them show up in an ordinary report. A claim a cl...

Kamo·1mo ago
Featurekamo-shared-library

Count new bug reports under the listing's own visibility rule

The badge and the list it opens are read side by side; a count computed under a different tenancy rule than the list is a bug report waiting to happen.

Kamo·1mo ago
Featurekamo-shared-library

Count missed calls a member has not been shown

callResult is a free-form provider string, not an enum — the history tab matches the literal 'Missed', and upper() is what stops a provider that reports MISSED ...

Kamo·1mo ago
Featurekamo-shared-library

Record whether an attendee has been told

The case this exists for is a webinar booked on somebody's behalf by somebody else: registration was recorded and nothing in the app ever told them. status coul...

Kamo·1mo ago
Featurekamo-shared-library

Count assistant replies the member has not seen

Keyed by session GUID because that is what a tool window carries. ASSISTANT only: a member's own prompt is not news to them.

Kamo·1mo ago
Featurekamo-shared-library

The healthcare engagement vocabulary

An appointment is the INTENT — a slot someone holds and may not keep — and the ENCOUNTER is the commitment: the visit that actually happened, the thing a note i...

Kamo·1mo ago
Featurekamo-internal

Give bugs and enhancements their own support section

The two report entries were sitting under "Online Support" beside Contact Support and View Active Tickets, which is a different errand: those two are asking a p...

kamo·1mo ago
Featurekamo-internal

Member-level availability, with sub-tabs and a calendar layer

**************** now has two sub-tabs. "Webinar Types" is what an administrator configures — the offering, its presenters, its reminders. "Scheduled Availabilit...

kamo·1mo ago
FeatureSecurityService

Seed MANAGE_WEBINAR_SCHEDULES from MANAGE_SUPPORT_SETTINGS

Until availability moved onto the member, MANAGE_SUPPORT_SETTINGS holders were the one group who set it — they authored the dated slots on each webinar type, wh...

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

Resolve bookable times from member availability

Availability is now computed rather than stored. MemberAvailabilityService owns the arithmetic: expand each presenter's declared windows over the type's booking...

Kamo·1mo ago
Featurekamo-shared-library

Move availability from the webinar type onto the member

Availability was webinar_availability_slot: a dated (date, start, end) row owned by a WebinarType. A presenter who ran three kinds of session had to declare the...

Kamo·1mo ago
Featurekamo-internal

The Patient Records surface — day, safety, search and chart

A nav entry, four panels and a chart. The design decisions worth reading are the ones where the screen is a control rather than a view. The chart's allergy ban...

kamo·1mo ago
Featurekamo-shared-library

Give an SMS conversation a read pointer

VoipConversation had no notion of read at all, so an SMS could be shown but never recorded as seen. Null means never looked, which counts all inbound — the hone...

Kamo·1mo ago
Featurekamo-shared-library

Count social conversations as unread

Social sessions were excluded from the unread membership query by a hand-written type list, so a social conversation could never show a count anywhere. They are...

Kamo·1mo ago
FeatureSecurityService

Keep room for the compact mark among a pile of lockups

A straight "best six by score" is the wrong cap for this, and the reason is the shape of real sites: a company's wide lockup appears in the header, in JSON-LD a...

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

Fit the report form in the window without scrolling

The form was about 120px taller than the 460x690 window's content area, so every new report opened on a scrollbar. Six changes, each of which also reads better ...

kamo·1mo ago
Featurekamo-shared-library

The Patient Records rights, and the access rights they are not

Twenty-three rights under ServiceType.EHR, and every one of them is a SECOND gate rather than the only one. Holding VIEW_CHART does not let a member open a char...

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