The card on admin, leads and settings — history values, reservations, mailboxes, audit logs, the profile hero
Every remaining member these screens show opens the member card. Ids are the strings the data carries, each checked on the server's origin/main. - History (Ent...
The card on home boards, HR, KB, documents and e-sign — face and name as one door
The owner's two: the Achievement Leaderboard and Affiliate Scoreboard widgets had the card on the 20px face only. MemberFace (BoardChrome) now takes the row's n...
The card on chat, support and the dock's windows — names beside faces, and the lines that name people
Where a face already opened the member card and the name beside it did not, and on the lines that name people. Every id is the string the data already carries, ...
The card's header wears the wallpaper their desktop shows
The header band now shows the member's own desktop wallpaper — their first photograph on air, or the organization's when that is what their desktop plays — unde...
An article's byline names its author, and opens their card
kbservice answers GET /articles/{guid} with its entity, so authorMemberId is a JSON number, and JSON.parse rounds a 19-digit member id. The article route compar...
The Enter that opens a card goes no further
A name's trigger handled Enter and Space but let the key bubble on, so a list around it that acts on Enter itself — the timecard approvals queue opens the membe...
The row no longer guards against the card's presses itself
The member card now keeps the events that start something inside itself (a92b3cac), for every surface, so the chat row's own guard against a press from its card...
A card opened in a tool window knows who is online
Presence and availability are provided inside AuthedChrome, but the ToolDock — every chat, ticket and social window, and the chats switcher — is mounted above i...
The card on the long tail — HR, KB, boards, webinars, growth, tracking, Hold'em
Every member these screens name now opens the member card. Ids are the strings the data already carried, except where noted. - PersonCell / PersonStack (HR att...
The card on chat and the clubhouse — rows, roster, message faces, post authors
Surfaces (every id is the string the data already carries): - ConversationRow: each face in a chat row's avatar stack (members[].memberId), and the name an un...
The card on leads — assignees, timeline authors, history and ticket agents
Every place the lead screens name a member (staff) now opens that member's card. Ids are the string member ids the data already carries. - Lead view: the Assig...
A name with no card to open draws no hover underline
MemberName drew its dotted hover underline even when the surface had no member id, so a plain name promised a card it could not open. The underline now comes on...
The card on settings and admin lists — members, billing, platform admins, phone, commissions
The member card on the settings and admin lists that show people. Each name opens the card on hover, focus or tap; a name that already does something on click k...
The card on calendar guests, document authors and account notes
- Calendar: the event dialog's resolved guest rows open the member card (the audience preview's memberId, carried onto GuestRow). A hand-typed address has no ...
The member card — hover any member, see who they are and what you can do
One card for every member name in kamo-internal, gated by the server rule SecurityService now serves (MemberInteractionPolicy, securityservice 5063eaa): chat, c...
A client's message pops its window into the front row, not a strip behind it
Reported 2026-09-17: Ian wrote into his Exec2Exec chat and the desk never saw it pop up; it was found only by going into the Interaction Center. Nothing upstre...
The dock moves on the compositor, and a window that moves no longer re-renders the tool inside it
Everything about a popup tool window that MOVES - re-packing the row, trading places with a strip click, stepping out of a row behind, a drag, a seam pull, taki...
A red mark on the calendar when nobody can book a webinar with you
The presenter of a webinar whose hours have run out was never told. The booking page just offers no times, and the one person who can fix it is the one person t...
The Webinars section reads the lead API that exists
It called /api/webinar/leads/{id}, which MediaService never served (live 404), and a 404 reads to this section as "the feature is off" — so it rendered nothing,...
The chat head menu acts on the person in the chat, not on the window id
A head's id is its window's id (`chat-3`), and the menu read it as the member it was a chat with. So it fetched /api/security/members/chat-3 — a 404 — and with ...
A window the member brings to the front lands with a light you cannot miss
Clicking a hexhead, or the strip of a window standing behind, brought the window forward with a faint shadow bloom (strip) or a 600ms green glow (hexhead) - eas...
A meeting from a chat window invites the conversation, and one email goes to everyone
Starting a meeting from a conversation window's meet button, or from a chat hexhead's "Invite to Meeting", invited nobody. The dialog closed as though the invit...
My Scheduled Webinars and Join Existing read the booking the server actually sends
The Support badge now takes a presenter to My Scheduled Webinars when a session is booked with them (mediaservice 0212445). That tab — and the wizard's Join Exi...
No OAuth client secret in kamo-internal's source; the anonymous token route is gone
**************** assigned the client-credentials secret for four production client ids (kamo:1:crm:internal, kamo:4:kamo:internal, kamo:5:ebonix:internal, kamo:...
Integration forms send only the credentials that were typed
The org CalDAV/CardDAV tab sent all four server fields on every save of an Apple or custom server. The fields never show what is stored, so they were empty, and...
Windows that do not fit the dock stand in rows behind it
A tool window that does not fit the front row now stands in a row BEHIND it, one title strip higher per row: its 42px title bar and 10px of body show above the ...
The provider form never holds the stored API key
AIService no longer returns provider API keys (only hasApiKey and a last-four mask). The edit button used to copy the returned key into the form, so it was in t...
Overlays clear the tool windows, scrollbars stack with their layer, and the rest of the shell geometry
What was left after pages stopped painting over the shell. Overlays opened BEHIND tool windows. Hand-rolled modals, menus and toasts named levels inside the sh...
Start a Facebook / Instagram connection through the authenticated connect-start
The Connect button navigated to **************** MediaService trusted both values with no session, so anyone who knew a connection id could bind their own page ...
Pages stay under the nav, the Interaction Center and the tool windows
The same two mistakes as /calendar's, everywhere else they were made. AuthedChrome's content box names no z-index, so a z-index in page code is a level in the R...
The drip enroll dialog finds leads by email
The lead search behind it now matches a lead's email (kamo-shared-library 992569a6, live with SecurityService 5c7319a), so the dialog says so: name, email, comp...
The calendar stays under the nav and the tool windows
/calendar positioned itself over the viewport — fixed at 56/80 with z-index 1000 — instead of filling the content box AuthedChrome gives every page. That box na...
Drip campaigns on /marketing/email — triggers, a visual builder, people and performance
/marketing/email gets a Broadcasts / Drips switch (?view=drips). The drips view lists every drip as a card with its trigger, its sequence and live counts, KPI a...
The Lifestyle Logo, a fourth logo per brand and the default background watermark
Behavior & Labeling gains a Lifestyle Logo slot beside the full logo, the simple logo and the tab icon, in both the company and the software (white-label) rows....
The campaign editor's Reply-To is a choice — NoReply, Member's E-mail or Custom, NoReply by default
The free-text Reply-To under the From becomes CampaignReplyToPicker, three choices that each say where replies land: - NoReply (default): NoReply@<the campaign'...
Rebuild for the Bulk Email settings page's hand-written translations
kamo-translation-dictionary de9ab66f writes Domain Setup, Sending, Opt Out and Deliverability, and the campaign screens' new From picker and sending-domain stri...
Outbound E-Mail Hosts shows the bulk relays as receiving servers see them
A "Bulk relays" card above the platform hosts: the shared relay every organization's sending domains leave through (contact.kamocrm.com, 47.181.8.86) and the pl...
Bulk Email gets Domain Setup and sub-tabs, /marketing/email explains what is missing, campaigns get a From picker
Settings → Email → Bulk Email is now four sub-tabs in ?sub=: Domain Setup · Sending · Opt Out · Deliverability. The member lands on Domain Setup until a sending...
Rebuild for the Email Campaigns widget's hand-written translations
kamo-translation-dictionary 93728a83 rewrites home.widgets.emailCampaigns by hand in 20 languages, replacing synced values such as de "Eins eins eins eins" for ...
Email's Deliverability tab has a settings-menu entry
The tab renders for whoever may manage the opt-out list (MANAGE_EMAIL_OPT_OUTS or the organization owner), but the settings menu never listed it, so settingsMen...
The scrollbar guard and the recipient-status tests pass again
Both were red on main, and vitest does not run in CI, so nothing noticed. - oneScrollbar.test.ts ("is the only thing in the app that styles a scrollbar") fai...
One copy of the Email Campaigns list's two-column comment [skip ci]
59a13aa2 moved the comment beside the state it explains and left the original above rowsKey. Comment only; nothing to build.
The campaign tabs get scroll arrows back, without hiding the selected tab
On a screen too narrow for the five sub-tabs, the strip now shows left and right arrows beside it, as the maximized-window tab strip does. It had none since the...
A live send in the Email Campaigns widget gets a spotlight card
With one send in progress, the In-Progress tab was a single thin row in a pane with room for far more, at the moment the widget matters most. When every campaig...
A checkbox, button or link inside a grid row no longer opens the row too
The ⋮ bug from /marketing/email, in the six other grids that have it. AG Grid fires rowClicked from its own native listener on the row container, which runs bef...
Email Campaigns widget tabs are the campaigns screen's stages
The widget filed campaigns under its own Live / Sent / Drafts, which put a cancelled campaign under Sent and a scheduled one under Live. Its tabs are now In-Pro...
The campaigns list follows what colleagues do to a campaign, live
BulkEmailWorkspace takes the change frames useEmailCampaignsWebSocket now delivers (onChanged, d0b56adf). A frame names a campaign and what happened to it, neve...
The Email Campaigns widget, live on the launchpad
A new home widget, email.campaigns, on the launchpad of everybody who can open the campaigns. Its five rights (EMAIL_CAMPAIGNS_WIDGET, 321-325) hang off VIEW_BU...
In-Progress, Not Started, Paused, Complete and Archived tabs, and the ⋮ opens its menu
/marketing/email splits the campaigns into five sub-tabs, each with a live count, and every campaign is under exactly one: - In-Progress: sending - Not Started...
Email Campaigns is the first Marketing tab
The Marketing Tools tab strip now reads Email Campaigns, Marketing Materials, Social Media, Tracking Codes. Bulk Email moves to the front under its new name, an...
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.
