Auto cross-service links
Matches what each service consumes against what others provide.
Your AI assistant explores your codebase blind — one grep at a time. graffiti turns the whole repo into a directed knowledge graph it can query. One static binary. No API key, no cloud, no cost.
$ graffiti . ✓ Done. 0 API calls, $0. 214 files → 1,883 nodes, 4,102 edges, 12 communities. The 3 most interesting questions your map can answer: 1) Which module is the load-bearing wall? 2) What does the auth flow touch? 3) Where are the cross-package call hotspots?
Every run sorts everything and stamps a single timestamp. Diff two builds and only the clock moves. Commit the map; review it like code.
A microservice system is N independent repos that form one product. graffiti maps each one, then discovers the edges between them — HTTP, gRPC, queues — from each service's contract.
$ graffiti system build ✓ System: 12 services → 38 cross-service links (2 ambiguous, 1 dangling, 4 orphan). 0 API calls, $0. $ graffiti system impact carts::GET /carts/{} ← checkout, web-bff, mobile-bff depend on it
Matches what each service consumes against what others provide.
Change an endpoint → see every service that breaks.
Dangling consumers, orphan providers, ambiguous matches.
The orchestrator federates the published artifacts.
Got a folder of independent services in subdirectories? Map them into one system graph — no merge, no cloud, no config.
build then publish every subdirectory into a store at the parent folder.
system build federates the maps and auto-discovers cross-service links.
render the map, ask impact/query, and gate CI with audit.
# parent folder; services live in ./orders, ./web, ./payments … # 1 — build + publish every service into a shared store for d in */; do graffiti build "$d" && graffiti publish "$d" --to .; done # 2 — federate + auto-discover the calls between them graffiti system build ✓ System: 3 services → 7 cross-service links (0 ambiguous, 0 dangling). 0 API calls, $0. # 3 — explore graffiti system impact orders # who breaks if orders changes graffiti system render # → .graffiti-system/system.html
Improve accuracy by dropping an openapi.json, a .proto, or a graffiti.contract.json into a service.
Paste this one prompt into your Claude Code session. Say "y" when it asks for permission. Done.
No Go toolchain, no build flags, no config hunt — Claude downloads the binary, maps your repo, and wires up the integration, asking before each command.
Install graffiti by amazopic for me. Download the right static binary for my OS/arch from the latest release at github.com/amazopic/graffiti (or build it from source with `make build` if Go is available), put it on my PATH as `graffiti`, and verify with `graffiti version`. Then run `graffiti .` at my repo root to build the map, run `graffiti init --hook` to wire graffiti into Claude Code, and finally open `.graffiti/map.html` so I can see the graph. Ask before each step.
↳ Just say y (yes) at every permission prompt — Claude will run each command one by one.
An AI coding assistant is only as good as what it can see.
graffiti is the map that should have been there.
Ask “where is the cart fetched and served?” — here's what your assistant has to read to answer it: grepping blind versus one scoped graph query.
Illustrative — actual savings vary by repo and task. graffiti query caps each answer at a soft ~2,000-token budget, so context stays lean and cheap.
graffiti . writes everything into .graffiti/.
The graph itself — nodes, edges, communities, schema-checked.
A human-readable digest of the most important structure.
A single self-contained, offline, interactive force-directed graph.
| Capability | Grep / cloud RAG | graffiti |
|---|---|---|
| Directed graph: calls, defs, imports | no | yes |
| Runs fully offline, no account | no | yes |
| Ongoing cost | $ per token | $0 |
| LLM-free, token-budgeted retrieval | no | yes |
| MCP server built in | no | yes |
| Byte-deterministic output | no | yes |
| Interactive offline graph viewer | no | yes |
| What it needs | cloud + API keys | one binary |
One static binary does it all: build the map, query it, serve it over MCP, and wire itself into Claude Code.
One curl — or make build from source.
Run graffiti . at the repo root.
graffiti init --hook — and your assistant reads the graph.
Have Claude Code open? Paste this one prompt and you're done — no terminal needed.
# 1 — get the binary (verifies SHA256) curl -fsSL https://raw.githubusercontent.com/amazopic/graffiti/main/scripts/install.sh | sh # 2 — map your repo graffiti . # 3 — look at the graph open .graffiti/map.html
The installer picks the right static binary for your OS/arch and verifies its SHA256. Prefer source? make build produces the same ~10 MB CGO-free binary.
graffiti init --hook # skill + CLAUDE.md + grep→query nudge graffiti serve # MCP server over stdio graffiti query "auth flow" # LLM-free scoped subgraph
Lay separate repos side by side and query across them — without merging.
Assert cross-project edges, validate they resolve, then query the whole federation.
$ graffiti link ../frontend ../backend ✓ Linked 2 projects. 7 cross-project links. 0 API calls, $0. $ graffiti query --workspace "where is the cart fetched and served"