open source · rust · mit · dag-based

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.

not public yet. source drops when it ships.
          ·                                    
                        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.