Docs · Getting started

From install to merged PR.

Your first real session: turn on the statusline so you can watch everything that follows, then take one change through /s:plan → /s:build and understand every artifact it leaves behind.

curl -fsSL https://shipd.now/install | shinstall the plugin + CLI
shipd doctoroptional preflight
shipd statusline installthe ☕ statusline
/s:plan <what you want>converge on a spec
/s:build <change>gated, refuted, merged
shipd boardwatch it ship

New to the whole idea? /s:onboard runs a nine-step guided tour in a throwaway sandbox — nothing in your repositories is touched. The steps below unpack each command.

1

Install

The installer runs a doctor check — it verifies every prerequisite and prints the exact command to fix anything missing. It refuses to run half-configured.

$ curl -fsSL https://shipd.now/install | sh
✓ doctor: all prerequisites present
✓ plugin installed — skills available as /s:<name>
2

Set up the statusline

Your coding agent reserves one line at the bottom of every session; shipd puts the spec in flight on it — name, lifecycle status, task progress — live. For the question you'll ask most (is it still going, and how far along?) you never run a command again.

$ shipd statusline install
✓ statusLine registered in ~/.claude/settings.json — other settings untouched
☕ export-json-flag · active · 3/7

Status is colored by lifecycle — draft grey through verified green. Epic members show their position (EPIC: export-cli, spec 2/5); during an autopilot run a breathing dot pulses with the run's heartbeat. No live change reads ☕ no active specs.

3

Plan — converge on the spec

Describe the change in prose. The Planner investigates your codebase first and asks only what it genuinely cannot infer, then names the change, opens a dedicated worktree, writes its artifacts — and stops. No code is written at this stage.

/s:plan Add a --json flag to export so scripts can consume its output
→ worktree .worktrees/export-json-flag · branch change/export-json-flag
☕ export-json-flag · ready · 0/7
.shipd/planned/export-json-flag/
plan.mdthe decision document — idea, motivation, details, non-goals (where scope creep goes to die), and ADR-style binding decisions with rejected alternatives
specs/…/spec.mdthe delta spec per affected capability — ADDED / MODIFIED / REMOVED requirements with WHEN/THEN scenarios the build is verified against
tasks.mdthe checklist — every task tagged [req: …] so nothing is built that wasn't specified; the file the statusline counts
Your one job

Read the three files. Right now the entire change is markdown — a wrong assumption costs one edit to fix. After the build it costs a rework. Planning ends with a deterministic context gate: pass promotes to ready; fail parks it rejected with the gaps written into plan.md — the engine refuses to build on guesses.

4

Build — gated, refuted, merged

The Orchestrator adopts the change in its worktree, delegates the checklist to execution sub-agents one model tier down, and keeps tasks.md current — boxes flip, the counter climbs. Done means verified against the delta spec's WHEN/THEN scenarios, not a vibe of "seems done".

/s:build export-json-flag
gate: PASS → 7 tasks → refute: confirmed → PR #212 merged

Three durable outcomes, in three places:

working codecommitted on change/export-json-flag — one change, one branch, one PR
master librarythe delta merges into .shipd/verified/ — how the system behaves now; the next plan starts better-informed, so every change makes the next one cheaper
immutable archivethe full artifact set moves to .shipd/completed/ — six months from now, "why does --json work this way?" has an answer with a date on it
5

Watch the board

The shipd CLI fronts the engine's read verbs — no raw script paths, JSON-first output for tooling.

shipd delivery board — a full-screen terminal board with columns for unplanned, ready, building, review, and shipped specs
shipd boardthe interactive delivery board, full-screen
shipd listin-flight changes across the root and its worktrees
shipd status [change]a change's status and progress
shipd epic <slug>an epic's status, metadata, and member states
shipd metricsdelivery metrics
shipd lint [change]structurally validate specs and change deltas

Go deeper

What is shipd?WorkspacesThe supersession gateWhat can it do?How it works
FAQ

The questions worth asking.

01

Which agents and models does it work with?

shipd ships as a plugin for Claude Code today — its skills are invoked as /s:plan, /s:build, /s:status inside your session. The spec engine underneath is deliberately LLM-free: exact-keyed CRUD over markdown, driven by plain scripts. No model ever reads or writes the library directly.

Roles are model-tiered, not model-locked: the orchestrator plans on the strongest model available, execution agents run one tier down, and the pipeline is config-defined — stages can be skipped, replaced, or extended per workspace, so other runtimes can slot in as the distribution opens up.

02

What does shipd see of my code? What leaves my machine?

The spec library lives in your repository, under your version control — .shipd/ is just markdown you can read, diff, and delete. Agents access your code the same way your coding-agent session already does; shipd adds no second channel.

Heavy inputs stay local by design: video ingest transcribes and diarizes screen recordings entirely on-device — no cloud transcription, no vision APIs — and only the cited brief enters the repo. Audio, frames, and raw transcripts never land in a checkout or a PR.

03

What if the validator is wrong?

The validator can only be wrong in the safe direction. It's adversarial — it tries to refute scenarios against the real, running code. A false refutation sends the change back to the execution agents; nothing is lost but time. And it never merges anything alone: CI must pass and the semantic review must be explicitly dispositioned by design.

When the earlier context gate finds a plan lacking, it doesn't guess — the plan parks as rejected with its findings written into plan.md, and a human enriches it before anything builds. Every guard is also inspectable and overridable: a refused transition tells you why, and --force exists when you know better.