Skip to main content

Introduction

callix parses Python, TypeScript, Go, Rust, PHP, C and C++ projects — and the YAML that wires them together — normalizing everything into a shared graph IR of typed nodes and directed relations, which it hands to Python code for dependency analysis, navigation, and code-intelligence tooling.

Repository → Language Adapter → Graph (IR) → your code

Everything of substance is written in Rust and ships inside one extension module. The Python package is a facade of re-exports.

What makes it different

Most code-analysis tooling asks you to assemble it: install a language server, put it on PATH, configure the transport, keep the versions in step. callix links the analysis engines into the module itself:

LanguageSymbol resolutionExtra setup
Pythonty, linked as a librarynone
TypeScripttypescript-go, linked as a Go c-archivenone
Gogo/packages + go/types, same c-archivea Go toolchain
Rustrust-analyzer scip index, decoded nativelyrust-analyzer and Cargo
PHPa symbol table built from the sourcesnone
C / C++a symbol table over the parsed sourcesnone
YAMLnone — it declares no symbolsnone

For Python and TypeScript that means pip install callix and nothing else — the type checkers and their standard-library stubs (typeshed, lib.d.ts) are inside the wheel. Go and Rust need their own toolchain, because a language's standard library cannot be compiled in: type checking reads its sources from GOROOT or from a real Cargo workspace. PHP and the C family have no checker worth linking and no widely installed indexer worth shelling out to, so callix builds a symbol table from the sources it already parsed and reports degraded — honest about being a symbol table rather than a type checker.

Scope and non-goals

callix produces a graph IR and stops there. Deliberately, it does not:

  • persist state or own a database — the graph is a value you serialize, diff, or feed to a backend of your choosing;
  • watch the filesystem or re-index on its own — a scan is a pure function of the source tree; deterministic node IDs make incremental updates possible, but the caller drives them;
  • compute embeddings or semantic search — the graph is structural and type-aware, not a vector index;
  • provide a UI, a CLI, or an agent runtime.

Relation to graphlens

callix is a full rewrite of graphlens by the same author. The public API is compatible — the same 14 node kinds, 12 relation kinds, the same deterministic IDs and serialization format — so a graph produced by either one reads in the other. What changed is that parsing, the graph models, boundary extraction and symbol resolution all moved to Rust, the resolvers stopped being external processes you install separately, and PHP, C and C++ were added.

See Migrating from graphlens for the differences that matter in practice, and Benchmarks for the numbers.