See your codebase as a graph.

tracers parses 20+ languages with Tree-sitter and builds a unified graph of symbols, calls, imports, and dependencies. Ask who calls a function, what breaks if it changes, or where the cycles are — all locally, in one Rust binary.

20+
languages parsed
0
cloud calls
deterministic
reproducible exports
Scan a repository
$ tracers scan .
=== Tracers scan summary ===
Files scanned: 4
Nodes: 59
Edges: 142
Wrote graph export to .tracers

Features

A layered analysis pipeline that turns source code into a queryable graph — and is honest about what it cannot resolve.

20+ languages

TypeScript, Python, Go, Rust, Kotlin, Swift, Java, C#, PHP, Ruby, C, C++, Dart, Scala, R, Zig, and more — all through maintained Tree-sitter grammars.

Honest resolution

Every relationship is marked resolved_internal, resolved_external, unresolved, or ambiguous — tracers never pretends a guess is a fact.

Call & dependency graphs

Direct and transitive dependencies, callers and callees, references, inheritance — bounded, deterministic traversals over indexed graph data.

Impact analysis

See exactly which symbols depend on a target, with the path that connects them — static reachability, not runtime guesswork.

Interactive explorer

Every scan emits a standalone graph.html — a D3-force canvas explorer with search, filtering, and ego-network inspection. Works from file://.

Fast & incremental

Parallel parsing with per-worker parsers and a content-addressed syntax cache — rescans only re-parse what changed.

See it in action

One scan builds the graph; every query command runs against it — or against an exported graph.json without rescanning.

Scan a repository
$ tracers scan fixtures/languages/typescript
=== Tracers scan summary ===
Files scanned: 4
Nodes: 59
Edges: 142
Symbols: 44
Unresolved edges: 12
Wrote graph export to .tracers
Who calls this function?
$ tracers callers twice
Callers of `twice`:
  - run [function] via calls
    (resolved_internal), lexical
    depth 1 — src/math.ts:11
What depends on it?
$ tracers impact twice
Impact of `twice`:
  - run [function] depth 1
    path: run -> twice
    via: calls

How it works

Discover, parse, resolve, query — a deterministic pipeline with explicit uncertainty at every step.

01

Scan

tracers discovers source files (respecting .gitignore and your tracers.toml), parses them with Tree-sitter in parallel, and caches syntax trees by content hash.

tracers scan .
02

Resolve & build

A layered resolver matches symbols through lexical scope, imports, qualified names, and package boundaries — recording exactly how confident each edge is.

.tracers/graph.json
03

Query & explore

Ask callers, callees, refs, deps, dependents, reach, impact, path, roots, cycles — or open the interactive explorer. All queries accept --graph to skip rescanning.

tracers callers myFunc

Get started

Grab a prebuilt binary from GitHub Releases, or build from source with Cargo. No runtime dependencies, no daemon, no account.

Install
$ curl -fsSL https://raw.githubusercontent.com/hieudoanm/tracers/main/scripts/install.sh | sh
Installed tracers to ~/.local/bin/tracers
$ tracers scan .
Wrote graph export to .tracers
$ tracers --version
tracers 0.0.1 (build 2026.11.08.13.12.56)

Or build from source: ./scripts/install-local.sh — see the README for details.