Repository navigation
Revamp layout, spacing and empty states, and rework Boundaries, credentials and the Bot page - #838
Merged
Merged
Conversation
The 15px root made every rem-based size a multiple of 3.75px, so padding, heights and radii never landed on whole pixels. The root is now the browser's 16px, and the text sizes are set to Tailwind's defaults times 15/16, so type reads exactly as before while spacing snaps to the grid. The radius rounds to 8px, the a2ui card text keeps its 14px and 16px, and two comments that quoted 15px measurements are brought up to date.
PageShell spaces the title block 32px from the first content and pads the page 64px at the bottom, PageRows holds every row to at least 56px with dividers inset 16px, and Connections drops its repeated section heading and lays its apps out as outline tiles, the one accepted exception to divided rows. The layout skill documents the rhythm.
A row is 16px in and 14px tall on either side, its icon a 16px glyph on a 32px muted tile, and its description a size smaller and 2px under the title. Admin's rows pass their icons through the icon variant.
PageEmpty becomes a bordered Empty with an icon for the kind of thing, a title saying there is none, a sentence on how the first one arrives, and the page's own Add button where there is one to offer. Every screen that lists something now says so this way.
The gear panel in a conversation ends with a "This conversation" section: Pin as an outline button and Delete as a destructive one, stacked. Delete confirms through the same dialog the sidebar uses, now shared.
A research run's new suggestions supersede the open ones from its last run, through a new superseded status. The instruction lists what is open and what was dismissed in the last 30 days so neither is suggested again, asks for nothing when nothing needs doing, and keeps tool names out of the text. A title already announced is not notified twice.
Add credential opens /admin/credentials/new, a page with a back button to the list and the form in a PageCard, the new card for page-sized forms. The kind select shows its label rather than the raw value. The layout skill gains the procedure for adding something from a list.
Rules are read as "Bots may never" rows with a name and a sentence, now stored beside each rule on the server. Adding one is its own screen that starts from a template or a blank rule and can be tested on recent activity first; a rule opens to what it has stopped lately and can be removed from there. Trial mode, Audit and the allow rules sit under How rules apply.
The message box's surface carried translate-y-0 at rest, which in Tailwind v4 sets translate: 0px and makes it the containing block for fixed descendants, so the menu was placed twice over, off the composer. It now names no translate at rest, and its transition names translate, so the lift as dictation starts animates.
Each option leads with the Bot's avatar, drawn from its id where a group's roster has no seed, and the menu takes prompt-area's full 320px so a Bot's title reads in full.
Each suggestion is a paragraph with two buttons, and a Bot with sixty open ones made its own page 8,000px of suggestions with its settings far below. The rest open in place from a "Show N more" row.
In progress, Scheduled and Completed move to /bots/$agentId/activity. The Bot page keeps an Activity section with up to three running or scheduled items, running first with a pulsing dot (amber when it needs you), and a row to all activity with a count.
guidovizoso
requested review from
MikeRyanDev,
davidmckayv,
mxmzb and
tylerslaton
as code owners
October 26, 2026 14:27
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this changes
A pass on how the app is laid out, aiming at the calm, even feel of Linear and Vercel. Colours are left alone, since each deployment sets its own; the work is spacing, sizes, borders and the shape of a few screens that had outgrown themselves. One commit per change.
Units and rhythm
html { font-size: 15px }made every Tailwind size 6.25% off its documented value (max-w-3xlwas 720px, not 768). Text stays on its 15px scale: each--text-*is Tailwind's default ×15/16.PageShellsets the page's rhythm, so screens stop choosing margins: 32px from the title to the first content, 48px between sections, 64px at the bottom.PageRowsholds every row to at least 56px with dividers inset 16px. Connections drops a heading that repeated the page title and stays a grid of outline tiles, documented as the one exception to divided rows.Itemrows are drawn like Linear's settings rows: 16px in, an icon as a 16px glyph on a 32px muted tile, the description a size smaller.PageEmptyis shadcn's empty state (icon, title, one sentence, and the page's Add button where there is one) on every screen that lists something..claude/skills/openbot-screen-layoutdocuments the rhythm table, the row anatomy, the empty state and the new "add something from a list" procedure.Screens
/admin/credentials/new) instead of a dialog, in a newPageCard. Its kind select shows "Model" rather than the rawmodel.action_policies.labels). Adding a rule (/admin/boundaries/new) starts from a template or a blank rule and can be tested on recent activity first. Each rule opens to what it has stopped lately (/admin/boundaries/$index) and can be removed there./bots/$agentId/activity. The page keeps up to three running or scheduled items, running first with a pulsing dot (amber when it needs you), and a row to all activity. Suggested next steps show the newest three, with the rest behind "Show N more".Fixes
supersededstatus lets each research run replace the open suggestions from the one before. Titles already open, or dismissed in the last 30 days, are refused. A title already announced is not notified twice. The research instruction now lists both kinds of title, asks for nothing when nothing needs doing, and asks it not to name tools.translate-y-0at rest. In Tailwind v4 that setstranslate: 0px, which makes the wrapper the containing block forposition: fixeddescendants, so the caret-placed menu was offset twice. The wrapper now has no translate at rest. Its transition also namedtransform, so the dictation lift never animated; it now namestranslate. The menu is also 320px wide and shows each Bot's avatar.Where it runs
supersededsuggestion status (migration 0061) andaction_policies.labels(migration 0062). The research engine's in-processrunningmap, which already held a run's setting, now also holds the titles that run was shown. It lives only for the length of a run in the process running it, as before.nextRunAtforward, so one process runs a given setting at a time. The process that finishes a run supersedes the previous run's open suggestions in oneUPDATE … WHERE status = 'open' AND run_id <> $run. Rule labels travel inside the policy row and reach other processes through the policy store's existing refresh.Boundary and audit
Changelog
Unreleased: the two migrations under "Before upgrading", and an entry for each change a person would notice.Proof
bun run format:check,lint,typecheckandtypecheck:testspass.bun run test) passes against a fresh pgvector database migrated from zero, 0061 and 0062 included: 8,416 pass, 80 skip, 0 fail across 726 files.main, each of the first nine commits typechecked and passed the app suite on its own.proactive.test.ts: superseding, refusing dismissed and duplicate titles, no second notification.proactive-store.integration.test.ts:supersedeandhistoryagainst Postgres.computer-policy.test.tsandpolicy-durability.integration.test.ts: labels are validated, stored and reloaded.boundaries-pages.test.tsx: the rule list, adding from a template, removing.conversation-actions.test.tsx: the Pin and Delete buttons in the gear panel.dictation-surface.test.tsx: no translate at rest. It fails without the fix.bot-page-length.test.tsx: the activity glance and the suggestions fold.