English · Русский
Local accounts and quota management for Claude Code, Codex CLI and Kimi Code. See which account is in use, check its remaining quota and open a session for your project. A desktop app, CLI and MCP server for macOS (Apple silicon and Intel), Windows (x64 and ARM) and Linux (x64 and ARM), built by PassionCode.ai.
Download for macOS · Download for Windows · Download for Linux · Installation · Release notes · Product page
Current interface, shown with synthetic demo accounts. Screenshot provenance.
| Task | In Switchboard |
|---|---|
| Keep work and personal accounts separate | Account pools, project rules and isolated session homes |
| See when another account is needed | Reported usage, reset countdowns and explicit unknown or expired states |
| Choose the next account | Native Claude switching or managed request routing; a response in progress keeps its identity |
| Use Kimi Code subscriptions | Official sign-in, membership and usage, then launch the chosen account in a project |
| Choose and configure coding agents | See which agents are installed, which take over work and the default one; OpenCode and Hermes continue workflows on an OpenRouter key; pick the model from OpenRouter's list |
| Work from your terminal or agent | switchboard CLI, MCP tools and launch --in-place |
Saved secrets use macOS Keychain, Windows DPAPI or the Linux Secret Service (GNOME Keyring, KWallet, KeePassXC). Automatic switching is opt-in. Kimi accounts stay in their own sign-in folders; Switchboard does not copy or renew them. See account behavior and agent support for the boundaries of each mode.
Latest published: v0.6.24 · October 12, 2026.
Work keeps going when the accounts run out: a fallback chain such as claude-code → kimi-code → hermes hands an Observatory workflow to a saved Kimi Code account, then to Hermes on your
OpenRouter key and the model your Hermes uses there (else the key's default); the account a session works on is checked every
minute from 95 % and every 30 seconds from 98 %, and the next one every minute; a limit the usage
figures miss reads Hidden personal limit; a waiting update keeps checking and never waits
forever. 0.6.21 finishes the Hermes hand-overs after a second review (bounded, listed under
Sessions); 0.6.24 makes hand-overs to saved Claude, Codex and Kimi accounts pass Project
Observatory again (it refused their ids as credential-shaped). 0.6.19, 0.6.22 and 0.6.23 were
tagged but never published. Release run
38313811475.
From 0.6.16 Windows installers and the CLI are Authenticode-signed; 0.6.15 added Linux and Windows on ARM.
macOS releases are universal, Developer ID signed and notarized by Apple. Windows releases (x64, arm64) are built natively and Authenticode-signed (Azure Artifact Signing, timestamped). Linux releases (x64, arm64) are a .deb, an AppImage and a CLI tarball. Installed copies from 0.6.1 update automatically. Builds and signatures come from the protected release workflow. Live-provider acceptance is tracked separately on the board (SB-01, SB-02, SB-15).
Open source under the GNU AGPL-3.0, with a commercial license available. License details.
With a coding agent: once the CLI is on PATH (step 3), ask the agent to run switchboard onboard
and follow it — it does every setup step it can and tells you the ones that are yours (opening the
app, signing in). switchboard onboard --status shows where setup stands.
- Install the published build: macOS ZIP
(redirects to the latest release),
check it against
SHA256SUMSfrom the release (shasum -a 256 -c SHA256SUMS --ignore-missing→OK), then follow docs/INSTALL.md. The app is Developer ID signed, notarized and stapled (spctl -a -vv "Fabric Switchboard.app"→accepted, source=Notarized Developer ID); the CLI beside it runs (./switchboard --version). Open the app once after installing: it moves accounts saved by earlier versions, opens at login from then on, and shows a five-step tour. - Configure: nothing to set before first run. Accounts are added in the app or with
switchboard accounts add … --secret-stdin; secrets come from your own Claude or Codex sign-in and go to the OS vault, never into an environment variable or an argument.--data-dir <absolute dir>points the CLI at a separate, disposable app-data directory. - MCP: put the
switchboardCLI onPATHby linking the one inside the app, so it updates with the app:ln -sf "/Applications/Fabric Switchboard.app/Contents/MacOS/switchboard" ~/.local/bin/switchboard(or Agents → Link switchboard into ~/.local/bin; INSTALL.md), then eitherclaude plugin marketplace add passioncode-ai/fabric-switchboardandclaude plugin install switchboard@switchboard(server plus theswitching-accountsskill), orclaude mcp add --scope user switchboard -- switchboard mcp.claude mcp listthen showsswitchboard … ✔ Connected; a first call is the read-onlyswitchboard_accountstool (an empty vault answers{"accounts":[]}). To prove it with a real client without changing your agent config or saved accounts, write a temporarymcp.jsonwith{"mcpServers":{"switchboard":{"command":"switchboard","args":["--data-dir","<absolute empty dir>","mcp","--read-only"]}}}and runclaude -p "Call the switchboard_accounts tool once and reply with exactly its JSON result." --strict-mcp-config --mcp-config mcp.json --allowedTools mcp__switchboard__switchboard_accounts --max-turns 3→{"accounts":[]}(run 2026-09-30 with the published 0.4.0 CLI: handoff). Even with--read-onlyand an empty data dir,switchboard_accountsreads the current Claude Code and Codex sign-in (on macOS the Claude Code Keychain item, throughsecurity find-generic-password) to report which saved account is signed in; it writes, switches and prints nothing from it. 0.4.1 does not change this read: its Keychain change covers Switchboard's own items. All agents and tools: docs/CLI.md. Measured from the published archive: 0.4.0 release record; 0.4.1 from the published archive: 0.4.1 release record. - Develop:
npm ci, then./scripts/check.sh(the gate) andnpm run app:dev; the CLI iscargo build --release --locked -p switchboard-cli→target/release/switchboard. Start at docs/HANDOFF.md, AGENTS.md and the layout table in Checks and layout; tests use synthetic fixtures only.
- Research on four existing tools: sources, architecture, storage and switching mechanics; 69 links to fixed commits.
- Specification: features, compatibility axes, states, security, protocols, Windows and acceptance criteria.
- Product map (Russian): what was built, which ideas were borrowed, limits and the order of further work.
- Entry point for the next contributor or agent: checks, decisions and the exact next task.
- CLI: commands, JSON, stdin and the shared session owner.
- Distribution: macOS universal app/CLI, signing, Windows installer/CLI.
- Agents Switchboard works with: the 30 popular coding agents (Hermes, Kilo Code, Cline, Goose, OpenCode, …) — tools, proxy and launch, with sources.
- Usage analytics: what release builds send (counts and kinds, never account names, e-mail addresses or sign-ins), the installation id PassionCode.ai tools share, and the switch that turns it off for all of them.
macOS needs macOS 14+, Xcode Command Line Tools, Rust and Node.js. Windows needs Rust
(MSVC), Visual Studio C++ Build Tools, Node.js and WebView2. The official claude or
codex CLI is needed only to sign in or launch a session, not to run the manager. The
verification status of each platform is in the current build report.
npm ci
npm run app:devBuild a local app:
npm run app:build
open 'target/release/bundle/macos/Fabric Switchboard.app'That command alone does not establish Developer ID signing or notarization, and a build
signed on a laptop is a debug build. Releases are built, signed and notarized only by the
release workflow in GitHub Actions.
Binaries are not stored in Git. Dependencies are pinned by Cargo.lock and
package-lock.json; byte-for-byte reproducibility is not claimed.
CLI from source:
cargo build --release --locked -p switchboard-cli
./target/release/switchboard --help
./target/release/switchboard accounts list
./target/release/switchboard serveserve, or an open desktop app, owns the proxy and the sessions. Other CLI commands talk
to that owner automatically. Without an owner, metadata operations run under an exclusive
lock; login and launch need a running runtime.
To look at the interface with synthetic data: npm run dev, then
http://127.0.0.1:1420/?demo=1. A plain web page does not connect to the vault. The browser
demo has no real accounts, no CLI launch and no network calls to providers.
- Add account — official sign-in in a separate profile, an API key, a Claude setup token, or explicitly imported OAuth JSON. Switchboard reads the current Claude Code and Codex sign-in to show which saved account is in use, but never saves or switches it without you.
- Set a label and a pool, for example
workorpersonal. The pool is the routing boundary; accounts of different providers are not interchangeable. - Select — choose the account for the next managed requests.
- Launch… — pick the project folder with the system folder picker and start the CLI
there. Cleared, the Isolated session box sends it through the local proxy as a managed
session (the pool's selected account; the app or
switchboard servemust stay open; one managed home per provider/pool). Ticked, it runs in the account's own home with a direct connection to the provider, and later Select actions do not affect it. - Check usage — quota is checked in the background (every 3 minutes for accounts in use or in a rotation pool, every 10 minutes otherwise); Check usage asks at once. An API key does not report a reliable subscription quota; an unknown quota is never shown as zero.
- Language — the window speaks English or Russian, following the operating system; About → Language overrides it (SCN-041).
Use Switchboard in line with the terms of Anthropic and OpenAI. Breaking a provider's terms can get your account blocked. You are responsible for how you use your accounts.
The persistent credential stays in the OS vault, but isolated mode writes the working copy of the access token that the official CLI needs into a private file (0600 on macOS, a user-only DACL on Windows). The refresh token is not written there; when the token expires, sign in again. Details, recovery after a failure and removal: operations guide.
./scripts/check.sh
# The explicitly requested test creates and deletes only a random synthetic Keychain item:
cargo test -p switchboard-core native_vault_roundtrip_uses_only_random_app_owned_item -- --ignored --exact| Path | Responsibility |
|---|---|
crates/switchboard-core |
accounts, Keychain/DPAPI, atomic metadata, route snapshot |
crates/switchboard-proxy |
loopback authentication, requests, streams, usage |
crates/switchboard-runtime |
shared owner, control API, official login and CLI launch |
crates/switchboard-cli |
the switchboard command, stdin and JSON |
src-tauri |
native window and IPC to the shared runtime |
src |
TypeScript interface and the clearly labelled demo |
docs |
research, specification, scenarios, contracts and evidence |
Full hosted CI runs nightly — the macOS gate and build, and the native Windows fixtures — and push and pull requests do not run the full suite. A workflow existing does not mean it passed.
A release is a vX.Y.Z tag on the merged release commit. The tag starts
release.yml in the protected release environment, approved by checks (operator, 2026-10-11): its guard
job lets the signing jobs start only when main contains the tagged commit and nightly.yml passed on it
(started on the tag when it did not run), and only release-approvers can push a v* tag; the macOS app and CLI are signed
with the organization's CI Developer ID and notarized (the app stapled); Windows is built
natively and Authenticode-signed through Azure Artifact Signing, every signature checked Valid
before publishing (the receipt says windows_authenticode: SIGNED); Linux is built natively on
x64 and arm64; then every file
is attested (Sigstore), summed in SHA256SUMS, GPG-signed and published with the notes from
CHANGELOG.md. A rehearsal runs the same path on a vX.Y.Z-rc.N tag with
gh workflow run release.yml --ref vX.Y.Z-rc.N -f publish=false and creates no release.
Details, receipts and the Azure setup: DISTRIBUTION.md. Other projects' sources were studied but are not included as
dependencies.
Open source under the GNU AGPL-3.0. A commercial license is
available for use that does not meet the AGPL's terms — passioncode.ai/business.
v0.4.1-beta.1 is the first release under the AGPL. Versions up to and including v0.4.0-beta.1 were released under PolyForm Noncommercial or Internal Use (v0.4.0-beta.1) and the MIT License (v0.3.1-beta.1 and earlier, commits up to and including 7c36f4a); those releases keep their licence.
The built app and CLI include third-party components under their own licenses; see THIRD_PARTY_NOTICES.md. Contributions are accepted under the CLA, which allows this dual licence; see CONTRIBUTING.md.
