KamoCRM

Live Change Log

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

18,392
Total Changes
6,527
Features
5,537
Fixes
30
Projects
Filter by project
All Projects18,392AIService276APIService177BillingService161ConversionService117DaemonService146DocsService240ESigService93EmailService619InitializerService344KBService162KlusterServices769MCPGatewayService277MediaService620RAGService79SecurityService1,995TranslateService62VOIPService265VectorService11kamo-apps26kamo-asterisk-support28kamo-capcha17kamo-capcha-widget4kamo-internal8,692kamo-login342kamo-marketing642kamo-nowww20kamo-register213kamo-shared-library1,824kamo-signer-monorepo57kamolos114
Filter by type
All TypesBuild23CI525Chore794Docs3,286Feature6,527Fix5,537Other1,001Performance174Refactor281Revert23Style45Test175Upgrade1
September 27, 2026
FixEmailService

A meeting invite answers with a summary, not the entity graph

Sending or updating a meeting invite answered with the CalendarEvent entity. Its attendees point back at their event, so Jackson recursed until the stack overfl...

Kamo·1mo ago
FixEmailService

A composer's meeting invite goes into the organizer's own calendar

MeetingInviteController handed MeetingInviteService.sendInvite the session's member id in the user-id slot, and sendInvite looked the calendar up with findByUse...

Kamo·1mo ago
September 25, 2026
FixEmailService

A signature's icons do not put a paperclip on the message

"kamo Marketing teaser" listed with a paperclip and opened with nothing to download. It has no file: the two parts it carries are the 14px phone and email icons...

Kamo·1mo ago
FixEmailService

A calendar message's plain-text part says what its HTML says

The text/plain alternative of every calendar message was "You've been invited to: " + subject, so an instance cancellation read "You've been invited to: Cancell...

Kamo·1mo ago
FixEmailService

Let the WebDAV verbs through Spring Security's firewall

StrictHttpFirewall admits only GET, HEAD, POST, PUT, PATCH, DELETE and OPTIONS, and answered every PROPFIND, PROPPATCH, REPORT, MKCOL and MKCALENDAR to /dav/** ...

Kamo·1mo ago
FixEmailService

A moved series keeps its days, its end and its exceptions; a lead callback never repeats

A whole-series move (ALL, or THIS_AND_FOLLOWING) now carries the rule with it (spec D-9): UNTIL moves by the same local step, so the last instance stays; a week...

Kamo·1mo ago
FixEmailService

CalDAV reads are authorised, bodies are generated, and a phone's PUT is parsed

Calendars are listed as calendar collections of events, resources are named by the UID their calendar-data states (encoded in hrefs), writes pass the read gate,...

Kamo·1mo ago
FixEmailService

The email.* host no longer reaches EmailService's server-to-server endpoints

The email-route IngressRoute sends every path on an email.* host straight to EmailService, past the API gateway, so the gateway's carve-outs (master spec sectio...

Kamo·1mo ago
FixEmailService

An organization with no domain still sends its letters

A domain is optional when an organization is created, but every transactional letter such an org sent threw "has no domains; cannot build NoReply from-address" ...

Kamo·1mo ago
FixEmailService

Ics import and export work — rows in, rows out, series included

Import upserts each UID group (master, canonical rule, EXDATEs, edited and cancelled instances) with no reminders and no invitations; E11 reports {created, upda...

Kamo·1mo ago
September 24, 2026
FixEmailService

Pin kamo-shared-library 1.6.1, the version the library stays at

39829f6 pinned 1.6.2 together with the library bump in db737a54. That bump is reverted: about thirty other services pin 1.6.1, and CI can only resolve the one v...

Kamo·1mo ago
FixEmailService

An attachment with a Content-ID is still an attachment

A PDF sent from the Gmail app had a paperclip on its list row and no download link in the reading pane. The app stamps every attachment with a Content-ID, and t...

Kamo·1mo ago
FixEmailService

Accept a short-lived otk on the WebSocket handshake, alongside ***

Same change as mediaservice: kamo-internal is moving the *** session id out of browser JavaScript, off sessionStorage and off every WebSocket URL (`?***=<128-he...

Kamo·1mo ago
September 23, 2026
FixEmailService

Catch dead domains and dead mailboxes the checks let through

Campaign 8781b848 ended with 667 bounces and 1,258 failures. Three gaps in the existing eligibility engine let them through: - DomainMailCheck asked A and AAAA...

Kamo·1mo ago
FixEmailService

An IMAP/SMTP connection test must not be usable as a network probe

POST /api/email/member-imap/test and /{id}/imap/test connected to whatever host and port the caller supplied and returned the raw exception message. Any authent...

Kamo·1mo ago
FixEmailService

Alias, domain and personal-mailbox admin actions need a management right

create/delete on an email alias, **************** on the org's sending domains, and **************** on a personal (self-hosted) mailbox all needed only a sessi...

Kamo·1mo ago
FixEmailService

A member's mailboxes and aliases are only readable inside their own organization

GET **************** took no HttpServletRequest at all — no session, no org check anywhere on the path — and GET **************** checked that the CALLER had a ...

Kamo·1mo ago
FixEmailService

A calendar export or import must be one the caller can actually open

GET /export/calendar/{id} and POST /import/{calendarId} took the calendar's UUID alone — no HttpServletRequest, so no session, no org or member check at all. An...

Kamo·1mo ago
FixEmailService

SearchService marks its injection constructor, so the service starts

9809d4b gave SearchService a second constructor (a clock, for tests) and marked neither, so Spring chose neither, looked for a no-argument constructor, and the ...

Kamo·1mo ago
FixEmailService

Search that honours its query, and every mail action on the mailbox that is open

Two problems on /messages, fixed in the service. Search did not work. The index path threw a ClassCastException on every hit (Instant -> Timestamp, visible in ...

Kamo·1mo ago
FixEmailService

Shared-mailbox **************** need a management right

**************** on /api/email/shared-mailboxes needed only a session — any authenticated member could create a shared mailbox, delete one, or grant themselves ...

Kamo·1mo ago
FixEmailService

An OAuth state token is a server-side record, not a blob the browser hands back

/api/email/oauth/callback and **************** are public and sessionless (the provider redirects the browser here with no Kamo session), so `state` was the onl...

Kamo·1mo ago
FixEmailService

A From override must be an address the caller may send as

POST /api/email/send took request.getFromAddress() straight into the header From and the SMTP envelope sender **************** -> EmailSmtpService.send, and the...

Kamo·1mo ago
September 18, 2026
FixEmailService

Aliases and shared-mailbox access name their members as text

GET and POST /api/email/aliases (and /aliases/member/{id}) and GET and POST **************** answered with the entities themselves, whose Long memberId and gran...

Kamo·1mo ago
September 17, 2026
FixEmailService

Saving a calendar/contacts integration never blanks or drops its stored credentials

A contact integration's credentialsJson was replaced by whatever a save sent. The org CalDAV/CardDAV tab sends all four server fields (empty — they never show w...

Kamo·1mo ago
FixEmailService

A shared mailbox's access list is only readable inside its own organization

GET **************** called **************** which read the access rows for any mailbox id. Every other access operation (update, delete, grant, revoke) loads t...

Kamo·1mo ago
FixEmailService

A person taken out of a drip stays out

The engine moves on up to 200 due people per drip from copies it read at the start of a pass, up to 25 seconds old by the time each is used. Meanwhile a member ...

Kamo·1mo ago
September 16, 2026
FixEmailService

Stop refreshing a mailbox grant no app can refresh, and say it needs reconnecting

An org connected Microsoft 365 through Kamo's platform app; the platform app was later switched off and the org has no registration of its own. The resolver the...

Kamo·1mo ago
FixEmailService

Every refused request says why, not just campaign calls

2a72597 gave the campaign controllers the member's sentence instead of "Bad Request". The same loss happened everywhere else in EmailService that refuses with a...

Kamo·1mo ago
FixEmailService

A refused campaign call says why, instead of "Bad Request"

CampaignService refuses with a ResponseStatusException carrying a sentence written for the member ("Pause the campaign before deleting it.", "Only paused campai...

Kamo·1mo ago
September 13, 2026
FixEmailService

Accept OCI image indexes when resolving the built digest [skip ci]

The images are pushed as OCI image indexes, so asking the registry for a single image manifest only answered 404, the digest came back empty and the check faile...

Kamo·1mo ago
FixEmailService

Restart when a same-commit rebuild leaves pods on the old digest [skip ci]

The rollout step tried to detect a same-commit rebuild by comparing the Deployment's image reference before and after `set image`. "Apply manifests" has already...

Kamo·1mo ago
September 12, 2026
FixEmailService

Saving a campaign no longer fails with "Restart read required"

The bulk-provider row (hosts, send window, warm-ups, campaign audiences) was read inside callers' longer transactions. A campaign save writes the row's audience...

Kamo·1mo ago
FixEmailService

The organization owner can open the opt-out list

A brand-new right is granted to nobody on the day it deploys, so a list gated only on MANAGE_EMAIL_OPT_OUTS would ship visible to no organization. The owner hol...

Kamo·2mo ago
FixEmailService

Name the sender once at the top of the preference page

With a logo, the name is its alt text and is not written out again beneath it; without one, the name is the header. It was shown, and read aloud, twice.

Kamo·2mo ago
FixEmailService

The opt-out list only names contacts from organization books

A member's personal address book is theirs; the org-wide opt-out list must not become a way to see whose private contacts include someone.

Kamo·2mo ago
FixEmailService

Every campaign is sent as the org's bulk sender, and its From never pauses it

A campaign's own from_email/from_name are no longer read: the From is always the address and name on Settings > Email > Bulk Email Sender (else the org's NoRepl...

Kamo·2mo ago
FixEmailService

Startup checks for the one-address-per-campaign index instead of creating it

EmailService ran CREATE UNIQUE INDEX on every startup. DDL on this cluster costs every service about fifteen minutes of "schema version mismatch", too much to r...

Kamo·2mo ago
FixEmailService

Review fixes to the provider blob, delivery reports and test send

The provider blob is always written in a transaction of its own, so its lock query stays the first statement and a lost lock race can be retried even when a cal...

Kamo·2mo ago
FixEmailService

A from the platform relay would refuse pauses the campaign instead of failing its recipients

Failing the recipients made every one of them contacted, so once the From was fixed the campaign could never send to those addresses. The send path now checks t...

Kamo·2mo ago
FixEmailService

The platform relay is recognised by one host-and-port check everywhere

Refusing an off-domain From matched the relay by host and port, while the warm-up's delivery tracking and the test send's advice matched by host alone, so a pro...

Kamo·2mo ago
FixEmailService

Live campaign progress reaches browsers on every replica

The STOMP broker is in-heap per pod and progress is raised on whichever pod holds the dispatch lease or received a delivery report, so browsers on the other pod...

Kamo·2mo ago
FixEmailService

The smtp envelope sender is set to the bare from address

Campaign mail now carries a display name in its From, and the relay it goes through accepts only its own sender domain, judged by MAIL FROM. mail.smtp.from is n...

Kamo·2mo ago
FixEmailService

A missing mailing address no longer blocks sending

assertSendable refused to schedule or send a campaign without a physical address. The org's address still goes in the footer when it has one on file; when it ha...

Kamo·2mo ago
FixEmailService

A hold'em invitation is gated on the right to play hold'em

HOLDEM_INVITE was in neither the gated nor the ungated map, so it shipped ungated and failed the test that exists to catch exactly that.

Kamo·2mo ago
FixEmailService

A line break in a sender's display name can no longer start a header

Jakarta Mail encodes commas, quotes and non-ASCII in a display name but passes a raw CR/LF through, so displayedAs now flattens control characters to spaces bef...

Kamo·2mo ago
FixEmailService

The NoReply recorder names the constructor Spring should use

It has two, the second for tests, and with neither marked Spring picks neither: the context failed with "No default constructor found" and took EmailSmtpService...

Kamo·2mo ago
September 10, 2026
FixEmailService

Template logos come from a live theme host

resolveLogoUrls built the logo URL from the org's first domain whatever its state, so an org still setting up its domain got a logo URL that could not be fetche...

Kamo·2mo ago
September 7, 2026
FixEmailService

A notification raised on the wrong pod reached nobody

The broker here is enableSimpleBroker — in-heap, per pod, no relay — and this deployment runs two replicas. MemberNotificationService published straight into it...

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