SLOPSHOPPER

agent-watch

Demo mod for the website's screenshots: agents running, as a band, a pane and a status

newpanebandcommandtoaststatus
A shopper browsing a rack in a slop shop
Preview · a replayed session in a sandbox
claude · ~/work/app · agent-watch
│ ┃ Agents ✕ › fix the failing auth test and add an audit log call │ ┃ Running agents │ ┃ ⏺ Read(src/auth.ts) │ ┃ ╭──────────────────────────────────────────╮ ⎿ Read 6 lines │ ┃ │ ● Explore: sidebar rows [ Stop ] │ ⏺ Update(src/auth.ts) │ ┃ │ 12m · 41k tokens │ ⎿ Added 2 lines, removed 1 line │ ┃ ╰──────────────────────────────────────────╯ ⏺ Bash(bun test) │ ┃ ⎿ 3 pass, 1 fail │ ┃ ╭──────────────────────────────────────────╮ │ ┃ │ ● Review: catch-up card [ Stop ] │ ● Done. refresh now rejects expired claims and logs an audit event. │ ┃ │ 4m · 18k tokens │ │ ┃ ╰──────────────────────────────────────────╯ ✻ Worked for 42s · done 4:20 PM │ ┃ │ ┃ ╭──────────────────────────────────────────╮ › /agent-watch │ ┃ │ ● Test runner [ Stop ] │ ⎿ agent-watch: Three agents are running. │ ┃ │ 1m · 3k tokens │ │ ┃ ╰──────────────────────────────────────────╯ │ 3 of 3 agents running Next start waits until one finishes. [ Show agents ] [ Raise limit ] ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › ? for shortcuts ⚠ agent-watch: 3/3

Draws

Band
3 of 3 agents running Next start waits until one finishes. [ Show agents ] [ Raise limit ]
Pane · Agents
Running agents ╭──────────────────────────────────────────────────────────╮ │ ● Explore: sidebar rows [ Stop ] │ │ 12m · 41k tokens │ ╰──────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────╮ │ ● Review: catch-up card [ Stop ] │ │ 4m · 18k tokens │ ╰──────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────╮ │ ● Test runner [ Stop ] │ │ 1m · 3k tokens │ ╰──────────────────────────────────────────────────────────╯
README

<img src="apps/desktop/build/icon.png" alt="Switchboard app icon" width="128" height="128">

<h1 align="center">Switchboard</h1>

<a href="https://github.com/estruyf/switchboard/releases/latest"><b>Download for Mac or Windows</b></a> · <a href="https://switchboard.struyfconsulting.com/">Docs</a> · <code>brew install --cask estruyf/tap/switchboard</code>

<a href="https://visitorbadge.io/status?path=https%3A%2F%2Fgithub.com%2Festruyf%2Fswitchboard"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Fgithub.com%2Festruyf%2Fswitchboard&labelColor=%2315181f&countColor=%23ffd43b" alt="Visitors"></a>

Switchboard puts all your Claude Code sessions in one window: the ones you start in the app, and the ones running in your terminal. Start new sessions, see at a glance which ones are working or waiting for you, approve permissions, and pick up any past conversation where you left off.

It uses the Claude Code you already have installed, with your login, settings, commands and skills. Nothing extra to sign in to. Use more than one Claude account, like a personal plan and a work one? Add each as a profile and see all their sessions in the same list.

<img src="docs/screenshots/session-light.png" alt="Switchboard with a finished session open: the session list on the left, its rails coloured by Claude profile (personal in yellow, work in blue), the conversation in the middle and its git changes on the right">

Watch the one-minute tour:

<a href="docs/videos/promo-720p.mp4"><img src="docs/videos/promo.gif" alt="A one-minute tour of Switchboard: Home, Claude profiles, a project's page and worktrees, the VS Code companion, split view, Changes, the command palette and search" width="720"></a>

What you can do

Keep track of every session

  • One list of all your sessions, newest first, across every project. Sessions you haven't touched for a while move to Archived, out of the way. You can archive one yourself too, even while it works: it comes back when it needs you or has finished. Nothing is deleted; to remove a session for good, delete it (it goes to the Trash).
  • Select several sessions with ⌘-click or ⇧-click to archive or unarchive them together.
  • See at a glance which sessions are working, waiting for you, finished or unread. Sort the sidebar by Quickest to unblock to see the sessions that wait for you first, then the unread ones by how long they take to review.
  • Catch-up: when a session finishes, a short briefing says what you asked, the one thing it needs from you next, whether the tests passed and how much changed, with a key for every action.
  • Filter by one of your projects, filter by title, and pin the sessions you keep coming back to.
  • Close a section of the sidebar (Working, Queue, Pinned, Today, Yesterday, Earlier) by clicking its header, or ← and → on it; ⌥-click closes or opens them all. A closed section keeps its count and says what's unread, and the session you have open stays visible under it.
  • Search every conversation (⌘⇧F): your prompts and Claude's replies across all sessions, with the matching words highlighted. Pick a result to jump straight to that message.
  • Find in a conversation (⌘F): every match in the session you're reading is highlighted; ↩ and ⇧↩ step through them.
  • Give each project an icon. Switchboard picks one up from the repo when it can (a logo or favicon).
  • Sessions running in your terminal show up too, live.
  • Several Claude accounts in one list: add a Claude profile for each login (a personal plan and a work one, say). Each session shows which account it runs on, and Home shows what each one is doing.

Work with Claude

  • Start a session in a folder (⌘N): pick a project by typing a few letters, then work on the current branch (or check out another one first) or in a new worktree, just like claude --worktree.
  • Quick questions (⌘⇧N): ask Claude something without picking a project. Choose Quick question under the project tiles in New session. Claude works in a scratch folder of Switchboard's own, so there are no git options and nothing is added to your projects. These sessions show as Questions in the sidebar.
  • Projects are the folders you choose to work in. Add them from the folders you've used Claude Code in, or any folder, then reorder, rename or remove them in the Projects view (the folder icon at the bottom of the sidebar). Renaming only changes the name Switchboard shows; the folder keeps its own. Each project has its own page: see Project pages and worktrees. Give a project its own defaults for new sessions there: model, effort, permission mode, worktree or current folder, and a branch. The New session view starts from them; change something there for one session, or click Save as project default.
  • Clean up worktrees. A project's Worktrees tab lists every worktree with its sessions, changes, commits, pull request and size on disk, and suggests which ones can go. Remove several at once after one confirmation. See Project pages and worktrees.
  • Clean up branches. A project's Branches tab lists its branches here and on the remote, says which are merged or deleted on the remote, and deletes the ones you tick: the local copy, the one on the remote, or both. See Branches.
  • Chat as you would in the terminal. You get streaming replies, / commands (your own commands and skills included), @ file mentions, and images you paste, drop or attach. Drag files anywhere over a session and the message box shows what a drop does: images are attached, other files and folders are added as context.
  • Context shows as chips above the message: files you drop, pick from the @ list, or choose several at once with Add context (⌘⇧A, or the paperclip). Remove one with its ×. Files go to Claude as references it reads itself, so a large file stays small. With the VS Code companion you can send the lines you have selected in VS Code, problems and terminal output too.
  • Approve or deny permission requests, answer Claude's questions and review plans in the conversation. Why? on a permission or question card says why Claude needs it and what saying yes does.
  • Follow what Claude does without the noise: each run of tool calls is one line ("Reading src/app.ts…", then "Ran 3 commands and edited 2 files"), and a click shows every step, with diffs, command output, to-do lists and subagent runs.
  • Images Claude reads or you attach are shown in the conversation.
  • Press Esc (or Stop) to stop Claude, ⇧Tab to switch permission mode, and keep typing while it works: messages wait in Up next above the message box (edit, remove, reorder or Send now each one), or Steer Claude at its next step (Settings › Conversation picks what Enter does). Stop session under ⋯ in the header ends the Claude Code process; sending a message picks it up again.
  • Ask about this session: the Ask button next to Send opens a panel on the right where you ask Claude about the session, also while it works. Claude answers from the conversation and the project, with read-only tools, and nothing is added to the conversation. Follow-ups stay in threads, and /btw and a question asks there too.
  • Change the model, permission mode and effort while a session runs, from the chips in the message box, and see how full the context window is under it. Click it for what fills it, like /context, and to compact the conversation.
  • Agents Claude starts, background ones included, show in a panel on the right (⌘⇧K, or the Agents button in the header, which shows how many run). Pick one to see what it is doing, what Claude asked it and what it reported, and stop a background agent.
  • Continue any past session. If it's still open in a terminal, Switchboard offers to fork it instead, leaving the original untouched.
  • Hover over a message to go back in time:
  • Undo file changes since one of your prompts. You see which files would change first.
  • Edit and resend a prompt, in a new session.
  • Fork from any of Claude's replies.
  • Copy any message from the same hover toolbar: your prompts and commands as you typed them, Claude's replies as Markdown. You can also select text in any message and press ⌘C.

Stay on top of things

  • A notification and Dock badge when a session needs you or finishes, so you can leave it running in the background.
  • A queue of prompts to start next, each one saying when it's ready (when its project is free). See Queue.
  • Unsent messages are kept, also after you quit. See Unsent messages.
  • An optional focus limit: how many sessions you want going at the same time, so starting another doesn't come at the cost of the ones already running. See Focus limit.
  • Remote: follow your sessions from your phone's browser. See what needs you, allow or deny, answer questions, send prompts, review changes and commit, end-to-end encrypted. Turn it on in Settings › Remote and pair a phone with a QR code. While it is on, Connected to this Mac at the bottom of the sidebar shows which devices are connected, what they did last, and Revoke.
  • Your plan usage under the message box: how much of your 5-hour and weekly limits you've used (hover for when they reset).

Review and finish the work

  • A Changes panel (⌘⇧D) with the session's git diff: what's uncommitted, or the whole branch compared with main. Stage, unstage or revert files, and open any diff inline. Reverted new files go to the Trash.
  • The branch a session's folder has checked out shows in its header, read live from git (so it's right after you or Claude switch in a terminal). Click it (or Switch branch… in the git menu) to switch to another local branch. Switching uses git switch: uncommitted changes that don't conflict come along, and when they would be overwritten git refuses and you stay where you are. Nothing is ever stashed or thrown away. It waits while Claude is working in this folder, and asks first when other sessions work in the same folder.
  • A git button in the session header offers the next step for the branch: Pull ↓2 when it's behind its upstream, Commit 3 when there are changes (Claude writes the commit), Push ↑1, Create PR once a branch or worktree has commits, View PR #123 once it has an open pull request, otherwise Fetch. Its menu shows where the branch stands (behind, ahead, changed files) and has every step: Pull (⌘⇧L), Fetch, Commit… with your own message, Ask Claude to commit, Push and Create PR…, plus Switch branch… and New worktree…. It says when you need to pull before you push. Git runs in a terminal tab so you see its output. Create PR… opens a dialog for the title, the description (from your pull request template or the commits), the base branch and Draft, then pushes and creates the pull request with the GitHub CLI (gh), without a browser. Pull and commit wait while Claude is working in the folder.
  • Finish a worktree from its Worktree menu: merge into the base branch, or remove the worktree, optionally with its branch. Switchboard warns you before you lose commits that aren't merged or pushed.

Everything in one place

  • A command palette: ⌘K (or ⌘⇧P) for the commands that fit where you are, ⌘P to jump to any session or project by typing a few letters. Start a session from it without leaving the keyboard: pick a project, write the prompt, press ⌘↵.
  • Sessions side by side: ⌥-click a session (or choose Open beside) to split the active pane. Open as many as fit, side by side, one above the other, or mixed. Drag a pane by its title to dock it somewhere else, and drag the dividers to resize.
  • Home (⌘⇧H, or the house button at the top of the sidebar) shows what needs you, what is working, and your projects. Close a session with the × in its header to go back to Home. A session that is working keeps running; pick it in the sidebar to open it again.
  • Tools (below the message box): the session's MCP servers, with their status and tools (turn them on or off, or reconnect, while the session runs in Switchboard), plus its skills, commands, agents and plugins.
  • A built-in terminal per session: ⌘J (or Terminal in the header) opens a shell in the session's folder. Outside a session, ⌘J opens a terminal too: in the project's folder on its page, otherwise in your home folder. ⋯ → Open in → Claude Code opens the session in the full Claude Code terminal interface.
  • Project actions: one-click buttons for things like Commit, Test or Publish, running a command or sending Claude a prompt. See Project actions.
  • Open in your editor, terminal or Finder (⌘O), or on GitHub. Click a file path in the conversation to show it in Finder, or ⇧-click to open it in your editor at that line.
  • Continue in VS Code (under ⋯ in the session header): stops the session in Switchboard and opens it in Claude Code's VS Code extension, in the window for its folder.
  • Links that open Switchboard: switchboard://new-session?project=payments&prompt=… (or cwd=/path, or repo=owner/name) opens New session with the project and prompt filled in, and switchboard://session/<id> opens a session. Put them in runbooks, alerts, READMEs or Raycast and Alfred scripts. By default you read the prompt and press Enter; add autostart=1 to start right away, or question=1 for a quick question without a project. See Links.
  • Delete sessions you don't need. They go to the Trash, so you can get them back.

<table> <tr> <td width="50%"><picture> <img src="docs/screenshots/home-light.png" alt="Home: a session that needs you, one that is working, your projects, and your two Claude profiles"> <td width="50%"><picture> <img src="docs/screenshots/new-session-light.png" alt="New session: pick a project, a branch or a worktree, and write the first prompt"> </tr> <tr> <td width="50%"><picture> <img src="docs/screenshots/split-light.png" alt="Two sessions side by side, one finished on the personal profile and one still working on the work profile"> <td width="50%"><picture> <img src="docs/screenshots/search-light.png" alt="Search across every conversation, with the matching words highlighted"> </tr> <tr> <td colspan="2" align="center"><picture> <img src="docs/screenshots/palette-light.png" width="70%" alt="The command palette on New session: recent projects with their branch, status and a ⌘1 to ⌘4 shortcut each"> </tr> </table>

Requirements

  • A Mac with Apple Silicon, or a PC with Windows 10 or 11
  • Claude Code installed and signed in (claude works in your terminal)

What works differently on Windows is in Windows support.

Install

Download the .dmg from the latest release, open it and drag Switchboard to Applications.

On Windows, download Switchboard-<version>-setup.exe from the same release and run it. It installs for you only, without admin rights, and updates itself.

Or install it with Homebrew:

brew install --cask estruyf/tap/switchboard

Switchboard updates itself, so brew upgrade skips it; brew upgrade --cask estruyf/tap/switchboard updates it through Homebrew instead.

Or build it from this repository, which takes a couple of minutes. You need Node 24 or later.

npm install
npm run dist

Then open apps/desktop/dist/Switchboard-<version>-arm64.dmg and drag Switchboard to Applications.

If macOS blocks the app the first time you open it, see Building, signing and notarisation.

Updates

Switchboard checks for a new release shortly after it opens and every few hours. When there is one, a message in the bottom right corner of the window says so: click Download (What's new shows the release notes), then Restart to update. Close it to decide later; it comes back for the next step or the next time you open Switchboard. If sessions are running, Switchboard asks before it restarts. You can also choose Switchboard → Check for Updates… at any time.

In Settings → About you can turn automatic checks off and pick a channel: Stable (published releases, the default) or Nightly (pre-release builds, when there are any). Nothing downloads until you click. Builds you make yourself with npm run dist update like a release; development builds don't update.

Claude Code

Switchboard also checks whether the Claude Code it runs is up to date: shortly after it opens, every few hours, and when you choose Check for Updates under Claude Code in Settings → About (or Check for Claude Code updates… in the command palette). It compares your version with the newest on the channel you follow: the autoUpdatesChannel in your Claude Code settings (latest or stable), or, for Homebrew, the cask you installed (claude-code is stable, claude-code@latest is latest).

When a newer version is out, the bottom of the sidebar says so. Click it to update, or dismiss it until the next version. Switchboard runs the update for how you installed Claude Code (claude update for the native installer, brew upgrade --cask … for Homebrew, npm install -g … for npm) and shows its output in Settings → About. New sessions use the new version straight away; sessions already running keep theirs until they restart. If Switchboard can't tell how Claude Code was installed, it shows the command to run in a terminal instead, with a copy button.

To stop the checks, turn off Check for Claude Code updates automatically in Settings → About. If you turned off Claude Code's own updater (DISABLE_AUTOUPDATER), Settings still shows a newer version, but the sidebar doesn't.

Getting started

  1. Open Switchboard. The sidebar lists the sessions you start or continue in Switchboard. To see your sessions from the terminal, Claude desktop and your editor too, turn on Show sessions from other apps in Settings.
  2. Pick a session to read it, or type below it to continue.
  3. Start something new with ⌘N: pick the project, write what Claude should work on, and choose where it runs: this checkout or a new worktree. Model, permission mode and effort are chips inside the message box, as they are in a session.
  4. When a session needs you (a permission or a question), it's marked in the sidebar and you get a notification.

Keyboard shortcuts

Press ⌘/ (or Help › Keyboard Shortcuts) to see every shortcut in the app, with the ones that work where you are and your project actions' shortcuts. Type in its field to filter by name or by keys ("terminal", "⌘J").

On Windows, ⌘ is Ctrl, ⌥ is Alt and ⇧ is Shift, and the app shows them that way. In the terminal panel, Ctrl keys belong to the shell and Ctrl+Shift keys to Switchboard.

<img src="docs/screenshots/shortcuts-light.png" width="80%" alt="The keyboard shortcuts sheet over a session: every shortcut grouped by where it works, with its keys on the right and the ones that don't work there faded">

<!-- shortcuts:start (written by npm run docs:shortcuts from apps/ui/src/lib/shortcuts.ts; edit the registry, not this table) -->

General

ShortcutWhat it does
⌘NNew session
⌘⇧NQuick question (no project)
⌘K or ⌘⇧PCommand palette (in the terminal ⌘K clears it, so use ⌘⇧P)
⌘PGo to a session or project (⌥↩ opens a session beside this one)
⌘⇧FSearch all conversations
⌘⇧HHome
Open usage (No key by default: use the command palette, or click a usage bar)
⌘,Settings
⌘/Keyboard shortcuts
⌘Q then ⌘QQuit (Switchboard asks first; Press once if you turned that off)
⌘J or ⌃`Show or hide the terminal
⌘⇧JMaximize or restore the terminal
⌘SSave the memory or instructions you are editing (on a project's Memory tab, or Settings › Memory)

Sessions and sidebar

ShortcutWhat it does
⌘BCollapse or open the sidebar
⌃⇥Next session (in the sidebar's order)
⌃⇧⇥Previous session (in the sidebar's order)
⌘⇧UNext session that needs you
↑ or ↓Move through sessions (in the sidebar)
⌘-click or ⇧-click or ⇧↑ or ⇧↓Select several sessions (in the sidebar)
⌘ASelect every session in the group (in the sidebar)
EscClear the selection (while sessions are selected)
F2Rename the session (in the sidebar)
⌘⌫Delete the session (in the sidebar, to the Trash)
⌥-clickOpen beside the current session (in the sidebar; Dragging the session onto a pane opens it there)
Middle-clickArchive a finished session (in the sidebar)
← or →Close or open a section (on a section header in the sidebar)
⌥-clickClose or open every section (on a section header in the sidebar)
⌘↩Start a queued item now (on a queued item, in the sidebar or Home)
⌘EEdit a queued item in New session (on a queued item, in the sidebar or Home)
⌥↑ or ⌥↓Move a queued item up or down (on a queued item, in the sidebar or Home)
⌥⇧↑Move a queued item to the top (on a queued item, in the sidebar or Home)
⌫Remove a queued item (on a queued item, in the sidebar or Home; Undo puts it back)
⇧F10Open the context menu (on a session, project or file; or right-click)
⌘⌥WClose this pane (with more than one pane open; The panes next to it take its space)
⌘\\Close the other panes (with more than one pane open; Keeps the pane you are in)
⌘⌥←Go to the pane on the left (with more than one pane open)
⌘⌥→Go to the pane on the right (with more than one pane open)
⌘⌥↑Go to the pane above (with more than one pane open)
⌘⌥↓Go to the pane below (with more than one pane open)
⌘⇧XSwap this pane with the next one (with more than one pane open; Dragging a pane's header onto the middle of another one does the same)
⌘⇧OStack this pane's split, or put it side by side (with more than one pane open; Turns the panes this one sits in the other way)

In a session

ShortcutWhat it does

| ↩ | Edit a me

Source 1 files
hooks/register.tsx 60 lines
1import type { Register } from 'claude-code'
2
3// A made-up mod for the website's screenshots (scripts/website-screenshots.ts): three agents that never change.
4
5const PANE = 'agents'
6const AGENTS = [
7  { what: 'Explore: sidebar rows', took: '12m', tokens: '41k tokens' },
8  { what: 'Review: catch-up card', took: '4m', tokens: '18k tokens' },
9  { what: 'Test runner', took: '1m', tokens: '3k tokens' },
10]
11
12export const register: Register = on => {
13  on('session.start', async ($, e, next) => {
14    // The session starts with this command, answered here: the screenshots cost nothing.
15    await $.command.register({ name: 'agent-watch', description: 'Show the running agents' })
16    $.ui.status('3/3')
17    void $.ui.open({ id: PANE, title: 'Agents', closeOnEscape: true })
18
19    return next(e)
20  })
21
22  on('command.run', { command: 'agent-watch' }, async () => ({ text: 'Three agents are running.' }))
23
24  on('ui.render', { component: 'AbovePrompt' }, async ($, e) => {
25    const { Box, Button, Text } = $.ui.resolve(e)
26
27    return (
28      <Box gap={2} alignItems="center">
29        <Text color="yellow" bold>3 of 3 agents running</Text>
30        <Text dimColor>Next start waits until one finishes.</Text>
31        <Box flexGrow={1} />
32        <Button key="show" label="Show agents" onPress={() => $.ui.open({ id: PANE, title: 'Agents', focus: true })} />
33        <Button key="raise" label="Raise limit" onPress={() => $.ui.toast('The limit is 3 agents per session.')} />
34      </Box>
35    )
36  })
37
38  on('ui.render', { component: 'Pane', requestId: PANE }, async ($, e) => {
39    const { Box, Button, Text } = $.ui.resolve(e)
40
41    return (
42      <Box flexDirection="column" gap={1}>
43        <Text bold>Running agents</Text>
44        {AGENTS.map(agent => (
45          <Box borderStyle="round" paddingX={1} alignItems="center" gap={1}>
46            <Text color="yellow">●</Text>
47            <Box flexDirection="column" flexGrow={1}>
48              <Text>{agent.what}</Text>
49              <Text dimColor>
50                {agent.took} · {agent.tokens}
51              </Text>
52            </Box>
53            <Button key={`stop:${agent.what}`} label="Stop" onPress={() => $.ui.toast(`${agent.what} keeps running in this demo.`)} />
54          </Box>
55        ))}
56      </Box>
57    )
58  })
59}
60