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
Release files for callix 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| callix-1.0.0.tar.gz | 705.2 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| callix-1.0.0-cp310-abi3-musllinux_1_2_x86_64.whl | CPython 3.10 | abi3 | Linux musl 1.2+ x86-64 | Details |
| callix-1.0.0-cp310-abi3-musllinux_1_2_aarch64.whl | CPython 3.10 | abi3 | Linux musl 1.2+ ARM64 | Details |
| callix-1.0.0-cp310-abi3-manylinux_2_28_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ x86-64 | Details |
| callix-1.0.0-cp310-abi3-manylinux_2_28_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| callix-1.0.0-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| callix-1.0.0-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 117.4 MB
Release files / callix-1.0.0.tar.gz
| Download URL | callix-1.0.0.tar.gz |
|---|---|
| Size | 705.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c9b88d95ed73fc6f3a9d35b01671f0421af4da050a64536cc2ef6486c991e245
|
|
BLAKE2b-256 checksum How to use checksums |
d0784e5ef6a5a0184f923836363c15de11d071672b9ac1a25e98049274e1e5d5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Release files / callix-1.0.0-cp310-abi3-musllinux_1_2_x86_64.whl
| Download URL | callix-1.0.0-cp310-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 20.4 MB |
| Tags | CPython 3.10 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
f6a190a779e00ffeacd74f0801adc2ab89aa0b1a6f4e4793ea159f35e14c1f6d
|
|
BLAKE2b-256 checksum How to use checksums |
82b8e0f728bca1cf0b436ca6996c7a8e94969d9819cce0e69815c5770f21e214
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Release files / callix-1.0.0-cp310-abi3-musllinux_1_2_aarch64.whl
| Download URL | callix-1.0.0-cp310-abi3-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 19.2 MB |
| Tags | CPython 3.10 Linux musl 1.2+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
f4f82a1d20b88c648b14e35cb86d1c448e71cd0cc9715dea0f998fc212e58660
|
|
BLAKE2b-256 checksum How to use checksums |
fd6d1065055df7d150925e298689dfc7b122b7663fd1e86ee90e958633738340
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Release files / callix-1.0.0-cp310-abi3-manylinux_2_28_x86_64.whl
| Download URL | callix-1.0.0-cp310-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 20.1 MB |
| Tags | CPython 3.10 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
26c6c7b064a18ebe7f175c064cfbb3f17367ab2c7f0343e38f20d15e0bf1e3b1
|
|
BLAKE2b-256 checksum How to use checksums |
2a15b2adeb28eb801d443614b6104c73bc85a2159ab3edce3f75e6e529431c65
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Release files / callix-1.0.0-cp310-abi3-manylinux_2_28_aarch64.whl
| Download URL | callix-1.0.0-cp310-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 19.0 MB |
| Tags | CPython 3.10 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
52e551ac300583d1713a00068b5027ea4c2a54a572cb8709ebd1bae7673510dc
|
|
BLAKE2b-256 checksum How to use checksums |
50fb431bd23617a10563d1c0989fd0614537c1e169755e6369bb89ef7ca35e31
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Release files / callix-1.0.0-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | callix-1.0.0-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 18.6 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
f577dd664e23ebedb627be0bf035b5faee6d2172ab8f4ea75a23b902b9fc958d
|
|
BLAKE2b-256 checksum How to use checksums |
f165c1b09e86235138bc3a5f29c5989f8f365bb420a6bd96d9df29e03507456b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Release files / callix-1.0.0-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | callix-1.0.0-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 19.4 MB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
4501037a5ad664ed040f9cc6312440bef735f720ea10a203a38cdcc7edb383d6
|
|
BLAKE2b-256 checksum How to use checksums |
ccf25419459ae3a5c7dc52feec1d26ccac273d0b1f96ff3feec53c4c40cc0399
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|