KamoCRM

Live Change Log

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

17,650
Total Changes
6,071
Features
5,339
Fixes
30
Projects
Filter by project
All Projects17,650AIService260APIService174BillingService157ConversionService110DaemonService138DocsService223ESigService91EmailService586InitializerService329KBService151KlusterServices744MCPGatewayService261MediaService604RAGService79SecurityService1,872TranslateService62VOIPService250VectorService11kamo-apps26kamo-asterisk-support27kamo-capcha17kamo-capcha-widget4kamo-internal8,411kamo-login340kamo-marketing642kamo-nowww20kamo-register213kamo-shared-library1,678kamo-signer-monorepo56kamolos114
Filter by type
All TypesBuild16CI523Chore775Docs3,257Feature6,071Fix5,339Other998Performance165Refactor278Revert23Style42Test162Upgrade1
August 26, 2026
FeatureEmailService

Back the personal-mailbox API the console already calls

Eighteen client methods over twelve routes that had been shipping with no backend behind them. A member reaches only their own inbox and configures it only once...

Kamo·2mo ago
FixEmailService

A contested primary is a 409, not a 500

The catch-all turned an expected refusal into a server error, which lost the message the member needed and made a routine conflict look like an outage in the lo...

Kamo·2mo ago
FixEmailService

Refuse a primary mailbox another member holds

Primary is a login identifier, so a silent takeover changes which account an address authenticates from a screen that never mentions logins. Assign still works ...

Kamo·2mo ago
FixEmailService

Build the org logo URL from its alias, not its domain

Transactional email is sent to real inboxes, so the header and footer logos have to resolve without any client-side theme JavaScript — they are built exactly th...

Kamo·2mo ago
FixEmailService

Conflict detection now finds conflicts

Delegates to findBusyForMemberInRange and excludes the event being edited in Java, where a null exclusion cannot poison a SQL predicate. The test it replaces m...

Kamo·2mo ago
August 25, 2026
ChoreEmailService

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·2mo ago
FeatureEmailService

Serve Google's OAuth callback on /api/email/oauth/callback

The platform console needs an address to show an operator setting up the Google Workspace registration, the way VOIP has /api/voip/oauth/callback. The only emai...

Kamo·2mo ago
August 22, 2026
FixEmailService

Actually move an event when its calendar is changed

The dialog has always offered a calendar picker when editing and the PUT has always carried the chosen calendarId, but updateEvent had no parameter for it — so ...

Kamo·2mo ago
PerformanceEmailService

Send a guest count instead of every guest

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
FeatureEmailService

Publish and accept an event's guest audience

Kamo·2mo ago
FeatureEmailService

Resolve an event's guest audience into people

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
August 21, 2026
FeatureEmailService

Scan the org's mailboxes for a lead's past e-mail on request

Serves the "Associate Past E-Mails w/ Lead" tick-box. Given a lead and the address just recorded on it, read INBOX and Sent of every mailbox in that lead's orga...

Kamo·2mo ago
August 16, 2026
FixEmailService

Size the pod above its own JVM heap ceiling [skip ci]

The image starts the JVM with -XX:MaxRAMPercentage=70 -XX:+AlwaysPreTouch, so the heap alone may take 70% of the container limit and pre-touch keeps every commi...

Kamo·2mo ago
August 15, 2026
FixEmailService

Campaigns take the bulk-email rights, like the recipient resolver already did

Bulk email was half-enforced and the halves were in different services. **************** in SecurityService has gated recipient resolution on MANAGE_BULK_EMAIL ...

Kamo·2mo ago
FixEmailService

Mailbox administration takes a right, and three endpoints get a session

MailboxController enforced no right at all. MANAGE_EMAIL_ACCOUNTS existed only as a checkRight in the browser and VIEW_EMAIL_ACCOUNTS was referenced nowhere, so...

Kamo·2mo ago
FixEmailService

Every contact endpoint takes the verb that names it

ContactRestController checked ownership carefully — orgOf, userOf, assertBookIsMine, assertGroupIsMine, and 404 rather than 403 so somebody else's id is never c...

Kamo·2mo ago
August 14, 2026
FeatureEmailService

Publish every change of state, not only arrivals

A member has this open in more than one tab about as often as not, and often on a phone as well. Each of those holds its own socket and draws its own bell, and ...

Kamo·2mo ago
FeatureEmailService

A paged, filterable history

The centre could answer one question: the most recent hundred, unread or not, with no way to ask for what had already been read. So anything a member had seen w...

Kamo·2mo ago
FeatureEmailService

Read one event by id

The lead page holds a callback's event id and wants to reopen it in the same dialog the calendar uses, so it needs to be able to fetch the event on its own. Sc...

Kamo·2mo ago
ChoreEmailService

Rebuild against the shared-lib event-range fix

No source change here. Service CI clones kamo-shared-library at build time, so picking up c1e68a9 — which stops an omitted date window failing every calendar ev...

Kamo·2mo ago
FixEmailService

Put a callback on a calendar the member can actually see

Callbacks were not reaching the calendar at all. This service picked the target calendar by account — findPrimaryByUser — and a user is global while a member is...

Kamo·2mo ago
FixEmailService

Stop envelopes claiming a consent answer nobody asked for

remoteImagesAllowed was a primitive boolean, and only the three endpoints that fetch a whole message ever assign it. The folder listing does not — answering it ...

Kamo·2mo ago
FixEmailService

Make event reminders actually notify someone

Three faults, one symptom. Members reported that calendar notifications did not work, and all three reasons were on this side. Reminders were never written. Th...

Kamo·2mo ago
FeatureEmailService

One integer for the mail badge, and count what the index path is worth

Three things, all about knowing rather than assuming. The nav-top unread badge fetched the entire folder tree and picked INBOX out of the result — the most exp...

Kamo·2mo ago
FeatureEmailService

Prove a folder unchanged with HIGHESTMODSEQ, then serve it from the index

Turns the index-backed message list on, by fixing the thing that made it unsafe rather than by flipping the flag. The old check compared message counts and UID...

Kamo·2mo ago
FixEmailService

Record all three IMAP flags, and say why the index cannot serve a list yet

The migration has run, so is_answered exists and SearchIndexService now writes it alongside is_read and is_starred. The index has recorded two of the three flag...

Kamo·2mo ago
FixEmailService

Do not read or write is_answered before its column exists

Follows the shared-library change unmapping the field. Nothing in the deployed path now touches a column that KamoInitializer has not yet created. The index-ba...

Kamo·2mo ago
FeatureEmailService

Serve a folder listing from the index when it can prove it is current

The rows behind a message list are already in Postgres — the metadata index holds sender, subject, date, size, attachment and flags for every message it has see...

Kamo·2mo ago
PerformanceEmailService

Stop opening every folder, and stop refetching every message

Two round-trip problems on the /messages critical path, both invisible in the code that caused them. listFolders opened each folder read-only to read two integ...

Kamo·2mo ago
August 12, 2026
FixEmailService

Stop leaking an IMAP IDLE connection on every browser reconnect

Interrupting the IDLE thread cannot end an IDLE: it is parked in a blocking socket read that only sees the flag once the read returns on its own, up to Dovecot'...

Kamo·2mo ago
August 11, 2026
FixEmailService

The source half of 1b3553f, which committed only its tests

1b3553f staged its two new test files and nothing else, so it landed asserting a nullable FolderManager.setFlags that did not exist yet and cannot compile on it...

Kamo·2mo ago
FixEmailService

Stop an unnamed IMAP flag from being overwritten

IMAP flags are independent, so "mark this read" must say nothing about the star. EmailImapService.setFlags has always taken nullable Booleans and skipped the nu...

Kamo·2mo ago
ChoreEmailService

Rebuild against the shared-library JetStream consumer reconcile

Picks up kamo-shared-library f3a7283. Eight members hold an email-ws-<id> consumer still filtered on email.inbox.<addr> from before subscribeToNats moved to ema...

Kamo·2mo ago
FeatureEmailService

Size each mailbox against the organization's storage

Dovecot now enforces a per-mailbox limit, and nothing was setting the column it reads. This writes it nightly, after the storage snapshot so the capacity being ...

Kamo·2mo ago
FixEmailService

Stop shipping a shared credential as a config default

The platform's shared password was baked in as the fallback for DB_PASSWORD and MINIO_ROOT_PASSWORD, so it lived in this repo and in the built image as well as ...

Kamo·2mo ago
August 10, 2026
FeatureEmailService

Manage an event's guest list

The dialog could show who was already on an event but never add or remove anyone; the only guest operation was re-notifying people who were somehow already ther...

Kamo·2mo ago
FeatureEmailService

Let the conflicts endpoint exclude the event being edited

ConflictDetectionService has always taken an excludeEventId; this endpoint passed null. Without it an event overlaps itself, so the moment the event dialog star...

Kamo·2mo ago
FeatureEmailService

Sync the organisation calendar to phones, without opening a hole

The shared calendar has no owner, so the account-scoped DAV listing could never return it: company events were plainly there on the web and invisible on every p...

Kamo·2mo ago
FixEmailService

Take the caller from the session, not from the query string

GET /api/calendar/calendars took userId as a request parameter, so changing a number in the URL read anyone's calendars — and because calendars carried no organ...

Kamo·2mo ago
FixEmailService

Make MKCOL create a book that can actually be stored

mkCol built a ContactBook carrying neither an organisation nor an owner and returned 201 regardless, so creating an address book from a CardDAV client failed at...

Kamo·2mo ago
FixEmailService

CockroachDB-only SQL that PostgreSQL rejects

CockroachDB spells the text type STRING; PostgreSQL and YugabyteDB use TEXT. 25 casts across native queries were still emitting CAST(x AS STRING) and ::STRING, ...

Kamo·2mo ago
FixEmailService

Scope address books to the member who owns them

Contacts were scoped by organisation alone. listBooks(orgId) was findByOrganizationId(orgId), and the contact list query opened WHERE c.contactBook.organization...

Kamo·2mo ago
ChoreEmailService

Rebuild against shared-library @Lob LONGVARCHAR fix

Hibernate's PostgreSQL dialect read @Lob String columns as OIDs via getLong(). Affects notes, contacts, calendar, OAuth tokens, IMAP passwords, email campaign b...

Kamo·2mo ago
FeatureEmailService

Point at YugabyteDB and use PostgreSQLDialect

CockroachDB has been replaced by YugabyteDB. Connection strings move from cockroachdb-public:26257 to yb-tserver-service:5433, and the Hibernate dialect from **...

Kamo·2mo ago
August 9, 2026
FixEmailService

Publish row ids as strings — a new book 404'd the moment you selected it

CockroachDB unique_rowid() produces 64-bit ids. A real one from contact_books is 1200081912680906758; JavaScript's JSON.parse rounds anything past Number.MAX_SA...

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