CodeRadar v0.5.7
Live semantic graph of your codebase — incremental, queryable, LLM-writable.
CodeRadar maintains an incrementally updatable graph of your code's logical structure, enabling LLMs and developer tools to both query and safely rewrite code through a unified pipeline.
Why CodeRadar
CodeGraph pioneered the semantic code graph for agents — CodeRadar builds on that foundation with capabilities CodeGraph doesn't have:
| Capability | CodeGraph | CodeRadar |
|---|---|---|
| Mutate code | ❌ Read-only | ✅ AST-aware body replacement, indent preservation, WriteGuard safety |
| Temporal queries | ❌ | ✅ Macrame bitemporal DB — query the graph as it existed at any point in time |
| Rewrite safety | ❌ | ✅ Dry-run mutation plans, stale-write rejection, automatic rollback on tainted updates |
| Semantic fallback resolution | ❌ | ✅ L4 embedding-based resolution when structural resolution fails |
| Python-native embedding | ❌ | ✅ Native Python integration for embeddings, GraphRAG, and ML pipelines |
| Zero runtime boot | 1.4s Node.js startup | ✅ <50ms — Python process is already warm |
| LLM-driven refactoring | ❌ | ✅ plan_body_replacement() — LLM proposes, CodeRadar validates, applies, and rolls back on error |
The key insight: CodeGraph answers "what is this codebase?" — CodeRadar answers that and "what was it yesterday?" and "what would it look like if I changed X?" and "apply that change safely."
Performance
Head-to-head benchmarks (N=5 median, lower is better):
| Codebase | Files | Lang | CodeRadar | CodeGraph 1.5.0 | Ratio |
|---|---|---|---|---|---|
| CodeRadar self | 84 | Python+Rust | 554ms | 1,434ms | 0.39× (faster) |
| codegraph-main | 558 | TypeScript | 12,232ms | 6,970ms | 1.75× |
CodeRadar wins on small-to-medium Python/Rust projects due to zero runtime boot overhead. On large TypeScript codebases, CodeGraph's hand-written per-language Rust walkers and flat-buffer emission are still faster than the generic .scm-query engine, but the gap narrowed from 2.77× to 1.75×. See performance-roadmap.md for the optimization backlog.
Architecture
Python Layer (CLI, Visualizers, Framework Resolvers, GraphRAG, MCP Server)
│
PyO3 FFI + register_synthetic_edge() bridge
│
Rust Core (ProjectedGraph, Tree-sitter 18-lang, Parallel Extraction,
Resolution Cascade L1-L3, Query Engine, Mutation Engine)
│
Macrame DB (bitemporal persistence with valid_from/valid_to timestamps)
| Metric | Value |
|---|---|
| Languages indexed | 28 (12 Tier 1, 16 Tier 2, 280+ Tier 3) |
| Tests | 476 (163 Rust + 313 Python) |
| Query surface | Pest structural + Macrame agent traversals + vector search |
| Frameworks | Django, Flask, FastAPI, Go, Actix, Express, Spring Boot, Laravel, ASP.NET, Rails, NestJS, Vue Router, React Router |
| Agents | MCP server with explore, node, search, affected tools |
Quick Start
pip install coderadar-rs
# Initial analysis (includes framework detection)
coderadar init src/
# Query
coderadar query "functions where is_async == true"
# Explore call flows
coderadar explore UserService.create --direction downstream
# Watch for changes
coderadar watch src/ --debounce 50
# Visualize
coderadar visualize module_graph --format graphviz src/
Python API
import coderadar
# Initial analysis
graph = coderadar.analyze("src/")
# Query
for cls in graph.query("classes where inherits_from contains 'BaseModel'"):
print(cls.name, [m.name for m in cls.methods])
# Framework-aware exploration (Django/Flask/FastAPI/Go/Actix routes included)
flow = graph.explore(["UserService.create"], direction="downstream")
# Callers (includes framework edges: route → handler)
callers = graph.callers_of("views.py::user_detail")
# Update after file change
report = graph.update_file("src/core/engine.py")
# Mutation (LLM-driven)
plan = graph.plan_body_replacement(
entity_id="src/auth.py::validate_user",
new_body=" return bool(re.match(r'^[^@]+@[^@]+$', email))",
dry_run=True
)
# Module children resolution
children = graph.module_children("src/auth.py::auth")
for cls in children["classes"]:
print(cls["name"], cls["grammar_kind"])
# Temporal queries (Macrame bitemporal)
past = graph.as_of("2026-08-01T00:00:00Z")
Language Support
| Tier | Languages | Resolution | Mutation |
|---|---|---|---|
| Tier 1 | Python, TypeScript, JavaScript, Rust, Go, Java, C, C++, Ruby, PHP, C#, Kotlin | Import → Signature → Framework | Full tool suite |
| Tier 2 | Swift, Scala, Lua, Elixir, Zig, R, Bash, Dart, Protobuf, Dockerfile, SQL, HCL, CMake, GraphQL, Erlang, Haskell | Import → Signature | replace_body, create_entity |
| Tier 3 | Shell, SQL, HTML, CSS, YAML, TOML, JSON, Markdown + 280 more | Signature Match only | replace_body, create_entity |
Resolution Cascade
| Layer | Method | Confidence | Languages |
|---|---|---|---|
| L1 | Import + Scope | 0.80–0.89 | All |
| L2 | Signature Match | 0.40–0.79 | All |
| L3 | Framework Resolvers | 0.80–1.00 | Python, Go, Rust |
| L4 | Embedding (Python) | 0.20–0.39 | Python |
| L5 | LSP Override | 1.00 | Optional, disabled by default |
Stack Graphs (L1 in v3.3 spec) was deferred to post-v1. CodeGraph ships 30+ languages at production scale with zero Stack Graphs dependency — compiler-grade scope disambiguation is not required for MCP agent use cases.
Framework Resolvers
CodeRadar detects and extracts framework-specific patterns that tree-sitter can't see:
| Framework | Language | Detection | Extracted Patterns |
|---|---|---|---|
| Django | Python | manage.py |
path() routes, DRF router.register(), admin registrations, .as_view() handlers |
| Flask | Python | @app.route |
Route decorators, Flask-RESTful add_resource(), Blueprint registration |
| FastAPI | Python | APIRouter |
@app.get()/@router.post() routes, Depends() injection chains, include_router() |
| Go | Go | go.mod |
gin.GET(), mux.HandleFunc(), Chi/Echo/Fiber route patterns |
| Actix | Rust | Cargo.toml |
App::new().route(), web::resource(), #[get]/#[post] attribute macros |
| Express | JS/TS | package.json |
app.get(), router.post(), chained .route() builder, app.use() middleware |
| Spring Boot | Java | pom.xml/build.gradle |
@GetMapping, @PostMapping, @RequestMapping(method=...), class-level @RequestMapping prefix, [controller] token replacement |
| Laravel | PHP | composer.json |
Route::get(), Route::resource(), Route::group() prefix propagation, [Controller::class, 'method'] array + 'Controller@method' string syntax |
| ASP.NET | C# | .csproj/.sln |
[HttpGet], [HttpPost], [Route("api/[controller]")] token replacement, Minimal API app.MapGet() |
| Rails | Ruby | Gemfile |
has_many/belongs_to/has_one associations, before_action/after_action callbacks |
| NestJS | TS | package.json |
@Controller route prefix, @Get/@Post routes, @Module dependency edges |
| Vue Router | JS/TS | package.json |
createRouter route objects, lazy import() component resolution, addRoute dynamic routes |
| React Router | JSX/TSX | package.json |
JSX <Route> declarations, v6 data router objects, <Link>/<NavLink> navigation tracking |
Framework edges are registered in the Rust graph — agents can trace from URL patterns to handler functions via callers_of() / callees_of().
v0.5.7 Feature Highlights
- 13 framework resolvers — Django, Flask, FastAPI, Go, Actix, Express, Spring Boot, Laravel, ASP.NET, Rails, NestJS, Vue Router, React Router — detect route registrations, model associations, controller callbacks, and navigation links across 7 languages
- 10 new languages — Bash, Dart, Protobuf, Dockerfile, SQL, HCL, CMake, GraphQL, Erlang, Haskell (28 languages total across 3 tiers)
- QueryPlanner — natural-language intent classifier routing to MacrameQuery primitives
- 476 tests, 0 failures — 163 Rust + 313 Python, full E2E coverage
v0.5.6 Feature Highlights
- 9 framework resolvers — Django, Flask, FastAPI, Go, Actix, Express, Spring Boot, Laravel, ASP.NET — detect route registrations and synthesize handler edges across 6 languages
- 10 new languages — Bash, Dart, Protobuf, Dockerfile, SQL, HCL, CMake, GraphQL, Erlang, Haskell (28 languages total across 3 tiers)
- QueryPlanner — natural-language intent classifier routing to MacrameQuery primitives
- 451 tests, 0 failures — 163 Rust + 288 Python, full E2E coverage
v0.5.4 Feature Highlights
- Single-pass cursor-driven extraction — QueryCursor directly drives entity emission, eliminating the two-pass tag→walk pipeline. Inline fn-ref subtree scanning during function emission. 37% faster on real-world TypeScript codebases.
- Parallel extraction pipeline — 3-phase design: collect → parallel parse/tag/walk (fragment merge) → sequential projection commit.
- 18-language query files — per-language
.scmqueries with automated compile validation. C/C++ and TypeScript/JavaScript query files split to eliminate grammar mismatches. - Query compilation caching —
CompiledQuerywraps pre-compiled queries + pre-indexed capture tags; compiles once per language, not per file. grammar_kindfield — raw tree-sitter node kind on every Class entity (e.g.class_declaration/structfor Swift)- Function-as-value capture — detects
self.on_click = handler, callback assignments, return values, kwargs - Cross-file fn-ref — resolves imported names across module boundaries
- Noise filtering — builtin type filter (70+ types), literal receiver filter, name stoplist (12 names)
- Docstring extraction — preceding comment runs for all languages, not just
@docstringcaptures - Elixir
def/defp— precise extraction via predicate queries __all__detection —=,+=,.extend(),.append()patternsmodule.children()— resolves child entity IDs to full dicts- Parameter annotations — type annotations extracted and filtered for builtins
- Live file watcher —
notify-based debounced watcher with incremental re-indexing - Graphviz visualizer — call graph rendering with SCC cycle highlighting
- Scoped call resolution — per-file resolution with caller/callee tracking
- Benchmark pipeline — balanced (50 modules × 1000 calls) and heavy (100 modules × 4000 calls) correctness tests
Project Structure
core_indexer/ # Rust core
queries/ # 18 .scm query files (one per language)
src/
extract/ # Tree-sitter: tagger (query cursor) + walker (hierarchy) + docstring + decorators
update/ # Incremental diff + patch + WAL
resolve/ # Resolution cascade (import_graph, orchestrator, signature, cache, stack_graph stub)
query/ # Pest grammar + execution engine
mutation/ # AST-aware refactoring (rope, indent, WriteGuard)
fs/ # File watcher (notify) + git integration
graph.rs # In-memory ProjectedGraph + parallel extraction + reverse indexes
storage.rs # Macrame concept/edge persistence
lib.rs # PyO3 FFI bindings
py_agent/src/coderadar/ # Python layer
resolvers/ # 13 framework resolvers: Django, Flask, FastAPI, Go, Actix, Express, Spring Boot, Laravel, ASP.NET, Rails, NestJS, Vue Router, React Router
embedding/ # Content-addressed dedup
agent/ # GraphRAG query pipeline
lsp/ # Persistent LSP warm pool
mutation/ # Tool router for LLM
mcp/ # MCP server (explore, node, search, affected)
query/ # Query planner + templates + cache
visualizers/ # Mermaid + Graphviz (SCC cycle highlighting)
docs/ # Specifications + code review + performance roadmap
tests/ # 140 Python tests (E2E, MCP, framework resolvers, benchmarks)
Configuration
# .coderadar.toml
[project]
languages = ["python"]
roots = ["src/", "tests/"]
[resolution]
min_confidence = 0.3
[macrame]
db_path = ".coderadar/store/coderadar.db"
[mutation]
enabled = true
default_dry_run = true
[performance]
worker_threads = 4
debounce_ms = 50
License
MIT — incorporates techniques from CodeGraph (MIT License).
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file coderadar_rs-0.5.7-cp39-abi3-win_amd64.whl.
File metadata
- Download URL: coderadar_rs-0.5.7-cp39-abi3-win_amd64.whl
- Upload date:
- Size: 10.4 MB
- Tags: CPython 3.9+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
82b134de1f0daf6b4bb18e9f8f7f263cdd7570904c1349e16b97faf657134e96
|
|
| MD5 |
10944494ba998c56e936ef1963668db1
|
|
| BLAKE2b-256 |
7296617c58c30962863b098e3868cce05d0b744029eee268927648eeff47787f
|
Provenance
The following attestation bundles were made for coderadar_rs-0.5.7-cp39-abi3-win_amd64.whl:
Publisher:
release.yml on opticsWolf/coderadar
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
coderadar_rs-0.5.7-cp39-abi3-win_amd64.whl -
Subject digest:
82b134de1f0daf6b4bb18e9f8f7f263cdd7570904c1349e16b97faf657134e96 - Sigstore transparency entry: 2425785354
- Sigstore integration time:
-
Permalink:
opticsWolf/coderadar@36c2ff8518d53c481b36622496a294de057c2bc1 -
Branch / Tag:
refs/tags/v0.5.7 - Owner: https://github.com/opticsWolf
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@36c2ff8518d53c481b36622496a294de057c2bc1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file coderadar_rs-0.5.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: coderadar_rs-0.5.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 11.3 MB
- Tags: CPython 3.9+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fadc6ee43ba54c29f31cac80c204276f974c8c27fedf135ff4e46a66e3825890
|
|
| MD5 |
18004c3043c17fe2131378ad0b9e0d36
|
|
| BLAKE2b-256 |
3f9c5ab3f90d3c6356cb2ab974b6e0b1838460f065a471f538cbd53b7c2f49f8
|
Provenance
The following attestation bundles were made for coderadar_rs-0.5.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on opticsWolf/coderadar
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
coderadar_rs-0.5.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
fadc6ee43ba54c29f31cac80c204276f974c8c27fedf135ff4e46a66e3825890 - Sigstore transparency entry: 2425784656
- Sigstore integration time:
-
Permalink:
opticsWolf/coderadar@36c2ff8518d53c481b36622496a294de057c2bc1 -
Branch / Tag:
refs/tags/v0.5.7 - Owner: https://github.com/opticsWolf
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@36c2ff8518d53c481b36622496a294de057c2bc1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file coderadar_rs-0.5.7-cp39-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: coderadar_rs-0.5.7-cp39-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 10.4 MB
- Tags: CPython 3.9+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6acf0349f04cc136f512cd555539eb2dad0b6910add16eaad2d4cb5f7eefaf9a
|
|
| MD5 |
5d8d3c5d8c78d0d5f191bd661f69abcd
|
|
| BLAKE2b-256 |
8e709bc4dcaec3b5e62b40d0791e9271ca726de2e3c5fb776d8ff0726abea8ef
|
Provenance
The following attestation bundles were made for coderadar_rs-0.5.7-cp39-abi3-macosx_11_0_arm64.whl:
Publisher:
release.yml on opticsWolf/coderadar
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
coderadar_rs-0.5.7-cp39-abi3-macosx_11_0_arm64.whl -
Subject digest:
6acf0349f04cc136f512cd555539eb2dad0b6910add16eaad2d4cb5f7eefaf9a - Sigstore transparency entry: 2425785050
- Sigstore integration time:
-
Permalink:
opticsWolf/coderadar@36c2ff8518d53c481b36622496a294de057c2bc1 -
Branch / Tag:
refs/tags/v0.5.7 - Owner: https://github.com/opticsWolf
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@36c2ff8518d53c481b36622496a294de057c2bc1 -
Trigger Event:
push
-
Statement type: