Park the swarm at the bottom-left, against the nav rail
The home cluster's default spot moves from the bottom-right corner to the bottom-left, sitting one padding clear of the primary rail's right edge — collapsed at...
Every tool window keeps what the member typed, not just one
Follow-up to c45b3857, which fixed the bug/improvement window and left four others named in a "known gaps" list. That list was the wrong answer: a gap recorded ...
Send a new starter to the board, and open the advert they came for
A team member whose employment is not ACTIVE is already confined to the restricted tier, and the home screen already bounced them somewhere. It now matters WHER...
Pin the right-click to one menu
The handler itself is already in — swept into 734f68cb by a concurrent commit in a shared checkout, under an unrelated message. This is the test it was written ...
The scrollers styled with classes rather than sx get the bar too
Reported against /hr/overview, and the page itself is innocent — it declares no overflow at all. Its scroller is one line in app/hr/layout.tsx: <div classN...
A populated bug report survives a page change
Reported again: a fully filled-in bug/improvement window came back empty after switching to /hr, and again from the analytics nav icon. The window was never los...
The rail's own scrollbar is not an exit from the rail
The previous attempt at this fixed the wrong handler. It taught the reconcile in useNavHoverPeek to see through the bar, which was worth doing and was not what ...
Resting on the rail's own scrollbar no longer flaps it open and shut
Reported as the rail switching between expanded and collapsed rapidly with the pointer held still over its scrollbar, which is exactly what it did. useNavHover...
Give the expanded rail back the width the scrollbar took
The rail is the one place where the app's scrollbar was paid for out of somebody else's layout. Expanded, it has always reserved a gutter — 20px, for the bar it...
The scrollbar moves the content over instead of sitting on it
Painting the bar over the last 32px is fine over a background — the launchpad's wallpaper does not mind — and wrong everywhere else. In a chat log it lands on t...
Publishing an application is a decision, and it comes with a chat
**Vendors & Products no longer prints a link for every product it has.** It printed one for every mortgage product the moment that product existed, which meant ...
Merge branch 'feat/one-scrollbar'
One scrollbar for every scroller in the app, with the terminal window's five controls on all of them.
Every scrollbar keeps all five controls, at every size
The first cut dropped the four buttons on any bar shorter than 140px, on the argument that 96px of them leaves a 250px popover with a stub of track. That was th...
One scrollbar, for every scroller in the app
The terminal tool window had a scrollbar worth keeping — 32px, with a button for each END of the scrollback as well as the usual step arrows, because in a long ...
Prove the deploy by digest, not by tag
The preceding commit stops `set image` being a silent no-op. This asserts the outcome: after the rollout, the tag is resolved to a digest at the registry and th...
Publish the policy addresses, the real state licences, and a link per product
Three things the public loan-application site could not previously be told, and one it was told wrongly. **Company Info gains Privacy Policy Address and Terms ...
A rebuild of the same commit deployed nothing and reported success
The image is tagged with the commit SHA, so rebuilding the same commit produces an identical image reference. `kubectl set image` then changes nothing, the Depl...
Start a coder session from the Linux Desktop menu, at a model and effort you keep
The icon already opened a remote desktop and a remote terminal. The third thing people actually go to that machine for was reachable only by opening the Interac...
Make Add Source actually connect Google and Microsoft
The Manage Sources dialog on the Contacts page had the same defect as the CalDAV/CardDAV settings tab, on a screen ordinary members reach rather than one behind...
Finish the personal calendars panel, and put it where a member can reach it
PersonalProviderSection was scaffolding that nothing rendered, and it would not have worked if it had: it read GET /member/{id}, a route that did not exist, so ...
Gate the user account on platform rights, not on which org owns it
Authored in a concurrent session on this machine and committed here at the user's request; recorded so the provenance is not guessed at later. The user account...
A 404 costs 1.45 MB, which is how a scanner took the site down
Next's not-found is a PAGE. It renders through the root layout, which resolves the tenant's organization over the network and serializes the whole app shell and...
Map a provider's own folders onto the standard ones, wherever they sit
The last fix pinned a folder by the role the server gave it and still left a member on Google Workspace looking at "[Gmail]" among their own folders with their ...
Say whether a DAV server's credentials are already stored
The Apple iCloud / custom CalDAV panel shows four empty boxes whether or not a username and password are on file. It cannot do otherwise -- a stored password is...
Keep the folder in the path too, wherever it can survive there
The endpoints prefer the query parameter, but they are deployed separately from this code, and a browser that loads the new bundle a minute before EmailService ...
Cover the arrangement the Gmail sidebar actually asks for
The classification is tested in folderTargets; this is the call the sidebar makes with it. None of Gmail's well-known folders is a root and none is named anythi...
A role with no slot in the pinned block leaves the folder unpinned
indexOf answers -1, and -1 is not null, so a role that ever lost its place in PINNED_ROOT_ORDER would have pinned its folder ahead of the inbox rather than fall...
Restore FolderSidebar's CRLF line endings
The previous commit rewrote the file through a text-mode tool, which flattened every line ending and turned a 66-line change into a 2755-line diff. Content is b...
Make Connect via OAuth on the CalDAV/CardDAV tab actually connect
The button raised alert('OAuth flow not yet implemented - configure credentials manually via the API'). It now opens the real Google Workspace / Microsoft 365 c...
Make Gmail's folders open, and list them as folders rather than paths
Two faults, both from the client deciding for itself things only the mail server knows. **"Failed to load messages."** The folder travelled as a path segment, ...
Offer a RingCentral sign-in, not a JWT box, on every member
The per-member credential card had exactly one control: paste a RingCentral JWT. A RingCentral JWT is minted per user inside the developer console, by a user wh...
Double the scrollback bar's width
16px to 32px. A terminal scrollbar is not chrome to be tucked out of the way — it carries four buttons that get pressed deliberately and a grip dragged over a l...
Make the scrollbar scroll the shell, because the scrollback is not here
The bar moved xterm's own buffer, and under tmux that buffer never grows: tmux sends the client only the lines that end up visible and keeps the history itself....
The end-terminal confirm was unreadable over the row behind it
Two things, both about the seam between a navigator and what is beside it. ## The confirm had no surface of its own A terminal row's actions sit OVER the row ...
Point the seat, payment-method and add-on calls at routes that exist
Four calls in posApi addressed REST-shaped URLs — /seats, /payment-method, /addons, DELETE /addons/{id} — and POSController exposes none of them. It has change-...
A put-away terminal's hexhead says whether it wants you
A member with six terminals minimized has one question about each: is that one waiting for me? The head now answers it in a colour. green working — nothing ...
Give a head the app's own tooltip, placed from where it sits
The label was the browser's native `title` box: unstyled, and put wherever the other 291 hover targets in this chrome use, arrow and all. A head is not a norma...
Show the startup fee before it is charged, and where a deal overrides it
calculate-price has always returned a setupFee and the order wizard printed it nowhere, so a charge that runs to four figures on a large order reached the custo...
Retire the SMS provider's test verdict when its credentials change
The same defect as the phone server's Overview tab, one screen across: saving new credentials left the previous Test Connection result on display, so a "Test fa...
Catch the app credentials pasted into RingCentral's JWT box
Two things went wrong on the same screen, and together they produced a settings page showing a green "Credentials complete" chip above a red "RingCentral instan...
Pick the model and effort before starting a coder session, once
Send To AI dialog has, and the two are the SAME choice rather than two. Somebody who has settled on Sonnet at High has settled on it. Re-picking in the other p...
Name a hexhead after the window it stands for
A hexhead's tooltip read "User w12" — the head id, which is the window id, in a string written for member avatars. A dock of six minimized windows was six ident...
Point the integrations proxy at the path EmailService serves
The Manage Sources dialog forwarded to /api/settings/integrations, which EmailService does not map — its controller is at **************** Every request from th...
Say why a mailbox sync failed, and what key is on file
Two silences that made a working Google Workspace connection read as broken. The mailbox sync caught the provider's rejection and dropped it. Google refuses th...
Show the sign-in lockout as a rule that cannot be switched off
SecurityService now applies a progressive sign-in lockout to every organization whether or not a row exists for it — five free attempts, then five seconds, then...
Show a member the redirect URI on their own domain
This is the screen the whole change is for. A member setting up Google Workspace with their organization's own OAuth app comes here to find the address to paste...
Stop a password reset asking the operator to type ERASE
ConfirmationDialog described every action as a deletion. Left to itself it picked the type-to-confirm word at random from DELETE, REMOVE, DESTROY and ERASE, dre...
An operator may set a personal address, and ask about the right account
Two changes to the member profile, both about the same confusion: which person a question is being asked about. The personal email card is no longer self-only....
Stop asking for logos that were never uploaded
/network built each org's logo URL from its alias and requested it for every org on the page. An org whose theme folder was never provisioned has no img/logo.sv...
coder sessions beside the running shells, and a scrollbar that reaches both ends
## Terminals is now two views of one machine Sub-tabs rather than two top-level tabs, because they are not two destinations: a terminal is a shell that may be ...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.