Finish the details the first pass left rough
Nine small corrections, each with a visible symptom. The drawer opened on ~0.4s of blank panel: `loading` started false, so the first committed render fell thr...
Build out Tracking Codes in place of the referral placeholder
/marketing/discounts was a ComingSoon stub; it is now /marketing/tracking, a working workspace, with the old path kept as a client redirect so existing bookmark...
Shorten the empty-description hint
The Description column shows {No Description} in place of "No description provided..". The string was hardcoded English, so it now comes from the dictionary — w...
Reorder and retitle the document tabs
The strip now reads Originals | Modify (n) | Modified | Binders | Common | Uploads, and Common trades the gear icon for a library one now that it no longer says...
Stop opening a note from overwriting it with a blank body
The editor seeded its buffer with `note.content || ''`, then compared that '' against the incoming null and concluded the member had unsaved edits. Two seconds ...
Paint the knowledge console in the org's colour, not a fixed purple
The rebuild took its chrome from --accent-knowledge, which globals.css declares as #8b5cf6. That variable does not move with an organization's brand, so every c...
Rebuild the knowledge base as a console
The four knowledge-base screens were the last in the app still wearing the old look, and three of them stated things that were not true. /kb showed "Pinned Art...
Nobody with a login is the anonymous web-chat visitor
A widget ticket names the org's SYSTEM member as its requestor because the visitor has no member record — and that member is the org owner, usually the person a...
Stop the inbox claiming email is unset while it works it out
Opening /messages showed the "email isn't available / you have no mailbox" panel for a moment on nearly every visit, then replaced it with the member's real inb...
Drop the masthead stat rail, move the filter to the bar
The five counted tiles are gone from the header. It now states what the page is and gives the rest of its width to the primary action. They were also the only ...
Rebuild /hr/attendance as a payroll console
Eight flat tabs over eight panels that each drew their own heading, table, skeleton, error line and Snackbar — and had drifted. The overhaul is three things at ...
Rebuild the network page as an operations console
The page was the last screen still wearing the old look — a flat gradient bar, white cards, a centred spinner, alert() for every failure — while the rest of the...
Rebuild /hr/legal-compliance as the legal registry
The surface was a MUI tab strip over two AG Grids. Packages rendered as seven columns of counts and an actions cell of six unlabelled icon buttons, three of whi...
Rebuild /hr/training as a training console
The tab was two AG Grids under a tab bar: accurate and mute. It now opens on the org's whole training obligation and lets an admin act on the gaps. - A masthea...
Let a note pinned from its sticky reach the launchpad band
The home band fetched the pinned list once on mount, so a note pinned from its floating sticky afterwards was in no list it held. Closing the sticky then left t...
Rebuild to pick up the Start Group Chat/Meeting labels
The image bakes messages/ from kamo-translation-dictionary at build time, so the dictionary push alone left the deployed bundle on the old copy.
Hold the token's int64 ids as digits, not as numbers
KToken could not verify a real token. The four ids it carries are int64s, and the Java signer (kamo-shared-library KToken#canonicalForMac) appends each as a raw...
Market filters were comparing a UUID against a number
Both market filters were dead, in different ways, and neither said so. Leads: a market tab matches a lead either by marketId or by the market's vendor products...
Stop rounding int64 ids on the way back to the server
Sweep of the client half of the int64 id work. Each of these took an id the server had sent intact and put it through Number()/parseInt(), which rounds anything...
Record the SecurityService unauthenticated-endpoint triage
Three fixed, the rest explained. The headline number needed narrowing three times and the first two attempts were wrong the same way — enumerating helper names ...
Let the colour palette take clicks again
The sticky's palette was a child of the title bar. Header and writing surface are siblings on the same layer, so the body — later in the DOM — paints over the h...
Gate the Linux desktop icon on a provision, not on god
The icon now appears exactly when the connection behind it will work — the SSO endpoint enforces the same rule, so the two cannot disagree. Windows and Master s...
Dev Machine dialog on the administrator card
Keeps three states apart that one toggle would collapse: never provisioned (needs a password), provisioned but locked (needs only the switch), and failed (needs...
Client module and proxy routes
*** is forwarded explicitly — buildForwardHeaders sets X-OTK but not the session token, and the dev-machine endpoints resolve the caller from it. The action seg...
Stop parsing the org id straight back into a rounded number
SecurityService now sends ids past Number.MAX_SAFE_INTEGER as strings so they survive JSON.parse. That was being undone one line into the client: OrganizationDT...
Stop sending an address field the server no longer has
A department's contact address is derived from the assigned mailbox server-side, and `email` was dropped from the create and update requests when the mailbox po...
The result screen answers to the logo overlay too
The success/error screen shown briefly before redirect was the one logo in the sign-in flow still rendering untouched. It kept its own design rather than joinin...
Record the ProxyHmacFilter rollout and what it does not cover
Two ordered steps, the checks that made the second one safe, and the reason the order matters: kamo-internal had to be signing before KamoLOS started validating...
One loading screen instead of four, all on the full logo
There were four copies of the same full-screen loading markup — the navigation screen, both of /validate's pre-result screens, and /logout — identical down to t...
Sign the proxy identity headers — step 1 of enabling ProxyHmacFilter
KamoLOS trusts X-Org-Id and X-Member-Id from this proxy. ProxyHmacFilter exists to prove those headers really came from here, but it is disabled in production: ...
Correct the record — KamoLOS is deployed, and has been for 78 days
§12 concluded that KamoLOS had no deployment and that gating it was therefore free, and the LOS proxy repeated the claim in a comment. Both are wrong. The servi...
Restore the CRLF endings of the two files the last commit reflowed
3bfe883c rewrote PublicProvider.tsx and the org route wholesale — 1919 and 121 lines for what was a one-line addition to each. The content was intact; the endin...
A logo overlay for the KamoMeets pre-meeting screen
Third and last surface, offered next to the other two — same thirteen options, its own setting, default No Overlay. Hidden unless the org can actually reach th...
16 unenforced becomes 13 — reports and dashboard deleted, tasks kept
VIEW_DASHBOARD, VIEW_REPORTS and EXPORT_REPORTS are gone from the mirror, both parent maps, the pinned counts and useUserInfo's enumeration, and app/dashboard a...
App icons on the wizard's Apps & Features step
The create-network wizard drew each app as the first letter of its name, so the same app was a storefront on Settings -> Features and an "S" here. The icons alr...
A solid-colour overlay for the loading screen logo too
Adds "Loading Screen Logo Overlay" directly under the home page one on **************** with the same thirteen options, applying to the logo on the screen shown...
17 unenforced becomes 16 — support topic creation takes its own right
POST /support/topics was gated on MANAGE_SUPPORT, the parent, so the child right looked dead while being the thing checked. It now takes CREATE_SUPPORT_TOPICS, ...
18 unenforced becomes 17 — bulk email campaigns are gated
VIEW_BULK_EMAIL and MANAGE_BULK_EMAIL now cover the campaign and provider surfaces in EmailService, which checked nothing, joining the recipient resolver in Sec...
Stop losing the brand palette on the way to the browser
Organization.fromJSON could not read back its own output. It mapped the brand ramps only from the nested `colors` object SecurityService sends, but what it EMIT...
Pick the assigned agent from the directory, not a dropdown
The Assigned Agent field is now the same control as Manager on a member's profile: a read-only field that opens the searchable member picker. A dropdown could o...
20 unenforced becomes 18 — marketing materials and social media are gated
VIEW_MATERIALS and VIEW_SOCIAL_MEDIA now have server enforcement, alongside their MANAGE counterparts which were client-only. 29 endpoints across seven MediaSer...
The analyzer could not see nested arguments — six rights were never decorative
26 unenforced becomes 20, and none of it is new enforcement. The six sales-agent rights have been gated the whole time: AiSalesAgentController checks them acros...
The editors say "Enforced as MANAGE_TIMECARDS" instead of "Not yet enforced"
One chip was carrying two different truths and misleading in opposite directions. Unbuilt means nothing checks the right and granting it does nothing. Supersede...
Eleventh cluster triaged — employees, time off and schedules all stay
The first cluster whose honest answer is "no action", and two of the six looked deletable until the last check. TimecardService has one authentication boundary...
Let a failed branding save say what actually went wrong
"Save failed: Failed to save branding identity settings" discarded the status and body of a PUT that enforces the applied security model, so a 403 whose reason ...
28 unenforced becomes 26 — AI models and usage are gated
MANAGE_AI_MODELS gates all four endpoints of AiModelController and VIEW_AI_USAGE both of AiUsageController. Neither checked a right before, only org ownership. ...
30 unenforced becomes 28 — voicemail is gated, call routing is kept
VIEW_VOICEMAIL and MANAGE_VOICEMAIL now gate VoipVoicemailController, which asked for a right only when playing back a recording in a PHI organization and for n...
Let an org paint the home page logo a solid colour
Adds "Home Page Logo Overlay" to Branding on **************** directly above Background Watermark: No Overlay, White, Black, and every step of the org's own pri...
32 unenforced becomes 30 — mailbox administration gated, email logs deleted
VIEW_EMAIL_ACCOUNTS now gates the administrative reads on MailboxController and MANAGE_EMAIL_ACCOUNTS gates every write. Both were client-only before: the whole...
Put the note composer at the top of All Communications
The composer only existed on the Notes sub-tab, so writing a note about what you were reading meant leaving the tab you were reading it on. All now carries the ...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.