Skip to content

Your first plan

This takes about five minutes and needs nothing installed. Each step is a complete Sprig file; open it in the playground to see what Sprig computes from it, then change it and watch the result move.

The last step takes the same plan to the terminal with the sprig command.

Every item is a line that starts with a mark and a space. - is something to do and x is done. The first line is the title.

Move flats
- Pack
- Book a van
x Tell the landlord

Open this in the playground →

The view shows one of three done. Tick Pack in the view and the source changes too: the file is always the truth.

Indent to put items inside another. There’s no limit to how deep, and each parent adds up what’s beneath it.

Move flats
- Pack
x Books
- Kitchen
- Bathroom
- Book a van
x Tell the landlord

Open this in the playground →

Pack now shows 1 of 3. A parent keeps the mark you give it: when all its children are done, the view suggests ticking it rather than doing it for you.

Give an item an anchor with ^name, and make another wait on it with after:^name. Anything waiting is blocked until what it waits on is done.

Move flats
- Pack ^pack
x Books
- Kitchen
- Book a van ^van
- Move everything after:^van after:^pack

Open this in the playground →

Switch the view to Next up: Kitchen and Book a van are ready, and Move everything is waiting on two things. Tick Pack and Book a van and it moves to ready.

A line starting with ? is a question. Write the answer underneath with =, and the question counts as done. The decision stays in the file, next to what it decided.

Move flats
? Keep the old sofa?
= No. It won't fit in the lift.
- Sell the sofa

Open this in the playground →

@name says who. It flows down, so a name on the title owns the whole file until an item names someone else. Dates are written due:2026-10-17; in the playground you can type due:fri and it becomes a real date when you press Enter.

Move flats @me
- Book a van due:2026-10-16
- Carry the heavy boxes @jo

Open this in the playground →

When a plan grows, move a branch into its own file and graft it back with + [[name]]. Progress and blockers carry across.

Move flats
+ [[packing]]
- Book a van
Packing
x Books
- Kitchen
- Bathroom

Open both files in the playground →

Install the sprig command, with Rust installed (rustup.rs):

Terminal window
cargo install --locked --git https://github.com/oddurs/sprig sprig-cli

Save the two files from step 6 as move.sprig and packing.sprig in one folder, and ask what can be done now. Grafted items come with their file:

Terminal window
$ sprig next move.sprig
- Kitchen Packing
- Bathroom Packing
- Book a van Move flats
3 ready

sprig check reads the same files and prints nothing when the plan holds together. Misspell the graft and it says where:

Terminal window
$ sprig check move.sprig
Terminal window
$ sprig check move.sprig
move.sprig:3:3: error[S0101]: no file named pakcing.sprig

It exits 1 on an error, so it can guard a repository. In GitHub Actions, the Sprig action checks every plan and summarises what each pull request did to them:

- uses: oddurs/sprig/action@main

8. Work it from your editor, and hand it to an agent

Section titled “8. Work it from your editor, and hand it to an agent”

Fix the graft again, and tick the van as booked:

Terminal window
$ sprig tick van
move.sprig:4 x Book a van

A ref is any words that match one item, an ^anchor, or file:line. In VS Code, Neovim or any editor with a language server, the same tick is one action on the line, and problems show as you type: set up your editor.

For a project, the plan lives at the root as PLAN.sprig. To have a coding agent read it before it starts and keep it up to date as it works, add the instructions to the file the agent reads:

Terminal window
$ sprig mcp --instructions --write AGENTS.md

Then register the MCP server with the agent. sprig mcp --config prints the snippet for .mcp.json. The agent can then ask what is next, tick what it finishes and add the steps it plans, and every change it makes shows up as a diff: plans for coding agents.

That’s the whole idea. From here: