{"_id":"@airshiplabs/cli","_rev":"7-88b8d90f58c3f34e823793a5d04e4d72","name":"@airshiplabs/cli","dist-tags":{"latest":"0.3.0"},"versions":{"0.2.0":{"name":"@airshiplabs/cli","version":"0.2.0","keywords":["ai","claude","codex","developer-tools","editor","opencode","visual-editing"],"license":"MIT","_id":"@airshiplabs/cli@0.2.0","maintainers":[{"name":"wizenheimer","email":"xNayanKumar@gmail.com"}],"homepage":"https://github.com/0xnyn/airship#readme","bugs":{"url":"https://github.com/0xnyn/airship/issues"},"bin":{"airship":"./dist/index.js"},"dist":{"shasum":"dcc3bb8a7c2a50e13a4c4c9b34782c39fd70dc3a","tarball":"https://registry.npmjs.org/@airshiplabs/cli/-/cli-0.2.0.tgz","fileCount":2,"integrity":"sha512-WHrAWFgFUQJ31tDKD40T8QcKUJu3kArRdKoeGNVHHsV1BGhAhl2fyupSvXDb6lvmKagmuXb8cixfnRpuzLHn6w==","signatures":[{"sig":"MEUCIQDhNJxRpRPLuTj9Yuvt725sIUJi9VCZLABlPiwYhQY0KAIgNeKiwa/YYuReff30GmyLfhFhd0YjFYSMZKszfHMAEuM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airshiplabs%2fcli@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2708},"type":"module","engines":{"node":">=22.13.0"},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup && node scripts/vendor-assets.mjs","clean":"rm -rf dist .turbo","typecheck":"tsc --noEmit"},"_npmUser":{"name":"wizenheimer","email":"xNayanKumar@gmail.com"},"repository":{"url":"git+https://github.com/0xnyn/airship.git","type":"git","directory":"apps/cli"},"description":"Airship — a visual editor for your running web app, driven by Claude Code, Codex or OpenCode","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.21.0","zod":"^4.0.0","diff":"^9.0.0","bippy":"^0.5.32","citty":"^0.2.2","picocolors":"^1.1.1","@clack/prompts":"^1.7.0","element-source":"^0.0.5","@opencode-ai/sdk":"^1.18.13","@openai/codex-sdk":"^0.146.0","@jridgewell/trace-mapping":"^0.3.31","@anthropic-ai/claude-agent-sdk":"^0.3.196"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.10.0","@airship/git":"0.0.0","@airship/core":"0.0.0","@airship/server":"0.0.0","@airship/source":"0.0.0","@airship/overlay":"0.0.0","@airship/protocol":"0.0.0","@airship/editor-tokens":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.2.0_1786404566643_0.4875148539019305","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@airshiplabs/cli","version":"0.2.1","keywords":["ai","claude","codex","developer-tools","editor","opencode","visual-editing"],"license":"MIT","_id":"@airshiplabs/cli@0.2.1","maintainers":[{"name":"wizenheimer","email":"xNayanKumar@gmail.com"}],"homepage":"https://github.com/0xnyn/airship#readme","bugs":{"url":"https://github.com/0xnyn/airship/issues"},"bin":{"airship":"./dist/index.js"},"dist":{"shasum":"d9e304dcfab5f9169c98da73c5924c8e253a005d","tarball":"https://registry.npmjs.org/@airshiplabs/cli/-/cli-0.2.1.tgz","fileCount":27,"integrity":"sha512-Ox6px9FwUhzQqQiH5hBB7VvH/uubnHpF5XYDY3r/s32RFLOIzn6mHxv/G6fP1Nbm/ftDNdCC2CLmKTfS8WhlYw==","signatures":[{"sig":"MEQCIA/gx+Au+RQrUtPm0LWGjVT8gNlDu9fRzu4vnLBOVmhmAiAgnQ+souPUqhjLnhOygEIQPmS3cG61gFQGVVvmu45qDw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airshiplabs%2fcli@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6355747},"type":"module","engines":{"node":">=22.13.0"},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup && node scripts/vendor-assets.mjs","clean":"rm -rf dist .turbo","typecheck":"tsc --noEmit"},"_npmUser":{"name":"wizenheimer","email":"xNayanKumar@gmail.com"},"repository":{"url":"git+https://github.com/0xnyn/airship.git","type":"git","directory":"apps/cli"},"description":"Airship — a visual editor for your running web app, driven by Claude Code, Codex or OpenCode","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.21.0","zod":"^4.0.0","diff":"^9.0.0","bippy":"^0.5.32","citty":"^0.2.2","picocolors":"^1.1.1","@clack/prompts":"^1.7.0","element-source":"^0.0.5","@opencode-ai/sdk":"^1.18.13","@openai/codex-sdk":"^0.146.0","@jridgewell/trace-mapping":"^0.3.31","@anthropic-ai/claude-agent-sdk":"^0.3.196"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.10.0","@airship/git":"0.0.0","@airship/core":"0.0.0","@airship/server":"0.0.0","@airship/source":"0.0.0","@airship/overlay":"0.0.0","@airship/protocol":"0.0.0","@airship/editor-tokens":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.2.1_1786405322306_0.28608463596156297","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@airshiplabs/cli","version":"0.2.2","keywords":["ai","claude","codex","developer-tools","editor","opencode","visual-editing"],"license":"MIT","_id":"@airshiplabs/cli@0.2.2","maintainers":[{"name":"wizenheimer","email":"xNayanKumar@gmail.com"}],"homepage":"https://github.com/0xnyn/airship#readme","bugs":{"url":"https://github.com/0xnyn/airship/issues"},"bin":{"airship":"./dist/index.js"},"dist":{"shasum":"3ea6430a7d4a92c8d358a6a5cbe810be4171cbb8","tarball":"https://registry.npmjs.org/@airshiplabs/cli/-/cli-0.2.2.tgz","fileCount":28,"integrity":"sha512-6HJEb76bZ2eXikEXk+pYlBibyY6JA40WCPwyzWybqjTIMFNpcrUan/ZWtgpsK0y/fLiVJXJqoaQyWx+OeBYSnA==","signatures":[{"sig":"MEYCIQDIJVJ/9cpA90VeD2n9QNyZask/U4zUJWUzollK98e8oAIhAPF3QP+Agesldt0IJ9DcrRs5eEdZWLnMs/pWSarJkOQn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airshiplabs%2fcli@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6447613},"type":"module","engines":{"node":">=22.13.0"},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup && node scripts/vendor-assets.mjs","clean":"rm -rf dist .turbo","typecheck":"tsc --noEmit"},"_npmUser":{"name":"wizenheimer","email":"xNayanKumar@gmail.com"},"repository":{"url":"git+https://github.com/0xnyn/airship.git","type":"git","directory":"apps/cli"},"description":"Airship — a visual editor for your running web app, driven by Claude Code, Codex or OpenCode","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.21.3","zod":"^4.0.0","diff":"^9.0.0","bippy":"^0.6.1","citty":"^0.2.2","picocolors":"^1.1.1","@clack/prompts":"^1.7.0","element-source":"^0.0.5","@opencode-ai/sdk":"^1.18.15","@openai/codex-sdk":"^0.147.0","@jridgewell/trace-mapping":"^0.3.31","@anthropic-ai/claude-agent-sdk":"^0.3.224"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^26.2.0","@airship/git":"0.0.0","@airship/core":"0.0.0","@airship/server":"0.0.0","@airship/source":"0.0.0","@airship/overlay":"0.0.0","@airship/protocol":"0.0.0","@airship/editor-tokens":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.2.2_1786408458618_0.701512885382102","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@airshiplabs/cli","version":"0.2.3","keywords":["ai","claude","codex","developer-tools","editor","opencode","visual-editing"],"license":"MIT","_id":"@airshiplabs/cli@0.2.3","maintainers":[{"name":"wizenheimer","email":"xNayanKumar@gmail.com"}],"homepage":"https://github.com/0xnyn/airship#readme","bugs":{"url":"https://github.com/0xnyn/airship/issues"},"bin":{"airship":"dist/index.js"},"dist":{"shasum":"aa440994b12083de9c77e830f80427af9e0512b1","tarball":"https://registry.npmjs.org/@airshiplabs/cli/-/cli-0.2.3.tgz","fileCount":28,"integrity":"sha512-TQZbUQT9mBU5QD7YjAtSSmbgPaiB53P+XRXVE0ElZ5ukjzKAYE5D97EYf2BjQaXESGUxB9HPDICfi0WWFBx8CQ==","signatures":[{"sig":"MEQCIENrXNcSwcW863Iwf+wvRP4U+7I0JO6Olk34BXFIxndlAiBNOeHP6yFX+Lh2lkvq8X+fMbK3sGBlgU/E9+Km8RZXNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airshiplabs%2fcli@0.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6447613},"type":"module","_from":"file:/home/runner/work/_temp/airshiplabs-cli.tgz","engines":{"node":">=22.13.0"},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup && node scripts/vendor-assets.mjs","clean":"rm -rf dist .turbo","typecheck":"tsc --noEmit"},"_npmUser":{"name":"wizenheimer","email":"xNayanKumar@gmail.com"},"_resolved":"/home/runner/work/_temp/airshiplabs-cli.tgz","_integrity":"sha512-TQZbUQT9mBU5QD7YjAtSSmbgPaiB53P+XRXVE0ElZ5ukjzKAYE5D97EYf2BjQaXESGUxB9HPDICfi0WWFBx8CQ==","repository":{"url":"git+https://github.com/0xnyn/airship.git","type":"git","directory":"apps/cli"},"_npmVersion":"10.9.8","description":"Airship — a visual editor for your running web app, driven by Claude Code, Codex or OpenCode","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.21.3","zod":"^4.0.0","diff":"^9.0.0","bippy":"^0.6.1","citty":"^0.2.2","picocolors":"^1.1.1","@clack/prompts":"^1.7.0","element-source":"^0.0.5","@opencode-ai/sdk":"^1.18.15","@openai/codex-sdk":"^0.147.0","@jridgewell/trace-mapping":"^0.3.31","@anthropic-ai/claude-agent-sdk":"^0.3.224"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^26.2.0","@airship/git":"0.0.0","@airship/core":"0.0.0","@airship/server":"0.0.0","@airship/source":"0.0.0","@airship/overlay":"0.0.0","@airship/protocol":"0.0.0","@airship/editor-tokens":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.2.3_1786409143993_0.8708285840888708","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@airshiplabs/cli","version":"0.2.4","keywords":["ai","claude","codex","developer-tools","editor","opencode","visual-editing"],"license":"MIT","_id":"@airshiplabs/cli@0.2.4","maintainers":[{"name":"wizenheimer","email":"xNayanKumar@gmail.com"}],"homepage":"https://github.com/0xnyn/airship#readme","bugs":{"url":"https://github.com/0xnyn/airship/issues"},"bin":{"airship":"dist/index.js"},"dist":{"shasum":"f557e4569effa57b137be86e640a339bc9cb114b","tarball":"https://registry.npmjs.org/@airshiplabs/cli/-/cli-0.2.4.tgz","fileCount":28,"integrity":"sha512-Acks0OWYJ99+p5jmNxAxYaZByqKl0rlAMcJe1Tbebvd93SMMmqmKEsCDcLXnw3HmPyq71ACJIX3fFAfo7L8p5w==","signatures":[{"sig":"MEYCIQC5L0riF8O3lJ+k2oXFtAHDyVmI8CJpo6wFLMDN0WiW7QIhALbLigP+ubMp5Mgo3TUukqTwnOJBRXuz8cK3NdHw05UW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airshiplabs%2fcli@0.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6474361},"type":"module","_from":"file:/home/runner/work/_temp/airshiplabs-cli.tgz","engines":{"node":">=22.13.0"},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup && node scripts/vendor-assets.mjs","clean":"node ../../scripts/clean.mjs dist .turbo","typecheck":"tsc --noEmit"},"_npmUser":{"name":"wizenheimer","email":"xNayanKumar@gmail.com"},"_resolved":"/home/runner/work/_temp/airshiplabs-cli.tgz","_integrity":"sha512-Acks0OWYJ99+p5jmNxAxYaZByqKl0rlAMcJe1Tbebvd93SMMmqmKEsCDcLXnw3HmPyq71ACJIX3fFAfo7L8p5w==","repository":{"url":"git+https://github.com/0xnyn/airship.git","type":"git","directory":"apps/cli"},"_npmVersion":"10.9.8","description":"Airship — a visual editor for your running web app, driven by Claude Code, Codex or OpenCode","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.21.3","zod":"^4.0.0","diff":"^9.0.0","bippy":"^0.6.1","citty":"^0.2.2","picocolors":"^1.1.1","@clack/prompts":"^1.7.0","element-source":"^0.0.5","@opencode-ai/sdk":"^1.18.15","@openai/codex-sdk":"^0.147.0","@jridgewell/trace-mapping":"^0.3.31","@anthropic-ai/claude-agent-sdk":"^0.3.224"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^26.2.0","@airship/git":"0.0.0","@airship/core":"0.0.0","@airship/server":"0.0.0","@airship/source":"0.0.0","@airship/overlay":"0.0.0","@airship/protocol":"0.0.0","@airship/editor-tokens":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.2.4_1786479248985_0.201278800339193","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@airshiplabs/cli","version":"0.2.5","keywords":["ai","claude","codex","developer-tools","editor","opencode","visual-editing"],"license":"MIT","_id":"@airshiplabs/cli@0.2.5","maintainers":[{"name":"wizenheimer","email":"xNayanKumar@gmail.com"}],"homepage":"https://github.com/0xnyn/airship#readme","bugs":{"url":"https://github.com/0xnyn/airship/issues"},"bin":{"airship":"dist/index.js"},"dist":{"shasum":"08d55a8476b651f4fe84dcf7c4f4a87a6b573441","tarball":"https://registry.npmjs.org/@airshiplabs/cli/-/cli-0.2.5.tgz","fileCount":28,"integrity":"sha512-uqeB6U4yAIxQqBBnjnxf/LVxmUluTXxPbFiaLw9lYaXclTAQf0socMtm6i7n3280W3Tt9fFZWozJCxKj9NN/ag==","signatures":[{"sig":"MEYCIQCF+7ybNGVOoaa+mRjVCeHFhGI8o99teXUqHAa7OybJ7wIhAO8MIX8jEsehfWwhWCU5VYq2WQfoPK3s7uw+pM5htpWg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airshiplabs%2fcli@0.2.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6474361},"type":"module","_from":"file:/home/runner/work/_temp/airshiplabs-cli.tgz","engines":{"node":">=22.13.0"},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup && node scripts/vendor-assets.mjs","clean":"node ../../scripts/clean.mjs dist .turbo","typecheck":"tsc --noEmit"},"_npmUser":{"name":"wizenheimer","email":"xNayanKumar@gmail.com"},"_resolved":"/home/runner/work/_temp/airshiplabs-cli.tgz","_integrity":"sha512-uqeB6U4yAIxQqBBnjnxf/LVxmUluTXxPbFiaLw9lYaXclTAQf0socMtm6i7n3280W3Tt9fFZWozJCxKj9NN/ag==","repository":{"url":"git+https://github.com/0xnyn/airship.git","type":"git","directory":"apps/cli"},"_npmVersion":"10.9.8","description":"Airship — a visual editor for your running web app, driven by Claude Code, Codex or OpenCode","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ws":"^8.21.3","zod":"^4.0.0","diff":"^9.0.0","bippy":"^0.6.1","citty":"^0.2.2","picocolors":"^1.1.1","@clack/prompts":"^1.7.0","element-source":"^0.0.5","@opencode-ai/sdk":"^1.18.15","@openai/codex-sdk":"^0.147.0","@jridgewell/trace-mapping":"^0.3.31","@anthropic-ai/claude-agent-sdk":"^0.3.224"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^26.2.0","@airship/git":"0.0.0","@airship/core":"0.0.0","@airship/server":"0.0.0","@airship/source":"0.0.0","@airship/overlay":"0.0.0","@airship/protocol":"0.0.0","@airship/editor-tokens":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.2.5_1786480491383_0.6508761547360447","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@airshiplabs/cli","version":"0.3.0","description":"Airship — a visual editor for your running web app, driven by Claude Code, Codex or OpenCode","keywords":["ai","claude","codex","developer-tools","editor","opencode","visual-editing"],"homepage":"https://github.com/0xnyn/airship#readme","bugs":{"url":"https://github.com/0xnyn/airship/issues"},"repository":{"type":"git","url":"git+https://github.com/0xnyn/airship.git","directory":"apps/cli"},"license":"MIT","type":"module","bin":{"airship":"dist/index.js"},"dependencies":{"@anthropic-ai/claude-agent-sdk":"^0.3.224","@clack/prompts":"^1.7.0","@jridgewell/trace-mapping":"^0.3.31","@openai/codex-sdk":"^0.147.0","@opencode-ai/sdk":"^1.18.15","bippy":"^0.6.1","citty":"^0.2.2","diff":"^9.0.0","element-source":"^0.0.5","picocolors":"^1.1.1","ws":"^8.21.3","zod":"^4.0.0"},"devDependencies":{"@types/node":"^26.2.0","@airship/editor-tokens":"0.0.0","@airship/core":"0.0.0","@airship/overlay":"0.0.0","@airship/git":"0.0.0","@airship/server":"0.0.0","@airship/protocol":"0.0.0","@airship/source":"0.0.0"},"engines":{"node":">=22.13.0"},"publishConfig":{"access":"public"},"scripts":{"build":"tsup && node scripts/vendor-assets.mjs","clean":"node ../../scripts/clean.mjs dist .turbo","dev":"tsup --watch","test":"vitest run","typecheck":"tsc --noEmit"},"_id":"@airshiplabs/cli@0.3.0","_integrity":"sha512-YevtRuDpH9at6CXGUmgUlG01q++ADm0vq0PJ03b6QSEiQsS6RlRJROjjsdKOMizhBWKl5ttfpLCcECvIBimY2Q==","_resolved":"/home/runner/work/_temp/airshiplabs-cli.tgz","_from":"file:/home/runner/work/_temp/airshiplabs-cli.tgz","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-YevtRuDpH9at6CXGUmgUlG01q++ADm0vq0PJ03b6QSEiQsS6RlRJROjjsdKOMizhBWKl5ttfpLCcECvIBimY2Q==","shasum":"02be007d1707ab711cf8731047a064ea7cce9cf5","tarball":"https://registry.npmjs.org/@airshiplabs/cli/-/cli-0.3.0.tgz","fileCount":32,"unpackedSize":7297265,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airshiplabs%2fcli@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAT12nJam/TWO8I+9Fm0crxqNhG6L77JpTvX8FzVEcd+AiEA6V+1o4s+oE3Pf0500i9dZNfavWJ+lCXo5So20wWM2yk="}]},"_npmUser":{"name":"wizenheimer","email":"xNayanKumar@gmail.com"},"directories":{},"maintainers":[{"name":"wizenheimer","email":"xNayanKumar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cli_0.3.0_1786865864531_0.13421515607702972"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-10T23:29:26.429Z","modified":"2026-08-16T07:37:45.156Z","0.2.0":"2026-08-10T23:29:26.777Z","0.2.1":"2026-08-10T23:42:02.548Z","0.2.2":"2026-08-11T00:34:18.817Z","0.2.3":"2026-08-11T00:45:44.206Z","0.2.4":"2026-08-11T20:14:09.166Z","0.2.5":"2026-08-11T20:34:51.547Z","0.3.0":"2026-08-16T07:37:44.770Z"},"bugs":{"url":"https://github.com/0xnyn/airship/issues"},"license":"MIT","homepage":"https://github.com/0xnyn/airship#readme","keywords":["ai","claude","codex","developer-tools","editor","opencode","visual-editing"],"repository":{"type":"git","url":"git+https://github.com/0xnyn/airship.git","directory":"apps/cli"},"description":"Airship — a visual editor for your running web app, driven by Claude Code, Codex or OpenCode","maintainers":[{"name":"wizenheimer","email":"xNayanKumar@gmail.com"}],"readme":"<!-- Generated from the root README.md by scripts/sync-readme.mjs. Do not edit. -->\n\n# Airship\n\n[![npm](https://img.shields.io/npm/v/@airshiplabs/cli)](https://www.npmjs.com/package/@airshiplabs/cli)\n[![node](https://img.shields.io/node/v/@airshiplabs/cli)](https://nodejs.org)\n[![license](https://img.shields.io/npm/l/@airshiplabs/cli)](https://github.com/0xnyn/airship/blob/main/LICENSE)\n\n**Visual editor for your codebase.**\n\nAirship puts an infinite design canvas in front of your dev server. Select an element, describe\nthe change, and watch Claude Code, Codex or OpenCode update the source — without rebuilding your\nUI in a separate design tool.\n\n![Airship mid-edit: the prompt \"Turn this into a github icon\" streaming its reads, writes and edits, a desktop and an iPhone frame side by side on the canvas, and the Edit inspector open on the selection](https://raw.githubusercontent.com/0xnyn/airship/main/media/inspector-edit.png)\n\n```bash\nnpx @airshiplabs/cli --target 3000\n```\n\nNo plugin. No config. Nothing added to your dependencies or your bundle.\n\n[airship.design](https://airship.design) · [CLI reference](#cli-reference) · [Configuration](#configuration) · [Questions](#questions)\n\n---\n\n## Quick start\n\n![The Airship landing page, with the editor overlay open on a running app at localhost:3000](https://raw.githubusercontent.com/0xnyn/airship/main/media/cover.png)\n\n**1. Start your app the way you always do.**\n\n```bash\npnpm dev    # http://localhost:3000\n```\n\nWorks with Vite, Next, Remix, Rails, or anything that serves HTML over HTTP. No plugins\nrequired.\n\n**2. Point Airship at your dev server.**\n\n```bash\nnpx @airshiplabs/cli --target 3000\n```\n\nAirship connects to the port you're already running and opens the visual editor on the next\nfree port. Or install it once and use the `airship` binary:\n\n```bash\nnpm i -g @airshiplabs/cli\nairship --target 3000\n```\n\n**3. Bring your coding agent.**\n\n```bash\nairship --target 3000 --agent codex --safe\n```\n\nPick the agent you already use and start making changes without running a separate agent\ninterface.\n\nAirship uses the authentication you already have configured for Claude Code, Codex, or\nOpenCode. Run `airship doctor` if something does not work.\n\n### Or let it start your dev server too\n\n`--exec` starts your dev server and stops it again when Airship exits. Leave `--target` off and\nit reads the port from your `package.json`:\n\n```bash\nairship --exec \"pnpm dev\"\n```\n\nRun `airship` on its own and it just asks you for the port, the agent and the mode.\n\n## What it is\n\nA CLI, and nothing else.\n\n- **Nothing goes into your project.** Airship runs in front of the dev server you already have.\n  Your build, your config and your dependencies are untouched.\n- **Every frame is a real browser window.** A phone frame behaves like a phone, however far you\n  zoom out. Mobile and desktop sit side by side — both live, both editable, one source file.\n- **Changes land in your code.** Click an element and Airship knows the file and line that drew\n  it. Describe the change, get the diff, undo it if you don't like it.\n- **Nothing leaves your machine.** No account, no telemetry, no service to sign up for.\n\n\n![The agent panel showing the diff of the file it just edited, with the element still selected on the canvas](https://raw.githubusercontent.com/0xnyn/airship/main/media/agent.png)\n\n## Canvas or inline\n\nTwo ways to look at your app. Same editor either way.\n\n**`canvas`** (default) — your app on a pannable canvas, one live frame per device size.\n\n![The canvas, with a desktop frame and an iPhone frame side by side, the agent panel on the left and the inspector on the right](https://raw.githubusercontent.com/0xnyn/airship/main/media/canvas.png)\n\n**`inline`** — the editor on top of your own page, one window.\n\n![Inline mode, with the editor panels floating over the real page at localhost:3000](https://raw.githubusercontent.com/0xnyn/airship/main/media/inline.png)\n\nPick one at launch with `airship --mode inline`, or switch any time from the bottom bar. Your\nchoice sticks across reloads and as you click around your app. Add `?__airship=inline` to a URL\nto try the other one once, without changing your preference; `?__airship=shell` is the way back\nto the canvas — the parameter takes the internal mode name, so it is `shell`, not `canvas`.\n\nOpen any route of your app in Airship — `/pricing`, `/settings` — and every frame opens there.\n\nThe controls, in short — the table below is generated from the editor's own command\ncatalog, so it cannot drift from what the keys actually do:\n\n<!-- controls:start -->\n| | macOS | Windows / Linux |\n| --- | --- | --- |\n| pan the canvas | Wheel / two-finger | Wheel / two-finger |\n| zoom at the cursor | ⌘-wheel / pinch | Ctrl-wheel / pinch |\n| pan without the hand | Space-drag | Space-drag |\n| select an element | Click | Click |\n| edit text in place | Double-click | Double-click |\n| open the element menu | Right-click | Right-click |\n| scrub a number | Drag a field's glyph | Drag a field's glyph |\n| undo | ⌘Z | Ctrl+Z |\n| delete element | ⌫ or Del | Backspace or Del |\n| duplicate | ⌘D | Ctrl+D |\n| edit text | ↩ or T | Enter or T |\n| move | V | V |\n| inspect | I | I |\n| zoom in | ⌘= or = | Ctrl+= or = |\n| zoom out | ⌘- or - | Ctrl+- or - |\n| zoom to 100% | ⌘0 or ⇧0 | Ctrl+0 or Shift+0 |\n| zoom to fit | ⇧1 | Shift+1 |\n| hand tool | H | H |\n| add a frame | F | F |\n| send | ⌘↩ | Ctrl+Enter |\n| keyboard shortcuts | ? | ? |\n| command palette | ⌘K | Ctrl+K |\n\nPress `?` in the editor for all of them, or see [CONTROLS.md](https://github.com/0xnyn/airship/blob/main/CONTROLS.md).\n<!-- controls:end -->\n\n## Edit and View\n\nThe two modes point the editor at different things, and the panels follow.\n\n**Edit** is about an element: hover to highlight, click to select, and the agent panel and\ninspector are open on either side of it.\n\n**View** is about your frames. The page underneath is fully interactive — click through it,\nfill in forms, scroll — so there is no element selection, and the two panels that depend on\none step aside. In their place the left panel lists every frame, and a minimap appears in\nthe bottom-right corner:\n\n- Click a frame in the list to go to it without changing your zoom; double-click to zoom\n  to it. Rename it in place, and use `⋯` for its device size, rotate, duplicate and delete.\n- The list is stacking order, front-most at the top. Drag a row anywhere along it — or\n  press ↑↓ on its handle — to restack frames that overlap on the canvas; up is forward.\n- Drag the minimap's indicator and the canvas travels with it; press anywhere else on the\n  map to jump there. Pan far off your frames and it keeps pointing back at them.\n\nYour panel arrangement is remembered per mode, so switching back returns the inspector\nexactly as you left it.\n\n## Inspector\n\nClick an element and it fills the inspector. Every tab is looking at the same thing.\n\n`Edit` is position, size, spacing and layout — the shot up in [Quick start](#quick-start). `CSS`\nis the box model, the rules that are actually hitting the element, and your own tweaks on top:\n\n![The CSS tab, showing the box model, an empty element.style block and the matched CSS rules for the selection](https://raw.githubusercontent.com/0xnyn/airship/main/media/inspector-css.png)\n\n`DOM` is the tree. Click a node to select it, or drag one to move it somewhere else:\n\n![The DOM tab, showing the element tree with the selected text node highlighted](https://raw.githubusercontent.com/0xnyn/airship/main/media/inspector-dom.png)\n\n## Agents\n\nPick one with `--agent`, or switch between them as you go. They are not equal, and Airship tells\nyou what you're giving up at startup.\n\n| | `claude` (default) | `codex` | `opencode` |\n| --- | --- | --- | --- |\n| Watch it write | word by word | the whole reply at once, at the end | word by word |\n| Pick up an old chat | yes | yes | yes |\n| Branch off a chat | yes | starts fresh, and says so | yes, history kept |\n| Shows what it cost | in dollars | tokens only | in dollars |\n| `--effort` | yes | yes | **ignored** |\n| `--max-turns`, `--max-budget` | yes | **ignored** | **ignored** |\n| `--model` | a model name | a model name | needs the `provider/model` form |\n| Lists its own models | yes | **no** — Airship ships a list | yes, the ones you are signed in to |\n| `--safe` | checks each edit and command | **real sandbox** | asks before each edit and command |\n| Install | included | included | **you install it yourself** |\n\nUndo is Airship's, not the agent's. It keeps the previous version of every file it touches, so\nundo works on all three. One catch: `codex` and `opencode` get that previous version from Git,\nso **undo needs your project to be a Git repo on those two**. Airship warns you at startup.\n\nOne more `opencode` quirk: the one-line summary and the follow-up suggestion chips come from a\nJSON block the model is asked to append to its reply. A model that ignores the instruction\nloses the chips and gets a plainer commit message — never the edit itself. Models with thinking\nenabled reject opencode's own structured-output request outright; Airship detects that, retries\nthe turn without it, and remembers not to ask that model again.\n\n### Authentication\n\nAirship reuses whatever the chosen agent already has, and warns at startup if it finds nothing.\n\n| Agent | Needs one of |\n| --- | --- |\n| `claude` | `ANTHROPIC_API_KEY`, `CLAUDE_CODE_OAUTH_TOKEN`, or a `claude` login (`~/.claude`) |\n| `codex` | `CODEX_API_KEY`, `OPENAI_API_KEY`, or a `codex login` (`~/.codex/auth.json`) |\n| `opencode` | the `opencode` binary on PATH, **plus** a provider key or an `opencode auth login` |\n\nOpenCode is a separate install — `brew install sst/tap/opencode` or `npm i -g opencode-ai` —\nand accepts `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `OPENCODE_API_KEY`, `OPENROUTER_API_KEY`,\n`GEMINI_API_KEY`, `GOOGLE_GENERATIVE_AI_API_KEY`, `AWS_BEARER_TOKEN_BEDROCK` or\n`AWS_ACCESS_KEY_ID`.\n\n## Safety\n\n**By default the agent runs unsandboxed.** It can write anywhere you can and reach the network —\nthe same access it has when you run it from your terminal. Pass `--safe` to confine it:\n\n| | default | `--safe` |\n| --- | --- | --- |\n| `codex` | full access, network on | locked to your project folder, no network, no web search |\n| `claude` | full access, no sandbox | edits kept inside your project, dangerous commands blocked |\n| `opencode` | full access | asks before every edit and command, checked the same way; no web fetch, no web search, nothing outside your project |\n\n`--safe` is not equally strong on all three, and the CLI says so at launch:\n\n- **Only `codex` gets a real sandbox.** The operating system stops it writing outside your\n  project. On `claude` and `opencode`, Airship checks each edit and command first — a good\n  check, but a check, not a wall.\n- **That check looks for known-dangerous commands; it does not understand shell.** It catches\n  `rm -rf`. It does not catch a write pointed somewhere else, like `echo x > /elsewhere`.\n- **`claude` and `opencode` can still reach the network.** Airship switches off their web tools,\n  but nothing stops a command they run from opening a connection anyway. Only a sandbox can.\n\nIf a hard guarantee matters more to you than which agent you use, run\n`airship --agent codex --safe`.\n\nDiffs and undo work the same either way — `--safe` has no effect on them.\n\n## CLI reference\n\n```\nairship [options]\nairship --target <port> [options]\nairship <command> [options]\n```\n\n| Command | |\n| --- | --- |\n| `airship` | Launch the visual editor against your dev server. Bare at a terminal, it asks first. |\n| `airship init` | Create an `airship.config.json` for this project. |\n| `airship doctor` | Check your environment and report what is wrong. |\n\nFlags accept `--flag value` and `--flag=value`, a camelCase spelling of any kebab name\n(`--maxTurns` ≡ `--max-turns`), and `--no-<name>` to turn any boolean off. A bare `--` stops flag\nparsing — airship takes no positional arguments, so anything after it is ignored rather than\nforwarded.\n\n### Core\n\n| Flag | | Default |\n| --- | --- | --- |\n| `-t, --target <port>` | Port your dev server is already running on. Detected from your `package.json` when omitted. | |\n| `-p, --port <port>` | Port for the airship proxy. | `target + 1` |\n| `--host <address>` | Interface the proxy listens on. See [`--host`](#--host) before widening it. | `127.0.0.1` |\n| `--allowed-hosts <names>` | Extra hostnames airship answers to, repeatable or comma-separated. `localhost` and IP addresses are always allowed. | |\n| `--cwd <dir>` | Project root for edits. | current directory |\n| `--mode <name>` | Editor mode: `canvas` or `inline`. Switchable from the editor too. | `canvas` |\n| `--exec <command>` | Start your dev server with this command and stop it when airship exits. | |\n| `--open` | Open the editor in your browser once it is listening. | |\n| `--keep-csp` | Keep your app's `Content-Security-Policy` on editor surfaces instead of stripping it. Framing headers (`X-Frame-Options`) are always stripped. | off |\n\n### Agent\n\n| Flag | | Default |\n| --- | --- | --- |\n| `-a, --agent <name>` | Coding agent: `claude`, `codex`, `opencode`. | `claude` |\n| `-m, --model <id>` | Model for whichever agent runs. Per-backend flags below outrank it. | the agent's own default |\n| `--effort <level>` | Reasoning effort: `minimal`, `low`, `medium`, `high`, `xhigh`, `max`. | |\n| `--max-turns <n>` | Cap agent turns per edit (claude only). | `24` |\n| `--max-budget <usd>` | Stop an edit if it exceeds this cost in USD (claude only). | |\n| `--commit` | Auto-commit each accepted edit (Conventional Commits). | |\n\n`-m` is `--model`, not `--mode`. `--mode` has no short alias.\n\nYou can also pick the model from the editor. The agent button in the chat header opens a\ngroup per backend; choosing a row picks the backend **and** its model in one go, and a box\nat the bottom takes any id the list does not offer. That choice is per backend and is\nremembered, so switching between them does not carry one backend's model to another. The\nflags below are the resting default it starts from.\n\n### Sandbox\n\n| Flag | | Default |\n| --- | --- | --- |\n| `--safe` | Confine edits to the project directory and cut network access. See [Safety](#safety). | off |\n\n### Backend\n\n| Flag | | Default |\n| --- | --- | --- |\n| `--claude-model <id>` | Model for the `claude` backend. Takes an alias or a full id. | `--model`, then the agent's own |\n| `--codex-model <id>` | Model for the `codex` backend. | `--model`, then the agent's own |\n| `--opencode-model <provider/model>` | Model for the `opencode` backend. Needs the `provider/model` form. | `--model`, then the agent's own |\n| `--codex-path <path>` | Path to the `codex` binary. | bundled |\n| `--codex-config <k=v>` | Extra `codex --config` pair; repeatable. | |\n| `--opencode-path <path>` | Path to the `opencode` binary. | found on PATH |\n| `--opencode-url <url>` | Attach to a running `opencode serve` instead of starting one. | |\n| `--opencode-agent <name>` | Run as a named opencode agent. | its own |\n| `--opencode-config <file>` | JSON file merged into the opencode server config. | |\n\n`--codex-config` reads the shape of the value: `true`/`false` become TOML booleans and anything\nnumeric becomes a number, so `--codex-config network_access=true` sends a boolean, not the string.\nQuote it — `--codex-config k='\"true\"'` — to keep a string a string.\n\n### Global\n\n| Flag | |\n| --- | --- |\n| `--json` | Machine-readable JSON on stdout, no colour and no banner. |\n| `-q, --quiet` | Suppress the launch banner. Warnings still print. |\n| `--debug` | Print stack traces, and every git command that failed. |\n| `-h, --help` | Show this help. |\n| `-v, --version` | Print the version. |\n\nBanners, warnings and errors go to stderr; `--json` payloads, help and `--version` go to stdout,\nso `airship --json | jq` is reliable.\n\n### `airship init`\n\nWrites an `airship.config.json` from the same questions the bare `airship` wizard asks, so it\nstops asking. Takes `--cwd` and the global flags. Needs a terminal.\n\n### `airship doctor`\n\nChecks, in order: `node`, `airship`, `config`, `git`, `git repo`, `overlay bundle`,\n`agent claude`, `agent codex`, `agent opencode`, `dev server`. Each reports `ok`, `warn` or\n`fail` with a hint. Only your preferred agent (`--agent`, default `claude`) can fail the run;\nthe other two warn.\n\n`git` and `git repo` are separate because they fail for different reasons and have different\nfixes: whether git can run at all, and whether this directory is somewhere it can usefully run\n(a work tree, with at least one commit, and a configured `user.name` / `user.email`). They fail\nthe run on `--agent codex` and `--agent opencode`, which reconstruct their diff baseline from\n`HEAD`, and warn on `claude`, which snapshots its own before-state and needs no git to edit or\nundo.\n\nExits `1` if any check failed, so `airship doctor && airship` works. Takes `--cwd`, `--target`,\n`--agent` and the global flags. `--json` prints the same checks as a machine-readable record,\nwhich is the most useful thing to send someone when a run is failing on a machine you cannot\nsee.\n\n### Exit codes\n\n| Code | |\n| --- | --- |\n| `0` | Fine. |\n| `1` | Something failed. |\n| `2` | Bad flag, bad value, or a terminal was needed and there wasn't one. |\n| `127` | Not an airship command. |\n| `130` | Interrupted — Ctrl-C, or a cancelled prompt. |\n\n## Configuration\n\nSettings resolve in this order, highest first:\n\n```\nflags  →  AIRSHIP_* environment  →  airship.config.json  →  defaults\n```\n\n### The config file\n\n`airship.config.json`, or an `\"airship\"` key in your `package.json`. Run `airship init` to write\none. Every key is a flag name, in either kebab or camel case:\n\n```json\n{\n  \"agent\": \"claude\",\n  \"mode\": \"canvas\",\n  \"target\": 3000,\n  \"safe\": true,\n  \"claudeModel\": \"opus\",\n  \"codexModel\": \"gpt-5.3-codex\"\n}\n```\n\nModels are keyed per backend — `claudeModel`, `codexModel`, `opencodeModel` — because the\neditor's picker can switch backends mid-session, and one shared `model` would follow it and\nhand Codex an id only Claude answers to. A plain `\"model\"` still works and applies to\nwhichever backend runs, with the per-backend keys taking precedence.\n\nAirship looks for it from `--cwd` upwards and **stops at your repository root**, so a stray\nconfig file somewhere above your repo won't affect you. Misspell a key and it says so, with a\nsuggestion — it never quietly ignores one.\n\n### Environment\n\nEvery flag except `--help` and `--version` has an environment variable: `AIRSHIP_` plus the flag\nname uppercased, with `-` as `_`.\n\n```\nAIRSHIP_TARGET          AIRSHIP_AGENT           AIRSHIP_CODEX_PATH\nAIRSHIP_PORT            AIRSHIP_MODEL           AIRSHIP_CODEX_CONFIG\nAIRSHIP_CWD             AIRSHIP_EFFORT          AIRSHIP_OPENCODE_PATH\nAIRSHIP_MODE            AIRSHIP_MAX_TURNS       AIRSHIP_OPENCODE_URL\nAIRSHIP_EXEC            AIRSHIP_MAX_BUDGET      AIRSHIP_OPENCODE_AGENT\nAIRSHIP_OPEN            AIRSHIP_COMMIT          AIRSHIP_OPENCODE_CONFIG\nAIRSHIP_SAFE            AIRSHIP_JSON            AIRSHIP_OPENCODE_MODEL\nAIRSHIP_DEBUG           AIRSHIP_QUIET           AIRSHIP_CLAUDE_MODEL\nAIRSHIP_KEEP_CSP        AIRSHIP_HOST            AIRSHIP_CODEX_MODEL\nAIRSHIP_ALLOWED_HOSTS\n```\n\n`AIRSHIP_HELP` and `AIRSHIP_VERSION` are deliberately not read — exporting one would leave the\nCLI unable to run anything. Booleans take `1`/`true`/`yes`/`on` or `0`/`false`/`no`/`off`;\nanything else is an error rather than a guess.\n\nFour more are honoured: `AIRSHIP_EDITOR` (`vscode`, `cursor`, `windsurf` or `zed` — which\neditor \"open in editor\" prefers, otherwise probed in that order), `AIRSHIP_AGENT_DEBUG` (stream\nthe Claude backend's raw stderr to the terminal — separate from `--debug`, which logs airship\nitself), and `NO_COLOR` / `FORCE_COLOR`.\n\n`AIRSHIP_DEBUG=1` does what `--debug` does, which is worth knowing when the person who needs\nthe trace is not the person who typed the command. Both print every failed git invocation to\nstderr with its argv, its exit status and the whole of its stderr — the detail behind the one\nline a toast has room for.\n\n### `--cwd`\n\n`--cwd` is the folder your dev server treats as its root, which is not always your repository\nroot. Airship needs it to turn the paths your dev server reports (`/src/app.tsx`) into real\nfiles on disk. In a monorepo where the app lives in `apps/web`, that's `--cwd apps/web`.\n\n### `--host`\n\nAirship listens on `127.0.0.1`, so only your own machine can reach the editor. That is a safety\nposture, not a limitation: the editor is an unauthenticated server that can drive a coding agent\nwith write access to your project, and airship warns loudly whenever you widen it. Three setups\nneed the extra flags:\n\n- **Docker.** Publishing the editor's port with `docker run -p` needs `--host 0.0.0.0` — a\n  loopback bind inside the container is unreachable from outside it, and the symptom is a bare\n  connection-refused.\n- **A phone or another machine on your network.** `--host 0.0.0.0`, then open\n  `http://<your-ip>:<port>`. While airship runs, anything on that network can drive the agent —\n  treat it like leaving a terminal unlocked.\n- **A hostname** — an `/etc/hosts` alias, a tunnel, a reverse proxy. Requests under a name are\n  refused unless it is the `--host` value or listed in `--allowed-hosts`. `localhost` and IP\n  addresses are always accepted; names must match exactly (no subdomains), which is what blocks\n  DNS rebinding. Airship never reads `X-Forwarded-Host` — behind a reverse proxy, put the public\n  name in `--allowed-hosts`.\n\n## Port detection\n\nLeave `--target` off and Airship works it out, trying each likely port in turn and taking the\nfirst one that answers:\n\n1. **The port in your dev script** — a `--port`, `-p` or `PORT=` in `scripts.dev`, `scripts.start`\n   or `scripts.serve`.\n2. **Your framework's default**, by what is in your dependencies:\n\n   | Dependency | Port |\n   | --- | --- |\n   | `next`, `nuxt`, `@remix-run/dev`, `react-scripts` | `3000` |\n   | `parcel` | `1234` |\n   | `@angular/cli` | `4200` |\n   | `astro` | `4321` |\n   | `@sveltejs/kit`, `vite` | `5173` |\n   | `storybook` (or any `@storybook/*`) | `6006` |\n   | `gatsby` | `8000` |\n   | `@11ty/eleventy` | `8080` |\n\n   Most specific first — a project with both `vite` and `storybook` is a Vite app that also has\n   a component catalogue, not the other way round.\n\n3. **Common ports** — `3000`, `5173`, `8080`, `4321`, `4200`.\n\nWith `--exec` it's the opposite: the port has to be *free*, since Airship is about to start your\ndev server on it. It won't start one on a port that's already taken.\n\n## Troubleshooting\n\n**The canvas frame is blank, or shows a broken-document icon.**\nYour dev server is probably sending `X-Frame-Options` or a `Content-Security-Policy` with\n`frame-ancestors` (Shopify's `shopify theme dev` does), which told the browser not to render the\napp inside airship's canvas frame. Airship strips those headers from the surfaces it serves, so\nthis should not happen — unless you passed `--keep-csp`, which keeps your CSP and with it any\n`frame-ancestors` restriction. Drop the flag, or loosen the policy while editing.\n\n**Every `opencode` turn fails with \"Thinking mode does not support this tool_choice\".**\nThe provider is rejecting the structured-output request opencode sends — it is implemented as a\nforced tool call, which models with thinking/reasoning enabled refuse (opencode issue #15226,\nclosed upstream). Airship retries the turn without that request and remembers the model, so you\nshould see one warning row and a working edit. If it persists, pick a model without thinking\nenabled, or disable thinking for your provider via `--opencode-config`.\n\n**\"No `opencode` binary found on PATH.\"**\nThe `opencode` CLI is a separate install (`brew install sst/tap/opencode`); Airship finds it on\nPATH rather than bundling it.\n\n**\"No provider credentials found.\"**\nAirship reuses the chosen agent's own login — see [Authentication](#authentication). For\n`opencode` that means a provider key or `opencode auth login`; for `codex`, a `codex login` or\nan API key; for `claude`, a `claude` login or `ANTHROPIC_API_KEY`.\n\n**Undo does nothing, or diffs come back empty, on `codex` or `opencode`.**\nBoth reconstruct their diff baseline from Git, so the project must be a Git repository. Airship\nwarns about this at startup.\n\n## Questions\n\nIncluding the ones with unflattering answers.\n\n**Do I need a plugin, or to change my build?**\nNo. Airship runs as a reverse proxy in front of your existing dev server. Nothing is added to\nyour dependencies, config, or bundle.\n\n**Does it work with Tailwind, CSS Modules or styled-components?**\nYes. Airship works with the styling system already in your project. It works with the tokens and\nstyling conventions already in your codebase, so visual changes can map back to the values your\ndesign system already uses.\n\n**How does it know which file an element came from?**\nDev builds already record where each thing on screen came from. Airship reads that to find the\nfile and line, and hands it to the agent.\n\n**What exactly gets sent to the agent?**\nWhat you clicked, the file and line it came from, anything you changed in the inspector, the\nframes you were working in — and whatever you typed.\n\n**Can I use my existing coding agent?**\nYes. Airship works with Claude Code, Codex, and OpenCode, so you don't need to change your agent\njust to use the visual editor.\n\n**Is it safe to point at a real repository?**\nAirship runs locally and works directly on the repository you point it at. By default your\ncoding agent has the same access to your files and the network that it always has. `--safe` can\nkeep edits inside your project and block dangerous commands — read [Safety](#safety) for what it\ndoes and doesn't cover on each agent.\n\n**How do I undo something?**\nEvery edit can be undone from Airship, which keeps the previous version of the file. On `claude`\nthat's all there is to it. On `codex` and `opencode` that previous version comes from Git, so\nthose two need your project to be a repository. See [Agents](#agents).\n\n**Can I see how a change affects different devices?**\nYes. Airship runs the same app at several real device sizes at once. Make a change once and\nwatch it land on desktop, tablet and mobile together, without resizing anything.\n\n**Can I use Airship without Git?**\nYes, Airship doesn't require it. But undo on `codex` and `opencode` works by asking Git for the\nprevious version of the file, so without a repository you lose undo on those two. `claude` is\nunaffected. See [Agents](#agents).\n\n**Does my code leave my machine?**\nAirship runs entirely on localhost by default: it binds `127.0.0.1` and refuses requests from\nother devices and cross-site pages unless you widen that with [`--host`](#--host). It has no\naccount, telemetry, or hosted service, and your code isn't sent to Airship. Your chosen coding\nagent handles requests using the same credentials and provider it would use from your terminal.\n\n## Requirements\n\nNode 22.13 or later, and one of Claude Code, OpenAI Codex or OpenCode.\n\nmacOS, Linux and Windows. Every PR is built and tested on Linux and Windows.\n\n## Links\n\n- [airship.design](https://airship.design)\n- [Issues](https://github.com/0xnyn/airship/issues) · [Releases](https://github.com/0xnyn/airship/releases)\n- [CONTRIBUTING.md](https://github.com/0xnyn/airship/blob/main/CONTRIBUTING.md) — architecture, the packages, Storybook, CI and releases\n- [MIT](https://github.com/0xnyn/airship/blob/main/LICENSE)\n","readmeFilename":"README.md"}