The Opt Out tab keeps its content off the card walls
SettingsView's white card and TabPanel carry no padding; every settings tab supplies its own, and this one did not, so its heading, buttons, figure cards and li...
Pages refetch on org change events instead of loading once
Every successful write through forwardToApi now publishes rt.org.{orgId}.{domain} on core NATS (the domain is the first backend path segment, skipping security/...
The Opt Out tab and the lead chip update live
Both subscribe to **************** (EmailService and SecurityService publish after every committed change; MediaService relays), so a recipient unsubscribing, a...
Pages and settings tabs fill their width instead of a centred column
Drop the max-width and auto-margin caps that held pages and settings tabs to a slim centred column. Where lifting a cap would leave one column of form fields st...
The organization owner sees the Opt Out tab, its menu entry and its card
A brand-new right is held by nobody the day it deploys; gating only on MANAGE_EMAIL_OPT_OUTS would hide the tab from whoever could grant it. Matches Sales Scrip...
House rules for UI work β layout, look, shared parts, live data [skip ci]
Pages fill their width, build from the shared components, colour only from the globals.css tokens, and take changing data over STOMP topics instead of loading o...
A background nothing can draw is reported, not a lost batch
The org setup wizard's Backgrounds step resized each picked or suggested image in a loop with no catch. Since resizeBackgroundIfNeeded now refuses, with a reaso...
A saved background shows the member's picture, never the platform's
Behavior & Labeling pointed each tile at the slot's public URL the moment the commit returned, before provisioning had written the slot (it had not even been re...
Let the server say whether the viewer sees every organization
/network chose between all-networks and my-networks from the platform-rights context. That read fails closed and stays failed until the page reloads, and a god ...
Email opt-out chip and panel on the lead page
Beside the lead's email address there is now a chip saying whether the person may be emailed: Emails allowed, Opted out of all email, Paused until a date, Some ...
Settings -> Email -> Opt Out, the organization's do-not-email list
Everyone who asked not to be emailed, in one place. A masthead says how many are off all email and why (unsubscribed, bounced, marked as spam, asked us to stop)...
Square, bevelled buttons and a 2px-cornered thumb on every scrollbar
The bar's four buttons (jump to start, step back, step forward, jump to end) are now 20px squares with hard corners, and the thumb keeps only a 2px radius. Both...
The opt-out design, and the client both surfaces will call
Settings -> Email -> Opt Out reads /api/email/opt-outs on EmailService; a lead's own address reads **************** on SecurityService. Long ids arrive as strin...
Outbound e-mail hosts, send windows, per-host warm-up and the staged outbox
- Settings β Platform β Configuration gains an Outbound E-Mail Hosts tab, behind the platform right MANAGE_OUTBOUND_EMAIL_HOSTS: the hosts shared with every o...
Delete, filter and switch off NoReply Outbound rows
The audit page gains a subsystem column and filter, checkbox selection with "select all" and "select all matching", and deletes for one row, the selected rows, ...
A saved campaign reopens inside its template, and the From is always the bulk sender's
The body is saved between two comment markers inside the finished email, and reopening a campaign puts only that part back in the middle of the template, where ...
The campaign editor's Recipients and Send steps fill the width instead of an 860px column
The campaign editor writes edge to edge, merge tokens in their own column
The subject sits under the campaign title and the audience beside the status chip, so the compose step is the email body alone, filling the middle of the page, ...
Review fixes for the bulk sender, warm-up and pacing banner
A pass over everything the bulk sender and warm-up screens are built from, fixing what it found: - a warm-up poll that started while a write was on the wire co...
A campaign the backend cannot send says why and how to fix it
EmailService now pauses a campaign instead of failing its recipients one by one when it cannot send it: its From is off the platform relay's domain, or there is...
Email settings redirect lists its hook dependencies
The rights check that sends a member without MANAGE_EMAIL_SETTINGS back to /settings ran in an effect that listed only `loading`, so the linter flagged the miss...
Warm-up says idle days don't count and draws the dates that slid
A warm-up day in which nothing is sent no longer counts: the run slides forward and the day repeats when sending resumes, which makes switching warm-up on befor...
The bulk sender tab fills the width it is given
The tab sat in a 1120px column centred in the settings card, so on a wide screen most of the card was empty margin around a narrow form. The column is gone, alo...
Recipient rows carry contacted, and already-sent rows keep their mark beside the status
EmailService's recipient DTO now reports whether the campaign has already emailed each address. The mapper carries it through, together with lastError, and fill...
The campaign From field says when the bulk relay would refuse it
The campaign's own From field, defaulted from the bulk provider, warns when the address is off the provider's domain, as mail that may land in spam. On the plat...
A relay that never signs in counts as a configured bulk sender
/marketing/email let an organization send campaigns only once its bulk provider had a stored password. The platform relay listens on port 25 with no TLS and no ...
Recipient grid fills name, source and error from either row shape
The campaign recipient grid read name, sourceType and errorMessage from rows that only carried email, status, sentAt and lastError, so three of its five columns...
Warm-up pacing banner on /marketing/email
While the new host warm-up is pacing, campaigns go out far more slowly than their own settings say, and nothing on the campaign said why. The campaigns workspac...
Typed bulk sender client with field errors and the warm-up endpoints
The client knew a provider status called PENDING that the backend never sends, so a sender that was saved but not yet tested fell through to "Not configured". I...
Connection rule, presets and warm-up view model behind the bulk sender
The pure pieces the new screens are built on, each with tests: - the backend's port-first connection rule, mirrored so the form can say how KamoCRM will conn...
Rebuilt bulk sender tab with a new host warm-up panel
The Bulk Email Sender tab is rebuilt from one long form into a set of cards over a draft of the saved state: - a masthead with the live status (a saved but unt...
A missing mailing address no longer blocks sending
The preflight treated an org with no address on file as an error and kept Send and Schedule disabled. The address still goes in the footer when there is one; wh...
Preview the email as sent, a Custom / No Template audience, and a real From field
Preview: a dialog that renders the editor's own buildBodyHtml() output - the string Save stores and the dispatcher sends - so the audience's header, signature a...
NoReply Outbound, a god-only audit of mail sent as the platform NoReply address
A third section under Mail, shown only to god-eligible members, opens /messages/outbound/noreply: every message EmailService handed to the relay as the platform...
The campaigns grid read counts the API never sent
EmailService's CampaignDTO carries a campaign's counters flat (totalCount, sentCount, failedCount, suppressedCount, bouncedCount, queuedCount), but every screen...
A tracking link can land on the white-label CRM fees article
Adds **************** to the destinations the tracking-link picker offers on /marketing/tracking, with its own icon. The path is locale-free like its siblings: ...
The launch bar ends at the form column, clear of a docked chat window
On /network/create the readiness meter and the Launch organization button sat in a bar across the whole page, under the brand preview too - exactly where docked...
A department's Select checks the members it is showing
The Directory's per-department Select used to switch the whole list into select mode with nothing checked, and read "Done" until pressed again. It now checks ev...
Void an organization from Platform -> Configuration -> Organizations
The Organizations tab gains Active and Void sub-tabs, and each organization's drawer a way to void it β or, on the Void tab, to restore it. - Active / Void sub...
Binders and Uploads read as live buttons in the org's brand
The two tabs looked disabled because they were: a MUI Tab with no <Tabs> parent defaults to textColor="inherit", which draws the whole tab at 60% opacity unless...
Topic titles in the bar's dropdowns sit on a darker plate of the brand
A menu's own name at its top and every section heading (Support's "Online Support", "Bugs & Enhancements", "Training"; Docs' "Create new") now sit on a rounded ...
Rebuild for Doc Manager's "Docs & Files" tab label
No code change. The label comes from kamo-translation-dictionary 649b24cb, which the image build clones into messages/ at build time, so it only reaches the sit...
Faces on messages only in conversations of three or more
A face beside every message tells people apart, and between two people the side a message is drawn on already does that - so the corner face now appears only wh...
Every message wears its author's face, on the bubble's corner
In every chat popup tool window - Chat, Support, Exec2Exec, Social, SMS, AI Chat - each message now carries a 16x16 photo that overlaps the bubble's top-left co...
The Signature Requests tab, and a colleague's save in the template editor
Signature Requests, between Templates and Common in the Docs manager: every document the collection's templates sent out for signature, in a grid paged on the s...
Add a meeting link to the conversation - always the platform's Kamo Meet
Both sides of an Exec2Exec window now carry the camera the other chat windows have: Add a meeting link. The meeting is created by MediaService as the PLATFORM o...
The desk's filters, faces and presence; an Exec2Exec badge that burns
Interaction Center > Chats > Exec2Exec gets two filters under the sub-tabs: Org Owner (All | Org-less | Org Owner) and Order By (Last Message | Latest Sign In) ...
Files and Templates, version history, and versioning settings
Members asked for documents that keep their history the way their organization chooses, and for templates that stand on their own instead of the Originals/Modif...
Kamo-careers picks up a branding change within a minute
The comment beside the Careers Logo Overlay said the careers site re-reads config.json hourly. It re-reads it every minute since kamo-careers 14c9ddb, which fix...
A Nav Logo Overlay and a Careers Logo Overlay
Behavior & Labeling gains two more logo overlays in the vocabulary the other six use - a token, resolved against the org's own palette: - "Nav Logo Overlay", d...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.