Rust-first codebase indexer

ACI

Turn source trees into queryable graphs.

Walk a repository, extract files, symbols, imports, calls, references, and packages, then store per-file graph partitions for fast local answers.

1.5sNext.js cold index
40.7sChromium cold index
15.8MGraph edges
next.js/.aci
partitioned graph stable IDs
adapters aci-core indexer store query

A neutral graph model for repo intelligence.

Parser-specific facts stay behind adapters. Everything lands in the same internal model — ready for lookup, traversal, impact analysis, and export.

SY

Symbols & spans

Names, kinds, qualified paths, source ranges, and jump locations in path:line:column form.

DP

Imports & packages

Source dependencies plus package metadata from manifests such as package.json.

RF

Calls & references

Caller, callee, reference, dependency tree, package, and impact queries from one local store.

EX

Export surfaces

JSONL, KiteDB-shaped JSONL, SCIP-shaped JSON, and LSIF-shaped JSONL outputs.

One thin CLI, reusable Rust crates.

Build the store, ask questions, keep it fresh while editing, and export the graph into downstream formats.

Install

curl -fsSL https://aci.mask.dev/install.sh | sh

Single binary, no dependencies.

Index

aci index .

Graph partitions in the default .aci store.

Query

aci query --pretty symbols --name main

Readable tables for humans, JSON for scripts.

Watch

aci watch . --debounce-ms 250

Refresh changed partitions incrementally.

Impact

aci query --pretty impact src/lib.rs

Trace what a changed file affects.

Export

aci export --format jsonl

Project the graph into interchange formats.

Docs

aci index . --max-parse-bytes 10485760

Parser limits, branch diff review, release checks, and troubleshooting.

local-first pipeline

From files to answers.

Hash files, skip unchanged inputs, replace graph partitions per changed file. Indexing stays incremental from day one.

Discover & fingerprint

Gitignore-aware walking filters vendor, generated, binary, and unchanged paths before parsing.

Extract neutral facts

Language adapters emit the same graph model across Tree-sitter and scanner fallback paths.

Write partitioned storage

Full indexes stream compact partition records; incremental updates append replacement records.

Query or export

Symbols, deps, callers, callees, refs, packages, impact — JSONL, SCIP, or LSIF.

Adapters stay behind the boundary.

Each language owns detection, extraction, resolution, and Tree-sitter queries while emitting the shared graph model.

Rust, Go, Java

Extension detection and Tree-sitter extraction with scanner fallback.

symbols / imports / calls
Python, TypeScript, TSX

Source and shebang support for structural facts across common application code.

refs + deps
C, C++, Objective-C

Parser-backed extraction for systems code with bounded deterministic fallbacks.

native projects
JSON / package.json

Package and dependency extraction for repository-level graph context.

packages

Cold-index timings on real repos.

Measured on local checkouts with the tree-sitter-fallback extraction mode.

NX
4.02s

Next.js canary

commit 300993781541bf7a35789e22adb0333bf9c44caf

  • Indexed files: 21,847
  • Skipped: 1,615
  • Parse / file: 0.51ms
  • Diagnostics: 0
DJ
1.52s

Django main

commit 62fa9b8976b9fd74440e9f97c0744feaf3165dc9

  • Indexed files: 3,003
  • Skipped: 1,456
  • Parse / file: 2.16ms
  • Diagnostics: 0