Skip to main content

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.

PyPI Python License CI

Documentation · Repository · Issues


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.

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"] says whether the backend came up (ok), is a table of names rather than a type checker (degraded), or did not run (unavailable) — not how many calls it found. Each edge records how it was found in metadata["resolution"] (definition, value, flow, external, unlocated, name), callix report -t status counts them, and how accurate resolution is says what each language follows and what it does not, with measured numbers.

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.

Command line and Docker

The same analysis without writing Python — and the formats other tools read:

docker run --rm -v "$PWD:/workspace" ghcr.io/callix-tools/callix:full \
  export . -f lsif -o dump.lsif        # GitLab code navigation, Sourcegraph-style tools

callix export also writes SCIP, CycloneDX, CSV, Graphviz and Mermaid; callix report prints summaries, resolver status, dependencies, boundaries and call lists. The full image carries the Go and Rust toolchains, so every language that has a real resolver gets it. See Command line, Export formats and Docker.

Documentation

https://callix-tools.github.io/callix/

Benchmarks

Last run: 2026-07-30 12:01 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 Answered
apache/superset python c83fb2b 399 519 1 886 181 320 370 764 19.4s 1,026 MB 20.6 ok 85% of 281 667 (11s)
colinhacks/zod typescript 1fb56a5 74 194 404 15 332 27 334 2.5s 419 MB 30.2 ok 89% of 17 067 (1s)
gin-gonic/gin go 73726dc 23 374 97 13 109 19 424 6.1s 948 MB 3.8 ok 100% of 13 916 (1s)
casdoor/casdoor go 696bcf0 86 898 458 33 324 58 107 35.7s 4,240 MB 2.4 ok 100% of 36 633 (10s)
gohugoio/hugo go 4d22555 224 821 897 75 036 130 508 22.0s 4,559 MB 10.2 ok 98% of 87 043 (6s)
BurntSushi/ripgrep rust 4649aa9 50 275 98 7 787 22 852 12.8s 1,077 MB 3.9 ok 99% of 16 156 (0s)
tokio-rs/axum rust c59208c 43 653 296 10 627 21 118 69.0s 3,123 MB 0.6 ok 87% of 12 625 (0s)
astral-sh/ruff rust 6686f63 687 409 1 870 102 595 330 597 176.0s 6,007 MB 3.9 ok 100% of 216 936 (2s)
laravel/framework php 92a7072 540 800 3 016 83 164 291 129 17.8s 376 MB 30.4 degraded 70% of 283 108 (1s)
redis/redis c 5279a8d 374 211 786 156 896 200 372 7.0s 294 MB 53.8 degraded 100% of 161 477 (0s)
google/leveldb cpp 99b3c03 28 280 131 12 235 20 600 0.9s 77 MB 32.5 degraded 100% of 14 322 (0s)
facebook/rocksdb cpp 3b44608 774 485 1 342 300 996 513 211 26.9s 718 MB 28.8 degraded 100% of 433 814 (0s)
APIs-guru/openapi-directory yaml 959d727 1 268 530 971 11 812 16 795 5.8s 115 MB 219.8 ok —
argoproj/argo-cd yaml 564b949 322 262 2 201 2 220 2 246 1.4s 91 MB 222.5 ok —
Total 4 898 711 1 006 453 403.3s 12.1 91% of 1 574 764

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. Answered = the share of use-sites the backend returned a place for - not a measure of correctness; see how accurate resolution is in the docs. 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 what the resolvers get right on the accuracy suites (tests/accuracy, a floor CI enforces) and the aggregate share of queries the backend answered, 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

Metadata

Release files for callix 1.5.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 callix 1.5.0
File Size Uploaded Provenance Actions
callix-1.5.0.tar.gz 1.1 MB Without provenance Details for callix-1.5.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for callix 1.5.0
File Actions
callix-1.5.0-cp310-abi3-musllinux_1_2_x86_64.whl CPython 3.10 abi3 Linux musl 1.2+ x86-64 Details for callix-1.5.0-cp310-abi3-musllinux_1_2_x86_64.whl
callix-1.5.0-cp310-abi3-musllinux_1_2_aarch64.whl CPython 3.10 abi3 Linux musl 1.2+ ARM64 Details for callix-1.5.0-cp310-abi3-musllinux_1_2_aarch64.whl
callix-1.5.0-cp310-abi3-manylinux_2_28_x86_64.whl CPython 3.10 abi3 Linux glibc 2.28+ x86-64 Details for callix-1.5.0-cp310-abi3-manylinux_2_28_x86_64.whl
callix-1.5.0-cp310-abi3-manylinux_2_28_aarch64.whl CPython 3.10 abi3 Linux glibc 2.28+ ARM64 Details for callix-1.5.0-cp310-abi3-manylinux_2_28_aarch64.whl
callix-1.5.0-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details for callix-1.5.0-cp310-abi3-macosx_11_0_arm64.whl
callix-1.5.0-cp310-abi3-macosx_10_12_x86_64.whl CPython 3.10 abi3 macOS 10.12+ x86-64 Details for callix-1.5.0-cp310-abi3-macosx_10_12_x86_64.whl

Total release size: 120.0 MB

Release files / callix-1.5.0.tar.gz

Download URL callix-1.5.0.tar.gz
Size 1.1 MB
Tags Source
SHA-256 checksum
How to use checksums
ad881c4efc33473f5ed25a6d9e1927931dae4e18144863d42c2aa80bc05f90a3
BLAKE2b-256 checksum
How to use checksums
767335f9c164dc5b391652f6972ca4b902a392e55447012952c4950afc79a4a3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / callix-1.5.0-cp310-abi3-musllinux_1_2_x86_64.whl

Download URL callix-1.5.0-cp310-abi3-musllinux_1_2_x86_64.whl
Size 20.8 MB
Tags CPython 3.10 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
c2bc9ee3f68321038861cecaff41f169185e22bf8abb66c78ca825ecea987bb5
BLAKE2b-256 checksum
How to use checksums
ae4e643fa6d9ce909051a2ce3c75516c40e55cfa47d0e6b6f5bb89046f346759
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / callix-1.5.0-cp310-abi3-musllinux_1_2_aarch64.whl

Download URL callix-1.5.0-cp310-abi3-musllinux_1_2_aarch64.whl
Size 19.5 MB
Tags CPython 3.10 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
71d2566f4ed8bc5e487fb1b17498227533176d44e115cc5c676d3f792ed18507
BLAKE2b-256 checksum
How to use checksums
acfebe53747e426be1a69f1cf95b37038661bc0f99c24088f2974f522703bf88
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / callix-1.5.0-cp310-abi3-manylinux_2_28_x86_64.whl

Download URL callix-1.5.0-cp310-abi3-manylinux_2_28_x86_64.whl
Size 20.4 MB
Tags CPython 3.10 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
e6c0327c0eea663531a5a84fd581fe9d2ce5f6c9bc50c414b0abffc159b1caa7
BLAKE2b-256 checksum
How to use checksums
46834e6dfd944dea9d2354c9bb33bcaf147a1fac30fec37a4f4f7c0f76083f27
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / callix-1.5.0-cp310-abi3-manylinux_2_28_aarch64.whl

Download URL callix-1.5.0-cp310-abi3-manylinux_2_28_aarch64.whl
Size 19.4 MB
Tags CPython 3.10 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
d88a3c32e77ff0d62e33042bfa0f2f30d5b877da858a375417e62024b075c11e
BLAKE2b-256 checksum
How to use checksums
b494aa30c19ceae8e109b023e1039737a1268983e0dda20b30ffcccbd1ac0dc6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / callix-1.5.0-cp310-abi3-macosx_11_0_arm64.whl

Download URL callix-1.5.0-cp310-abi3-macosx_11_0_arm64.whl
Size 18.9 MB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
70a1142084567a72cbc675604c638c65f0e34c72e621d15a71656b2021f89f0d
BLAKE2b-256 checksum
How to use checksums
1d41894e84eed9b9e3ac9ab169b61ed3fac894c9fe44385b8f50f8b388bb3aff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / callix-1.5.0-cp310-abi3-macosx_10_12_x86_64.whl

Download URL callix-1.5.0-cp310-abi3-macosx_10_12_x86_64.whl
Size 19.8 MB
Tags CPython 3.10 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
51629eafa0cb1a326a9ebb66c4f783b3cdf3f94bdf4c203060a4c6c8fcdb662a
BLAKE2b-256 checksum
How to use checksums
2dd4fcc48f53ade66446d2967d4995ff0a37a77f5b8f2a4da46343462e630e24
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for callix 1.5.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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