chainship
v0.0.8
Published
Deploy a frontend to Arweave + ENS — permanent, censorship-resistant, one command.
Downloads
1,292
Maintainers
Readme
chainship
Deploy a frontend to Arweave + ENS — permanent, censorship-resistant, in one command. Feels like Vercel; the bytes live on permanent storage and the canonical pointer lives on Ethereum.
Honest status: every deploy embeds a client-side verifier (Service Worker + content-hash manifest): the browser checks each asset against its hash and fails closed on tamper — call this "tamper-checked delivery". It does not yet verify the ENS pointer on-chain, so a host swapping the whole self-consistent bundle is not caught, and the very first visit (before the SW installs) is unverified. So never market it as bare "verified" or "trustless" — state the pointer-swap limit alongside "fails closed" (see
docs/11-mvp-scope.md).
Quickstart
npx chainship init ./site # or --template vite | next
npx chainship deploy ./site --dry-run # content-address + cost estimate, no keys needed
npx chainship deploy ./site # → Arweave + ENS, prints a permanent URLNo global install required.
Commands
| Command | What it does |
|---|---|
| init [dir] --template <vanilla\|vite\|next> | Scaffold a deployable starter |
| doctor | Preflight .env, RPC, key balance, ENS (read-only) |
| dev [dir] | Build + serve locally exactly as a deploy would (--watch, --spa) |
| deploy [dir] | Build → optimize → content-address → Arweave → ENS. --preview --estimate --no-optimize --build |
| promote [id\|txId] | Make a deploy live (flip the ENS pointer) |
| rollback [txId] | Point ENS back at a previous deploy |
| status | Read the ENS name's current contenthash |
| list / usage | List deploys / show local usage |
Zero-config by default; drop a chainship.json (buildCommand, outputDir, rootDir,
installCommand, nodeVersion) to override the build for monorepos or custom setups.
How deploy works
- build — auto-detect Next (static export) / Vite / Astro, or honor
chainship.json. - optimize — minify HTML/CSS/JS (smaller = faster and cheaper;
--no-optimizeto skip). - content-address — hash every file → a deterministic bundle id (the future verification anchor).
- upload — push to Arweave via ArDrive Turbo; a path manifest makes
<gateway>/<txId>serveindex.html. - point ENS — encode the tx id as an EIP-1577
contenthashon the name's Sepolia resolver. - record — append to
.chainship/deployments.json(the dashboard +usageread it).
Environment
For a real (non–--dry-run) deploy, set in .env (run chainship doctor to check):
PRIVATE_KEY— a funded Sepolia test key (pays gas + the Arweave upload)SEPOLIA_RPC_URL— any Sepolia RPCENS_NAME— an ENS name you control on Sepolia (or use--preview/--skip-ens)
Open source
The CLI is OSS and self-hostable: bring your own key and pay Arweave/gas directly — $0 to
chainship. The managed service (gasless deploys, hosted dashboard, teams) is the paid layer.
See the repo docs (docs/12-pricing.md, docs/13-open-core.md).
MIT
