Sample values for the co-borrower request and its one-time code, so the admin preview renders them
Rebuilds EmailService onto the shared library that carries the MICRO_ACTION_REQUEST and MICRO_ACTION_CODE templates (an org seeds a missing template on first se...
Preview variables for the invoice and invoice receipt emails
commerce.invoice_sent and the new commerce.invoice_receipt (a paid work order or order invoice's receipt) get sample variables, so the template editor's preview...
Audience filters on every trigger, account and loan triggers, enroll by filter
TriggerConfig gains leadFilter, accountFilter, loanFilter, loanStatuses, audienceId and includeExisting; a drip saved with the flat market/vendor/ product/state...
Keep filter subqueries on their row-key indexes, and test them
EXPLAIN against the live catalog showed the planner driving callback, loan status and rate lock subqueries from their status indexes (every such row on the plat...
Lead/account/loan audience filters, saved audiences and audience options
Extends LeadAudienceFilter with status/sub status (include or exclude), assignment, source, created/assigned/last-activity date rules, callback, birthday, loan ...
Send bulk mail from the domain itself, and extend SPF instead of replacing it
- A sending domain can now be the domain itself (acme.com), not only a name of its own (news.acme.com): create/lookup take root=true. Its records are SPF, D...
Index backfill candidate query without a '::' cast
Hibernate's native-query parser read ':text' in ARRAY[]::text[] as a named parameter and the first live run answered 500. (attachment_types IS NULL OR NOT (mark...
Targeted index backfill for removed-attachment counts; conversations carry the count
Listings served from email_metadata.search_index only showed antivirusRemoved for messages indexed after b05af4f. Only mail delivered after the Antivirus mail f...
Purchase requests are gated on the Procurement rights
PURCHASE_REQUEST_SUBMITTED (kamo-shared-library 6a765c18) asks for APPROVE_PURCHASE_REQUESTS, the right SecurityService chose its recipients by; PURCHASE_REQUES...
Message-list rows carry antivirusRemoved / hasBlockedAttachment
The IMAP envelope fetch now names X-Kamo-Antivirus beside Message-ID (same HEADER.FIELDS fetch, no body read), and toEnvelope sets the removed count from remove...
Antivirus for mail β read gate on every mailbox, milter placeholders, send screening, detections
- Read: every attachment/inline part from any mailbox (Kamo Mail, IMAP providers, Graph; personal and shared routes) is hashed in memory (temp file past 8 MiB...
Preview samples for the legal review letters
hr.package_needs_review / hr.package_returned / hr.package_approved (seeded from kamo-shared-library's canonical templates) now preview with realistic whole sen...
Members choose which details their signature prints (UPDATE_OWN_SIGNATURE)
/api/email/member-signature GET/PUT/DELETE; the composer narrows the org's USER-scope toggles with the sender's own choices (never the settings editor's explici...
Read a drip's lead by its primary key
DripContacts.lead/stateOfLead wrote "l.uid = ? AND l.org_id = ?", which YugabyteDB's heuristic planner serves from ix_leads_org_id, walking the whole organizati...
Sales Floor notices are gated on the Leads right
SALES_FLOOR (kamo-shared-library 3ea204a5) is gated on VIEW_LEADS: every owner, floor worker and deal-role holder holds it today, where a floor right would sile...
Stream emails print the sender's and the org's NMLS and the equal housing mark
Saved and written stream emails alike, above the address and unsubscribe. Only for an org with an NMLS number.
Fill the one merge field list, so a saved email reads the same in a drip
A landed call, text or email tells open screens
The contact tracker now announces each communication on the floor's domains, so a call the phone system reports reaches the board at once instead of on the next...
Only write to an owner about domains they have verified
An unverified domain is only a name someone typed in, and the letter's steps assume its owner controls the DNS. Such a domain now counts as nothing to do, so an...
A stream's email wears the org's email template, and can be a saved template
The same compose wrap a drip's email gets. A saved template's HTML goes as it stands, with the compliance lines a written email gets.
Write to an org's owner each week a domain is unfinished
Covers ownership, web addresses, alias-domain mail and what we need to send system mail as the domain. From the platform, one letter per owner, and it stops by ...
Send as an org's domain when its SPF or DKIM authenticates us
A published DKIM key now puts the org's domain on the From by itself, with the envelope left on the platform so a strict SPF record cannot sink the message. SPF...
Stream emails on the drip road, and a lead's mail reply tells their streams
/api/internal/stream-email queues one edition per run and step through DripEditions, so the campaign path keeps the opt-out check, hosts, warm-up and unsubscrib...
A lead's Stop all outreach ends their drips, and an unsubscribe can set it
An unsubscribe is offered to the lead's Stop all outreach, which does nothing unless the organization turned it on. Mail to and from a lead now updates its last...
Sign calendar invitations from an org domain as well
EmailSmtpService.send carried no domain signer, only sendAsMember did, so an invitation sent from an alias domain left unsigned while the member's ordinary mail...
Outbound mail stops looking like spam: a plain-text part, a real Message-ID, no unreachable Reply-To, no zero-font spacers
rspamd's scan of 76 recent kamouniverse.com messages, fixed where each is built: - MIME_HTML_ONLY (75/76): every body is now multipart/alternative with a text/...
An explicit alias at the default alias domain keeps the member on it
personalMailboxes() leaves out the primary mailbox's copy on an alias domain when the member holds an explicit alias at that address. When that copy was the org...
Alias domains sign with the org domain's own DKIM key
An alias domain is an organization domain, and SecurityService already gives every org domain one DKIM key (org_domains.dkim_*), the record the owner is told to...
A member's signature prints the address the letter goes out from
The member's own signature always printed the profile's email - their primary mailbox - so mail sent as Dylan@kamouniverse.com (an alias, or the mailbox on an a...
Voice quiet hours are a partial update and switching them off keeps the member's hours
PUT **************** wrote quietEnd = quietStart to mean 'off', so turning quiet hours off, or saving without quietEnd, lost the member's end, and turning them ...
Per-kind phone and voice channels, the voice mirror, and SI_ASSISTANT_REPLY
Voice Assistant program (2026-10-27) P3-5, P4-1, P4-2, P4-4. - GET/PUT /api/notifications/channels and PUT **************** per-kind PHONE/VOICE choices (BELL...
A colleague's alias can be sent from when their mailbox can
Composing as a colleague offers their aliases in the From picker, but /send authorizes the From against the logged-in member, whose canSendAs knew only the coll...
Alias domains receive and sign on their own; colleague and self defaults
The mail server now learns an org's alias domains from EmailService instead of hand-edited postfix config. KamoMailAliasDomains keeps an alias_domains table in ...
Dovecot push publishes once per mailbox, EHR letters get a subsystem; four stale tests fixed
Production: - DovecotPushService published every arrival, change and unread recount once per application spelling of the mailbox. That fan-out existed because...
Manage the org's alias domains, and allow aliases on them
org_alias_domains only ever existed by hand-written SQL. New /api/email/alias-domains lists them (any member of the org) and adds, removes and sets the default ...
An alias works on every alias domain, like the primary mailbox
The org's alias domains (org_alias_domains) already mirrored the member's primary mailbox into the composer (erik@kamocrm.com also offered as erik@kamouniverse....
A member can send from an alias by default
PUT **************** chooses which alias stands in for the member's primary mailbox (null clears it). One alias per member at most carries is_default; the colum...
MailProvenanceService names its Spring constructor, so EmailService starts again
5cd632f gave it a second public constructor; Spring found no default one and every new pod crash-looped ("No default constructor found"), holding the deploy on ...
A message's sender facts for SI identity checks; SI_AUTH_REQUEST belongs to no app
The provenance answer now also says what the message itself claims about its sender: From, Reply-To, the server that handed it to ours, and the SPF/DKIM/DMARC r...
A plain-text version beside the HTML, and an SI's recap letter for a supervisor when the SI has no mailbox (TPRECAPS)
/api/email/send takes an optional textBody: the body is then multipart/alternative (text, then the HTML), inside mixed when there are attachments. POST ********...
A Reply-To elsewhere is a spoof sign: such mail is never a teammate's proven email
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.
