Skip to content

Labs: inbox-first layout - #41

Closed
sean-brydon wants to merge 5 commits into
mainfrom
labs-inbox
Closed

sean-brydon wants to merge 5 commits into
mainfrom
labs-inbox

Conversation

@sean-brydon

Copy link
Copy Markdown
Collaborator

One of several parallel experiments in navigation that isn't a sidebar. This one is inbox first, in the style of Superhuman.

Turn it on in Settings › Labs › Layout › Inbox, or with ?layout=inbox in mock mode. The sidebar stays the default and is unchanged. The pref is layout: "sidebar" | "inbox" in berth.prefs. An integration pass will merge it with the other Labs layout switch.

The idea

The sidebar becomes one triage list of every agent on every box.

Sections:

  • Needs you: the agent that has waited longest is on top.
    • A permission ask shows its whole command, wrapped, with Deny and Allow once on the row.
    • Under the cursor, y and n answer it and the cursor moves to the next row.
    • Review's finished work also appears here.
  • Working: two lines per row, the title and then the place and current step.
  • Recent: done and idle agents, one line each.

Keys:

Key What it does
j / k Move
↵ Open the worktree beside the list
e Clear the row until its agent's state changes
z Undo
b Go back to the last worktree
c New task
/ or ⌘K Search
⌘J Bring the keyboard back to the list from a terminal (in this layout only)
⌘\ Fold the list
? Show every key

Behaviour:

  • Rows hold their places while the pointer or keyboard is in the list.
  • The open row is filled, with a bar at its edge. The cursor is shown as an outline.

Also covered:

  • New task brings Home's composer forward.
  • An Inbox | Projects toggle switches to today's tree.
  • A filter by box and project.
  • Review, Automations, More and Settings at the foot.
  • Below 1024px the list folds to a strip of agent rings while a worktree is open, and ⌘J lays it over the worktree.

Code

  • app/src/lib/inbox.ts (+ inbox.test.ts): the model with no React. It covers sections, ordering, clear and undo, filters, holding rows in place, and cursor steps.
  • app/src/components/inbox/: the pane, the row, the strip, the Home panel and the state.
  • Small hooks into existing code:
    • App.tsx: the layout branch.
    • prefs.ts: the layout pref and ?layout=.
    • Labs settings: the Layout row.
    • use-shortcuts.ts: ⌘J in the inbox layout.
    • useLiveStep and QUESTION_TOOLS are now exported from the home widgets.

Scores

A fresh critic subagent scored each round from 1 to 10, against today's app and against Superhuman, Linear and Arc.

R1 R2 R3 R4 R5 (final)
Speed to what needs you 8 8 8 8 9
Switching 5 6 7 6 7
Overview of many agents 5 5 6 6 6
Focus and calm 7 7 6 7 5.5
Learnability 6 6 7 6 7
Visual quality vs today 7 7 7 7 7

Only one axis reached 8. I stopped after five rounds, and here is why the rest don't get there:

  • Overview (6). A list ordered by state loses the shape of the work: parent and child worktrees, grouping by box, and idle worktrees, which live behind the Projects toggle. Grouping Recent by project would help with large fleets, but at that point it is a tree again.
  • Calm (5.5–7). The critics disagreed with each other here. One asked for a fill on the open row and the next asked to drop it. Each one called the 30px rings, the monospace commands and the 316–360px panel busier than the 240px sidebar. Shrinking all of that trades away the "see the ask without opening it" speed that scores 9.
  • Switching (7). Rows move when an agent changes state. Holding them still, b and ⌘J help, but a tree gives you place memory that a state-sorted list can't.
  • Not mine to change: the folded strip reuses the sidebar's rail (RailAgents). Its duplicate labels ("order-export" twice) are a fix in shared code.

Worth taking whatever layout wins:

  • Clear-until-it-changes.
  • Never offer Allow next to a cut-off command, and y/n with auto-advance.
  • Hold a live list's order while the pointer or keyboard is in it.
  • ⌘J back to the list and b for the last worktree.

Checks

  • pnpm typecheck:plugins, check:titles, check:csp, check:themes, pnpm test (303 pass) and pnpm build all pass.
  • npx tsc -p e2e passes.
  • docs-site build passes.
  • go vet passes.
  • No Go or Rust changes.
  • e2e:
    • New e2e/inbox.spec.ts (5 tests): keyboard triage (j/k/e/z/y/↵/⌘J/b), New task and c, Projects, Review and Settings › Labs back to the sidebar, and the narrow fold and overlay. It passed --repeat-each=4.
    • An inbox a11y scene, which passes in dark and light.
    • keyboard.spec.ts and rail.spec.ts still pass.

🤖 Generated with Claude Code

sean-brydon and others added 5 commits October 9, 2026 21:09
… you on top

Settings › Labs › Layout › Inbox swaps the sidebar for a triage list:
Needs you, Working, Recent. Allow or deny on the row, j/k to move, Enter
to open the worktree beside the list, e for done, z to undo, c for a new
task, ⌘J back to the list. The projects tree is a toggle away; narrow
windows fold the list to a strip while a worktree is open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ill under you, and b goes back

Answer asks with y and n, clear rows with e, and see more agents at once:
Working rows are two lines and Recent rows one. New task and Search share
a row, a key strip shows while the list has the keyboard, and ? lists
every key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, and never cuts a worktree's name

Agent glyphs are monochrome in the list, commands wrap at word breaks,
the age stays beside Clear, Recent rows name their box when it matters,
and clearing a row says it comes back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… glance

y and n move the cursor to the next row. Recent rows show a state dot
instead of a ring, keep the worktree's name whole, and give the box its
own slot. Clear takes the age's place instead of covering text, the list
is never narrower than 316px, and the waiting count is said once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… only under the cursor

Pressing a row no longer focuses it on the way to opening the worktree,
so nothing in the list moves between press and release and the click
can't land on the list instead. ⌘J and the strip decide at once whether
to unfold or lay the list over, rather than after the next paint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vercel

vercel Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
berth Ready Ready Preview Oct 9, 2026 8:58pm UTC
berth-docs Building Building Preview Oct 9, 2026 8:58pm UTC

Request Review

@sean-brydon

Copy link
Copy Markdown
Collaborator Author

Stashed: not going ahead with this layout for now. The branch stays for later.

@sean-brydon sean-brydon closed this Oct 9, 2026

This branch was successfully deployed

2 active deployments
Preview – berth-docs — 2857c483 Deployed Oct 9, 2026 by vercel[bot]
Preview – berth — 2857c483 Deployed Oct 9, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant