graphify-labs/graphify
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.
How graphify is put together
graphify is a Python 3.10+ CLI (PyPI package 'graphifyy') that maps a folder of code, docs, PDFs, images, or video into a queryable knowledge graph. Code is parsed locally with tree-sitter ASTs (no LLM) by per-language extractors under graphify/extractors/, edges are tagged EXTRACTED vs INFERRED, communities are detected (Leiden via optional graspologic), and results are written to graphify-out/ as graph.html, GRAPH_REPORT.md, and graph.json (networkx node-link format). A separate subsystem (graphify/install.py) registers an AI-assistant skill plus PreToolUse/BeforeTool hooks across 20+ hosts (Claude Code, Codex, Cursor, Gemini CLI, etc.), and an optional MCP server (graphify/serve.py, mcp + starlette extras) exposes the graph over MCP transports. Data flow: scan corpus -> AST/semantic extraction -> graph build/dedup/cluster -> export/query (explain/path/query commands) -> optional export to Neo4j/FalkorDB.
Languages
Frameworks
Datastores
Infrastructure
Major components
CLI entry & command dispatch
graphify/__main__.py and graphify/cli.py expose subcommands (install, explain, path, query, hook-guard, hook-check) and stage timing/size caps.
Assistant install subsystem
graphify/install.py copies packaged skill markdown and writes/removes hooks and config sections for Claude Code, Codex, Cursor, Gemini, Kilo, Kiro, Devin, VS Code, Antigravity and other hosts.
Language extractors
graphify/extractors/* parse ~40 languages with tree-sitter grammars into nodes/edges, including config/manifest JSON handling and language-specific resolution modules (ruby, pascal, csharp dispatch).
Graph build pipeline
graphify/build.py, extract.py, cluster.py, dedup.py, global_graph.py, _minhash.py assemble, deduplicate, community-detect, and merge graphs.
Query & reporting
graphify/report.py, querylog.py, wiki.py, reflect.py, affected.py answer explain/path/query questions and produce GRAPH_REPORT.md highlights.
Exporters
graphify/exporters/html.py renders interactive graph.html; graphdb.py exports to Neo4j/FalkorDB.
Security helpers
graphify/security.py provides URL scheme validation, SSRF-guarded DNS-resolve-once connections, redirect re-validation, fetch size caps, and graph-file size limits.
Ingest/introspection adapters
graphify/mcp_ingest.py, scip_ingest.py, manifest_ingest.py, pg_introspect.py, cargo_introspect.py, google_workspace.py pull structure from external sources (SCIP indexes, manifests, Postgres, Cargo, Google Workspace).
A quieter week focused on cross-repo type merging, C# property nodes, and a batch of small language-extractor fixes.
5 weeksWeek of 2026-08-24
Week of 2026-08-24latest
A quieter week focused on cross-repo type merging, C# property nodes, and a batch of small language-extractor fixes.
Week of 2026-08-17
A very busy week of hardening: PDF slicing for oversized documents, LLM reply recovery, caching and export fixes, plus a new --no-dedup flag.
Week of 2026-08-10
The busiest week of the period: nested JavaScript function extraction, a brand-new OCaml extractor, Git-tracked file detection fixes, and many robustness patches.
Week of 2026-08-03
A broad correctness sweep across extractors and core paths: direction-aware pathfinding, silent-failure surfacing, and multi-language fix batches.
Week of 2026-07-27
Focused on merge integrity and watch-mode reliability: tier-aware merging, manifest provenance, MCP server compatibility, and Ruby mixin resolution.
Over the last five weeks, Graphify shipped a steady stream of correctness fixes across its many language extractors (C#, Go, JS, SQL, Ruby, and more), making the code-graph tool more reliable at linking calls, types, and files across projects. The team also hardened the LLM-powered extraction pipeline — slicing oversized PDFs, recovering malformed model replies, and fixing caching bugs — while polishing the watch mode, export, and install experience. The pace was heaviest in mid-August (78–97 commits per week), tapering to smaller, focused batches by late August.
Week by week
2026-08-24A quieter week focused on cross-repo type merging, C# property nodes, and a batch of small language-extractor fixes.latest6 changes
Feature
Link shared type declarations across two repos
When two repositories declare the same type, the merge step now links them together, with a test pinning that the link survives even if the declarations drift apart.
Feature
C# property member nodes
The C# extractor now creates a graph node for each class property.
Feature
C# interface-to-implementation links
Interface methods are now connected to their single implementing method in the graph.
Fix
Bash command-substitution call edges
Calls made via x=$(fn) style command substitution in shell scripts are now captured as edges.
Fix
SQL tables inside transactions
CREATE TABLE statements wrapped in BEGIN/COMMIT blocks are now extracted correctly.
Fix
Small extractor fixes for PowerShell, Common Lisp, Julia, and Zig
Enum definitions in PowerShell, cross-file superclass links in Common Lisp, abstract types with supertypes in Julia, and enum/union methods in Zig are all now extracted properly.
2026-08-17A very busy week of hardening: PDF slicing for oversized documents, LLM reply recovery, caching and export fixes, plus a new --no-dedup flag.6 changes
Fix
Slice oversized PDFs before sending to the LLM
Large PDFs are now split into pieces based on their actual extracted text so they fit within token limits instead of failing.
Fix
Recover JSON from reasoning-first model replies
When an AI model puts its answer before its reasoning text, Graphify can now find and use the JSON anyway, retrying hollow responses rather than discarding them.
Feature
New --no-dedup flag for incremental merges
Incremental updates can now skip fuzzy duplicate-detection when re-merging graphs, speeding up repeated runs.
Fix
Export fixes for large and messy graphs
The visual graph.html export works again for large graphs, and a stray control character in a label no longer aborts the whole export.
Fix
tsconfig caches cleared between runs
Path-alias settings cached from TypeScript configs no longer leak stale results from one run into the next.
Fix
Obsidian vault adoption and wikilink resolution
Exporting into an existing Obsidian vault now keeps its existing notes instead of orphaning them, and wikilinks resolve vault-wide when a sibling-file match misses.
2026-08-10The busiest week of the period: nested JavaScript function extraction, a brand-new OCaml extractor, Git-tracked file detection fixes, and many robustness patches.6 changes
Feature
New OCaml extractor
Graphify can now parse OCaml .ml/.mli files (via an optional tree-sitter add-on) to build code graphs for OCaml projects.
Feature
Nested JavaScript functions extracted
Functions declared inside other functions — including arrow-function components and callbacks — now appear as their own nodes in the graph.
Fix
Git-tracked files survive .gitignore patterns
Files already tracked by Git are no longer wrongly excluded just because a .gitignore pattern would match them, and detection is faster when no .gitignore applies.
Fix
Case-only symbol collisions kept in Go
Go symbols that differ only in letter case (e.g. 'User' vs 'user') are now both preserved instead of one being dropped.
Fix
Lazy CommonJS requires retained
Dependencies loaded through lazy require() calls in JavaScript are now recorded in the dependency graph without double-counting.
Fix
Safer bash source paths and export filenames
Shell scripts can no longer use '..' paths to escape the analyzed folder, and exported filenames are budget-checked against full destination paths including multibyte characters.
2026-08-03A broad correctness sweep across extractors and core paths: direction-aware pathfinding, silent-failure surfacing, and multi-language fix batches.6 changes
Fix
Path queries respect edge direction
The path and shortest_path commands now follow the actual direction of relationships by default, giving more accurate answers.
Fix
Four silent CLI failures surfaced
Cases where the command-line tool previously reported success despite something going wrong now fail loudly.
Fix
Multi-language extractor correctness batch
Fixes landed for JavaScript, Kotlin, Swift, and SQL extraction, including Swift cross-file extension calls that were being dropped.
Fix
Retry failed extractions and show claude-cli errors
Failed AI extractions are retried automatically, and error messages from the claude-cli backend are now shown to users.
Fix
Deterministic dedup collision ranking
When duplicate node IDs collide, the tool now consistently prefers the active version over archived ones.
Fix
C# receiver typing scoped per declaration
Method-level name reuse in C# no longer causes genuine call edges to be dropped from the graph.
2026-07-27Focused on merge integrity and watch-mode reliability: tier-aware merging, manifest provenance, MCP server compatibility, and Ruby mixin resolution.6 changes
Fix
Tier-aware merging preserves both graph layers
Re-extracting part of a project no longer wipes out the other layer (e.g., semantic results) during a merge.
Fix
Watch mode writes a proper manifest
Watch mode now records manifest.json in the target's output folder with anchor and commit provenance, and inherits the directed-graph flag on rebuilds.
Fix
MCP server works with SDK 1.x and 2.x
The built-in server now supports both major versions of the Model Context Protocol SDK, unblocking fresh installs.
Fix
Ruby mixin targets resolved correctly
Compact and nested mixin declarations in Ruby now resolve to the right targets, eliminating phantom 'concern hub' nodes.
Fix
SQL cross-file table references
Table references across SQL files now normalize identifiers and handle sourceless stubs so links form correctly.
Fix
Go predeclared functions filtered from resolution
Built-in Go functions like len or cap are no longer mistaken for user-defined call targets.
Dependencies and code review
Dependency advisories
Security Watch
5 vulnerable packages (16 advisories) across 202 scanned dependencies.
cryptography 49.0.0
1 advisory. Fixed in 50.0.0.
How it can be abusedAn attacker who can send encrypted messages to a server and watch how it responds could gradually decode those messages by measuring tiny differences in error messages and timing during decryption. This project is a local CLI that parses files into a knowledge graph and does not decrypt attacker-supplied encrypted data, so no realistic attack path exists here.
- highGHSA-g6cj-pr64-35w5cryptography: PKCS#7 EnvelopedData decryption exposes a Bleichenbacher oracle through distinguishable errors and timing
pillow 12.2.0
10 advisories. Fixed in 12.3.0.
How it can be abusedGraphify scans folders that can contain images and PDFs, and Pillow decodes those files locally. Someone who tricks a user into running graphify on a folder containing a crafted image or PDF, such as a file downloaded from the internet, could crash the scan with a huge decompressed file or, worse, corrupt memory during decoding, affecting anyone who points the tool at content they do not fully trust.
- highGHSA-45hq-cxwh-f6vcPillow `BdfFontFile`: `Image.new()` called without `_decompression_bomb_check()` — bomb protection bypass via font loading
- highGHSA-5x94-69rx-g8h2Pillow: `FontFile.compile()`: `Image.new()` called without `_decompression_bomb_check()`
- highGHSA-62p4-gmf7-7g93Pillow: Out-of-bounds read via attacker-controlled row stride on Pillow's mmap path (McIdas AREA files)
- highGHSA-6r8x-57c9-28j4Pillow: Heap out-of-bounds write `Image.paste()` / `Image.crop()` via signed coordinate overflow
- highGHSA-8v84-f9pq-wr9xPillow `PcfFontFile._load_bitmaps()`: `Image.frombytes()` called without `_decompression_bomb_check()` — bomb protection bypass via PCF font loading
- highGHSA-9hw9-ch79-4vh6Pillow: Controlled heap out-of-bounds write in Pillow `ImageCmsTransform.apply()` via output mode mismatch
- highGHSA-jjj6-mw9f-p565Pillow: Decompression Bomb DoS via PdfParser.PdfStream.decode()
- highGHSA-phj9-mv4w-65pmPillow `GdImageFile._open()`: image dimensions accepted without `_decompression_bomb_check()`
- highGHSA-vjc4-5qp5-m44jPillow JPEG2000 tiled decode retains a growing scratch buffer and can be used for denial of service
- highGHSA-xj96-63gp-2gmrPillow: Heap out-of-bounds write in `ImageFilter.RankFilter` via integer overflow in `ImagingExpand`
pypdf 6.13.3
2 advisories. Fixed in 6.14.1.
How it can be abusedAnyone who runs graphify on a folder containing a maliciously crafted PDF could get stuck: a crafted image inside the PDF sends pypdf into an endless loop, so the scan hangs and never produces output. This affects any user indexing untrusted or third-party documents.
- highGHSA-5xf7-4p34-54qrpypdf: Possible infinite loop for not terminated inline images
- highGHSA-g867-7843-wf8qpypdf: Possible infinite loop for not terminated inline images (ASCII85 and ASCIIHex filter)
soupsieve 2.8.3
2 advisories. Fixed in 2.8.4.
How it can be abusedIf someone runs graphify on a folder containing files from others, like a shared docs folder or cloned repo, a crafted HTML file could make the scan hang or eat all available memory instead of finishing, freezing the engineer's machine mid-run. Anyone who points the tool at content they did not fully control is affected.
- highGHSA-2wc2-fm75-p42xSoup Sieve has Memory Exhaustion via Large Comma-Separated Selector Lists
- highGHSA-836r-79rf-4m37Soup Sieve: Regular Expression Denial of Service (ReDoS) via Selector Parser
yt-dlp 2026.6.9
1 advisory. Fixed in 2026.7.4.
How it can be abusedAn attacker who can influence the URL or filename that yt-dlp downloads could plant malicious content in the link file that yt-dlp writes, which downstream tools then pass to a shell and execute as commands. This only matters for projects that run yt-dlp and feed its --write-link output back into shell commands; graphify parses local files with tree-sitter and never invokes yt-dlp, so its users are not affected.
- highGHSA-6v4j-43gg-vj32yt-dlp: Downstream command injection via improper sanitization of yt-dlp --write-link output
Code review
No concrete code-level issues confirmed.
Get this report every week for your repos.
GitZoid learns each repo, reports what changed, and flags what needs attention. One flat price for the whole team.
$19 a month, flat · First 10 outputs free · No card required