← All reportsPublic report

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.

110k stars Python View on GitHubprofiled 11d ago
Try GitZoid
362PRs this week
64Contributors
202Deps scanned
5Issues found
01 · Repo overview

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

PythonMarkdown

Frameworks

setuptools (build backend)tree-sitternetworkxstarlette (optional, MCP HTTP transport)urllib/http.client (stdlib networking)pytest

Datastores

Neo4j (optional exporter)FalkorDB (optional exporter)filesystem graph.json (primary store)

Infrastructure

Docker (Dockerfile, .dockerignore)PyPI distributionpre-commit hooks (.pre-commit-config.yaml)Nuitka (dev dep for binary builds)

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).

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.

03 · Security check

Dependencies and code review

202 dependencies scanned

Dependency advisories

Security Watch

5 vulnerable packages (16 advisories) across 202 scanned dependencies.

warninghigh · pypifixed in 50.0.0

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
warninghigh · pypifixed in 12.3.0

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`
warninghigh · pypifixed in 6.14.1

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)
warninghigh · pypifixed in 2.8.4

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
warninghigh · pypifixed in 2026.7.4

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