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
September 12, 2026
FeatureEmailService

A warm-up day nothing was sent on does not count

A warm-up day used to be the N-th 24 hours from the start whether or not anything went, so turning the warm-up on days before the first campaign silently spent ...

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

Campaign mail the platform relay would refuse fails at once instead of being retried

The relay sends only as its own domain and answers anything else with a 451, so a campaign whose From is on another domain used to retry every recipient three t...

Kamo·2w ago
TestEmailService

Spring can build the bulk-email, warm-up and delivery beans

Several of them have a second constructor taking a clock for tests, and with two constructors Spring needs to be told which to use or the whole context fails at...

Kamo·2w ago
FeatureEmailService

New host warm-up holds an org's campaign mail and releases it at the warm-up's pace

While an org's warm-up is on, the dispatcher leaves its campaigns alone and a releaser sends them one message at a time, the earliest due first across the org's...

Kamo·2w ago
FeatureEmailService

Every campaign message names its recipient row in X-Kamo-Ref

The bulk relay logs the header against its queue id and strips it before delivery, so delivery results can be matched to the exact recipient row. The composer'...

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

The relay's delivery reports bounce, block and count campaign mail after hand-off

POST **************** takes the platform relay's reports of what became of each message, matched to the recipient row by the X-Kamo-Ref header or, failing that,...

Kamo·2w ago
FeatureEmailService

The warm-up's schedule, pacing and health rules

A new sending IP is ramped over fourteen warm-up days. Days 1-7 follow a fixed schedule per pace (conservative, balanced, aggressive); from day 8 each day grows...

Kamo·2w ago
FeatureEmailService

A campaign cannot be sent or scheduled without a bulk email sender

The dispatcher used to accept such a campaign and then skip it on every tick, leaving it at SENDING with nothing but a log line. sendNow and schedule now refuse...

Kamo·2w 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·2w ago
RefactorEmailService

The smtp connection rule is stated once and shared

SmtpConnectionRule holds the port convention createSmtpSession applies (465 implicit TLS, 587 STARTTLS, STARTTLS elsewhere only when asked for, anything else pl...

Kamo·2w ago
FeatureEmailService

The provider settings api answers with the saved state and names the field it refuses

PUT now returns the full settings state instead of {success: true}, which blanked the form after every save. Fields are validated server-side and refused as 400...

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

A campaign emails an address at most once, ever

Addresses are matched trimmed and case-insensitively, and a row the campaign has handed to the relay (sent, in flight, bounced, failed, or retried) is now its p...

Kamo·2w ago
September 11, 2026
FeatureEmailService

A ledger of every message sent as the platform NoReply address, readable by god only

Recorded in EmailSmtpService at the one place mail reaches the relay, and decided by the From address, so transactional templates, campaigns and article shares ...

Kamo·2w ago
FeatureEmailService

Email an article to someone, as the platform org, with a working opt-out

A visitor on the marketing site can send the seat-fee article to up to three people. POST /api/internal/article-share (X-Internal-Auth, like every other /api/in...

Kamo·2w 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·2w 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·3w ago
FixEmailService

The last two durable consumers become queues, and contact sync reaches every pod

The mail relay was one of four NATS subscriptions on a plain durable consumer. A plain durable admits exactly ONE subscriber, so at two replicas the second is r...

Kamo·3w ago
FixEmailService

A bulk mark-read announces itself, so the nav badge follows it

The single-message endpoints have always published the mailbox events that move the nav badge and reload the other tabs. The three batch endpoints — flags, move...

Kamo·3w ago
FixEmailService

Every pod relays the mailbox push, so the unread badge moves again

The browser's email relay bound a DURABLE NATS consumer named after the member ("email-ws-<id>"). A durable push consumer admits exactly one subscriber, so with...

Kamo·3w ago
FixEmailService

A service may change a meeting's link, and the room is told

updateEvent restated the title, description, location, colour, timezone and deep link, and dropped meetingUrl — so a link added to a callback that had already b...

Kamo·3w ago
FixEmailService

A preference PUT was resetting every setting it did not mention

Reported as "when I enable repeating sound it does not save". It saved. Then the next preference the member touched turned it off again — and the settings page ...

Kamo·3w ago
FixEmailService

A meeting link can be set, not only read

meetingUrl has been on the entity, in EventDto and in meetingSignature for as long as the dialog has existed, and nothing could ever write it. EventRequest did ...

Kamo·3w ago
FixEmailService

The join link reaches the guest's calendar, not just their inbox

An invitation carried its meeting link in the html body and nowhere else, so a guest who accepted it on Monday and opened their calendar on Friday had no way in...

Kamo·3w ago
FeatureEmailService

A guest a service put on an event is actually told about it

InternalCalendarService wrote the attendee rows and stopped. It never set sendInvites and never called EventInviteService, so a guest arriving through the servi...

Kamo·3w ago
FeatureEmailService

Let a browser report the two conditions only it can see

Every notification so far is raised by the service that watched something happen. These two cannot be: whether a member looked at a conversation within five sec...

Kamo·3w ago
September 6, 2026
FixEmailService

Watch a mailbox for the phone, not only for the browser

An IMAP IDLE listener is the only thing that notices a message arriving; it publishes email.inbox.<addr>, which is what eventually asks MediaService to buzz a p...

Kamo·3w ago
FeatureEmailService

Preview variables for SYSTEM_BUG_COMMENT

Without them the template editor renders the new letter with holes where the report number, the sender and the button go, which reads as a broken template rathe...

Kamo·3w ago
FixEmailService

Give the bug-status preview the denial block it now renders

SystemBugStatusEmail pre-renders two conditional blocks, and the admin preview has to supply both. Present and empty rather than absent: an unsupplied placehold...

Kamo·3w ago
September 5, 2026
FixEmailService

A catalog bump emptied the sweep instead of failing it

Both reads the sweep depends on already sat inside a catch that logs and carries on, so a Yugabyte conflict never surfaced as an error — it surfaced as a tick t...

Kamo·3w ago
FixEmailService

Prove the deploy by digest, not by tag

The previous commit stops `set image` being a silent no-op. This asserts the outcome: after the rollout, the tag is resolved to a digest at the registry and the...

Kamo·3w ago
FixEmailService

A rebuild of the same commit deployed nothing and reported success

The image is tagged with the commit SHA, so rebuilding the same commit produces an identical image reference. `kubectl set image` then changes nothing, the Depl...

Kamo·3w ago
FeatureEmailService

Let a member connect their OWN calendars and contacts

The personal calendars panel asked for GET **************** which was never mapped -- so it failed on every open -- and for Google and Microsoft it had no way t...

Kamo·3w ago
FeatureEmailService

Give every provider's folder tree the same shape before any client sees it

Reporting a folder's SPECIAL-USE attribute was not enough, because a server only sends one if it is configured to — and the KamoMail Dovecot in production sends...

Kamo·3w ago
FixEmailService

Stop one member reaching another's calendar integration, and stop the endpoints handing out the credential

Two defects on the /settings/integrations/member endpoints, both live and both reachable by any signed-in member. The id was the only access control. Every /me...

Kamo·3w ago
FixEmailService

Create a subfolder under its parent, not beside it with a dot in its name

createFolder joined a parent to a new folder's name with a hardcoded ".". On Gmail, which separates its hierarchy with "/", that produced a top-level folder lit...

Kamo·3w ago
FixEmailService

Take the folder from the query, so a Gmail folder can be addressed at all

The folder travelled as a path segment, and Gmail separates its hierarchy with "/" — its Sent folder is `[Gmail]/Sent Mail`. There is no way to put that in one ...

Kamo·3w ago
TestEmailService

Pin the two rules that let an OAuth grant and typed-in DAV credentials share a row

An org-level ContactIntegration holds either a typed-in DAV URL and password or an OAuth grant, and the CalDAV/CardDAV tab writes to that one row from two indep...

Kamo·3w ago
FeatureEmailService

Connect Google and Microsoft calendars over OAuth, on the app the mailbox already uses

The CalDAV/CardDAV tab's Connect via OAuth button raised an alert saying the flow was not implemented and to configure credentials through the API. It now runs ...

Kamo·3w ago
FixEmailService

Report the folder separator and special-use role so Gmail's folders are recognisable

A member on Google Workspace saw every one of their folders listed under "My folders" with its raw path for a label — "[Gmail]/Sent Mail", "[Gmail]/Spam" — and ...

Kamo·3w ago
FeatureEmailService

Send an organization's mail as its own domain when its SPF says we may

The From address was chosen by asking who hosts the organization's MAILBOXES. That is a different question from the one that matters, and it was wrong in both d...

Kamo·3w ago
FixEmailService

Stop a provider config save from discarding another form's fields

Every config panel posts only the fields it owns, flat, alongside the provider type -- the Google Workspace panel sends nothing but serviceAccountJson. PUT /api...

Kamo·3w ago
September 4, 2026
FixEmailService

Stop a Yugabyte read restart from silently killing a transactional send

EmailTemplateService.sendToUser is the endpoint behind every service-to-service transactional email on the platform, and it was @Transactional over three reads:...

Kamo·3w ago
FeatureEmailService

Send an org's own hostname as the mailbox OAuth redirect

An organization that brought its own Google or Entra app registered that app in its own account, under its own brand, and is now told on its settings screen to ...

Kamo·3w 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