Skip to main content
v1.0.0 — markdown wiki + Obsidian vault export

Understand a codebase before you touch it

astria turns any folder into a queryable knowledge graph — deterministic AST extraction in Rust, optional local-embedding semantics, zero API keys, everything on your machine.

npm install -g @nodesify/astria
agent — zsh
$ astria query "where does auth live?"
NODE  authenticate_user()  src/auth/auth.rs:45
NODE  AuthMiddleware      src/auth/middleware.rs:12
EDGE  AuthMiddleware ─CALLS→ authenticate_user  EXTRACTED · 0.97 @middleware.rs:28
~3,000 tokens · 73× fewer than reading the corpus · graph built 2m ago
50–110×
fewer tokens per query, measured
21
languages via tree-sitter
0
API keys required
100%
local — your code never leaves

Why a graph, not a folder

Three things a folder full of files can't give you — plus the exports and integrations that make the graph part of your daily loop.

Deterministic AST extraction

Tree-sitter grammars in a native Rust core — no regex guessing. Every node is anchored at file:line and every edge carries its provenance.

Structure that survives the session

Hub files, god nodes, communities, and blast radius stored in SQLite — rebuilt incrementally in seconds as your code changes.

An honest audit trail

Every edge is labeled EXTRACTED, INFERRED or AMBIGUOUS with a numeric confidence score. --detail high shows declared facts only.

Answers for agents and humans

Query from the CLI, point any MCP-capable agent at the built-in stdio server, or ask for an Aider-style repo map ranked by PageRank.

Wiki & Obsidian export

An agent-crawlable markdown wiki, or a full Obsidian vault with [[wikilinks]] and a canvas of your communities. Regenerated on every update.

Local semantic layer

Optional local embeddings add similar_to edges and semantic query recall — no API key, offline after a one-time download. Or bring your own LLM.

One pipeline, pure stages

Each stage is a pure function in its own Rust crate. SQLite persists; petgraph computes.

detect()→extract()→build()→cluster()→analyze()→report()

Put your codebase on the graph

One command, one local directory, no cloud. See worked examples — including what the graph got wrong.