goals aren't a list.
they're a graph.
a tiny cli for tracking big goals as a directed graph of dependencies. see what's blocked, know what you can actually start today. chart your life by the stars instead of a checklist.
· ⋅
✦ ship the app
│
╭─────┴─────╮
⋅ │ │ ·
✦ finish ✦ write
backend landing
│
╭─────┴─────╮
· │ │ ⋅
✦ pick db ★ auth flow
│ │
◉ done ★ in progress
⋅ ·
a session, end to end.
add a goal, wire it up, ask what's next, close the loop.
$ goalgraph add "ship the app" + added root goal: ship the app $ goalgraph add "finish the backend" --blocks "ship the app" + finish the backend → ship the app $ goalgraph add "pick a database" --blocks "finish the backend" + pick a database → finish the backend $ goalgraph tree ship the app └─ finish the backend └─ pick a database ← you are here $ goalgraph next 3 goals ready to work on: · pick a database · write the cover letter (standalone) · call the dentist (standalone) $ goalgraph done "pick a database" ✓ completed. unblocked: └─ finish the backend
dependencies, first-class
goals point at other goals. "ship the app" waits on "finish the backend". the graph your priorities already have, written down.
next shows unblocked leaves
a topological sort finds the goals with no unmet dependencies. the ones you can actually work on today.
finishing cascades
mark a goal done and its parents get re-evaluated. new leaves surface, old ones fade out. the graph breathes.
plain json storage
your graph lives at ~/.goalgraph/graph.json. jq it, commit it, sync it across machines. no cloud, no account.
why a graph, not a list.
a todo list pretends your work is one-dimensional, line by line, top to bottom. your real priorities don't behave that way.
you can't work on "ship the app" directly. you can only work on the leaves that feed it, and those leaves have their own leaves. the shape is a tree (a dag, really), and a flat list flattens it into nonsense.
goalgraph keeps the shape. every goal remembers what it's waiting on, so you don't have to guess what's actually available to do.
a flat list: a graph: □ ship the app ✦ ship the app □ finish backend └─ ✦ finish backend □ pick db ├─ ◉ pick db □ auth flow └─ ★ auth flow □ write landing └─ ✦ write landing where do i start? start at the leaves.
your backlog is a jungle. this turns it into a map.