Graphify¶
Graphify-Labs/graphify turns a codebase, with its docs,
schemas and configs, into a knowledge graph an agent can query instead of reading trees. It ships as
a /graphify skill for Claude Code, Codex, Cursor and Gemini CLI. Code is parsed locally with
tree-sitter; docs, YAML, PDFs and images go to an LLM pass. 124.7k stars and 12.0k forks on
2026-10-07; Apache-2.0, with a LICENSE-MIT for code from before the relicensing.
For marola it is already designed: MIP-0076 was accepted on 2026-10-03. Adopting it means delivering that MIP's open tasks, not installing the skill.
Why marola uses it, and for what¶
MIP-0017 §9 rejected graphify while marola was one repo, because Grep already gave an agent its
context in seconds. The polyrepo split (MIP-0070) changed that, so MIP-0076 ran two offline spikes on
the real workspace:
- It graphs the whole umbrella in one run: 4,921 nodes and 8,447 edges in 3.7 s, 0 tokens.
- It answers symbol questions ("where is X?"): 3 hits, 3 partials and 2 misses out of 8.
- It does not see the wiring between repos (workflows, dispatches, pin files). A generated table answers those instead: 5 of the 8 questions in 2.5 KB read once.
So graphify is half of MIP-0076. The other half is a wiring extractor whose table lives in the
umbrella's REPOS.md, and a routing skill picks between the two and git grep.
The marola way¶
| Do | Don't (MIP-0076 §4, §5.2, §9) |
|---|---|
Run it through the devkit's just graph (build, query, path, explain) |
Run bare graphify, which can start the LLM pass |
Take nixpkgs' graphify (0.9.66) through the devkit's flake lock |
pip/uv install it, a second pinning mechanism |
extract . --code-only --no-label, under env -i with GRAPHIFY_NO_AUTO_REFRESH=1 and no API keys |
Its LLM pass over YAML and docs: ~0.6–0.7M tokens a pass |
Write output to ${XDG_CACHE_HOME:-$HOME/.cache}/marola-graph/<repo> via GRAPHIFY_OUT |
Commit graphify-out/ (5.9 MB that churns) or leave it in the checkout |
query with --budget 400 (~1.8 KB an answer) |
Read GRAPH_REPORT.md (~21k tokens) or graph.json whole |
A committed .graphifyignore for noise (**/vendor/**) |
graphify install, its hooks or --strict: they collide with the devkit's core.hooksPath and plugin |
| The CLI | Its MCP server: the same answers plus ~6.6 KB of tool schemas |
The routing rule the skill will carry (§5.3): wiring questions read the REPOS.md block; "where is
X" with an unknown keyword uses just graph query and reads only the files it names; a known
keyword uses git grep --recurse-submodules.
Where the work stands¶
MIP-0074, which MIP-0076 was blocked by, is implemented. Every MIP-0076 task is open, and none
carries agent-ready yet, so an agent cannot start them until a person labels them.
| Task | Issue | What |
|---|---|---|
| 1–4 | devkit#25, #26, #27, #28 | The wiring extractor, its --check, notify-umbrella on every push, the devkit release |
| 5–11 | marola#661, the five *-notify rows, marola#662 |
The generated wiring block and each repo's devkit bump |
| 12 | devkit#29 | graph: the devkit tool around nixpkgs' graphify |
| 13 | devkit#30 | The routing plugin skill |
| 14 | devkit#31 | Devkit release with graph |
| 15 | marola#663 | wiring --check in the umbrella's gates |
| 16 | marola#664 | Umbrella on the new devkit, .graphifyignore, the AGENTS.md paragraph |
| 17 | marola#665 | A CI job that builds the graph as a 7-day artifact |
| 18 | marola#666 | MIP-0076 flipped to Implemented |
The full order and each task's tests are in MIP-0076.tasks.md. Done means at least 7 of the 8 spike questions answered right first on a fresh clone, with 0 tokens in graphify's report footer (§7).
Outside marola¶
In a personal repo with no devkit, the same rules keep it cheap: uv tool install graphifyy, then
graphify extract . --code-only --no-label with GRAPHIFY_OUT pointing outside the checkout, and
graphify query --budget 400. Skip graphify install if the repo already manages its own skills
and hooks.