Correct the floating logo vertical offset.
Anchor the mark 10px above nav center instead of shifting it down with a transform miscalculation.
Float the logo above the preview banner and raise it 10px.
Use fixed positioning so the mark escapes the nav header stacking context and paints over the red strip.
Use full PNG logo that floats over the preview banner.
Replace the SVG wordmark with kamocrm-logo-full-v4 so the mark extends above the red strip and below the nav bar.
Show the correct draft batch total before send
Draft batches keep totalAmount at zero until send — it is a post-send snapshot, not a running total — so the compose UI now sums line amounts for the KPI tile a...
Normalize memberId when relaying line add/update requests
The browser keeps member ids as strings to avoid IEEE-754 rounding on CockroachDB unique_rowids. Normalize to Long before relaying so the credit lands on the in...
The card on the deliverability history's "who"
EmailService now sends the member behind each change in an address's opt-out history (actorMemberId, text). On Settings → Email → Deliverability a colleague's n...
The card on email aliases and shared-mailbox access
EmailService now sends the member ids on aliases and shared-mailbox access as text. As JSON numbers they were rounded past 2^53, so these tabs matched nobody on...
Quotes, hand histories, ticket events and bug threads send the id a member card needs
Four surfaces showed a member by name with no id beside it, so the console's member card had nothing to open. Each now sends the id as TEXT next to the name it ...
The deliverability history names the member behind each change
Settings → Email → Deliverability shows an address's opt-out history with who made each change, but HistoryView sent only the actor's name, so the page could no...
Aliases and shared-mailbox access name their members as text
GET and POST /api/email/aliases (and /aliases/member/{id}) and GET and POST **************** answered with the entities themselves, whose Long memberId and gran...
The card on the opt-out list's "last changed by"
EmailService now sends the member behind each address's last change (lastActorMemberId, text). The list cuts their name out of the "last changed by" sentence (a...
An opt-out row carries the member behind its last change
The opt-out list named who made each address's last change (lastActorName) but not who they are, so the settings page could not open their member card. Each row...
The card on the people the servers now name — document history and shares, careers, the account's primary member, a group seat's manager
Wires the ids the services now send: - Document history (DocManager's changes and downloads, the marketing material drawer's history): the member by name (mem...
A group seat's coverage carries its manager's member id
GET /api/billing/self/coverage named the billing group's manager (managerName) but not who they are, so the member's plan page could not open the manager's memb...
A number's owner travels as exact text, so saving it no longer re-owns it
GET /api/voip/numbers wrote ownerMemberId as the entity's Long. A member id is an INT8 past 2^53, so the settings page read it rounded: the owner was never foun...
The account view names its primary member
GET /customers/{uid} sent the primary member only as primaryMemberId, while the account view reads a primaryMember object — so its Primary member row read "---"...
An article's version history draws, and names who edited each version
kbservice answers /articles/{guid}/versions with a Spring Page of its entity. The history component read the body as a list and called .map on the Page, so it n...
A face that opens a card has a name for a screen reader
A MemberHoverCard around a face alone was a focusable button with nothing to be named by. It takes an optional label, used only when the trigger has no text of ...
One way to cut a sentence around the people it names
Three agents and the first sweep each taught the app the same trick — format a translated sentence with a mark where the name goes, split on it, draw the name a...
A document's history loads, and names the people on it and on its shares
GET /imaging/history/changes and /history/downloads built each row with Map.of, which throws on a null — and a row with no IPv6 address, no prior data or no mem...
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...
The member card carries the wallpaper their desktop shows
GET /members/{id}/card gains "wallpaper" for the card's header, resolved the way the console backdrop and the profile hero resolve a member's desktop: none when...
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 uploader's member id travels with the list and the history
The document list (/imaging/list) and a document's history carried the uploader's name only, so kamo-internal could show who uploaded a file but not open their ...
An account note names the member who wrote it, not "System"
GET /customers/{uid}/notes sent each note's authorMemberId but no authorName, and the account view shows a note with no name as written by the system — so every...
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...
The Presenters table can see which presenters nobody can book
GET **************** — MANAGE_SUPPORT, the caller's own organization's type only (anything else is "not found") — answers each active presenter with hasBookable...
One rule for what a member may do with another, served per member and per roster row
The same five actions — chat, call, email, meet, view profile — were offered from three places in kamo-internal (the Interaction Center row, the chat hex-head p...
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...
Tell a presenter, live, when nobody can book a time with them
A presenter whose declared hours have run out is the one state in this feature nothing reported: the booking page simply offers no times, the visitor leaves, an...
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 demos booked on a lead, on the lead
GET **************** The lead page's Webinars section has called /api/webinar/leads/{id} since it was written and nothing ever served it — the live API answers ...
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...
The public demo page shows no one's contact details, and a site's key books only its own org
Demo requests from the marketing site come from visitors with no account. That path already needed none: the attendee row is the name and email the form collect...
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.
