CodeGraph

Complex codebase,
Deterministic answers

Niro turns every repo into one semantic graph - languages, config and events - then answers by walking edges instead of searching text. Same question, same path, every time, at any size.

Index a repo
9 repos · 50,000 nodes · deterministic traversal
01What the graph holds

A node per symbol
an edge per relationship

Semantic graph engine
callers · callees · imports · tests

Every symbol parsed at AST depth and woven into a directed graph: call chains, dependency trees, inheritance, data flow.

Always live
incremental · git-aware

The graph updates incrementally as files change. No full re-index, no stale context, and it knows which branch you are on.

Every repo, one graph
cross-repo

Calls that cross a service boundary are edges like any other. Monorepo and polyrepo resolve the same way.

Environment-aware
.env · YAML · properties

Not only source. Niro parses .env files, config YAML and properties, so the graph knows how services are wired, not just how they are written.

Events and protocols
HTTP · data · queues

HTTP endpoints, data resources, message queues and event handlers are mapped, so asynchronous boundaries are visible.

It compounds
richer per commit

Every commit adds edges. More repos connected means connections no single engineer holds. File-by-file reading hits a ceiling; the graph does not.

Deterministic where it counts
graph traversal · no top-k guessing

Structural retrieval is a graph traversal, not a similarity search: the same question against the same index returns the same hops and the same facts every run. Embeddings do have a job here - natural-language search and find_reusable_code use them to pick candidates - but the relationships those candidates sit in are resolved on the graph, not ranked by distance. The sentence your agent writes around the facts is still the model's.

02The same question, twice

Reading files,
against resolving them

One incident, asked of the same assistant two ways. One column is a capable agent with a shell; the other is the same agent with the graph.

Why is checkout failing in production?
File by file On the graph
Files opened 47 2
Tool calls 87 10
Cost of the answer $0.35 $0.21
Time to answer 53s 11ms
Crossed a repo it never imports no yes
Asked a second time a different path the same four hops
Answer was verified guessed traced
03Ask it yourself

Pick a question
watch it resolve

Each question is a real MCP tool, and the traversal lights in the graph as the hops resolve - not a file read among them.

tool
Ask any of these twice and the hops come back identical. The traversal is exact; only the sentence around it is the model's.
04Branches and worktrees

One graph per branch,
worktree and environment

Your repositories are not in one state, so Niro does not keep one graph. It keeps a project per repository and branch, reads parallel worktrees as the separate trees they are, and routes every question to the graph that covers where you actually are - re-indexing as the work moves rather than serving everyone a nightly snapshot.

Incremental, not nightly

Changed files re-index on their own. A full rebuild is available and rarely needed.

push · save · re-index
Branch-aware, and honest about it

Every question routes to the project covering your repo and current branch. On a branch no project covers, Niro refuses to answer rather than serving stale code - and offers to build a temporary project instead.

refuses · does not guess
Worktree-scoped

Parallel worktrees of the same repo are read as what they are: separate trees, keyed apart, sharing what can safely be shared.

parallel trees
Your source is not a log line

Files move over multipart and are never written to logs. Indexing needs the code; observability does not.

never logged
05The surface

Questions your agent
could not answer with confidence before

35 tools reach the graph over MCP. No plugins, no per-tool wiring, and the same set for every compatible assistant.

Where does this run from?
entry points, callers, the path in
What breaks if I change it?
blast radius across every repo
Why did this fail?
ranked causes with the evidence
Does this already exist?
the canonical implementation, and the copies
How do these services talk?
HTTP, queues, events, config
What has broken here before?
prior bugs, causes and fixes
06FAQ

Questions about
the index

Are the answers deterministic?

The retrieval is. A question is resolved by walking edges in the graph, so the same question against the same index returns the same hops and the same set of facts on every run. What is not deterministic is the sentence your agent writes around those facts - that is the model, and it will phrase the same finding differently twice. We claim exactness for the traversal, not for the prose.

What happens if the graph is out of date?

Changed files re-index on their own, so the graph tracks the work rather than a nightly snapshot. On a branch no project covers, Niro refuses to answer rather than serving last week's code as if it were current, and offers to build a temporary project instead. A confident wrong answer is the one failure mode worth refusing outright.

Does Niro need to build or compile my repo?

No. Tree-sitter grammars parse your source to an AST and a semantic language mapper turns that into graph nodes, so indexing does not depend on your build system, your dependency resolution or a successful compile.

What happens with a language you do not support?

Nine languages have mappers: Java, TypeScript, JavaScript, Python, Go, C#, Kotlin, PHP and Ruby. C, Scala and Rust have grammars but no mapper yet, so they are not supported - and we would rather say that than half-index them and let an agent draw conclusions from the half.

Is there a limit on how much code it will index?

Local mode (coming soon) has no line-of-code cap on any paid tier. The cloud graph is capped per tier: 25k lines on Free, 100k on Solo with add-on packs available, a 1M shared pool on Team, and unlimited on Enterprise.

Who else can see my graph?

Every project, index and session is keyed to an account, so one tenant cannot traverse into another tenant's graph. On Team an org main graph lives in Niro's cloud alongside local copies; on Enterprise it can be a shared cloud, a dedicated single-tenant instance, or a deployment inside your own VPC.

07Next

Index a repo
and ask it something

One install and one command. The graph is built from your code, and your agent picks the tools up over MCP without further wiring.

Get the CLI Prove it on your repos