Round the artwork's corners
The picture sat square inside a pane with a 16px corner, cutting a rectangle out of the glass. 12px on the wrapper — the same radius the drop veil uses — and th...
Make the cabinet as tall as its own content
The page was dark for one screenful and then white for the rest of the scroll. `PageWrapper` is `height: 100%` with `flex-direction: column`, so every route in...
Resolve contact effects through four layers, with a tab at the platform and the member
Contact effects were a single per-member setting on one organization page. They now resolve exactly the way event sounds do — shipped catalogue, then the platfo...
Eighteen sprites for the single-action achievements
Thirty-five new achievements arrived in the catalogue and every one of them was rendering the padlock fallback, because all eight existing sprites belong to the...
Skins — the one bar, wearing a different machine's clothes
The scrollbar already let a surface tint itself: five custom properties on the scroller, inherited, read by the overlay. For every screen in the app that is the...
24 more contact effects, grouped by character rather than by geometry
The catalogue sorted itself by what an effect DID — converging, expanding, lively. Nobody opens a settings pane wanting "something that expands"; they want some...
Make the contact effect a choice — 24 of them, one dropdown per event
The six animations shipped last change were hard-wired to the six contact events. They are now a catalogue any of which binds to any event, and the member picks...
The white band under the cabinet
The application's `body` and `html` are `--background: #ffffff`, and this route is the one dark surface in it. The page element is `min-height: 100%` so it fill...
Pin the storage meter to white, and ship the fix past a dead runner
A source-level guard rather than a rendered assertion, because none of what went dark is visible to a rendered one. Three of the four faults were dark for only ...
Every foreground on the storage meter is white
Reported unreadable, and it was. Four places went dark or coloured where the rest of the component is white on a dark ground: - The "Add 10 GB" button was #0b0...
A storage meter beside My Widgets, for the owner who is filling up
An owner had no way to know how much of their plan's storage they had spent without opening a settings tab they had no reason to open. The bar that told them li...
Fail the build on a character the bitmap font cannot draw
A codepoint Press Start 2P lacks does NOT render as tofu. The browser silently falls back to a system font, so the character appears, correctly shaped, and mere...
Tear the page down and rebuild it as an arcade cabinet
Two things were wrong and the first one is a rule, not a preference. FULL WIDTH. The page shipped with `maxWidth: 1240, margin: '0 auto'` inside a content area...
An animation at the point of contact, six of them, one for each way a press can happen
Left down, left up, middle down, middle up, touch down and touch up each get their own animation around the point of contact. They are one family rather than si...
A scrollbar 17px in from the edge is still a scrollbar the dock must not cover
The tool dock reserved the right edge for a page's vertical scrollbar only when that bar was AT the edge — within two pixels, for sub-pixel rounding. Almost no ...
The Accounts app was billed as Human Resources, so the Free plan lost it
The `accounts` option was gated on `organization.isHrs && VIEW_EMPLOYEES`. Neither half is what /account is: its own backend enforces VIEW_ACCOUNTS (CRM) on the...
Three React Compiler errors, and what each of them was really saying
The compiler rules caught three things in the achievement surfaces, and none of them was a style complaint. A component aliased into a local during render (`co...
A two-level jump published two frames and the browser kept one
`useMediaTopic` holds ONE message slot and overwrites it, so two frames arriving in the same tick are batched by React into a single render and only the last is...
Growth Hub — one thing at a time, beside the App Shelf
The launchpad pane a member works their organisation's growth requests through, and the Marketing settings tab an admin writes and reviews them from. `WidgetDe...
A trophy cabinet, and a celebration that finds the member
Adds the Achievements surface: the trophy in the rail, /achievements, the launchpad leaderboard, and the unlock popup that arrives over whatever page a member h...
The docked row has one height, and no way left to arrive at another
Resizing a docked window's top edge moves every window's top edge — the row sits on the bottom with its tops in a line, and a row of different heights is a ragg...
The board every org can read, and a vote on every improvement
The organization column is on for everybody now, because every viewer sees every organization's reports. What varies is whether a given ROW can be named, and th...
A way onto a paid plan that is not hidden under a profile
An owner deciding whether to pay had to know the answer lived under their own profile, three clicks from the page they open every morning, signposted only by a ...
Give a member their text numbers, and let them choose which one sends
Two screens, one idea: a phone line usually is not one person's. MEMBER SETTINGS → PHONE A card modelled on the Email tab's mailbox list, because the two scre...
The launchpad hid the App Shelf to say the member had no apps
A member granted an app or two and no widget right — Support and the Knowledge Base, say — opened their launchpad to "No apps yet. You don't have access to any ...
A meeting link the member can set, and one guest row per guest
Two halves of "Add external guest to meetings does not send an email to that person". The link. meetingUrl came back from the API, was bound to nothing, and co...
The repeat interval goes down to one second
Asked for on 2026-09-06. The floor was five; it is one everywhere now — the control, the clamp the browser applies, and the clamp the service applies. Zero is s...
One checkbox on a callback, to tell the lead
The callback dialog hid the invite controls, and the note under it said "The lead is not notified." That was true, and it was the right call for the control bei...
A knowledge-base link the member can actually click
The assistant's KB links did nothing at all. Not a wrong path and not a rights problem — the click handler was never called, because no click event was ever dis...
The unread-chat card opened the member's mailbox
It carried deepLink: '/messages', which is the mail client. Chat has no route to point at — its window is a tool raised by a tool:open event — so the card navig...
Tell me about new mail and unread chat, and keep saying it
Two more tiles under "What you are told about", and the two things behind them. New email is raised off the inbox socket the app already holds open. Unread cha...
The last two files git was treating as binary
Finishing the sweep that started when my own billingDraft.ts committed as "Bin 0 -> 6882 bytes". Scanning every tracked text file for a NUL byte found three mor...
The wallpaper was painting under the body, not failing to load
The launchpad backdrop — the plain gradient, the org watermark and the wallpaper slideshow it carries — has been completely invisible since 03743d02. Nothing fa...
An expired card can no longer be the one you are billed to
Answering "is changing the default still there on Payment Info" — it was, and reading it turned up a defect worth more than the answer: nothing stopped an EXPIR...
Show the URL a carrier has to be told to post to
Adding a text provider covers sending. Receiving needs the carrier told where to deliver, which happens in the carrier's own console — and the form never said w...
A NUL byte in two source files, which made git call them binary
Caught on a last pass over my own work: `billingDraft.ts` committed as "Bin 0 -> 6882 bytes". A separator written as a space had reached the file as a raw NUL b...
Pay without leaving the order, and never lose it again
Sending somebody to another page to add a card was the wrong answer, and it was wrong at the worst possible moment. The console noticed there was no card and li...
The app shell was capping every page under every scrollbar
My last fix was in the wrong file. Removing the stacking context from the launchpad changed nothing, because the one that matters is a level above it, in the sh...
The commitment term travels with the plan, not just the plan
Carrying the plan code alone was half a fix, and the missing half was the half that carries the price. Somebody who set three years on /myplan, saw $49 a seat a...
Opening an attachment no longer throws React #310
Clicking a thumbnail threw "Minified React error #310 — rendered more hooks than during the previous render" over the whole page. Mine, from the attachment-aut...
Finish the spec's inventory, and add the order to check things in
The "where it lives" table was written before the setup service, the media handoff, the CARRIER_TO_PHONE_SERVER rail and the phone server's default text route e...
The two inbound shapes, and the rule that keeps the endpoint safe
Records what voipservice 9e9e814 and ea6d631 established, because the reasoning is not recoverable from the diff. A Telnyx messaging profile has exactly one we...
One setting that covers every number on a phone system
The approved routing design had three tiers and only two of them were reachable. A number could name its own text provider, and failing that the phone server wa...
The /myplan to console journey, end to end
The preselect landed across two sessions and two files, so the thing worth pinning is the journey rather than either half: a plan chosen on /myplan arrives sele...
One price on the screen, and a purchase that cannot fail silently
The console showed a customer three different numbers for one plan and let them buy with no card. Rendering it against the live catalogue, Business at five seat...
React to a status change, not only to a comment
"🎉" on a Fixed event is the single most natural thing anybody wants to say in a bug thread, and offering reactions only on comments meant typing one to say it....
Live thread updates, and reactions that are actually reachable
Two halves of the thread were built and then left unconnected. The server has published every comment and status event to `chat.session.{guid}` since the featu...
Stop the launchpad capping its own dropdowns under every scrollbar
The admin bar's dropdowns were painting under the App Shelf's scrollbar, and lowering the shelf's z-index last time did not help — because the number was never ...
The plan you picked travels to the page that sells it
"Move to Business" opened the billing console with nothing selected. The choice the person had just made was dropped on the floor and they were asked to make it...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.