The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Goaltree listing page.
A multi-parent, value-propagating goal graph. Concept-stage, open source, looking for people to poke holes in it.
Most prioritization tools assume a clean hierarchy: one goal breaks into sub-goals, which break into sub-sub-goals, and so on. Real work rarely looks like that. A feature can depend on two other things at once; a bug fix can matter to three different initiatives for three different reasons. Trees don't capture that. A graph might.
GoalT is a small engine for exactly that:
Value redistribution (how a parent splits its value among children) is pluggable. By default it's a simple equal split — deterministic, no API key needed, always converges. You can swap in an LLM to decide weights based on context instead (e.g. "speed matters more than polish this sprint"). The engine never trusts the LLM's numbers directly: whatever comes back gets validated and re-normalized so the graph stays mathematically consistent even if the model returns something odd.
Click the "Open in Colab" badge above. It opens demo.ipynb in your browser, no setup required. Run the cells top to bottom.
Requirements: Python 3.10+ (the mcp package, needed for the Claude Code server, requires it). If you're on macOS and pip install fails with errors like "Requires-Python >=3.10" or "No matching distribution found for mcp", you likely have more than one Python installed and pip is pointing at the wrong one (common with the Python bundled in Xcode Command Line Tools). Check with python3 --version, and if it's 3.10+, use python3 -m pip install ... instead of a bare pip install ..., which guarantees packages land in the same Python that will actually run the server.
The core engine only needs networkx. The heavier pieces are extras, so you
install what you actually use:
Or from source:
Note that c lands on 1.000 while the root is also 1.000, and that a, b
and c sum to more than the root. That's intentional, not a bug: value is
conserved per parent (each parent splits exactly 1.0 among its children),
not globally across the graph. A goal serving two parents accumulates from
both.
So the number isn't a share of a fixed budget, and comparing it to the root's 1.0 doesn't mean anything. It's a pull-weight: it answers "how much is riding on this," not "what fraction of the project is this." Here, the export bug is load-bearing for both sub-goals, so nothing else in the graph can be done without it mattering — which is exactly what a 1.000 is saying.
See demo.ipynb for the full walkthrough, including the LLM-backed redistribution example.
GoalT ships as a Claude Code plugin: an MCP server (build and query a tree in conversation) plus a live dashboard that auto-starts with the server and highlights, in real time, which goal Claude is currently working on.
This wires up both the MCP tools and the activity hook automatically. Dependencies install themselves the first time the server starts (a bootstrap.sh finds a suitable Python and runs pip install if needed), so no manual clone or pip install step is required. The very first tool call may take a few extra seconds while that happens; after that it's instant.
This gets you the tools but not the automatic "Claude is currently..." activity pulse -- that part relies on the plugin's hook, which is only registered via the plugin install path above.
Onboarding an existing codebase: run the /goalt:start slash command in the project you want to plan. Claude explores the repo (README, package manifest, folder structure, database migrations if present), identifies real functional areas, and builds a tree with genuine descriptions -- linking the files and backend artifacts (database tables, edge functions, etc.) it's confident actually implement each goal, rather than fabricating structure.
Starting from scratch, in a Claude Code session:
"Create a goal tree for shipping v2 of our product, with onboarding and performance as sub-goals, and a shared bug fix that depends on both. Show me the priorities and open the dashboard."
Claude calls create_tree, add_goal, and list_priorities, then open_dashboard gives you a URL (http://127.0.0.1:8765) to open in your browser. From there:
related_files linked, editing one of those files automatically highlights that goal with a glowing green border -- no extra tool call needed, the hook matches the edited path against every goal's related files.set_active_goal with a reason. Best-effort only -- it happens if Claude chooses to call it, not guaranteed.project_root was set when the tree was created, a background thread polls git status every few seconds and marks goals with an amber border if any of their related files have uncommitted changes -- independent of whether anything is being actively edited right now.vscode://file/...) that opens it directly in VS Code -- works out of the box if VS Code is installed, no setup needed. Files with uncommitted changes also get a Diff button that opens a proper side-by-side diff (HEAD vs working copy). On macOS this launches VS Code directly (no PATH setup needed, works if VS Code is simply installed); elsewhere it uses the code CLI if it's on PATH. If neither is available, the button tells you exactly what to do instead of failing silently.Available tools: load_tree, create_tree, add_goal, link_artifacts, list_priorities, set_active_goal, clear_active_goal, open_dashboard, reset_tree.
Current limitations:
<project_root>/.goalt/tree.json on every change and auto-loads on the next session (either a best-effort guess at startup, or reliably via load_tree once Claude knows the actual project root -- the system instructions point it there first). Add .goalt/ to your project's .gitignore if you don't want to commit it.goals_for_file) is a heuristic suffix match, not exact-path resolution -- it can mismatch on ambiguous relative paths in unusual project layouts.project_root and re-polls on a fixed interval (a few seconds), so there's a small lag between a change happening and it showing up.goaltree/goal_tree.py -- the core engine: graph construction, cycle detection, deterministic value propagation, and the pluggable LLM redistribution hook. The only module with no optional dependencies, and the only one re-exported from goaltree directly.goaltree/visualize.py -- a thin matplotlib/networkx wrapper used by demo.ipynb to draw a static graph image. Needs the [viz] extra.demo.ipynb -- an interactive, runnable walkthrough (works in Colab, no local setup).goaltree/mcp_server.py -- the MCP server: tools for building/querying the tree, plus best-effort active-goal tracking. Starts the dashboard automatically on load. Needs the [mcp] extra.goaltree/dashboard.py -- the live, interactive web dashboard (FastAPI + vis-network, single file, no build step), including the hook endpoint Claude Code's PreToolUse hook calls. Needs the [mcp] extra.pyproject.toml -- packaging metadata; also defines the goalt-mcp console script, which is just python -m goaltree.mcp_server under a shorter name..claude-plugin/plugin.json, .claude-plugin/marketplace.json, .mcp.json, hooks/hooks.json -- plugin packaging so the whole thing installs with two commands (see above).commands/start.md -- the /goalt:start slash command that onboards GoalT onto an existing codebase.bootstrap.sh -- the plugin's actual entry point (see .mcp.json). Finds a Python 3.10+ interpreter and auto-installs dependencies on first run, so installing the plugin genuinely requires nothing beyond the two /plugin commands above -- no separate clone or pip install step, and no machine-specific path hardcoded anywhere.tests/ -- 62 tests covering the core engine, the dashboard's API/hook logic, and the MCP tools end-to-end (via a real MCP client, the same way Claude Code talks to it). See "Running tests" below.No CLI yet -- a natural next step if there's interest.
62 tests across three files:
tests/test_goal_tree.py -- the core engine (multi-parent value propagation, cycle handling, artifact linking, file matching, save/load round-trips), no I/O.tests/test_dashboard.py -- pure helper functions, real git fixtures for uncommitted-changes detection, the VS Code diff fallback chain (mocked, no GUI needed), and the FastAPI endpoints via TestClient.tests/test_mcp_server.py -- integration tests: a real MCP client talking to a real goaltree.mcp_server subprocess over stdio, covering the actual tools (create_tree, add_goal, link_artifacts, set_active_goal, load_tree/persistence, reset_tree). Slower (~30s total) since each test spawns a real process, but it's what actually exercises the tool layer Claude Code calls into.Being upfront about this instead of overselling it:
add_goal call can trigger one redistribution call per affected parent. On a large, deep graph that could mean a lot of API calls per edit. Caching / batching isn't implemented yet.add_goal API alone, a cycle is impossible by construction (a new node has no outgoing edges yet). The check matters for a planned future feature — linking two already-existing goals together — where cycles become genuinely reachable.load_tree tool, which the system instructions tell Claude to call first with the actual project root before assuming no tree exists.Issues and PRs welcome — see CONTRIBUTING.md. Breaking it is as useful as extending it; if you find a case where the graph produces something wrong or unstable, that's exactly the kind of feedback this needs right now.
Apache 2.0 — see LICENSE. Use it, fork it, build on it, commercial or not.