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 5, 2026
FixEmailService

Adapt the metadata indexers to array-typed columns

Follows the kamo-shared-library change that maps conversations/search_index array columns as String[]/UUID[] rather than List<T>, which is what stopped every in...

Kamo·2mo ago
FixEmailService

Bound the bulk folder index and stop it on structural failure

Uncommitted work from a concurrent session, swept in so the tree is clean. The bulk index walked pages with totalPages set to Integer.MAX_VALUE and no ceiling,...

Kamo·2mo ago
FixEmailService

Never match a lead against the company's own addresses

A lead whose e-mail was set to noreply@kamocrm.com matched every message that address had ever sent — one lead record surfaced the company's entire outbound mai...

Kamo·2mo ago
FixEmailService

Page the lead sweep until the window is covered

A single fixed page silently lost mail whenever a mailbox took more than pageSize messages between ticks — a newsletter burst, a busy shared inbox, or just the ...

Kamo·2mo ago
FixEmailService

Address replies at Reply-To, and stop leaking SMTP exceptions to the UI

A quick reply to a KamoCRM notification failed with `{"error":"Invalid Addresses"}` rendered verbatim in the reply box. That string is Jakarta Mail's own wordin...

Kamo·2mo ago
FixEmailService

Stop classifying a multipart/related HTML root as an attachment

Every transactional email we send with an inlined org logo arrived in our own /messages viewer with a correct subject and a completely empty body. isAttachment...

Kamo·2mo ago
August 3, 2026
FixEmailService

Scan the shared MFA repositories

MfaEnrollmentService is a @Service in kamo-shared-library, so the wildcard @ComponentScan("com.kamo") in this application constructs it whether or not this serv...

Kamo·2mo ago
FixEmailService

Merge duplicate kamo key that crashlooped EmailService

The new EmailService pod has been in CrashLoopBackOff since 16e8a05 — 22 restarts, never once started. snakeyaml raises DuplicateKeyException on a repeated top-...

Kamo·2mo ago
FixEmailService

Harden the kubectl download against flaky egress [skip ci]

dl.k8s.io over the runner's egress intermittently drops mid-transfer: curl: (56) OpenSSL SSL_read: decryption failed or bad record mac which fails the deploy ...

Kamo·2mo ago
FixEmailService

Add missing CampaignController REST endpoints for /api/email/campaigns

The bulk-email workspace/editor call GET/POST /api/email/campaigns etc., but only CampaignService (the @Service) was ever created — no @RestController exposed i...

Kamo·2mo ago
July 28, 2026
FixEmailService

Remove ambiguous unsubscribe requestMatcher that crashed startup

EmailService mounts two servlets (MVC DispatcherServlet + Spring-WS MessageDispatcherServlet at /services/*), so a bare string requestMatchers( "/api/email/unsu...

Kamo·2mo ago
July 9, 2026
FixEmailService

Stop serializing computed xoauth2 getter that broke MailCredentials Redis cache

MailCredentials is cached in Redis (GenericJackson2Json). The added `isXoauth2()` boolean getter was serialized as a "xoauth2" property but has no field to read...

Kamo·3mo ago
July 8, 2026
FixEmailService

Scope KamoMail mailbox/domain listing to the org's own domains (cross-tenant leak)

SECURITY: **************** ran 'SELECT email FROM virtual_users' (and **************** 'SELECT name FROM virtual_domains') with no org scoping, so mailbox/domai...

Kamo·3mo ago
FixEmailService

Persist selected OAuth provider on callback so it stops reverting to KamoMail

Switching an org to Microsoft 365 (or Google Workspace / Zoho) never stuck: the OAuth callback stored tokens and only flipped status on a pre-existing provider ...

Kamo·3mo ago
FixEmailService

Resolve welcome-email logo from the org theme host, not the apex

Header/footer logos in system emails (welcome/verification) were built as **************** — an apex path that only exists on the Kamo marketing site, so for cu...

Kamo·3mo ago
FixEmailService

Constant-time internal-auth secret compare (timing oracle)

Replace String.equals with MessageDigest.isEqual so response latency cannot leak the X-Internal-Auth shared secret byte-by-byte. Fleet-wide sweep of the copy-pa...

Kamo·3mo ago
July 1, 2026
FixEmailService

Return 422 (not 500) when member has no mailbox

listFolders and other read endpoints threw IllegalStateException from MailContext.toMailCredentials() when a member had no IMAP credentials provisioned, which t...

Sage·3mo ago
June 16, 2026
FixEmailService

Don't save transactional NoReply sends to a Sent folder

NoReply is a send-only address with no mailbox, but every transactional send still attempted an IMAP append to its Sent folder, producing a noisy AUTHENTICATION...

Kamo·4mo ago
June 15, 2026
FixEmailService

Mailbox list API returns UI-shaped ****************

GET /api/email/mailboxes returned the raw entity (providerStatus, lastSyncedAt, no member count). The settings UI reads **************** so status was always un...

Kamo·4mo ago
FixEmailService

Authorize privilege-based mailbox access for read + send-as

resolveForMailbox only granted access via a direct MemberMailbox assignment, so mailboxes surfaced through **************** rights threw NoSuchElementException ...

Kamo·4mo ago
May 9, 2026
FixEmailService

Preserve original filename and content type on attachment download

The **************** endpoints (both the personal and shared-mailbox controllers) were emitting Content-Disposition: attachment with no filename parameter and C...

Kamo·5mo ago
April 28, 2026
FixEmailService

Sync members.email when primary mailbox is assigned, changed, or removed

When a mailbox was assigned to a member in a KAMO_MAIL org, members.email was never updated, causing EmailCredentialService to fail to resolve IMAP credentials ...

Kamo·5mo ago
April 26, 2026
FixEmailService

Mark-as-read for shared and member mailboxes

EmailController.setFlags now accepts an optional mailboxId query param and routes through resolveProviderWithMailbox so member-mailbox flags are set against the...

Kamo·6mo ago
FixEmailService

Handle IMAPInputStream in getMessage to prevent ClassCastException

JavaMail can return an IMAPInputStream instead of a decoded String from part.getContent() when message content has not been pre-fetched. The direct (String) cas...

Kamo·6mo ago
April 25, 2026
FixEmailService

Use getHasAttachments() to match Boolean wrapper type

**************** is a Boolean (wrapper), so Lombok generates getHasAttachments() not isHasAttachments(). The latter only exists for primitive boolean. Use Boole...

Kamo·6mo ago
FixEmailService

Reset stale hasAttachments on sync and accumulate correctly

- Reset has_attachments=false at start of bulk sync so stale true values from old false-positive MIME detection are cleared before re-indexing - Accumulate ha...

Kamo·6mo ago
FixEmailService

Support fromAddress override on send

Adds FromAddressRequest to EmailSendRequest so the frontend can specify which alias/shared/mailbox address to send from. SmtpOnlyProvider now uses that address ...

Kamo·6mo ago
FixEmailService

Fix attachment parsing and hasAttachment false positives

Three fixes to EmailImapService: 1. toEnvelope: narrow multipart check to multipart/mixed only — plain HTML+text emails (multipart/alternative) no longer sh...

Kamo·6mo ago
April 24, 2026
FixEmailService

Add com.kamo.z.shared.commerce to EnableJpaRepositories scan

**************** (required by **************** in the shared library) lives under com.kamo.z.shared.commerce but was not included in the JPA repository scan, ca...

Kamo·6mo ago
FixEmailService

Correct field name and type in getFromAddresses response

Backend was sending 'email' key but frontend expected 'address', and sent type 'shared_mailbox' when frontend expected 'shared'. Also fixes hasMailboxes flag wh...

Kamo·6mo ago
April 21, 2026
FixEmailService

Fall back to org_domains when no email_provider_domains default set

KamoMailDomainValidator was hard-failing with 403 for orgs that have a DNS-verified domain in org_domains but never added it to the email provider domain regist...

Kamo·6mo ago
April 20, 2026
FixEmailService

Wire up status filter and auto-seed required templates on list

- EmailTemplateController.list() now accepts ?status= param and filters using the existing findByOrgIdAndStatus repository query - Auto-seeds required templat...

Kamo·6mo ago
April 19, 2026
FixEmailService

Preview uses same auto-vars as sendToUser (org logo + name)

The preview endpoint now injects logoUrl, logoSimpleUrl, and orgName from the org's domain before applying sample content variables, matching the exact variable...

Kamo·6mo ago
FixEmailService

Update EMAIL_VERIFICATION sample vars to match current template

Use expiryText instead of expiryMinutes (renamed variable), and update verifyLink to point to the register subdomain (correct send path).

Kamo·6mo ago
April 18, 2026
FixEmailService

Preserve DB domain case in NoReply from address

Removed toLowerCase() — the domain already comes from resolvePrimaryDomain which reads org_domains from the database, so case is canonical from DB.

Kamo·6mo ago
FixEmailService

Resolve root domain for NoReply from-address instead of bare subdomain

resolvePrimaryDomain() was returning the first domain entry (e.g. "www") which produced NoReply@www. Now prefers root domains (parent == null) so transactional ...

Kamo·6mo ago
FixEmailService

Add internal.auth.secret to EmailService configmap

InternalAuthFilter was rejecting all service-to-service calls (send, seed-org) with 503 because internal.auth.secret was unconfigured. Matches the same INTERNAL...

Kamo·6mo ago
FixEmailService

Allow transactional send on port-25 relay and auto-seed missing templates

Port-25 SMTP (postfix) requires no auth — transactionalCredentials() was throwing ProviderUnavailableException when user/pass were unconfigured, blocking all ve...

Kamo·6mo ago
FixEmailService

Add dao.repositories to JPA scan so EmailTemplateRepository is found

Same pattern as KamoInitializerService — explicit basePackages overrides default scanning and must include every package that has repositories.

Kamo·6mo ago
FixEmailService

Bump kamo-shared-library to 1.4.0

Kamo·6mo ago
FixEmailService

Rename mailboxId→id and providerStatus→status in mailbox list response

Align field names with frontend expectations for member mailbox listings.

Kamo·6mo ago
April 2, 2026
FixEmailService

Support mailbox switching by resolving IMAP credentials per mailboxId

Added getMailCredentialsByEmail to look up virtual_users by email directly, resolveForMailbox to MailProviderResolver with access verification, and optional mai...

Kamo·6mo ago
FixEmailService

Rename DomainService to EmailDomainService to resolve bean name conflict

The shared library's DomainService and EmailService's local DomainService both registered as 'domainService' bean, causing CrashLoopBackOff on deploy.

Kamo·6mo ago
FixEmailService

Correct method signatures in DomainController and MailboxController

- Fix getMemberMailboxes -> getMailboxesForMember in MailboxController - Add missing memberId parameter to getVerificationRecords and verifyDomain in DomainCont...

Kamo·6mo ago
March 27, 2026
FixEmailService

Extract BCC recipients from IMAP messages

BCC header is retained on sent folder copies. Now extracted alongside To and CC so the frontend can display it in sent item previews.

Kamo·7mo ago
March 26, 2026
FixEmailService

Provider GET returns both type and providerType, PUT accepts both

GET /api/email/provider now includes both 'type' and 'providerType' fields in the response for frontend compatibility. PUT now accepts 'type' as a fallback when...

Kamo·7mo ago
March 21, 2026
March 20, 2026
FixEmailService

Update calendar, contact, and integration ID types from Long to UUID

Calendar entities, contact sub-entities, and ContactIntegration IDs are now UUID. Updates all services, controllers, and DAV endpoints.

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