Show HN: Airship – Figma-Like Visual Editor for Claude Code, Codex and OpenCode Airship Labs released Airship, a Figma-like visual editor that connects to a developer's running dev server and lets them edit code through Claude Code, Codex, or OpenCode, with no plugins or config. The CLI tool, available via npx @airshiplabs/cli, supports modes for canvas and inline editing, and claims no data leaves the machine. It works with any framework serving HTML over HTTP, including Vite, Next, Remix, and Rails. Visual editor for your codebase. Airship puts an infinite design canvas in front of your dev server. Select an element, describe the change, and watch Claude Code, Codex or OpenCode update the source — without rebuilding your UI in a separate design tool. npx @airshiplabs/cli --target 3000 No plugin. No config. Nothing added to your dependencies or your bundle. airship.design https://airship.design · CLI reference cli-reference · Configuration configuration · Questions questions 1. Start your app the way you always do. pnpm dev http://localhost:3000 Works with Vite, Next, Remix, Rails, or anything that serves HTML over HTTP. No plugins required. 2. Point Airship at your dev server. npx @airshiplabs/cli --target 3000 Airship connects to the port you're already running and opens the visual editor on the next free port. Or install it once and use the airship binary: npm i -g @airshiplabs/cli airship --target 3000 3. Bring your coding agent. airship --target 3000 --agent codex --safe Pick the agent you already use and start making changes without running a separate agent interface. Airship uses the authentication you already have configured for Claude Code, Codex, or OpenCode. Run airship doctor if something does not work. --exec starts your dev server and stops it again when Airship exits. Leave --target off and it reads the port from your package.json : airship --exec "pnpm dev" Run airship on its own and it just asks you for the port, the agent and the mode. A CLI, and nothing else. Nothing goes into your project. Airship runs in front of the dev server you already have. Your build, your config and your dependencies are untouched. Every frame is a real browser window. A phone frame behaves like a phone, however far you zoom out. Mobile and desktop sit side by side — both live, both editable, one source file. Changes land in your code. Click an element and Airship knows the file and line that drew it. Describe the change, get the diff, undo it if you don't like it. Nothing leaves your machine. No account, no telemetry, no service to sign up for. Two ways to look at your app. Same editor either way. canvas default — your app on a pannable canvas, one live frame per device size. inline — the editor on top of your own page, one window. Pick one at launch with airship --mode inline , or switch any time from the bottom bar. Your choice sticks across reloads and as you click around your app. Add ? airship=inline to a URL to try the other one once, without changing your preference; ? airship=shell is the way back to the canvas — the parameter takes the internal mode name, so it is shell , not canvas . Open any route of your app in Airship — /pricing , /settings — and every frame opens there. On the canvas: | Gesture | | |---|---| | wheel / two-finger | pan | | ⌘/ctrl-wheel, pinch | zoom at cursor | | space-drag, middle-drag | pan | | ⇧1 / ⇧2 / ⇧0 | fit / zoom to selection / 100% | Click an element and it fills the inspector. Every tab is looking at the same thing. Edit is position, size, spacing and layout — the shot up in Quick start quick-start . CSS is the box model, the rules that are actually hitting the element, and your own tweaks on top: DOM is the tree. Click a node to select it, or drag one to move it somewhere else: Pick one with --agent , or switch between them as you go. They are not equal, and Airship tells you what you're giving up at startup. claude default | codex | opencode | | |---|---|---|---| | Watch it write | word by word | the whole reply at once, at the end | word by word | | Pick up an old chat | yes | yes | yes | | Branch off a chat | yes | starts fresh, and says so | yes, history kept | | Shows what it cost | in dollars | tokens only | in dollars | --effort | yes | yes | ignored | --max-turns , --max-budget | yes | ignored | ignored | --model | a model name | a model name | needs the provider/model form | --safe | checks each edit and command | real sandbox | asks before each edit and command | | Install | included | included | you install it yourself | Undo is Airship's, not the agent's. It keeps the previous version of every file it touches, so undo works on all three. One catch: codex and opencode get that previous version from Git, so undo needs your project to be a Git repo on those two . Airship warns you at startup. Airship reuses whatever the chosen agent already has, and warns at startup if it finds nothing. | Agent | Needs one of | |---|---| claude | ANTHROPIC API KEY , CLAUDE CODE OAUTH TOKEN , or a claude login ~/.claude | codex | CODEX API KEY , OPENAI API KEY , or a codex login ~/.codex/auth.json | opencode | the opencode binary on PATH, plus a provider key or an opencode auth login | OpenCode is a separate install — brew install sst/tap/opencode or npm i -g opencode-ai — and accepts ANTHROPIC API KEY , OPENAI API KEY , OPENCODE API KEY , OPENROUTER API KEY , GEMINI API KEY , GOOGLE GENERATIVE AI API KEY , AWS BEARER TOKEN BEDROCK or AWS ACCESS KEY ID . By default the agent runs unsandboxed. It can write anywhere you can and reach the network — the same access it has when you run it from your terminal. Pass --safe to confine it: | default | --safe | | |---|---|---| codex | full access, network on | locked to your project folder, no network, no web search | claude | full access, no sandbox | edits kept inside your project, dangerous commands blocked | opencode | full access | asks before every edit and command, checked the same way; no web fetch, no web search, nothing outside your project | --safe is not equally strong on all three, and the CLI says so at launch: Only The operating system stops it writing outside your project. On codex gets a real sandbox. claude and opencode , Airship checks each edit and command first — a good check, but a check, not a wall. That check looks for known-dangerous commands; it does not understand shell. It catches rm -rf . It does not catch a write pointed somewhere else, like echo x /elsewhere .Airship switches off their web tools, but nothing stops a command they run from opening a connection anyway. Only a sandbox can. claude and opencode can still reach the network. If a hard guarantee matters more to you than which agent you use, run airship --agent codex --safe . Diffs and undo work the same either way — --safe has no effect on them. airship options airship --target