Graphify-Labs/graphifyPublic

Turn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.

AI summary: A deterministic local knowledge graph parser for AI assistants that maps codebases, schemas, and PDFs without vector stores.

Stars
123.7K
+197 today
Forks
11.9K
Watchers
395
Open issues
698
Open PRs
796
Contributors
~284
Commits
2K
Branches
12

PythonApache-2.0Created Apr 3, 2026Last push todayLatest release v0.9.72+1.9K stars this week+9K this month

Quick answers

What is graphify?
A deterministic local knowledge graph parser for AI assistants that maps codebases, schemas, and PDFs without vector stores.
What does graphify do?
Graphify is a powerful analytical tool that translates arbitrary projects—including source code, SQL schemas, configuration files, and PDFs—into highly queryable knowledge graphs. It operates entirely locally using deterministic Abstract Syntax Tree (AST) parsing instead of relying on stochastic vector databases or external embeddings. The system carefully documents every node and edge to explain the exact relationships between different codebase components. By functioning as a slash-command skill for Claude Code, Cursor, and Gemini CLI, it provides AI coding assistants with deep, structurally precise context to accurately navigate massive enterprise environments.
Who is graphify for?
Graphify is targeted at enterprise engineers, AI tool developers, and engineering managers who require precise, privacy-conscious contextual navigation of sprawling codebases.
How do I get started with graphify?
https://graphify.com
How popular is graphify on GitHub?
Graphify-Labs/graphify has 123,741 stars and 11,932 forks on GitHub, and gained 1,870 stars in the last 7 days.
What license does graphify use?
Graphify-Labs/graphify is released under the Apache-2.0 license.

Star history

since Jul 28, 2026
050K100KJul 2026Aug 2026Sep 2026Oct 2026
123.7K stars as of Oct 4, 2026. Measured daily since Jul 28, 2026; GitHub no longer exposes earlier star timestamps.

Update history

1 recorded
  • Oct 4, 2026Previously tracked as safishamsi/graphify; its 1 daily snapshot and 42 trending appearances were merged into this profile. Stars: 98,319 on 2026-07-29 under the old name, 123,705 on 2026-10-04 (+25,386).

Contribution activity

commits per day, last 52 weeks
OctNovDecJanFebMarAprMayJunJulAugSepMonWedFri2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-08: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 0 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 0 commits2026-02-17: 0 commits2026-02-18: 0 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 0 commits2026-02-23: 0 commits2026-02-24: 0 commits2026-02-25: 0 commits2026-02-26: 0 commits2026-02-27: 0 commits2026-02-28: 0 commits2026-03-01: 0 commits2026-03-02: 0 commits2026-03-03: 0 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 0 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 0 commits2026-03-13: 0 commits2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 0 commits2026-03-17: 0 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 0 commits2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 0 commits2026-03-31: 0 commits2026-04-01: 0 commits2026-04-02: 0 commits2026-04-03: 2 commits2026-04-04: 8 commits2026-04-05: 18 commits2026-04-06: 24 commits2026-04-07: 16 commits2026-04-08: 13 commits2026-04-09: 26 commits2026-04-10: 19 commits2026-04-11: 4 commits2026-04-12: 7 commits2026-04-13: 6 commits2026-04-14: 2 commits2026-04-15: 4 commits2026-04-16: 4 commits2026-04-17: 8 commits2026-04-18: 8 commits2026-04-19: 0 commits2026-04-20: 1 commit2026-04-21: 18 commits2026-04-22: 11 commits2026-04-23: 5 commits2026-04-24: 1 commit2026-04-25: 1 commit2026-04-26: 1 commit2026-04-27: 7 commits2026-04-28: 4 commits2026-04-29: 13 commits2026-04-30: 8 commits2026-05-01: 12 commits2026-05-02: 29 commits2026-05-03: 10 commits2026-05-04: 30 commits2026-05-05: 13 commits2026-05-06: 7 commits2026-05-07: 23 commits2026-05-08: 4 commits2026-05-09: 13 commits2026-05-10: 1 commit2026-05-11: 3 commits2026-05-12: 7 commits2026-05-13: 8 commits2026-05-14: 12 commits2026-05-15: 22 commits2026-05-16: 16 commits2026-05-17: 9 commits2026-05-18: 15 commits2026-05-19: 0 commits2026-05-20: 4 commits2026-05-21: 1 commit2026-05-22: 12 commits2026-05-23: 4 commits2026-05-24: 7 commits2026-05-25: 1 commit2026-05-26: 15 commits2026-05-27: 8 commits2026-05-28: 13 commits2026-05-29: 9 commits2026-05-30: 6 commits2026-05-31: 12 commits2026-06-01: 7 commits2026-06-02: 14 commits2026-06-03: 15 commits2026-06-04: 0 commits2026-06-05: 15 commits2026-06-06: 4 commits2026-06-07: 14 commits2026-06-08: 7 commits2026-06-09: 5 commits2026-06-10: 8 commits2026-06-11: 19 commits2026-06-12: 8 commits2026-06-13: 6 commits2026-06-14: 0 commits2026-06-15: 1 commit2026-06-16: 6 commits2026-06-17: 15 commits2026-06-18: 8 commits2026-06-19: 10 commits2026-06-20: 1 commit2026-06-21: 2 commits2026-06-22: 9 commits2026-06-23: 7 commits2026-06-24: 15 commits2026-06-25: 9 commits2026-06-26: 6 commits2026-06-27: 15 commits2026-06-28: 28 commits2026-06-29: 18 commits2026-06-30: 20 commits2026-07-01: 25 commits2026-07-02: 21 commits2026-07-03: 6 commits2026-07-04: 10 commits2026-07-05: 12 commits2026-07-06: 25 commits2026-07-07: 11 commits2026-07-08: 13 commits2026-07-09: 16 commits2026-07-10: 10 commits2026-07-11: 7 commits2026-07-12: 8 commits2026-07-13: 15 commits2026-07-14: 17 commits2026-07-15: 20 commits2026-07-16: 14 commits2026-07-17: 17 commits2026-07-18: 15 commits2026-07-19: 7 commits2026-07-20: 16 commits2026-07-21: 17 commits2026-07-22: 20 commits2026-07-23: 4 commits2026-07-24: 6 commits2026-07-25: 19 commits2026-07-26: 12 commits2026-07-27: 13 commits2026-07-28: 11 commits2026-07-29: 15 commits2026-07-30: 9 commits2026-07-31: 5 commits2026-08-01: 7 commits2026-08-02: 0 commits2026-08-03: 0 commits2026-08-04: 0 commits2026-08-05: 5 commits2026-08-06: 3 commits2026-08-07: 5 commits2026-08-08: 2 commits2026-08-09: 4 commits2026-08-10: 5 commits2026-08-11: 21 commits2026-08-12: 15 commits2026-08-13: 16 commits2026-08-14: 13 commits2026-08-15: 18 commits2026-08-16: 9 commits2026-08-17: 22 commits2026-08-18: 17 commits2026-08-19: 9 commits2026-08-20: 14 commits2026-08-21: 16 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 15 commits2026-08-25: 17 commits2026-08-26: 1 commit2026-08-27: 10 commits2026-08-28: 8 commits2026-08-29: 22 commits2026-08-30: 24 commits2026-08-31: 1 commit2026-09-01: 1 commit2026-09-02: 7 commits2026-09-03: 7 commits2026-09-04: 4 commits2026-09-05: 11 commits2026-09-06: 4 commits2026-09-07: 9 commits2026-09-08: 8 commits2026-09-09: 6 commits2026-09-10: 21 commits2026-09-11: 15 commits2026-09-12: 19 commits2026-09-13: 11 commits2026-09-14: 34 commits2026-09-15: 10 commits2026-09-16: 33 commits2026-09-17: 10 commits2026-09-18: 2 commits2026-09-19: 5 commits2026-09-20: 13 commits2026-09-21: 11 commits2026-09-22: 23 commits2026-09-23: 18 commits2026-09-24: 12 commits2026-09-25: 25 commits2026-09-26: 20 commits2026-09-27: 14 commits2026-09-28: 8 commits2026-09-29: 8 commits2026-09-30: 0 commits2026-10-01: 0 commits2026-10-02: 0 commits2026-10-03: 0 commits
1,941 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Landmark project

    123,741 stars

  • Very active

    1,941 commits in 52 weeks

  • Community-driven

    ~284 contributors

  • Well documented

    High community health score

  • Permissive license

    Apache-2.0

  • Continuous integration

    Automated checks passing

  • Repeat trending

    56 trending appearances

  • Top 10% tracked

    Rank 54 of 1135

What graphify does

Graphify is a powerful analytical tool that translates arbitrary projects—including source code, SQL schemas, configuration files, and PDFs—into highly queryable knowledge graphs. It operates entirely locally using deterministic Abstract Syntax Tree (AST) parsing instead of relying on stochastic vector databases or external embeddings. The system carefully documents every node and edge to explain the exact relationships between different codebase components. By functioning as a slash-command skill for Claude Code, Cursor, and Gemini CLI, it provides AI coding assistants with deep, structurally precise context to accurately navigate massive enterprise environments.

Graphify is targeted at enterprise engineers, AI tool developers, and engineering managers who require precise, privacy-conscious contextual navigation of sprawling codebases.

  • Deterministic AST Parsing: Generates precise project relationships by natively traversing code syntax rather than relying on unreliable text embeddings.
  • Local Processing: Operates entirely on the local machine without vector stores, ensuring maximum privacy and rapid execution times.
  • Comprehensive Data Ingestion: Consumes disparate data sources simultaneously, linking application source code directly to database schemas and PDF documentation.
  • Explained Edges: Automatically annotates the relationships between graph nodes to explicitly define how functions, classes, and configurations interact.
  • AI Assistant Integration: Natively operates as a callable skill across major developer tools including Claude Code, Cursor, and Codex.
  • Multilingual Architecture: Fully translates its documentation and interfaces into over a dozen languages for global enterprise deployment.

Where teams use it

Complex Codebase Navigation

Developers ask their AI assistant to map out how a newly discovered configuration flag impacts downstream SQL queries across multiple microservices.

Privacy-Preserving Code Analysis

Enterprise teams analyze proprietary applications securely by keeping all parsing and graph generation confined to their local environments.

Architecture Documentation

Engineers rapidly generate an explainable, deterministic graph of legacy infrastructure to understand tightly coupled module dependencies.

Integrated Context Generation

AI coding assistants utilize Graphify's precise relationships to fetch highly accurate context windows, drastically reducing hallucinations when generating code.

Getting started: https://graphify.com

README

v8 branch

Graphify

Graphify-Labs%2Fgraphify | Trendshift

Read this in other languages

🇺🇸 English | 🇨🇳 简体中文 | 🇯🇵 日本語 | 🇰🇷 한국어 | 🇩🇪 Deutsch | 🇫🇷 Français | 🇪🇸 Español | 🇮🇳 हिन्दी | 🇧🇷 Português | 🇷🇺 Русский | 🇸🇦 العربية | 🇮🇷 فارسی | 🇮🇹 Italiano | 🇵🇱 Polski | 🇳🇱 Nederlands | 🇹🇷 Türkçe | 🇺🇦 Українська | 🇻🇳 Tiếng Việt | 🇮🇩 Bahasa Indonesia | 🇸🇪 Svenska | 🇬🇷 Ελληνικά | 🇷🇴 Română | 🇨🇿 Čeština | 🇫🇮 Suomi | 🇩🇰 Dansk | 🇳🇴 Norsk | 🇭🇺 Magyar | 🇹🇭 ภาษาไทย | 🇺🇿 Oʻzbekcha | 🇹🇼 繁體中文 | 🇵🇭 Filipino | 🇮🇱 עברית

PyPI CI License: Apache-2.0 Downloads Docs Discord YouTube LinkedIn YC S26

Try the graphify platform free for 14 days: app.graphify.com

Type /graphify in your AI coding assistant and it maps your entire project (code, docs, PDFs, images, videos) into a knowledge graph you can query instead of grepping through files.

  • Code maps for free, fully local. Code is parsed with tree-sitter AST: deterministic, no LLM, nothing leaves your machine. (Docs, PDFs, images and video use your assistant's model, or a configured API key, for a semantic pass.)
  • Every edge is explained. Each connection is tagged EXTRACTED (explicit in the source) or INFERRED (resolved by graphify), so you can tell what was read directly from what was inferred.
  • Not a vector index. No embeddings, no vector store: a real graph you traverse. Ask a question, trace the path between two things, or explain one concept.

Want this always-on, updating in the background across your code, docs, and meetings rather than only on demand? That is what we are building at graphify.com, and early access is open now at app.graphify.com.

graphify's interactive graph.html showing the FastAPI codebase as a force-directed knowledge graph with a legend of detected communities

The FastAPI codebase mapped by graphify. Every node is a concept, colors are detected communities, and the whole thing is clickable in graph.html.

Get started (30 seconds):

uv tool install graphifyy      # install the CLI (or: pipx install graphifyy)
graphify install               # register the skill with your AI assistant

Then, in your AI assistant:

/graphify .

That's it. You get three files:

graphify-out/
├── graph.html       open in any browser — click nodes, filter, search
├── GRAPH_REPORT.md  the highlights: key concepts, surprising connections, suggested questions
└── graph.json       the full graph — query it anytime without re-reading your files

Works in Claude Code, Cursor, Codex, Gemini CLI, GitHub Copilot, and 15+ more — pick your platform.


See it in action

graphify path query: a terminal asks for the shortest path between FastAPI and ModelField, and the answer lights up hop by hop across the knowledge graph

Once the graph is built you query it instead of reading files. Real output, graphify run on the FastAPI codebase shown above:

$ graphify explain "APIRouter"
Node: APIRouter
  Source:    routing.py L2210
  Community: 2
  Degree:    47

Connections (47):
  --> RequestValidationError [uses] [INFERRED]
  --> Dependant [uses] [INFERRED]
  --> .get() [method] [EXTRACTED]
  <-- __init__.py [imports] [EXTRACTED]
  ...

$ graphify path "FastAPI" "ModelField"
Shortest path (3 hops):
  FastAPI --uses--> DefaultPlaceholder <--references-- get_request_handler() --references--> ModelField

Every edge carries a confidence tag (EXTRACTED = explicit in the source, INFERRED = derived by resolution), so you can tell what was read directly from what was inferred. graphify query "<question>" returns a scoped subgraph for a plain-language question, and graphify path A B traces how any two things connect.


What it does

What you get out of the box:

Capability What you get
God nodes The most-connected concepts, so you see what everything flows through
Communities The graph split into subsystems (Leiden), with LLM-free labels
Cross-file links calls / imports / inherits / mixes_in resolved across ~40 languages via tree-sitter AST
Query, path, explain Ask a question, trace the path between two things, or explain one concept, all against graph.json
Rationale + doc refs # NOTE: / # WHY: comments and ADR/RFC citations become first-class nodes linked to the code
Beyond code Docs, PDFs, images, and video/audio all map into the same graph
Local-first Code is parsed locally with tree-sitter (no LLM, nothing leaves your machine); only the semantic pass over docs/media calls a backend, and only if you configure one

Benchmarks

Benchmark Metric graphify Field
LOCOMO (n=300) recall@10 0.497 mem0 0.048, supermemory 0.149
LOCOMO (n=300) QA accuracy 45.3% supermemory 49.7%, mem0 27.3%
LongMemEval-S (n=50) QA accuracy 76% tied with dense RAG
Graph build LLM credits 0 per-token for most systems

Every system ran on the same harness with the same model and budgets, scored by a judge blind-validated against a second judge (90.6% agreement, Cohen's kappa 0.81). Full per-system tables, the code-intelligence result, and reproduction commands: BENCHMARKS.md.


Prerequisites

Requirement Minimum Check Install
Python 3.10+ python --version python.org
uv (recommended) any uv --version curl -LsSf https://astral.sh/uv/install.sh | sh
pipx (alternative) any pipx --version pip install pipx

macOS quick install (Homebrew):

brew install [email protected] uv

Windows quick install:

winget install astral-sh.uv

Ubuntu/Debian:

sudo apt install python3.12 python3-pip pipx
# or install uv:
curl -LsSf https://astral.sh/uv/install.sh | sh

Install

Official package: The PyPI package is graphifyy (double-y). Other graphify* packages on PyPI are not affiliated. The CLI command is still graphify.

The official source repository is Graphify-Labs/graphify.

Step 1 — install the package:

# Recommended (isolated env; if 'graphify' isn't found after, run: uv tool update-shell):
uv tool install graphifyy

# Alternatives:
pipx install graphifyy
pip install graphifyy  # may need PATH setup — see note below

Step 2 — register the skill with your AI assistant:

graphify install

That's it. Open your AI assistant and type /graphify .

To install the assistant skill into the current repository instead of your user profile, add --project:

graphify install --project
graphify install --project --platform codex

Project-scoped installs write under the current directory, for example .claude/skills/graphify/SKILL.md or .agents/skills/graphify/SKILL.md (plus a references/ sidecar the skill loads on demand), and print a git add hint for files that can be committed. Per-platform commands that support project-scoped installs accept the same flag, for example graphify claude install --project or graphify codex install --project.

PowerShell note: Use graphify . not /graphify . — the leading slash is a path separator in PowerShell.

graphify: command not found? uv tool install / pipx install put the graphify command in their tool bin dir (~/.local/bin). If your shell can't find it right after install — common on a fresh macOS + zsh setup — that dir isn't on your PATH yet: run uv tool update-shell (or pipx ensurepath), then open a new terminal. With plain pip, add ~/.local/bin (Linux) or ~/Library/Python/3.x/bin (Mac) to your PATH, or run python -m graphify.

Running with uvx / uv tool run instead of installing? Name the package, not the command: uvx --from graphifyy graphify install. Plain uvx graphify … fails (No solution found … no versions of graphify) because uv tool run reads the first word as a package, and the package is graphifyy — the graphify command lives inside it.

Avoid pip install on Mac/Windows if possible. The skill resolves Python at runtime from graphify-out/.graphify_python; if that points to a different environment than where pip installed the package, you'll get ModuleNotFoundError: No module named 'graphify'. uv tool install and pipx install isolate the package in their own env and avoid this entirely.

Git hooks and uv tool / pipx: graphify hook install embeds the current interpreter path directly into the hook scripts at install time, so the post-commit hook fires correctly even in GUI git clients and CI runners where ~/.local/bin is not on PATH. If you reinstall or upgrade graphify, re-run graphify hook install to refresh the embedded path.

Strict mode (Claude Code): graphify install --project --strict makes the assistant actually use the graph. The default install nudges it to run graphify query before reading files; strict mode blocks the first raw source read of a session and redirects it to the graph, then reverts to the nudge (so it fires at most once per session and never gets stuck). Toggle at runtime with GRAPHIFY_HOOK_STRICT=1/0; the default install is unchanged (soft nudge).

Pick your platform (20+ assistants, click to expand)
Platform Install command
Claude Code (Linux/Mac) graphify install
Claude Code (Windows) graphify install (auto-detected) or graphify install --platform windows
CodeBuddy graphify install --platform codebuddy
Codex graphify install --platform codex
OpenCode graphify install --platform opencode
Kilo Code graphify install --platform kilo
GitHub Copilot CLI graphify install --platform copilot
VS Code Copilot Chat graphify vscode install
Aider graphify install --platform aider
OpenClaw graphify install --platform claw
Factory Droid graphify install --platform droid
Trae graphify install --platform trae
Trae CN graphify install --platform trae-cn
Gemini CLI graphify install --platform gemini
Hermes graphify install --platform hermes
Kimi Code graphify install --platform kimi
Amp graphify amp install
Agent Skills (cross-framework) graphify install --platform agents (alias --platform skills)
Kiro IDE/CLI graphify kiro install
Pi coding agent graphify install --platform pi
Cursor graphify cursor install
Devin CLI graphify devin install
Google Antigravity graphify antigravity install

Codex users also need multi_agent = true under [features] in ~/.codex/config.toml for parallel extraction. CodeBuddy uses the same Agent tool and PreToolUse hook mechanism as Claude Code. Factory Droid uses the Task tool for parallel subagent dispatch. OpenClaw and Aider use sequential extraction (parallel agent support is still early on those platforms). Trae uses the Agent tool for parallel subagent dispatch and does not support PreToolUse hooks, so AGENTS.md is the always-on mechanism.

--platform agents (alias --platform skills) targets the generic cross-framework Agent-Skills locations: the spec's user-global ~/.agents/skills/ (read by npx skills and spec-compliant frameworks) for a global install, and ./.agents/skills/ for a project (--project) install. The bare graphify install stays single-platform (Claude Code) by design — use the named agents platform when you want the skill discoverable by any framework that reads .agents/skills.

Codex uses $graphify instead of /graphify.

Optional extras (install only what you need)
Extra What it adds Install
pdf PDF extraction uv tool install "graphifyy[pdf]"
office .docx and .xlsx support uv tool install "graphifyy[office]"
google Google Sheets rendering uv tool install "graphifyy[google]"
video Video/audio transcription (faster-whisper + yt-dlp) uv tool install "graphifyy[video]"
mcp MCP stdio server uv tool install "graphifyy[mcp]"
neo4j Neo4j push support uv tool install "graphifyy[neo4j]"
falkordb FalkorDB push support uv tool install "graphifyy[falkordb]"
svg SVG graph export uv tool install "graphifyy[svg]"
leiden Leiden community detection (graspologic on Python < 3.13; native backend on 3.13+) uv tool install "graphifyy[leiden]"
ollama Ollama local inference uv tool install "graphifyy[ollama]"
openai OpenAI / OpenAI-compatible APIs uv tool install "graphifyy[openai]"
gemini Google Gemini API uv tool install "graphifyy[gemini]"
anthropic Anthropic Claude API (--backend claude, uses ANTHROPIC_API_KEY) uv tool install "graphifyy[anthropic]"
bedrock AWS Bedrock (uses IAM, no API key) uv tool install "graphifyy[bedrock]"
azure Azure OpenAI Service (--backend azure, uses AZURE_OPENAI_API_KEY + AZURE_OPENAI_ENDPOINT) uv tool install "graphifyy[openai]"
sql SQL schema extraction uv tool install "graphifyy[sql]"
postgres Live PostgreSQL introspection (--postgres DSN) uv tool install "graphifyy[postgres]"
dm BYOND DreamMaker .dm/.dme AST extraction (may need a C compiler + python3-dev if no wheel matches your platform) uv tool install "graphifyy[dm]"
terraform Terraform / HCL .tf/.tfvars/.hcl AST extraction uv tool install "graphifyy[terraform]"
pascal Pascal / Delphi .pas/.dpr/.dpk/.inc AST extraction (more accurate calls/inherits edges; falls back to a regex extractor when absent) uv tool install "graphifyy[pascal]"
ocaml OCaml .ml/.mli AST extraction uv tool install "graphifyy[ocaml]"
commonlisp Common Lisp .lisp/.cl/.lsp/.asd AST extraction uv tool install "graphifyy[commonlisp]"
robot Robot Framework .robot/.resource extraction (suites, test cases, keywords, keyword-call and resource/library import edges) uv tool install "graphifyy[robot]"
chinese Chinese query segmentation (jieba) uv tool install "graphifyy[chinese]"
all Everything above uv tool install "graphifyy[all]"

Make your assistant always use the graph

Run this once in your project after building a graph:

Platform Command
Claude Code graphify claude install
CodeBuddy graphify codebuddy install
Codex graphify codex install
OpenCode graphify opencode install
Kilo Code graphify kilo install
GitHub Copilot CLI graphify copilot install
VS Code Copilot Chat graphify vscode install
Aider graphify aider install
OpenClaw graphify claw install
Factory Droid graphify droid install
Trae graphify trae install
Trae CN graphify trae-cn install
Cursor graphify cursor install
Gemini CLI graphify gemini install
Hermes graphify hermes install
Kimi Code graphify install --platform kimi
Amp graphify amp install
Agent Skills (cross-framework) graphify agents install (alias graphify skills install)
Kiro IDE/CLI graphify kiro install
Pi coding agent graphify pi install
Devin CLI graphify devin install
Google Antigravity graphify antigravity install

This writes a small config file that tells your assistant to consult the knowledge graph for codebase questions, preferring scoped queries like graphify query "<question>" over reading the full report or grepping raw files.

  • Hook platforms (Claude Code, Gemini CLI): a hook fires automatically before search-style tool calls (and, on Claude Code, before reading source files one by one via the Read/Glob tools) and nudges your assistant toward the graph path.
  • Instruction-file platforms (Codex, OpenCode, Cursor, etc.): persistent instruction files (AGENTS.md, .cursor/rules/, etc.) provide the same query-first guidance.

GRAPH_REPORT.md is still available for broad architecture review.

CodeBuddy does the same two things as Claude Code: writes a CODEBUDDY.md section telling CodeBuddy to read graphify-out/GRAPH_REPORT.md before answering architecture questions, and installs PreToolUse hooks (.codebuddy/settings.json) that fire before Bash search commands and file reads, nudging toward graphify query instead.

Codex writes to AGENTS.md, which is what actually carries the always-on graph guidance on this platform. graphify codex install also registers a PreToolUse hook in .codex/hooks.json (graphify hook-check), but that entry is deliberately a no-op: Codex Desktop rejects hookSpecificOutput.additionalContext on PreToolUse, so emitting a nudge there would break Bash tool calls. Unlike Claude Code, where the hook (graphify hook-guard) does the nudging, on Codex the hook fires and intentionally does nothing, and AGENTS.md is the always-on mechanism.

Kilo Code installs the Graphify skill to ~/.config/kilo/skills/graphify/SKILL.md and a native /graphify command to ~/.config/kilo/command/graphify.md. graphify kilo install also writes AGENTS.md plus a native tool.execute.before plugin (.kilo/plugins/graphify.js + .kilo/kilo.json or .kilo/kilo.jsonc registration) so Kilo gets the same always-on graph reminder behavior through native .kilo config.

Cursor writes .cursor/rules/graphify.mdc with alwaysApply: true, so Cursor includes it in every conversation automatically, no hook needed.

To remove graphify from all platforms at once: graphify uninstall (add --purge to also delete graphify-out/). Or use the per-platform command (e.g. graphify claude uninstall).


What's in the report

  • God nodes — the most-connected concepts in your project. Everything flows through these.
  • Surprising connections — links between things that live in different files or modules. Ranked by how unexpected they are.
  • The "why" — inline comments (# NOTE:, # WHY:, # HACK:), docstrings, and design rationale from docs are extracted as separate nodes linked to the code they explain.
  • Suggested questions — 4–5 questions the graph is uniquely positioned to answer.
  • Confidence tags — every inferred relationship is marked EXTRACTED, INFERRED, or AMBIGUOUS. You always know what was found vs guessed.

What files it handles

Type Extensions
Code (37 tree-sitter grammars) .py .ts .mts .cts .js .jsx .tsx .mjs .go .rs .java .c .cpp .cc .cxx .h .hpp .cu .cuh .metal .rb .cs .kt .kts .scala .php .swift .lua .luau .toc .zig .ps1 .psm1 .psd1 .ex .exs .m .mm .ml .mli .jl .vue .svelte .astro .groovy .gradle .dart .v .sv .svh .sql .f .f90 .f95 .f03 .f08 .pas .pp .dpr .dpk .lpr .inc .dfm .lfm .lpk .sh .bash .json .dm .dme .dmi .dmm .dmf .sln .slnx .csproj .fsproj .vbproj .xaml .razor .cshtml (.dm/.dme requires uv tool install graphifyy[dm], .ml/.mli requires uv tool install graphifyy[ocaml]; .mts/.cts reuse the TypeScript grammar, .cc/.cxx and CUDA .cu/.cuh and Metal .metal reuse the C++ grammar)
Salesforce Apex .cls .trigger (regex-based; classes, interfaces, enums, methods, triggers, SOQL/DML edges)
Terraform / HCL .tf .tfvars .hcl (requires uv tool install graphifyy[terraform])
OCaml .ml .mli (requires uv tool install graphifyy[ocaml])
Common Lisp .lisp .cl .lsp .asd (requires uv tool install graphifyy[commonlisp])
Robot Framework .robot .resource (via the official robot.api parser, requires uv tool install graphifyy[robot]; suites, test cases, user keywords, keyword-call and Resource/Library/Variables import edges)
MCP configs .mcp.json mcp.json mcp_servers.json claude_desktop_config.json — extracts server nodes, package refs, env var requirements
Package manifests apm.yml pyproject.toml go.mod pom.xml — one canonical package node per package (by name) plus depends_on edges, so a package referenced from many manifests is a single hub
Docs .md .mdx .qmd .html .txt .rst .yaml .yml (markdown [text](./other.md) links and [[wikilinks]] become references edges between docs)
Office .docx .xlsx (requires uv tool install graphifyy[office])
Google Workspace .gdoc .gsheet .gslides (opt-in; requires gws auth and --google-workspace; Sheets need uv tool install graphifyy[google])
PDFs .pdf
Images .png .jpg .webp .gif
Video / Audio .mp4 .mov .mp3 .wav and more (requires uv tool install graphifyy[video])
YouTube / URLs any video URL (requires uv tool install graphifyy[video])

Terraform module calls with a literal local source (./... or ../...) link to a directory module node through an EXTRACTED module_source edge. Each directory node contains its scanned .tf files, so nested calls expose paths such as environment → application → base → resource. Scan the common repository root to include both callers and implementations. Paths resolve relative to the calling module, and excluded or out-of-root files are never loaded implicitly.

Remote sources and source expressions are not resolved; .tfvars, generic .hcl, and .tf.json files do not define module-source targets. References to module.app.output still target the module call rather than its implementation's output. The graph represents source configuration, not evaluated Terraform instances. Incremental Terraform changes reconcile the scanned .tf corpus, reusing cached syntax for unchanged files. After upgrading an existing graph, run graphify update . once to regenerate Terraform IDs and topology.

Code is extracted locally with no API calls (AST via tree-sitter). Everything else goes through your AI assistant's model API.

Google Drive for desktop .gdoc, .gsheet, and .gslides files are shortcut pointers, not document content. To include native Google Docs, Sheets, and Slides in a headless extraction, install and authenticate the gws CLI, then run:

uv tool install "graphifyy[google]"  # needed for Google Sheets table rendering
gws auth login -s drive
graphify extract ./docs --google-workspace

You can also set GRAPHIFY_GOOGLE_WORKSPACE=1. Graphify exports shortcuts into graphify-out/converted/ as Markdown sidecars, then extracts those files.


Common commands

/graphify .                        # build graph for current folder
/graphify ./docs --update          # re-extract only changed files
/graphify . --cluster-only         # rerun clustering without re-extracting
/graphify . --cluster-only --resolution 1.5      # more granular communities
/graphify . --cluster-only --exclude-hubs 99     # suppress utility super-hubs from god-node rankings
/graphify . --no-viz               # skip the HTML, just the report + JSON
/graphify . --wiki                 # build a markdown wiki from the graph
graphify export callflow-html      # Mermaid architecture/call-flow HTML (auto-regenerates on every git commit if hook is installed)

/graphify query "what connects auth to the database?"
/graphify path "UserService" "DatabasePool"
/graphify explain "RateLimiter"

/graphify add https://arxiv.org/abs/1706.03762   # fetch a paper and add it
/graphify add <youtube-url>                       # transcribe and add a video

graphify hook install              # auto-rebuild on commit + branch checkout (run `graphify update .` after `git pull` — see "Recommended workflow" below)
graphify merge-graphs a.json b.json              # combine two graphs

graphify prs                       # PR dashboard: CI state, review status, worktree mapping
graphify prs 42                    # deep dive on PR #42 with graph impact
graphify prs --triage              # AI ranks your review queue (uses whatever backend is configured)
graphify prs --conflicts           # PRs sharing graph communities — merge-order risk

See the full command reference below.


Ignoring files

Create a .graphifyignore in your project root — same syntax as .gitignore, including ! negation.

.gitignore is respected automatically. graphify reads the .gitignore in each directory. If a .graphifyignore is also present, the two are merged — .graphifyignore patterns are evaluated last, so they win on conflicts (including ! negations). Adding a .graphifyignore only ever excludes more; it never re-includes a file your .gitignore already excluded. Subdirectory scoping works the same way as git — an ignore file only affects its own subtree.

Pass --no-gitignore to graphify extract when git-ignored generated or transpiled code belongs in the graph. This disables .gitignore and .git/info/exclude; .graphifyignore still applies.

# .graphifyignore
node_modules/
dist/
*.generated.py

# only index src/, ignore everything else
*
!src/
!src/**

Team setup

For users building a team graph, the graphify-out/ directory is gitignored by default. If your team wants to share a graph, you should explicitly force-add only the queryable products so your teammates can consume them:

(Note: If you are contributing to the Graphify repository itself, do not commit your local graphify-out/ at all unless it's a specific test fixture).

Recommended git commands to share a graph (you only need to force-add once; git will track future changes normally):

git add -f graphify-out/graph.json
git add -f graphify-out/GRAPH_REPORT.md
# git add -f graphify-out/wiki/         # optional: if using the wiki export
# git add -f graphify-out/obsidian/     # optional: if using the Obsidian export

manifest.json is now portable — keys are stored as relative paths and re-anchored on load, so committing it is safe and avoids a full rebuild on first checkout.

The remaining graphify-out/ files stay machine-local and should not be force-added: .graphify_root and .graphify_python (absolute paths to this machine's scan root and interpreter), .graphify_analysis.json, the AST cache under graphify-out/cache/, and the needs_update flag. A teammate who pulls the shared graph.json can query it immediately; running graphify update re-anchors the committed manifest.json and rebuilds only what changed on their machine.

Recommended workflow

Set this up once per clone. From then on, three of your normal git commands keep the graph current by themselves, and one keeps it in sync with your team:

you do graphify does
graphify hook install (once, right after cloning) installs the hooks below, plus a merge driver so graph.json never shows conflict markers
git commit rebuilds automatically — AST only, no API cost
git checkout / git switch (branches) rebuilds automatically (a file-only git checkout -- <path> does not)
git pull / git merge run graphify update . right after
git push nothing to do

The commit and branch-switch rebuilds run in the background and return immediately, so on a large repo the graph can lag the commit by a few seconds — step 5 covers the rare case where you query before it catches up.

Step by step:

  1. Clone the repo and run graphify hook install once.
  2. Commit and switch branches as normal — the graph stays current on its own.
  3. After every git pull (or merge), run graphify update . to bring the graph in sync with what you just pulled. On a large or active repo, put it on autopilot with a pull alias:
    git config --global alias.gpull '!git pull && graphify update .'
  4. When docs or papers change, run /graphify --update to refresh those nodes too (code and docs update independently).
  5. If a query ever seems to be missing something you just added, run graphify update . first, then ask again.

Using the graph directly

# query the graph from the terminal
graphify query "show the auth flow"
graphify query "what connects DigestAuth to Response?" --graph graphify-out/graph.json

# expose the graph as an MCP server (for repeated tool-call access)
python -m graphify.serve graphify-out/graph.json
python -m graphify.serve --graph graphify-out/graph.json  # --graph flag also accepted

# register with Kimi Code:
kimi mcp add --transport stdio graphify -- python -m graphify.serve graphify-out/graph.json

# or serve over HTTP so a whole team points at one URL (no local graphify needed):
python -m graphify.serve graphify-out/graph.json --transport http --port 8080
python -m graphify.serve graphify-out/graph.json --transport http --host 0.0.0.0 --api-key "$SECRET"

The MCP server gives your assistant structured access: query_graph, get_node, get_neighbors, shortest_path, list_prs, get_pr_impact, triage_prs.

Shared HTTP server

--transport stdio (the default) spawns one local server per developer. --transport http serves the same tools over the MCP Streamable HTTP transport, so a single shared process can serve the graph for the whole team — clients point their IDE MCP config at http://<host>:8080/mcp instead of running graphify locally.

Flag Default Purpose
--transport {stdio,http} stdio Transport to serve on
--host 127.0.0.1 HTTP bind host (use 0.0.0.0 to expose beyond localhost)
--port 8080 HTTP bind port
--api-key env GRAPHIFY_API_KEY Require Authorization: Bearer <key> (or X-API-Key)
--path /mcp HTTP mount path
--json-response off Return plain JSON instead of SSE streams
--stateless off No per-session state (for load-balanced / CI deployments)
--session-timeout 3600 Reap idle stateful sessions after N seconds (0 disables)

The default 127.0.0.1 bind is loopback-only. Set --host 0.0.0.0 and --api-key together when exposing on a shared host. Run it in a container:

docker build -t graphify .
docker run -p 8080:8080 -v "$(pwd)/graphify-out:/data" graphify \
  /data/graph.json --transport http --host 0.0.0.0 --api-key "$SECRET"

WSL / Linux note: Ubuntu ships python3, not python. Use a venv to avoid conflicts:

python3 -m venv .venv && .venv/bin/pip install "graphifyy[mcp]"

Environment variables

These are only needed for headless / CI extraction (graphify extract). When running via the /graphify skill inside your IDE, the model API is provided by your IDE session — no extra keys needed.

Variable Used for When required
ANTHROPIC_API_KEY Claude (Anthropic) backend --backend claude
ANTHROPIC_BASE_URL Anthropic-compatible endpoint URL (LiteLLM proxy, gateways, ...) --backend claude (default: https://api.anthropic.com)
ANTHROPIC_MODEL Model name for the Claude backend — for custom endpoints, use the model name/alias your server exposes --backend claude (default: claude-sonnet-4-6)
GEMINI_API_KEY or GOOGLE_API_KEY Google Gemini backend --backend gemini
OPENAI_API_KEY OpenAI or OpenAI-compatible APIs --backend openai (local servers accept any non-empty value)
OPENAI_BASE_URL OpenAI-compatible server URL (llama.cpp, vLLM, LM Studio, ...) --backend openai (default: https://api.openai.com/v1)
OPENAI_MODEL Model name for the OpenAI backend — for self-hosted servers, use the model name/alias your server exposes (check its /v1/models endpoint), e.g. LFM2.5-8B-A1B-UD-Q4_K_XL for llama.cpp --backend openai (default: gpt-4.1-mini)
DEEPSEEK_API_KEY DeepSeek backend --backend deepseek
MOONSHOT_API_KEY Kimi Code backend --backend kimi
OLLAMA_BASE_URL Ollama local inference URL --backend ollama (default: http://localhost:11434)
OLLAMA_MODEL Ollama model name --backend ollama (default: auto-detect)
GRAPHIFY_OLLAMA_NUM_CTX Override Ollama KV-cache window size optional — auto-sized by default
GRAPHIFY_OLLAMA_KEEP_ALIVE Minutes to keep Ollama model loaded optional — set 0 to unload after each chunk
AZURE_OPENAI_API_KEY Azure OpenAI Service backend --backend azure
AZURE_OPENAI_ENDPOINT Azure resource endpoint URL --backend azure (required alongside API key)
AZURE_OPENAI_API_VERSION Azure API version override optional — default 2024-12-01-preview
AZURE_OPENAI_DEPLOYMENT or GRAPHIFY_AZURE_MODEL Azure deployment name optional — default gpt-4o
AWS_* / ~/.aws/credentials AWS Bedrock — standard credential chain --backend bedrock (no API key, uses IAM)
GRAPHIFY_MAX_WORKERS AST parallelism thread count optional — also --max-workers flag
GRAPHIFY_MAX_OUTPUT_TOKENS Raise output cap for dense corpora optional — e.g. 32768 for large files
GRAPHIFY_API_TIMEOUT Per-call timeout in seconds for HTTP, claude-cli, Anthropic SDK, and Bedrock backends (default: 600) optional — also --api-timeout flag
GRAPHIFY_MAX_RETRIES How many times to retry a rate-limited (429) request before giving up (default: 6; honors Retry-After) optional — raise for strict per-org limits (e.g. kimi); 0 disables
GRAPHIFY_MAX_RETRY_DEPTH How deep a truncated chunk may be bisected and re-extracted (default: 3, so up to 8x sub-calls for one chunk) optional — lower it to cap worst-case spend; 0 disables every retry (no bisection, no hollow-response retry), so a chunk costs exactly one call
GRAPHIFY_FORCE Force graph rebuild even with fewer nodes optional — also --force flag
GRAPHIFY_GOOGLE_WORKSPACE Auto-enable Google Workspace export optional — set to 1
GRAPHIFY_TRIAGE_BACKEND Backend for graphify prs --triage optional — auto-detected from available keys
GRAPHIFY_TRIAGE_MODEL Model override for triage optional — e.g. claude-opus-4-7
GRAPHIFY_QUERY_LOG_ENABLE Set to 1 to turn on the local query log at ~/.cache/graphify-queries.log (records each query/path/explain question + corpus path). Off by default — nothing is written unless you opt in (#1797) optional
GRAPHIFY_QUERY_LOG Enable the query log and write it to this path instead of the default optional — off unless this or _ENABLE is set
GRAPHIFY_QUERY_LOG_DISABLE Set to 1 to force the query log off (wins over the enable vars) optional
GRAPHIFY_QUERY_LOG_RESPONSES When the log is enabled, also record full subgraph responses (off by default) optional
GRAPHIFY_NO_AUTO_REFRESH Set to 1 to stop the CLI from refreshing installed skills that are older than the package after an upgrade optional — refresh is on by default
GRAPHIFY_MAX_GRAPH_BYTES Override the 512 MiB graph.json size cap — e.g. 700MB, 2GB, or plain bytes optional — useful for very large corpora
GRAPHIFY_MAX_CONTEXTS Maximum number of non-default project graphs retained by one multi-project MCP server optional — default: 8; invalid values use 8, and values below 1 use 1
GRAPHIFY_LLM_TEMPERATURE Override LLM temperature for semantic extraction — e.g. 0.7, or none to omit optional — auto-omitted for o1/o3/o4/gpt-5 reasoning models

Privacy

  • Code files — processed locally via tree-sitter. Nothing leaves your machine. A code-only corpus requires no API key — graphify extract runs fully offline. On a mixed repo, add --code-only to index just the code and skip the docs/PDFs/images that would otherwise need an LLM.
  • Video / audio — transcribed locally with faster-whisper. Nothing leaves your machine.
  • Docs, PDFs, images — sent to your AI assistant for semantic extraction (via the /graphify skill, using whatever model your IDE session runs). Headless graphify extract requires GEMINI_API_KEY / GOOGLE_API_KEY (Gemini), MOONSHOT_API_KEY (Kimi), ANTHROPIC_API_KEY (Claude), OPENAI_API_KEY (OpenAI), DEEPSEEK_API_KEY (DeepSeek), a running Ollama instance (OLLAMA_BASE_URL), AWS credentials via the standard provider chain (Bedrock - no API key needed, uses IAM), or the claude CLI binary (Claude Code - no API key needed, uses your Claude subscription). The --dedup-llm flag uses the same key.
  • Data residency — graphify extract auto-detects which provider to use based on which API key is set (priority: Gemini → Kimi → Claude → OpenAI → DeepSeek → Azure → Bedrock → Ollama). For code with data-residency requirements, use --backend ollama (fully local) or pass an explicit --backend flag. Kimi (MOONSHOT_API_KEY) routes to Moonshot AI servers in China.
  • No telemetry, no usage tracking, no analytics.
  • Query logging — every graphify query, graphify path, graphify explain, and MCP query_graph call is logged to ~/.cache/graphify-queries.log in JSON Lines format (timestamp, question, corpus, nodes returned, duration). Full subgraph responses are not stored by default. Set GRAPHIFY_QUERY_LOG_DISABLE=1 to opt out, or GRAPHIFY_QUERY_LOG=/dev/null to silence without disabling the code path.

Troubleshooting

graphify: command not found after installing The CLI is installed but its bin directory isn't on your shell's PATH. Pick the fix for how you installed:

  • uv (uv tool install graphifyy): the command lands in uv's tool bin dir (~/.local/bin), which a fresh macOS/zsh setup often doesn't have on PATH. Run uv tool update-shell, then open a new terminal. (Find the dir with uv tool dir --bin.)
  • pipx (pipx install graphifyy): run pipx ensurepath, then open a new terminal.
  • pip (pip install graphifyy): pip installs scripts to a user bin dir that may not be on PATH — add ~/Library/Python/3.x/bin (macOS) or ~/.local/bin (Linux) to your PATH in ~/.zshrc/~/.bashrc, or just run python -m graphify.

uvx graphify … or uv tool run graphify … fails to resolve graphify The PyPI package is graphifyy; graphify is only the command it provides. uv tool run treats the first word as a package name, so it looks for a package called graphify and reports No solution found … no versions of graphify. Name the package explicitly: uvx --from graphifyy graphify install (same as uv tool run --from graphifyy graphify install). Or uv tool install graphifyy once and then call graphify directly.

uv run --with graphifyy python -m graphify silently runs an older install uv run uses your system Python, so if an older graphifyy also lives there (e.g. a past pip install graphifyy), Python can find that copy first on sys.path and --with graphifyy won't override it. It runs with no error, but you get the old version's behavior — e.g. env overrides like OPENAI_BASE_URL are silently ignored, so requests hit the default endpoint and fail with a 401 that looks like a bad key. The fingerprint is a warning: skill is from graphify <newer>, package is <older> line — that means a different install was loaded, not just a stale skill. Check which copy actually loaded:

python -c "import graphify; print(graphify.__file__)"

Then run the installed command directly (it uses the uv-managed copy), or drop the stale system copy:

uvx --from graphifyy graphify extract . --backend openai   # names the package explicitly
pip uninstall graphifyy                                    # or remove the old system install

python -m graphify works but graphify command doesn't Your shell's PATH doesn't include the bin directory the command was installed to. Prefer uv tool install / pipx install over plain pip, then run uv tool update-shell / pipx ensurepath and open a new terminal (see the install notes above).

/graphify . causes "path not recognized" in PowerShell PowerShell treats a leading / as a path separator. Use graphify . (no slash) on Windows.

Graph has fewer nodes after --update or rebuild If a refactor deleted files, the old nodes linger. Pass --force (or set GRAPHIFY_FORCE=1) to overwrite even when the rebuild has fewer nodes.

extract exits with "extraction was incomplete ... refusing to overwrite" When an extraction pass crashes or a walk can't fully read the corpus, the run would be smaller than a complete one, so graphify extract refuses to overwrite a larger existing graph with the partial result (protecting your graph.json). Fix the underlying failure and re-run, or pass --allow-partial to overwrite anyway.

Graph has duplicate nodes for the same entity (ghost duplicates) Ghost duplicates (same symbol appearing twice — once from AST extraction with a source location, once from semantic extraction without) are now automatically merged at build time. If you see this in a graph built before v0.8.33, run a full re-extract to clean up:

graphify extract . --force

Ollama runs out of VRAM / context window exceeded The KV-cache window is auto-sized but may be too large for your GPU. Reduce it:

GRAPHIFY_OLLAMA_NUM_CTX=8192 graphify extract ./docs --backend ollama --token-budget 4000

LLM returned invalid JSON / Unterminated string warnings The model's JSON response hit its output-token limit and was cut off mid-string. graphify auto-recovers (it splits the chunk and re-extracts the halves, and an oversized single document is first sliced at heading/paragraph boundaries so the whole file is still covered), so these warnings are noisy but not data loss. To reduce the churn, raise the output cap or shrink each chunk's output:

GRAPHIFY_MAX_OUTPUT_TOKENS=16384 graphify extract . --mode deep   # lift the cap
graphify extract . --mode deep --token-budget 4000                # smaller input chunks -> smaller output

With a cloud gateway like OpenRouter, prefer --backend openai (set OPENAI_BASE_URL) over the Ollama shim — it's a cleaner OpenAI-compatible path. If the model has its own max-output ceiling, lowering --token-budget is the reliable lever.

Graph HTML is too large to open in a browser (>5000 nodes) Skip HTML generation and use the JSON directly:

graphify cluster-only ./my-project --no-viz
graphify query "..."

graph.json has conflict markers after two devs commit at once Run graphify hook install — it sets up a git merge driver that union-merges graph.json automatically so conflicts never happen.

Graph doesn't reflect a teammate's recent changes Run graphify update . right after git pull or any merge — see Recommended workflow. Commits and branch switches update the graph automatically via the installed hooks; syncing with a pull is the one step you run yourself. Fold it into a pull alias so it's one command either way:

git config --global alias.gpull '!git pull && graphify update .'

Confirm the hooks are active with graphify hook status; re-run graphify hook install after an interpreter upgrade/reinstall to refresh them.

Extraction returns empty nodes/edges for docs or PDFs Docs, PDFs, and images require an LLM call — code-only corpora need no key. Check that your API key is set and the backend is correct:

ANTHROPIC_API_KEY=sk-... graphify extract ./docs --backend claude

Skill version mismatch warning in your IDE Your installed graphify version is different from the skill file. After an upgrade, the first graphify command refreshes every installed skill that is older than the package, on all platforms at once, and keeps a locally edited SKILL.md as SKILL.md.bak. Set GRAPHIFY_NO_AUTO_REFRESH=1 to turn this off. A skill it can't refresh safely keeps the warning: one newer than the package, or a directory that two installers share (for example Copilot and graphify vscode install). Reinstall that platform by hand:

uv tool upgrade graphifyy
graphify install --platform <name>  # overwrites the skill file

Claude Code prompt cache invalidated after every graphify extract Graphify writes output files (graph.json, graphify-out/) into the workspace. If those paths aren't ignored, every write invalidates Claude Code's prompt cache, forcing a full re-upload at cache-write rates on the next turn. Add them to .claudeignore:

# .claudeignore
graph.json
graphify-out/

Full command reference

View on GitHub

Recent activity

commits and pull requests

Releases and announcements

218 total
  1. v0.9.72v0.9.72Sep 29, 20264 downloads

    - Feature: after a package upgrade, `graphify` refreshes stale installed skills automatically (the `SKILL.md` + references sidecar it manages) so the version-mismatch warning no longer requires a manual `graphify install`. It runs on any non-install CLI command when a skill is stale, backs up local edits to `SKILL.md.bak`, never touches your marker-bounded `CLAUDE.md`/`AGENTS.md`/`GEMINI.md` sections, and can be disabled with `GRAPHIFY_NO_AUTO_REFRESH=1` (#3895, #1805, thanks @bercedev). - Fix: `graph.html`'s Node Info panel now shows the real Type/Source/Community for each node instead of "Type: unknown / Source: -" (the panel read field names that did not match the emitted node schema); aggregated community nodes show a member count (#3918, #3914, thanks @hopstreax). - Fix: a Kotlin class property that is both annotated and has an inferred type (`@Volatile var x = 0`) no longer crashes extraction with an `UnboundLocalError` that dropped the whole file (#3915, thanks @nothariharan; #3899, thanks @harshaygadekar; #3884). - Fix: SQL DDL that appears before a PostgreSQL `DO $$ ... $$` block is now extracted — the block node the parser produces for that span is walked instead of skip

  2. v0.9.71v0.9.71Sep 28, 202674 downloads

    - Feature: SQL `CREATE TRIGGER` statements are now extracted and linked to their table (`ON <table>`), including `OR REPLACE`/`OR ALTER`, `INSTEAD OF`, and procedural `BEGIN…END` bodies that previously landed in a parser-error node and were dropped (#3863, thanks @rajatnagda45). - Feature: Groovy `enum` declarations and their constants are extracted, with members linked to the enum via `case_of` (#3861, thanks @rajatnagda45). - Fix: R class definitions created via a namespace-qualified constructor (`R6::R6Class`, `methods::setRefClass`) are now recognised, so the class body and its methods are no longer dropped (#3864, thanks @rajatnagda45). - Fix: R6 intra-class calls through `self$method()` and `private$method()` now resolve to the sibling method instead of dangling; `super$` is left unresolved (single-file dispatch is not visible) (#3865, thanks @rajatnagda45). - Fix: the markdown wikilink index now respects `.graphifyignore`/`.gitignore`/`--exclude` — it no longer descends huge ignored trees when building the `[[link]]` index, and a wikilink can no longer resolve into an ignored file (#3826, #3822, thanks @Abhirup0). - Fix: manifest re-anchoring keeps a foreign-platform key in

  3. v0.9.70v0.9.70Sep 27, 202631 downloads

    - Security: the Fortran capital-F cpp step no longer allows an untrusted `.F`/`.F90` source to read arbitrary host files. `-nostdinc -I /dev/null` did not stop cpp from resolving absolute (`#include "/etc/passwd"`) or traversing (`#include "../../../secret"`) includes, which inlined host-file contents into `graph.json`/`GRAPH_REPORT.md` and the LLM context on the default offline path. Every `#include` directive is now stripped before preprocessing and the source is fed to cpp on stdin; macro expansion is preserved (GHSA-pcc4-rvhr-2pr8, CWE-22/73/200). - Security: the Aider/Devin monolith `--watch` snippet no longer interpolates the agent-substituted `INPUT_PATH` into a shell command — it now reads the trusted `graphify-out/.graphify_root` written in Step 1, closing the last instance of the shell-injection class from #3642 (#3852, #3844, thanks @hopstreax). - Security: Terraform secret redaction now also covers a `value` paired with a secret-named `name` in name/value pair lists (`environment = [{ name = "DB_PASSWORD", value = "…" }]`, ECS `valueFrom` included), where the sensitive signal is the sibling `name` literal rather than a key (#3870, #3787, thanks @breken-ai). - Fix: `gra

  4. v0.9.69v0.9.69Sep 26, 202643 downloads

    - Feature: five language extractors gained structural depth — **OCaml** classes now emit their methods (via the `method` relation) and instance variables (#3838, thanks @rajatnagda45); **Elixir** `defprotocol`/`defimpl` are extracted as containers holding their functions, with a same-file `implements` link (#3839, thanks @rajatnagda45); **Fortran** derived-type `contains` blocks link type-bound procedures to the type, resolving the `=> impl` target (#3840, thanks @rajatnagda45); **Julia** macro definitions and `@enum` types are extracted, including valued (`red = 1`) and typed (`Color::UInt8`) enum forms, with members using the `case_of` relation (#3841, thanks @rajatnagda45); **Kotlin** annotations (class/function/property, use-site targets) and `val`/`var` primary-constructor properties now produce edges (#3848, #3842, thanks @nikhilsaxena04). - Fix: a TypeScript "solution" `tsconfig.json` that only carries `references` (no `paths` of its own) now resolves path aliases declared in the referenced project configs, so alias imports in a `tsc -b` layout no longer dangle (#3753, #3745, thanks @abhay-codes07). - Fix: extraction now skips the process pool up front when the `spawn` star

  5. v0.9.68v0.9.68Sep 25, 202634 downloads

    - Security: the `/graphify add ... --watch` reference no longer passes the raw, agent-substituted `INPUT_PATH` placeholder unquoted into a shell command (`… -m graphify.watch INPUT_PATH`), where a scan root containing `$(…)`, backticks, or `;` could execute — a follow-on to the Step 1 fix. The watcher now reads the trusted `graphify-out/.graphify_root` that Step 1 resolves, so there is no path to substitute (#3742, #3642, thanks @ayushcodes10). The identical placeholder still appears in the Aider/Devin monolith `--watch` snippet and is tracked separately. - Fix: incremental updates (`update`/`extract --code-only`/`watch`) now preserve a cross-file `imports`/`calls`/`uses` edge whose target symbol lives in an unchanged file — the symbol-resolution facts pass widens its target index with the read-only resolution context, so re-extracting one file no longer silently drops its edges into the rest of the graph; a genuinely removed edge is still pruned (#3812, #3776, thanks @hopstreax). - Fix: C# type references (`inherits`/`implements`/parameter/return/base types) no longer resolve to a same-named non-type node — an enum member, property, field, or method sharing a type's name is exclu

Code frequency

additions and deletions
+72.3K-72.3KWeek of 2026-03-29: +18,822 linesWeek of 2026-03-29: -2,680 linesWeek of 2026-04-05: +28,799 linesWeek of 2026-04-05: -6,806 linesWeek of 2026-04-12: +4,208 linesWeek of 2026-04-12: -1,120 linesWeek of 2026-04-19: +10,618 linesWeek of 2026-04-19: -6,752 linesWeek of 2026-04-26: +8,139 linesWeek of 2026-04-26: -3,157 linesWeek of 2026-05-03: +11,281 linesWeek of 2026-05-03: -1,889 linesWeek of 2026-05-10: +72,298 linesWeek of 2026-05-10: -4,968 linesWeek of 2026-05-17: +11,883 linesWeek of 2026-05-17: -538 linesWeek of 2026-05-24: +16,835 linesWeek of 2026-05-24: -884 linesWeek of 2026-05-31: +45,682 linesWeek of 2026-05-31: -9,844 linesWeek of 2026-06-07: +9,337 linesWeek of 2026-06-07: -864 linesWeek of 2026-06-14: +8,796 linesWeek of 2026-06-14: -1,947 linesWeek of 2026-06-21: +12,136 linesWeek of 2026-06-21: -1,221 linesWeek of 2026-06-28: +14,540 linesWeek of 2026-06-28: -1,638 linesWeek of 2026-07-05: +26,068 linesWeek of 2026-07-05: -18,927 linesWeek of 2026-07-12: +11,563 linesWeek of 2026-07-12: -872 linesWeek of 2026-07-19: +8,301 linesWeek of 2026-07-19: -715 linesWeek of 2026-07-26: +8,903 linesWeek of 2026-07-26: -922 linesWeek of 2026-08-02: +7,493 linesWeek of 2026-08-02: -697 linesWeek of 2026-08-09: +9,846 linesWeek of 2026-08-09: -622 linesWeek of 2026-08-16: +10,264 linesWeek of 2026-08-16: -461 linesWeek of 2026-08-23: +7,130 linesWeek of 2026-08-23: -416 linesWeek of 2026-08-30: +6,732 linesWeek of 2026-08-30: -365 linesWeek of 2026-09-06: +7,028 linesWeek of 2026-09-06: -559 linesWeek of 2026-09-13: +7,278 linesWeek of 2026-09-13: -268 linesWeek of 2026-09-20: +1,130 linesWeek of 2026-09-20: -490 linesMar 29, 2026Sep 20, 2026
+385.1K lines added, -69.6K removed over the last year.

Commits per week

last 52 weeks
1280Week of 2025-10-05: 0 commitsWeek of 2025-10-12: 0 commitsWeek of 2025-10-19: 0 commitsWeek of 2025-10-26: 0 commitsWeek of 2025-11-02: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 0 commitsWeek of 2026-02-15: 0 commitsWeek of 2026-02-22: 0 commitsWeek of 2026-03-01: 0 commitsWeek of 2026-03-08: 0 commitsWeek of 2026-03-15: 0 commitsWeek of 2026-03-22: 0 commitsWeek of 2026-03-29: 10 commitsWeek of 2026-04-05: 120 commitsWeek of 2026-04-12: 39 commitsWeek of 2026-04-19: 37 commitsWeek of 2026-04-26: 74 commitsWeek of 2026-05-03: 100 commitsWeek of 2026-05-10: 69 commitsWeek of 2026-05-17: 45 commitsWeek of 2026-05-24: 59 commitsWeek of 2026-05-31: 67 commitsWeek of 2026-06-07: 67 commitsWeek of 2026-06-14: 41 commitsWeek of 2026-06-21: 63 commitsWeek of 2026-06-28: 128 commitsWeek of 2026-07-05: 94 commitsWeek of 2026-07-12: 106 commitsWeek of 2026-07-19: 89 commitsWeek of 2026-07-26: 72 commitsWeek of 2026-08-02: 15 commitsWeek of 2026-08-09: 92 commitsWeek of 2026-08-16: 87 commitsWeek of 2026-08-23: 73 commitsWeek of 2026-08-30: 55 commitsWeek of 2026-09-06: 82 commitsWeek of 2026-09-13: 105 commitsWeek of 2026-09-20: 122 commitsWeek of 2026-09-27: 30 commitsOct 5, 2025Sep 27, 2026
1.9K commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 18 commitsSun 1:00 — 4 commitsSun 2:00 — 4 commitsSun 3:00 — 1 commitsSun 4:00 — 0 commitsSun 5:00 — 2 commitsSun 6:00 — 3 commitsSun 7:00 — 0 commitsSun 8:00 — 1 commitsSun 9:00 — 2 commitsSun 10:00 — 11 commitsSun 11:00 — 14 commitsSun 12:00 — 9 commitsSun 13:00 — 10 commitsSun 14:00 — 15 commitsSun 15:00 — 29 commitsSun 16:00 — 12 commitsSun 17:00 — 12 commitsSun 18:00 — 23 commitsSun 19:00 — 17 commitsSun 20:00 — 9 commitsSun 21:00 — 5 commitsSun 22:00 — 12 commitsSun 23:00 — 14 commitsMon 0:00 — 6 commitsMon 1:00 — 9 commitsMon 2:00 — 1 commitsMon 3:00 — 3 commitsMon 4:00 — 0 commitsMon 5:00 — 0 commitsMon 6:00 — 1 commitsMon 7:00 — 0 commitsMon 8:00 — 2 commitsMon 9:00 — 7 commitsMon 10:00 — 14 commitsMon 11:00 — 15 commitsMon 12:00 — 13 commitsMon 13:00 — 20 commitsMon 14:00 — 26 commitsMon 15:00 — 26 commitsMon 16:00 — 38 commitsMon 17:00 — 19 commitsMon 18:00 — 25 commitsMon 19:00 — 14 commitsMon 20:00 — 9 commitsMon 21:00 — 14 commitsMon 22:00 — 31 commitsMon 23:00 — 10 commitsTue 0:00 — 14 commitsTue 1:00 — 5 commitsTue 2:00 — 8 commitsTue 3:00 — 9 commitsTue 4:00 — 6 commitsTue 5:00 — 0 commitsTue 6:00 — 1 commitsTue 7:00 — 0 commitsTue 8:00 — 2 commitsTue 9:00 — 13 commitsTue 10:00 — 14 commitsTue 11:00 — 15 commitsTue 12:00 — 18 commitsTue 13:00 — 17 commitsTue 14:00 — 16 commitsTue 15:00 — 22 commitsTue 16:00 — 17 commitsTue 17:00 — 5 commitsTue 18:00 — 22 commitsTue 19:00 — 3 commitsTue 20:00 — 14 commitsTue 21:00 — 19 commitsTue 22:00 — 29 commitsTue 23:00 — 19 commitsWed 0:00 — 23 commitsWed 1:00 — 8 commitsWed 2:00 — 2 commitsWed 3:00 — 1 commitsWed 4:00 — 2 commitsWed 5:00 — 2 commitsWed 6:00 — 2 commitsWed 7:00 — 2 commitsWed 8:00 — 4 commitsWed 9:00 — 12 commitsWed 10:00 — 11 commitsWed 11:00 — 16 commitsWed 12:00 — 21 commitsWed 13:00 — 19 commitsWed 14:00 — 28 commitsWed 15:00 — 31 commitsWed 16:00 — 11 commitsWed 17:00 — 12 commitsWed 18:00 — 8 commitsWed 19:00 — 19 commitsWed 20:00 — 24 commitsWed 21:00 — 10 commitsWed 22:00 — 15 commitsWed 23:00 — 26 commitsThu 0:00 — 21 commitsThu 1:00 — 12 commitsThu 2:00 — 7 commitsThu 3:00 — 3 commitsThu 4:00 — 1 commitsThu 5:00 — 0 commitsThu 6:00 — 1 commitsThu 7:00 — 1 commitsThu 8:00 — 9 commitsThu 9:00 — 17 commitsThu 10:00 — 10 commitsThu 11:00 — 19 commitsThu 12:00 — 10 commitsThu 13:00 — 18 commitsThu 14:00 — 22 commitsThu 15:00 — 18 commitsThu 16:00 — 13 commitsThu 17:00 — 13 commitsThu 18:00 — 15 commitsThu 19:00 — 9 commitsThu 20:00 — 12 commitsThu 21:00 — 8 commitsThu 22:00 — 16 commitsThu 23:00 — 30 commitsFri 0:00 — 19 commitsFri 1:00 — 14 commitsFri 2:00 — 5 commitsFri 3:00 — 1 commitsFri 4:00 — 0 commitsFri 5:00 — 1 commitsFri 6:00 — 1 commitsFri 7:00 — 2 commitsFri 8:00 — 2 commitsFri 9:00 — 2 commitsFri 10:00 — 19 commitsFri 11:00 — 12 commitsFri 12:00 — 4 commitsFri 13:00 — 6 commitsFri 14:00 — 22 commitsFri 15:00 — 28 commitsFri 16:00 — 24 commitsFri 17:00 — 10 commitsFri 18:00 — 17 commitsFri 19:00 — 8 commitsFri 20:00 — 10 commitsFri 21:00 — 14 commitsFri 22:00 — 21 commitsFri 23:00 — 19 commitsSat 0:00 — 3 commitsSat 1:00 — 8 commitsSat 2:00 — 3 commitsSat 3:00 — 2 commitsSat 4:00 — 4 commitsSat 5:00 — 2 commitsSat 6:00 — 5 commitsSat 7:00 — 0 commitsSat 8:00 — 4 commitsSat 9:00 — 9 commitsSat 10:00 — 9 commitsSat 11:00 — 5 commitsSat 12:00 — 12 commitsSat 13:00 — 16 commitsSat 14:00 — 13 commitsSat 15:00 — 10 commitsSat 16:00 — 28 commitsSat 17:00 — 16 commitsSat 18:00 — 17 commitsSat 19:00 — 25 commitsSat 20:00 — 13 commitsSat 21:00 — 17 commitsSat 22:00 — 19 commitsSat 23:00 — 30 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.
DateListRankStars gained
Jul 27, 2026daily#11+4
Jul 26, 2026daily#9+4
Jul 24, 2026daily#8+5
Jul 21, 2026daily#22+3
Jul 19, 2026daily#9+7
Jul 18, 2026daily#13+5
Jul 17, 2026daily#6+9
Jul 16, 2026daily#5+10
Jul 15, 2026daily#12+8
Jul 14, 2026daily#2+9
Jul 13, 2026daily#15+3
Jul 12, 2026daily#3+6
Jul 7, 2026daily#7+10
Jul 4, 2026daily#22+21
Jul 3, 2026daily#11+13
  • public-apis/public-apis

    A collective list of free APIs

    486.1K stars · Python

  • openclaw/openclaw

    The AI that really does things. Any OS. Any Platform. The lobster way. 🦞

    391.3K stars · TypeScript

  • donnemartin/system-design-primer

    Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.

    373.2K stars · Python

  • obra/superpowers

    An agentic skills framework & software development methodology that works.

    295.2K stars · Shell

  • practical-tutorials/project-based-learning

    Curated list of project-based tutorials

    285.8K stars · Python

  • affaan-m/ECC

    The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.

    272.8K stars · JavaScript