callix
Polyglot code analysis in Rust. Parses Python, TypeScript, Go, Rust, PHP, C, C++ and YAML into a shared graph IR — with the type checkers linked in, so there are no language servers to install.
Repository → Language Adapter → Graph (IR) → your code
Nodes and directed relations, typed and deterministic: functions, classes, modules, the calls between them, and the HTTP or gRPC boundaries where one service meets another.
Why
Code analysis usually asks you to assemble it — install a language server, put
it on PATH, wire up the transport, keep the versions in step. callix links
the analysis engines into the module instead:
| Language | Symbol resolution | Extra setup |
|---|---|---|
| Python | ty, linked as a library | none |
| TypeScript | typescript-go, linked as a Go c-archive | none |
| Go | go/packages + go/types, same c-archive |
a Go toolchain |
| Rust | rust-analyzer scip index, decoded natively |
rust-analyzer and Cargo |
| PHP | a symbol table built from the sources | none |
| C / C++ | a symbol table over the parsed sources | none |
| YAML | none — it declares no symbols | none |
Python and TypeScript need nothing beyond the wheel — the checkers and their
standard-library stubs are inside it. Go and Rust use the toolchain the project
already has, because a standard library shipped as sources cannot be frozen
into a wheel. PHP and the C family have no checker worth linking and no widely
installed indexer worth shelling out to — every precise C/C++ option requires a
compile_commands.json, which almost no repository ships — so callix builds a
symbol table from the sources and reports degraded, honest about being a symbol
table and not a type checker.
Installation
pip install callix
Python ≥ 3.10. Wheels for Linux glibc and musl (x86_64, aarch64) and macOS (arm64, x86_64); Windows is not supported.
The published release is 0.1.0 — four adapters (Python, TypeScript, Go, Rust) and Python ≥ 3.13. PHP, C, C++ and YAML are on
mainand unreleased; build from source to use them.
Usage
from callix import NodeKind, PythonAdapter
graph = PythonAdapter().analyze("path/to/project")
print(len(graph.nodes), len(graph.relations))
for node in graph.nodes_by_kind(NodeKind.FUNCTION):
print(node.qualified_name, graph.callers(node.id))
graph.to_json(indent=2) # serialization
old.diff(new) # structural diff
The same call works for every other language — TypeScriptAdapter, GoAdapter,
RustAdapter, PhpAdapter, CAdapter, CppAdapter, YamlAdapter — and each
discovers its own project roots, so a monorepo works without configuration.
Symbol resolution is on by default. resolve=False gives a structural graph;
graph.metadata["resolver_status"] always says how complete the result is.
A Python server declaring @app.get("/users/{id}") and a TypeScript client
calling fetch("/users/1") produce the same boundary node, so merging
their graphs links the two services. See
Cross-language analysis.
Documentation
https://callix-tools.github.io/callix/
- Installation · Quick start · Concepts
- Adapters and how the resolvers work
- Graph model · API reference
- Migrating from graphlens
Benchmarks
Last run: 2026-07-29 13:55 UTC · callix main · runner Linux x86_64 · single cold run, indicative only.
| Project | Lang | Commit | LOC | Files | Nodes | Relations | Time | Peak RSS | KLOC/s | Resolver | Resolved |
|---|---|---|---|---|---|---|---|---|---|---|---|
| apache/superset | python | c83fb2b |
399 519 | 1 886 | 179 307 | 379 535 | 17.2s | 1,004 MB | 23.2 | ok | 84% of 281 667 (10s) |
| colinhacks/zod | typescript | 1fb56a5 |
74 194 | 404 | 15 236 | 27 578 | 2.3s | 420 MB | 32.2 | ok | 89% of 17 067 (1s) |
| gin-gonic/gin | go | 73726dc |
23 672 | 98 | 11 688 | 15 646 | 5.4s | 933 MB | 4.4 | ok | 99% of 12 755 (0s) |
| casdoor/casdoor | go | 696bcf0 |
86 898 | 458 | 32 606 | 42 295 | 35.1s | 4,207 MB | 2.5 | ok | 100% of 33 504 (7s) |
| gohugoio/hugo | go | 4d22555 |
224 821 | 897 | 75 619 | 100 542 | 16.8s | 4,432 MB | 13.3 | ok | 98% of 78 036 (4s) |
| BurntSushi/ripgrep | rust | 4649aa9 |
50 275 | 98 | 5 420 | 15 318 | 17.1s | 1,076 MB | 2.9 | ok | 99% of 11 668 (0s) |
| tokio-rs/axum | rust | c59208c |
43 653 | 296 | 8 162 | 15 095 | 88.1s | 3,124 MB | 0.5 | ok | 87% of 10 030 (0s) |
| astral-sh/ruff | rust | 6686f63 |
687 409 | 1 870 | 70 186 | 221 119 | 230.8s | 6,006 MB | 3.0 | ok | 100% of 159 277 (2s) |
| Total | 1 590 441 | 398 224 | 413.0s | 3.9 | 92% of 604 004 |
Peak RSS measured via getrusage.max (largest single process — ours or a resolver subprocess; no cgroup counter was readable, so this is not the tree total). KLOC/s = analysed thousands-of-lines per second. Generated by benchmarks/run_benchmarks.py.
Speed-ups against graphlens, the Python implementation this replaces: 5.2× on apache/superset, 3.3× on colinhacks/zod, 2.6× on gin-gonic/gin. Details and method in Benchmarks.
Versioning
Semver covers the graph contract — the node and relation kinds, the two id
formulas, 1-based spans, node ordering, the serialization format — and the
Python API as generated into the committed .pyi. It does not cover what the
resolvers answer: the Python one is a pinned 0.0.x release of ty, the Rust
one is whatever rust-analyzer the machine has. A patch release may change
which CALLS edges appear. What is watched instead is the aggregate share of
resolved queries, recorded per project in the baselines.
Full statement, including which changes need a major release: Versioning.
Contributing
See CONTRIBUTING.md for the development loop, the build constraints, and how releases are cut.
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
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 callix-1.0.0.tar.gz.
File metadata
- Download URL: callix-1.0.0.tar.gz
- Upload date:
- Size: 705.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c9b88d95ed73fc6f3a9d35b01671f0421af4da050a64536cc2ef6486c991e245
|
|
| MD5 |
c3314ce71e3f605edb15cd7cba2d50f4
|
|
| BLAKE2b-256 |
d0784e5ef6a5a0184f923836363c15de11d071672b9ac1a25e98049274e1e5d5
|
File details
Details for the file callix-1.0.0-cp310-abi3-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: callix-1.0.0-cp310-abi3-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 20.4 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6a190a779e00ffeacd74f0801adc2ab89aa0b1a6f4e4793ea159f35e14c1f6d
|
|
| MD5 |
dadc213608655de16e7fc8e7dcf7488b
|
|
| BLAKE2b-256 |
82b8e0f728bca1cf0b436ca6996c7a8e94969d9819cce0e69815c5770f21e214
|
File details
Details for the file callix-1.0.0-cp310-abi3-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: callix-1.0.0-cp310-abi3-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 19.2 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f4f82a1d20b88c648b14e35cb86d1c448e71cd0cc9715dea0f998fc212e58660
|
|
| MD5 |
d70f174d1214fb887f1ec97c03b3d8c4
|
|
| BLAKE2b-256 |
fd6d1065055df7d150925e298689dfc7b122b7663fd1e86ee90e958633738340
|
File details
Details for the file callix-1.0.0-cp310-abi3-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: callix-1.0.0-cp310-abi3-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 20.1 MB
- Tags: CPython 3.10+, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
26c6c7b064a18ebe7f175c064cfbb3f17367ab2c7f0343e38f20d15e0bf1e3b1
|
|
| MD5 |
56eee4724c1b851b770d9ad2e6222c1e
|
|
| BLAKE2b-256 |
2a15b2adeb28eb801d443614b6104c73bc85a2159ab3edce3f75e6e529431c65
|
File details
Details for the file callix-1.0.0-cp310-abi3-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: callix-1.0.0-cp310-abi3-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 19.0 MB
- Tags: CPython 3.10+, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
52e551ac300583d1713a00068b5027ea4c2a54a572cb8709ebd1bae7673510dc
|
|
| MD5 |
d0a4dd5dcbffed1352a486c22ebcdd6e
|
|
| BLAKE2b-256 |
50fb431bd23617a10563d1c0989fd0614537c1e169755e6369bb89ef7ca35e31
|
File details
Details for the file callix-1.0.0-cp310-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: callix-1.0.0-cp310-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 18.6 MB
- Tags: CPython 3.10+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f577dd664e23ebedb627be0bf035b5faee6d2172ab8f4ea75a23b902b9fc958d
|
|
| MD5 |
60868046ce126f4dba17a9097b178b15
|
|
| BLAKE2b-256 |
f165c1b09e86235138bc3a5f29c5989f8f365bb420a6bd96d9df29e03507456b
|
File details
Details for the file callix-1.0.0-cp310-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: callix-1.0.0-cp310-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 19.4 MB
- Tags: CPython 3.10+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4501037a5ad664ed040f9cc6312440bef735f720ea10a203a38cdcc7edb383d6
|
|
| MD5 |
8212a4a51c6f4ec79d6dcd19d86bfbcc
|
|
| BLAKE2b-256 |
ccf25419459ae3a5c7dc52feec1d26ccac273d0b1f96ff3feec53c4c40cc0399
|