Watch your codebase become a constellation — and give your AI agent a map of it.
▶ Watch the full demo with audio
Rig builds a local-first semantic knowledge graph of your project, renders it as an interactive map you can fly through, and exposes it to coding agents (Claude Code, Cursor, Codex, opencode) over MCP. Agents navigate by structure and by meaning, and they keep what earlier sessions decided, attached to the code it is about.
Everything runs on your machine. No API key, no upload, nothing leaves your laptop.
Quickstart
In any project directory:
npx rig-constellation
(Have Bun? bunx rig-constellation works too.) That's the whole thing. One command:
⬡ Rig — mapping my-project
http://localhost:7491
✓ initialized ./.rig
✓ map live http://localhost:7491
→ 1/6 extract ██████████████████ 212/212
→ 5/6 hubness ████████████████░░
✓ indexed 1,204 nodes · 3,891 edges · 212 files · 36 skills
✓ wired Claude Code project
wrote .mcp.json
wrote .claude/settings.json
wrote CLAUDE.md
press Ctrl-C to stop the map.
It initializes .rig/, opens the live map first, then indexes your code so the
graph assembles in the already-open browser tab in real time, and wires whichever
agent it detects into this project, listing every file it writes. The map title and
port are derived per project, so two checkouts can run side by side on stable,
distinct ports. Re-run any time, or use the explicit subcommands below.
The command is
rig(alias:rig-constellation). Prefer a global install?npm i -g rig-constellation(orbun install -g rig-constellation), thenrig start. Installed locally withnpm i rig-constellation? The binary lives innode_modules/.bin— run it withnpx rig start(or install with-gto getrigon yourPATH).
What it can do
Map and navigate code
-
A live map of your codebase. Files, symbols, calls, imports, tests and dependencies as a graph you can fly through in the browser. The map updates live while agents work.
-
Structural questions in one call. Callers, callees, impact ("what breaks if I change X"), critical paths, neighbours and hubs, instead of grep-and-read.
-
Search in plain language. "Where do we refresh expired sessions?" finds the code. Exact names, keywords (including identifier words, so "handle login" matches
handleLogin) and on-device embeddings are fused into one ranking. A symbol name still returns that symbol first. -
Orientation on demand.
rig_overview(also the MCP resourcerig://overview, andrig overviewon the command line) returns a compact markdown map of the repository, about 2,000 tokens long. It covers:- packages and their purposes
- entry points
- the most-referenced symbols with
file:line - route and handler tables
- where the tests live
- recent decisions
The map is cached and refreshed on every index, sync and file change.
-
Magnetic pull. "What's related to X", ranked by graph distance, semantic similarity and recent activity, with the score components broken out.
-
Dependency intelligence. Installed versions, declared-but-unused packages, imports with no declaration, and version conflicts across a monorepo. It covers npm and Python: PyPI names are matched to their import names (
PyYAML→yaml), and the standard library is never flagged.
Remember across sessions and agents
-
Memory that survives re-indexing. Index, sync, file edits and line moves keep everything agents attach to code:
- waypoints (decisions, constraints, open questions)
- aliases, annotations and promotions
- proposed and accepted links
If a symbol disappears, its memory is set aside rather than lost, and re-attached when the symbol comes back.
-
Waypoints live outside the context window. They are searchable by meaning (
rig_waypoints query="…"), and the next session can load the previous one's. -
Human review where it matters. Links an agent proposes wait for your accept or reject on the map, and every change can be undone step by step.
-
Portable memory.
rig export-memoryandrig import-memorycarry agent memory across fresh clones and machines. -
One graph, many agents. Claude Code, Cursor, Codex and opencode can all work on the same project at the same time. Writes are concurrency-safe and record which agent made them.
Fit into your setup
- Wiring goes into the current project by default (
rig install claude), andrig uninstallremoves exactly what was added. Each agent gets rig's approval policy in its own permission format; risky writes ask first. - A live graph. A single file watcher per project keeps the graph current while you code.
- Languages: TypeScript, TSX, JavaScript, JSX, Python and Markdown, plus
package.json,pyproject.toml,requirements*.txtand their lockfiles.
Measured, not claimed
scripts/bench runs real agents (Claude Haiku 5.5 via OpenRouter) on 16 questions about next-auth at a pinned commit, and checks every answer automatically. With grep and rig available, as in a real agent session:
- Natural-language questions cost fewer tokens than with grep alone.
- Exact identifier lookups still cost more. The installed guide tells agents to use grep for those.
- Injecting the orientation map into every prompt cost more than it saved. That's why it's on demand.
The raw results and reports are in scripts/bench/results/.
What your agent does differently
Without a map, an agent answers "what breaks if I change parseConfig?" by grepping the string and reading whatever files match — blind, lossy, and token-expensive.
With Rig it's one call:
rig_impact parseConfig
→ 7 transitive callers, ranked:
loadSettings calls · depth 1
bootstrap calls · depth 2
__tests__/config… tests · depth 1
…
And "what else should I look at?" isn't a guess — rig_pull returns related anchors scored by graph distance, on-device embedding similarity, and recent activity, with the three components broken out so the ranking is explainable, not a black box:
rig_pull parseConfig
→ { node: "validateSchema", score: 0.81,
components: { structural: 0.4, semantic: 0.9, recency: 0.7 } }
That ranked, self-explaining retrieval — not a flat grep dump — is the difference.
Privacy & local-first
- Embeddings run locally via a small on-device model (
bge-small). No API key required. - The graph lives in
.rig/rig.dbin your project.rigauto-adds.rig/to your.gitignore. - Nothing is uploaded. The map UI is served on loopback only and needs its per-project session token, with Host and Origin checks against other web pages;
rig startopens it signed in.
Wiring your agent
bunx rig-constellation auto-detects the agents you have installed and wires them into
the current project — it never edits your user-level config. To wire one explicitly:
rig install claude # also: cursor · codex · opencode
rig install claude --global # your user-level config instead: applies to every project
rig uninstall claude # remove exactly what install added (--all · --global · --dry-run)
| Agent | Project (default) | --global |
|---|---|---|
| Claude Code | .mcp.json · .claude/settings.json · CLAUDE.md |
~/.claude.json · ~/.claude/settings.json · ~/.claude/CLAUDE.md |
| Cursor | .cursor/mcp.json · .cursor/cli.json · .cursor/rules/rig.mdc |
~/.cursor/mcp.json |
| Codex CLI | — user-level only | ~/.codex/config.toml · ~/.codex/AGENTS.md |
| opencode | — user-level only | ~/.config/opencode/opencode.jsonc · ~/.config/opencode/AGENTS.md |
Each install merges Rig's MCP server entry, Rig's per-tool approval policy (in the
agent's own permission format), and a short usage guide between <!-- rig:begin -->
markers, leaving the rest of each file alone — re-running it is safe. The agent spawns
rig serve --mcp on demand; Claude Code asks you once to approve a server from a
project's .mcp.json. In a directory without .rig/, the server still starts and every
tool answers with how to fix it (rig init or rig start).
OpenRouter is an API, not an MCP host: rig install openrouter only writes a reference
config to copy into the MCP client you use with it.
Commands
| Command | What it does |
|---|---|
rig start |
One-shot: init + index + wire agent + open the live map |
rig install <agent> |
Wire an agent into this project (--global for your user-level config) |
rig uninstall <agent> |
Remove exactly what install added (--all, --global, --dry-run) |
rig index |
Extract + write nodes, skipping unchanged files (--include / --exclude <glob>, --force) |
rig sync |
Incremental update |
rig query |
CLI search |
rig overview |
Print the orientation map your agent gets from rig_overview (--budget <tokens>, default 2000; --json) |
rig serve --all |
Start MCP and/or the web map (--mcp / --web / --no-auth; --path <dir> for another project); keeps the graph live by syncing on file changes (--no-watch or RIG_NO_WATCH=1 to turn off) |
rig status |
Index health |
rig doctor |
Diagnose environment, db, model cache, agent configs |
rig export-docs |
Render waypoints into a markdown doc tree |
rig export-memory |
Save agent memory (aliases, notes, links, promotions, waypoints) as JSONL that survives losing .rig/ (--out <file>). It can contain conversation-derived text: review it before committing it |
rig import-memory <file> |
Merge an export back in, e.g. after a fresh clone + rig index. Only adds; never overwrites |
Run rig --help for the full list.
How it works
.contracts/ is the declarative source of truth (tools, anchors, migrations, events); bun run gen emits the matching code into generated/. The graph is plain SQLite. Search fuses exact names, SQLite FTS5 keyword matches and on-device embedding similarity by reciprocal rank; "what's related" is a single magnetic-pull scoring function over structural edges, on-device embeddings, and recency. The map UI is a force-graph over WebSocket.
packages/core— theRigclass: DB, extraction, graph, embeddings, magnetic pullpackages/mcp— MCP stdio server + tool dispatchpackages/web— Fastify + WebSocket + React map UIpackages/cli— therigbinarypackages/contracts—defineToolContract& friends
See docs/contracts.md to add a tool, docs/integration.md for the architecture, and COMPATIBILITY.md for the stability promise.
Requirements
- Bun ≥ 1.1 (primary), or Node ≥ 22 (fallback).
- Works on macOS, Linux, and Windows.
Contributing
Adding a tool means touching one file in .contracts/ and one implementation — the generator wires the rest. Start with docs/contracts.md, then docs/integration.md for where new ideas plug in. Stable tools are protected by a compatibility gate (bun run check:compat); see COMPATIBILITY.md.
License
Apache-2.0. Rig's extraction layer is derived from CodeGraph (MIT, © Colby Mchenry); those portions remain under their original MIT terms — see LICENSE-CODEGRAPH.txt and NOTICE. With thanks.