Demo mod for the website's screenshots: the pull request, as a status

<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>
Keep track of every session
Work with Claude
claude --worktree./ 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.@ 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./btw and a question asks there too./context, and to compact the conversation.Stay on top of things
Review and finish the work
main. Stage, unstage or revert files, and open any diff inline. Reverted new files go to the Trash.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.gh), without a browser. Pull and commit wait while Claude is working in the folder.Everything in one place
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.<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>
claude works in your terminal)What works differently on Windows is in Windows support.
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.
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.
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.
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
| Shortcut | What it does |
|---|---|
| ⌘N | New session |
| ⌘⇧N | Quick question (no project) |
| ⌘K or ⌘⇧P | Command palette (in the terminal ⌘K clears it, so use ⌘⇧P) |
| ⌘P | Go to a session or project (⌥↩ opens a session beside this one) |
| ⌘⇧F | Search all conversations |
| ⌘⇧H | Home |
| Open usage (No key by default: use the command palette, or click a usage bar) | |
| ⌘, | Settings |
| ⌘/ | Keyboard shortcuts |
| ⌘Q then ⌘Q | Quit (Switchboard asks first; Press once if you turned that off) |
| ⌘J or ⌃` | Show or hide the terminal |
| ⌘⇧J | Maximize or restore the terminal |
| ⌘S | Save the memory or instructions you are editing (on a project's Memory tab, or Settings › Memory) |
Sessions and sidebar
| Shortcut | What it does |
|---|---|
| ⌘B | Collapse or open the sidebar |
| ⌃⇥ | Next session (in the sidebar's order) |
| ⌃⇧⇥ | Previous session (in the sidebar's order) |
| ⌘⇧U | Next session that needs you |
| ↑ or ↓ | Move through sessions (in the sidebar) |
| ⌘-click or ⇧-click or ⇧↑ or ⇧↓ | Select several sessions (in the sidebar) |
| ⌘A | Select every session in the group (in the sidebar) |
| Esc | Clear the selection (while sessions are selected) |
| F2 | Rename the session (in the sidebar) |
| ⌘⌫ | Delete the session (in the sidebar, to the Trash) |
| ⌥-click | Open beside the current session (in the sidebar; Dragging the session onto a pane opens it there) |
| Middle-click | Archive a finished session (in the sidebar) |
| ← or → | Close or open a section (on a section header in the sidebar) |
| ⌥-click | Close 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) |
| ⌘E | Edit 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) |
| ⇧F10 | Open the context menu (on a session, project or file; or right-click) |
| ⌘⌥W | Close 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) |
| ⌘⇧X | Swap 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) |
| ⌘⇧O | Stack 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
| Shortcut | What it does |
|---|
| ↩ | Edit a me
hooks/register.tsx 12 lines1import type { Register } from 'claude-code'
2
3// A made-up mod for the website's screenshots (scripts/website-screenshots.ts): a pull request's state as a status.
4
5export const register: Register = on => {
6 on('session.start', async ($, e, next) => {
7 $.ui.status('PR #142 · 2 reviews requested')
8
9 return next(e)
10 })
11}
12