AI writes faster than you can verify

Package a repo once.
Every AI knows what breaks.

Your agent can change 40 files before you understand the first one. Tests catch broken behavior. Linters catch broken syntax. Neither sees what it did to the shape of your system. Carto packs that into one portable container, so any AI tool knows what breaks before the diff lands.

or bring it to your editor

npm i -g carto-md
View on GitHub

then cd your-repo && carto init packages it

Free · MIT · One SQLite file · No cloud · No telemetry

.carto / container
digest verified
source
supabase@a3f9c1
files
6,358
digest
sha256:9e4b…c07
anci
v0.1 · reproducible
01Structuralimports · routes · models · domains
02Episodicevery decision & validated diff
03Temporalsnapshots · churn · drift
04Semanticinvariants & conventions
05Proceduralpatterns mined from git
change session.ts0 files break · P 0.00 · 2.7µs

Auto-wires into

  • Cursor
  • Claude Code
  • Codex
  • Copilot
  • VS Code
  • Zed
  • Windsurf
  • JetBrains
  • Kiro
THE VERIFY GAP01 / 07
[ THE VERIFY GAP ]

You have two safety nets. The one that matters isn't there.

Your agent can change 40 files before you read the first one. Two checks stand between it and main - and both of them are looking the wrong way.

tests

Did behavior break?

covered

Runtime, assertions, coverage. They tell you a function returned the wrong value, after you already wrote it.

linters

Did syntax break?

covered

Types, style, formatting. They tell you a line is malformed, one file at a time, never the whole graph.

structure

What did it do to the shape?

blind spot

Nothing in your pipeline sees that an edit crossed a domain boundary, coupled two systems, or put 88 files one change away from breaking.

Carto takes the third seat.

the structural check
$ carto package supabase/supabase
6,795 files · 22,309 edges · 6 domains · packaged in 5.9s
88
files break from touching one file, the worst change in the repo
537
edges cross a domain boundary they shouldn't
310
AUTH reaches into CORE, the tightest coupling in the graph
your tests and linters catch none of itgraded in 84µs · HIGH-risk edits blocked before they reach disk
See the shape of a repo you know
THE RE-INDEXING TAX02 / 07
[ THE RE-INDEXING TAX ]

Every AI tool re-reads your entire codebase from scratch, every session. And forgets it all by the next one.

Cursor builds its own index. Copilot builds its own. Claude Code builds its own. Same parsing, every tool, every time, and none of them remember what they learned yesterday. An index is a snapshot of right now, thrown away at the end of the session. A container is portable, versioned, and remembers.

Any tool's indexstateless · thrown away
  • Rebuilt from zero every session
  • Lives inside one tool, walled off
  • Knows what's there, not what breaks
  • Forgets every decision instantly
What Carto does instead
The Carto containerportable · versioned
  • Built once, read by every tool in seconds
  • Portable open format, no re-index
  • Blast radius: knows what breaks before you edit
  • Remembers decisions, drift & history across sessions

One container replaces every tool's private index. Then it carries what no index can: blast radius, predictive risk, cross-domain guardrails, and full history.

[ IS THIS DOCKER? ]

No. Docker containerizes compute.
Carto containerizes context.

Docker packs the OS, libraries, and binaries a CPU needs to run your code anywhere. Carto packs the import graph, blast radius, and structural boundaries an LLM needs to reason about your code without re-reading it.

No daemon, no image pull, no virtual network: just a lightweight .carto/ folder: a local SQLite database plus an open ANCI map. It costs nothing while idle, answers a blast-radius query in microseconds, and never touches the cloud.

INSIDE THE CONTAINER03 / 07
[ INSIDE THE CONTAINER ]

Structural intelligence, plus four memories an index can’t carry.

Your AI tool sees files. Carto’s container sees architecture, history, and consequences: five layers, packed into one SQLite file and exposed to any tool over MCP.

01

Structural

the shape of the repo

Import graph, routes, models, and auto-detected domains, parsed once with tree-sitter across 17 languages.

02

Episodic

what was decided

Every validated diff and decision, queryable weeks later. “Did we agree on snake_case here?” Get the actual verdict.

03

Temporal

the map over time

Snapshots every commit. Tracks churn, drift, and architectural events. The container gets smarter the longer the repo lives.

04

Semantic

the unwritten rules

Invariants and conventions mined from the import graph, not declared by humans, discovered from how the code actually connects.

05

Procedural

how changes happen

Patterns mined from git history. “When a route is added, auth middleware is touched 89% of the time.”

Structural intelligence is only worth anything if it reads your stack. It parses 17 languages and detects routes and data models across the frameworks you actually ship.

[ WILL IT READ MY STACK? ]

Route detection: endpoints, methods & handlers

ExpressNext.jstRPCReact RouterFastAPIFlaskDjangoGinEchoChiActixAxumRocketSpringJAX-RSASP.NETRailsSinatra
[ THE SIGNATURE MOVE · BLAST RADIUS ]

Know what breaks
before you touch it.

Search finds files that mention something. Blast radius finds files that break when you change something, transitively, over the real import graph. On a 7,500-file repo, one query returns in about 3 microseconds thanks to a Roaring-Bitmap engine.

Then it goes one step further: every file carries a predictive risk score - P(this file causes the next incident) from 0 to 1, learned from churn and past breakage. You see not just what breaks, but what’s most likely to hurt.

predicted risk · session.ts0.82 · HIGH

2.7µs

blast radius p50

84µs

validate_diff p50

750ns

high-impact p50

session.ts88 dependents · P 0.82
BUILD ONCE · PULL ANYWHERE04 / 07
[ BUILD ONCE · PULL ANYWHERE ]

An open format, not a lock-in.

The container is a portable artifact, .carto/anci.{yaml,bin} with a verifiable identity: source commit, tree hash, pinned grammar versions, and a sha256 content digest. Same repo → same digest. Build it on one machine, load it on another. The digest is checked on load, and every AI tool reads it with zero re-index.

carto · build once
portable
01

carto init

parse the repo → build the container

02

carto export --out myrepo.anci

pack yaml + bitmap + manifest into one file

03

carto load myrepo.anci

unpack on any machine, no re-index, digest verified

Loaded containers are treated as untrusted data, never instructions: portability without a prompt-injection hole.

consumer.js
read it, no runtime
const { loadAnci } =
  require('carto-md/src/anci/consumer');

const c = loadAnci('./.carto');

c.domains;
// [{ name: 'AUTH', file_count: 42 }, …]

c.blastRadius('src/auth/session.ts');
// { count: 88, hops: 3, files: [ … ] }

c.getHighImpactFiles(5);
// top 5 by transitive dependents

↳ zero Carto runtime · zero deps · JS today, Python next

The container is a CLI you live in, not a black box. Everyday commands answer questions straight from the map, and pr-impact shapes the blast radius between two refs, so it drops straight into CI.

[ EVERYDAY COMMANDS ]
carto impactcarto whycarto checkcarto statuscarto doctorcarto pr-impact

↳ multi-repo · load many containers side by side: monorepos and org-wide, one map per repo, queried together.

HOW IT WORKS05 / 07
[ ADD IT IN A MINUTE ]

Build. Run. Attach.

[ 01 ]carto init

Build.

Parses your repo: imports, routes, models, domains, blast radius, and writes the container to .carto/. Auto-wires every AI tool it finds on your machine.

[ 02 ]carto serve

Run.

Serves the container over MCP: a compact core-10 plus parameterized families, so your AI spends its context on your code, not a tool menu. Auto-syncs on commit, checkout, merge & rebase. It stays fresh by itself. Decisions and drift persist in one SQLite file.

[ 03 ]via MCP / ANCI

Attach.

Cursor, Claude, Copilot, Kiro: every tool queries the same container instead of building its own index. Or read the ANCI file directly, no runtime.

SPEED · BENCHMARKS06 / 07
[ SPEED · REAL REPOS ]

Packs a 7,500-file repo in under nine seconds.

Fresh runs on real open-source repos (Apple M-series, 8 CPUs, 8 GB RAM). Re-syncs are incremental, under a second on every repo here.

carto bench · fresh runs
M-series · 8 CPU · 8 GB
RepoFilesFirst indexRe-indexContainer
cal.com4,3523.9s805ms3.1 MB
supabase/supabase6,3585.9s967ms4.8 MB
vercel/next.js6,1936.9s978ms15.1 MB
microsoft/vscode7,5678.6s1.1s14.3 MB
LICENSE · TRUST07 / 07
[ WHAT CARTO NEVER DOES ]

Your code stays on your machine.

Sends your code anywhere

Local only. SQLite on disk. No telemetry, no cloud.

Writes secrets into the container

.cartoignore blocks .env & credential files by default.

Touches your manual notes

Only writes between CARTO:AUTO markers.

Costs money

MIT. Free forever.

[ QUESTIONS BEFORE YOU INSTALL ]

The short answers.

01So it's just shared context across my AI tools?
No, that's the least of it. Carto is the layer between your codebase and your AI. Your repo becomes a portable container that sits in the path: every change your AI tool proposes passes through it, gets graded, and the dangerous ones are blocked before they reach disk. A plain index is passive context you hope the AI reads. Carto is context that pushes back.
02I already use Cursor or Copilot. What does Carto add?
They each build their own index of your repo and throw it away when the tab closes. Carto packages the repo once into a container every tool shares, so your AI starts each session already knowing your architecture, blast radius and past decisions, instead of re-reading 40 files to guess.
03Can it actually stop my AI from making a risky change?
Yes. Carto grades every diff your AI proposes for risk and boundary violations before you ever see it, and the MCP middleware can block a HIGH-risk edit before it reaches disk. It's a guardrail that pushes back, not a report you read after the damage is done.
04How is this different from my tests and linter?
Tests catch broken behavior. Linters catch broken syntax. Neither sees what a change did to the shape of your system. Carto shows the blast radius: touch one file and it names the 22 others that break, transitively, before the diff lands.
05Does it remember what we decided last week?
Yes. Every decision and validated diff is saved in one local SQLite file. Ask “did we agree on snake_case here?” six weeks later and you get the actual verdict, not a fresh guess. The container gets smarter the longer the repo lives.
06Does my code ever leave my machine?
No. Carto is local-only: a SQLite database plus an open ANCI file inside a .carto/ folder on your disk. No cloud, no account, no telemetry, ever. .cartoignore blocks .env and credential files by default.
07Which AI tools does it work with?
Any MCP client: Cursor, Claude Code, Copilot, Kiro, Zed, Windsurf, JetBrains and more are auto-wired when you run carto init. Or read the ANCI file directly with zero Carto runtime.
08Will it understand my stack?
It parses 17 languages with tree-sitter, detects routes across Express, Next.js, tRPC, FastAPI, Flask, Django, Gin, Axum, Spring, Rails and ASP.NET, and extracts data models from Prisma, Zod, Drizzle, Pydantic, SQLAlchemy and JPA.
09How does the container stay fresh?
It auto-syncs on git events: commit, checkout, merge and rebase, and re-syncs are incremental, under a second on every repo we benchmark. If the repo moves ahead of the index, queries warn that the graph is stale instead of answering with old data.
10Does it work across multiple repos?
Yes. Load many containers side by side for monorepos or org-wide setups: one map per repo, queried together.
11Is this Docker?
No. Docker containerizes compute: the OS and binaries a CPU needs. Carto containerizes context: the import graph, blast radius and structural boundaries an LLM needs to reason about your code without re-reading it. No daemon, no image pull.
12How much does it cost?
Free. MIT-licensed, one SQLite file, no cloud bill. That's the whole pricing page.
[ SHIP THE MAP ]

Package your codebase once.
Let every AI understand it.

One command builds the container and wires itself into every AI tool on your machine. Free, MIT, and it never leaves your disk.

npm i -g carto-md && carto init