Every skill you keep installed pays rent in your context window — every turn, before you type anything. This is the switchboard, and the meter.
Claude Code and Codex advertise every skill, MCP server and subagent they can discover to the model in the system prompt, on every turn, whether or not you use it. Sixty installed capabilities is a standing bill nobody was showing you, and the only lever on it used to be uninstalling.
Skillswitch keeps every source in one library at ~/.skillswitch and switches what each agent can
see — with the bill on screen while you do it.
- A context-load readout. Per agent, the estimated tokens your switched-on capabilities cost every turn, against the ceiling if everything were on, over a patch row with one tick per capability. Flip a switch and the number moves.
- Independent switches per agent. Skills, MCP servers and subagents, Claude and Codex separately — which is harder than it sounds, because the two agents agree about almost none of the underlying mechanism. See DESIGN.md.
- Presets. Name a working set — "ecommerce SEO needs these skills, this server, that subagent" — and switch one or both agents to exactly it. The preview shows what goes on, what goes off, and what the number does, before anything moves.
- Agent pages. What Claude or Codex is carrying right now, which paths it reads, and how each kind of thing is switched for it.
- A store. Browse a GitHub repository whole, or search skills.sh across every repository it indexes. Installs land in the library switched off. Bundled resource paths are materialized against a stable absolute root; managed updates regenerate them from an immutable upstream snapshot plus a durable local overlay.
- Consolidate. Move the real skill directories and subagent files that live inside Claude's and Codex's own folders into the library and link them back, so the switches become genuinely independent. Planned and shown before anything moves.
There is a second, smaller front end over the same library: a menu bar app at JC-kk/skillswitch, for flipping switches without opening a window. This one is for the questions that need room.
macOS, a rustup toolchain, and Node 18+. macOS only by choice — see DESIGN.md §8.
npm install
npm run tauri devPoint it at a throwaway tree instead of your real config while poking at it:
SKILLSWITCH_HOME=/tmp/skillswitch-fixture npm run tauri devThe design work can be done in a plain browser, against a harness with realistic row counts:
npm run devOpened at http://localhost:1420 outside the Tauri webview there is no Rust side, so src/mock.ts
stands in. It is behind import.meta.env.DEV and never reaches a production bundle.
python3 scripts/make_icon.pyThree vertical ticks off the app's own patch row — clay for Claude, cyan for Codex, one switched off between them. The colours are the interface's own, so the mark and the window cannot drift apart.
./scripts/package.shProduces a signed, verified .dmg and .zip plus checksums in dist/. Deliberately not
tauri build --bundles dmg: that path needs macOS Finder automation permission and leaves the bundle
failing codesign --verify. See DESIGN.md §9.
cd src-tauri && cargo test128 tests. Every one builds its own temporary HOME, so nothing in the suite can read or write the
real ~/.claude, ~/.codex or ~/.agents, and the store is driven against tarballs built in a temp
directory — including three hostile ones — rather than a live host.
Two examples cover what the suite deliberately cannot. scan prints the live inventory as JSON:
cd src-tauri && cargo run --example scanstore is the only thing here that opens a socket — point it somewhere disposable:
cd src-tauri && SKILLSWITCH_HOME=/tmp/skillswitch-check cargo run --example store
cd src-tauri && SKILLSWITCH_HOME=/tmp/skillswitch-check cargo run --example store -- --search seo- Nothing deletes a regular file or a directory. The only removals available demand proof of ownership: resolution inside the library, or a shared inode with a link count of at least two.
- Turning off something Skillswitch did not create writes Claude's own
skillOverridesrather than touching the files. Where an agent has no such switch, the toggle is refused and says why. - Config edits are a text splice of one key, validated by re-parsing and comparing every other key before anything is written — then backed up, then written atomically.
- Adopt and park move things aside instead of deleting them, so both are undoable.
- A store install refuses to overwrite an existing library skill, and never enables it anywhere.
- Hostile archive entries — absolute paths,
.., symlinks — are dropped during extraction.
MIT. See LICENSE.