Features › Extensions
Extensions that run in a sandbox
Extensions are written in TypeScript or Swift. A TypeScript one runs in its own sandboxed worker and can reach only what its manifest asked for and you approved. Switchboard’s own tools use the same extension points, and the gallery is open source. Unsigned extensions install only in Develop mode, so you meet that switch the first time you write one.
Coming soon See pricing
What it does
You want actions that call Linear’s API.
The extension declares one network host, api.linear.app, and you see it as a check row before you install. A call to any other host fails with “permission denied” and never leaves the sandbox.
You describe an extension in a sentence: “An action that counts the words on the clipboard and shows a HUD”.
Claude writes a TypeScript extension against the SDK. Switchboard compiles it, checks it and runs its test before you see it. Then it shows the files and the permissions in words, with Try it and Install in Develop mode.
An extension has tools for agents.
An agent sees none of them until you turn each one on. A tool that changes something asks for your approval every time; only a tool its author marked read-only runs without asking.
You are writing one and want to see it change.
switchboard ext dev <folder> loads it into the running engine, rebuilds on every save, hot-reloads it and streams its log.
An extension hangs.
A call that takes more than five seconds without answering is killed and the extension restarts. Memory is capped. The code has no file system, network, shell or eval of its own.
How it works
- Copy the hello template from the SDK, install @switchboard/sdk and give your extension a reverse-DNS id.
- List what it adds (actions, triggers, conditions, functions, palette rows, sensors) and what it may touch in switchboard.json.
- Load it with switchboard ext dev. Unsigned extensions install only in Develop mode.
In the gallery
- Linear create, search and update issues; triggers on assignment and state change; palette search
- Jira create, transition, JQL search; new-match trigger; palette search (Jira Cloud)
- Home Assistant call a service, get a state; state-changed trigger (local network)
- OBS switch scene, start/stop recording, toggle mute; scene and recording triggers (OBS WebSocket v5)
- Sonos play, pause, volume, group; playback trigger (local network, no account)
- 1Password read a field with the 1Password CLI
- Things add a to-do, show a list, search (URL scheme)
- Window snap, resize, tile, move between displays, switch, save and restore window layouts (Accessibility)
- Stream Deck an Elgato plugin that runs Switchboard macros from keys (not an extension)
- Raycast a Raycast command "Run Switchboard Macro" (not an extension)
Read the docs
- Writing an extensionBuild a TypeScript extension that adds actions, conditions, triggers, functions or palette rows, and asks only for the permissions it needs.
- Make your first extensionA ten-minute walk-through from an empty folder to a working extension action in a macro, with hot reload, a setting, a permission, logs, tests and the gallery.
- Making an extension with AIDescribe an extension in a sentence, read the checked TypeScript Claude wrote and the permissions it asks for, try it, and install it in Develop mode.