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 16, 2026
FeatureEmailService

Sending domains — add one, read its DNS record by record, verify it, know what an address may do

A sending domain (news.acme.com) is kept in the org's encrypted bulk provider blob with its DKIM key. SendingDomainChecker reads what receivers will see — SPF e...

Kamo·1w ago
FeatureEmailService

DKIM keys and a relaxed/relaxed rsa-sha256 signer for organizations' sending domains

DkimKeys generates a domain's RSA-2048 key (kept in the org's encrypted bulk provider blob) and the TXT value a member publishes at kamoXXXXXX._domainkey.<domai...

Kamo·1w ago
FeatureEmailService

DNS for sending domains — each domain's own nameservers first, SPF evaluated, DNS provider named

LiveDnsResolver asks the zone's authoritative nameservers (found through 1.1.1.1/8.8.8.8), so a record a member just saved at their DNS provider is seen at once...

Kamo·1w ago
FeatureEmailService

The shared org relay (47.181.8.86) is seeded for every organization; the platform relay stays KamoCRM's

PlatformRelayProperties now knows both in-cluster relays: postfix-bulk (47.181.8.87, hello.kamocrm.com) and postfix-orgs (47.181.8.86), with the egress address,...

Kamo·1w ago
FeatureEmailService

The campaigns widget reads by stage, the stages the campaigns screen files by

The launchpad widget's read now groups and counts campaigns by the stages /marketing/email's tabs use: In-Progress (sending), Not Started (draft or scheduled), ...

Kamo·1w ago
FeatureEmailService

Archive a campaign, and the widget leaves archived ones out

POST **************** and /unarchive (MANAGE_BULK_EMAIL) set and clear the campaign's archivedAt, and CampaignDTO carries it. The /marketing/email screen files ...

Kamo·1w ago
FeatureEmailService

A live read and live frames for the Email Campaigns home widget

GET /api/email/widget/campaigns is the launchpad widget's one read, built for a pane that sits on every campaign viewer's home page all day: lean rows with no b...

Kamo·1w ago
September 13, 2026
FeatureEmailService

Blind copies on the service-to-service template send

SendTransactionalRequest takes an optional bcc list, carried through sendToUser and deliver onto the SMTP envelope — including the platform-address retry — so a...

Kamo·2w ago
FeatureEmailService

Name the recipient in a header that headers-only complaint reports keep

Microsoft's feedback-loop reports now carry only the original message's headers, with anything shaped like an address masked. Every campaign message carries X-K...

Kamo·2w ago
FeatureEmailService

Open and click tracking, complaint reports by email, capped outbox counts

- Tracking: the composer wraps a campaign's web links in a signed redirect (<base>/c/<token>?u=&s=) and adds an open pixel (<base>/o/<token>), as each org c...

Kamo·2w ago
FeatureEmailService

One eligibility engine decides who a campaign may mail

Every list add (a member's, an audience's, a copy) and the send itself ask one engine whether an address may receive the campaign, cheapest check first: syntax,...

Kamo·2w ago
September 12, 2026
FeatureEmailService

Running campaign counts, and Send to latest

Counts: - Every status change moves a campaign's counts by exactly what it changed: a send +1 sent, a later bounce report -1 sent +1 bounced, an add +n, a r...

Kamo·2w ago
FeatureEmailService

A campaign's recipient list pages both ways, with totals, at any size

The list was already read a page at a time, but only forwards, as an endless scroll with no total — and a status filter found its rows by walking the list in ad...

Kamo·2w ago
FeatureEmailService

A campaign can go to every lead, account or application a member can see

"All leads / accounts / applications" is a rule, not a list. It is stored with the campaign (the bulk-provider blob, campaignAudiences — no DDL), runs on the ac...

Kamo·2w ago
FeatureEmailService

The preference page in every language the product speaks

The page behind every unsubscribe link only spoke English. It now speaks all 22 languages the product UI ships: English, Chinese, Hindi, Spanish, French, Arabic...

Kamo·2w ago
FeatureEmailService

An unsubscribe by email is honoured, not dropped

Every bulk and shared-article message offered unsubscribe@<sender's domain> in its List-Unsubscribe header, but nothing read that mailbox - for a tenant it was ...

Kamo·2w ago
FeatureEmailService

Opt-out screens refresh live when anyone changes the list

The ledger now tells OptOutChangePublisher after every committed change - a recipient on the preference page, a bounce, a member in Settings - and it publishes ...

Kamo·2w ago
FeatureEmailService

A real preference page behind every unsubscribe link

The unsubscribe link opened a bare confirm-or-leave card. Someone who only wanted fewer emails had no way to say so, and nothing told them why they were being m...

Kamo·2w ago
FeatureEmailService

An org admin can see and change the whole opt-out list

Settings -> Email -> Opt Out now has its API under /api/email/opt-outs, behind MANAGE_EMAIL_OPT_OUTS (god bypasses): a summary with the last 30 days, the list f...

Kamo·2w ago
FeatureEmailService

Every suppression check and bounce goes through the opt-out ledger

SuppressionService now asks EmailOptOutLedger, so a check sees the do-not-email list, pauses and topics alike, and a bounce lands in the same history as an unsu...

Kamo·2w ago
FeatureEmailService

Several outbound hosts per org, sent round-robin, each warmed on its own, inside a send window

An organization's campaign mail now leaves through any number of outbound hosts, one message at a time in rotation, instead of one bulk provider. - Hosts: an o...

Kamo·2w ago
FeatureEmailService

The NoReply ledger can be filtered by subsystem, pruned, and told what to record

Each row now names the subsystem that sent it and, for a template send, the template key. EmailTemplateService and the campaign sender open a NoReplyOutboundSou...

Kamo·2w ago
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
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
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
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
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
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 7, 2026
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
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
September 5, 2026
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
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
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
September 4, 2026
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
FeatureEmailService

Lock the shared sweeps, and run two pods

Nine of EmailService's ten scheduled sweeps have a shared effect and now take a named lease before running. The most consequential is CampaignDispatcher: at two...

Kamo·3w ago
FeatureEmailService

Buzz a member's phone when mail arrives

MessageIndexer is already a durable consumer of email.inbox.> and already resolves the mailbox OWNER, so it is where this belongs — one notification per genuine...

Kamo·3w ago
FeatureEmailService

Preview variables for the two email-change letters

Both new canonical templates render in the console the moment this service is rebuilt onto the shared library that carries them; without a sampleVariables arm t...

Kamo·3w ago
FeatureEmailService

Resolve mailbox OAuth credentials per organization

Google, Microsoft 365 and Zoho mailbox connects now read whichever app the org is on — its own registration if it brought one, otherwise Kamo's platform app. T...

Kamo·3w ago
September 3, 2026
FeatureEmailService

A library of footer badges, and the row each scope prints

The signature footer went from one image to a row of them. The library is org-wide; the selection and its order are per scope, so an image uploaded while editin...

Kamo·3w ago
FeatureEmailService

Internal endpoint for importing contacts from an external system

VOIPService's JustCall integration needs to land a customer's contacts in the right member's address book, and this is where contacts are written: a Contact map...

Kamo·3w ago
FeatureEmailService

Let a sent message carry images inside its body

The body had four possible shapes and send() could only build three. The multipart/related branch — the one that puts an image where the HTML's cid: points at i...

Kamo·3w ago
September 2, 2026
FeatureEmailService

Send the meeting invitation the guest list implied

Adding somebody to an event's guest list did not tell them. Only a reminder ever wrote to a guest, and a reminder reaches a member in-app and an outside address...

Kamo·3w ago
FeatureEmailService

Let a transactional send carry one attachment

Added for scheduled reports, which are a rendered PDF or workbook that has to reach people who may have no account — a link would not be a delivery for them. T...

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