Skip to main content

code2graph

PyPI version PyPI downloads Python CI License

Turn a source code repository into a queryable knowledge graph — no LLM required.

code2graph statically extracts the structure of a codebase — files, modules, functions, classes, calls, dependencies, schemas, infrastructure — as a typed graph of nodes and edges. Rank the most relevant nodes for any query with Personalized PageRank and pass focused context to any LLM.

Pure Python. No LLM dependency. Bring your own model.


Quick start

pip install codebase2graph
# Extract full graph from a repo
codebase2graph /path/to/repo --graph all --output repo.graph.json

# Python call graph only
codebase2graph /path/to/repo --graph call --output calls.graph.json

# With actionable summary
codebase2graph /path/to/repo --graph all \
  --output repo.graph.json \
  --summary-output repo.summary.json
from code2graph import build_graph

graph = build_graph("/path/to/repo", graph_type="all")
# graph.nodes — list of Node objects
# graph.edges — list of Edge objects

Why graph-based code context?

Approach What you lose
Dump entire codebase into prompt Token budget, focus
Embed + search file chunks Call relationships, module structure, dependency chains
code2graph Nothing — relationships are explicit labeled edges

The graph knows that auth.login() calls db.query(), which imports connection_pool, which depends on config.DATABASE_URL. Flat file chunks don't.


Graph types

Type What it extracts
folder Repo, folder, file nodes with contains edges
call Functions/methods with calls and defines edges (Python, JS, TS)
entity Classes, functions, constants with defines and imports edges
schema Database tables, columns, foreign keys (SQL, ORM models)
workflow CI/CD pipelines, GitHub Actions, Makefile targets
infra Dockerfiles, docker-compose, Terraform, Kubernetes manifests
security Hardcoded secrets patterns, dangerous function calls, exposed endpoints
web React/Vue components, routes, API endpoints
android Activities, services, permissions from AndroidManifest.xml
decision ADR-style architecture decisions
all Merged graph from all applicable extractors
codebase2graph /path/to/repo --graph call   --output call.graph.json
codebase2graph /path/to/repo --graph schema --output schema.graph.json
codebase2graph /path/to/repo --graph infra  --output infra.graph.json
codebase2graph /path/to/repo --graph all    --output full.graph.json

Installation

pip install codebase2graph

No extra dependencies required — all graph types work with the standard install.


Python API

Build a graph

from code2graph import build_graph, Graph, Node, Edge

# Full graph
graph: Graph = build_graph("/path/to/repo", graph_type="all")

# Specific type
call_graph = build_graph("/path/to/repo", graph_type="call")
schema_graph = build_graph("/path/to/repo", graph_type="schema")

Inspect results

print(f"{len(graph.nodes)} nodes, {len(graph.edges)} edges")

# Filter by kind
functions = [n for n in graph.nodes if n.attributes.get("kind") == "function"]
calls = [e for e in graph.edges if e.label == "calls"]

Export

import json

# To dict
d = {"nodes": [vars(n) for n in graph.nodes], "edges": [vars(e) for e in graph.edges]}
json.dump(d, open("graph.json", "w"), indent=2)

Graph output format

{
  "nodes": [
    {
      "id": "function:auth.login",
      "label": "login",
      "attributes": {
        "kind": "function",
        "module": "auth",
        "file": "src/auth.py",
        "line": 42
      },
      "content": "def login(username, password): ..."
    }
  ],
  "edges": [
    {
      "id": "edge:auth.login:calls:db.query",
      "from": "function:auth.login",
      "to": "function:db.query",
      "label": "calls"
    }
  ],
  "current_node_id": "repo"
}

CLI reference

codebase2graph <repo> [options]

Arguments:
  repo                    Path to the repository root

Options:
  --graph TYPE            Graph type: folder, call, entity, schema, workflow,
                          infra, security, web, android, decision, all
                          (default: all)
  --output PATH           Write graph JSON to this file (default: stdout)
  --pretty                Pretty-print JSON output
  --summary-output PATH   Write graph summary JSON (entrypoints, workflow start
                          nodes, fan-in/out nodes, isolated modules)
  --update-existing PATH  Update an existing graph JSON in place
  --update-summary-output PATH
                          Write update diff summary JSON
  -h, --help              Show help

Update mode

Rebuild a graph from the current repository state while preserving stable node IDs and custom attributes added outside code2graph:

codebase2graph /path/to/repo --graph all \
  --update-existing repo.graph.json \
  --update-summary-output repo.update.json

Update mode removes stale nodes/edges for deleted or changed code, adds new nodes/edges, and keeps stable IDs for nodes that haven't changed. Custom attributes on existing nodes are preserved.


Use cases

  • Code review — extract call graph before/after a PR to see what changed structurally
  • LLM code assistance — pass ranked subgraph as context instead of dumping whole files
  • Dependency analysis — find all callers of a function, all modules depending on a service
  • Security audit — detect hardcoded secrets, dangerous API patterns, exposed endpoints
  • Architecture docs — extract infra + schema + decision graphs for living documentation
  • Onboarding — give a new developer a ranked subgraph of the most important entry points

Design principles

  • Pure Python — no LLM, no cloud, no database required
  • Deterministic — same repository state always produces the same graph
  • Static analysis only — no code execution, safe to run on any codebase
  • Works with any model — output is plain JSON; pass to GPT-4, Claude, Llama, or any other model
  • Companion to docs2graph — same node/edge schema, combine code and documentation graphs

Related projects

Package What it does
docs2graph Documents → knowledge graph (same node/edge schema)
graph2sql Graph-based schema analysis for text-to-SQL

Contributing

See CONTRIBUTING.md.

git clone https://github.com/jw-open/code2graph
cd code2graph
pip install -e ".[dev]"
pytest tests/ -v

License

Apache-2.0 — see LICENSE

Metadata

Release files for codebase2graph 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for codebase2graph 0.2.0
File Size Uploaded
codebase2graph-0.2.0.tar.gz 84.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for codebase2graph 0.2.0
File Interpreter ABI Platform
codebase2graph-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 159.8 kB

Release files / codebase2graph-0.2.0.tar.gz

Download URL codebase2graph-0.2.0.tar.gz
Size 84.5 kB
Tags Source
SHA-256 checksum
How to use checksums
470441c71979510224ca94fc3b8d33f05ebc396fe43ee9dcb524da5c65247e9a
BLAKE2b-256 checksum
How to use checksums
a5847b567ab0be1e0de34dc559a0aedad4bcedbc2aac2bd43d0c3f24986f192c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.0

Release files / codebase2graph-0.2.0-py3-none-any.whl

Download URL codebase2graph-0.2.0-py3-none-any.whl
Size 75.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
136b01418480deb5e22bce902c7bfc7b565ec1a88fdabf26eb4a3177b652fca2
BLAKE2b-256 checksum
How to use checksums
ea3e16b098f7ac9edcd18f6d7a50ce7bb6cb98f84399c43360efff1901c004af
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.0

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page