Map any repo from a prompt

Hand the prompt to your coding agent, paste back what it gives you, and see your codebase as a map — no install, no account. Your source never leaves your machine: the agent reads it locally and emits only the structure.

1 · Copy this into your coding agent
Map THIS repository into a portable "scan" that reads like a PRODUCT, not a folder tree. A non-engineer should understand it at a glance. Output ONE JSON object and nothing else (no markdown fences, no prose).

How to make it read well (this is the whole point):
- Name each node for what it DOES, in plain words a user would recognize: "Billing", "Support agent", "Auth", "Search", "Weekly digest" — NOT the folder ("apps/api", "lib/utils").
- Give each node a short "sub": what it does in plain language ("answers support tickets", "charges cards", "sends the digest") — NOT a file count.
- Label EVERY meaningful edge with the plain relationship — WHAT flows or WHEN: "charges on trial end", "nightly evals", "on signup", "escalations". A blank arrow tells the reader nothing.
- Put recognizable third-party products (Stripe, OpenAI, Postgres, Resend, S3, Slack) as their OWN "external" nodes on the receiving end, named by the product, with "sub" = what it's for ("Payments", "AI", "Database", "Email").

Rules:
- Structure only. Use paths, names, routes, and one-line paraphrased reasons from git history. NEVER include file contents, code, secrets, tokens, or connection strings.
- Limits: <=60 nodes, <=120 edges, <=40 decisions, <=12 blind spots. Prefer FEWER, clearer nodes over many.
- Be honest. If you can't tell, omit it. Do not invent edges, tools, or decisions.

Shape (ScanPayload v1):
{
  "version": 1,
  "project": { "name": "", "slug": "lowercase-dashed", "date": "YYYY-MM-DD", "window": { "from": "YYYY-MM-DD", "to": "YYYY-MM-DD", "commits": 0 } },
  "graph": {
    "nodes": [ { "id": "unique-id", "label": "Plain feature name (<=28 chars)", "kind": "entry|job|service|store|external|surface", "churn": 0, "sub": "what it does (<=40 chars)", "group": "optional area", "sourceRef": "path (optional)" } ],
    "edges": [ { "from": "nodeId", "to": "nodeId", "kind": "calls|reads|writes|triggers", "label": "plain phrase (<=24 chars)" } ]
  },
  "decisions": [ { "id": "d1", "claim": "what was decided (<=120 chars)", "why": "the reason (optional)", "when": "YYYY-MM", "evidence": "shortSHA or #123", "scope": "nodeId (optional)", "recorded": "adr|pr|commit|none" } ],
  "blindSpots": [ { "node": "nodeId", "changes": 0, "lastChange": "YYYY-MM", "note": "" } ]
}

Field values:
- kind: entry=route/page/CLI/webhook/handler, job=cron/queue/worker, store=your DB/cache/index, external=3rd-party product (Stripe, OpenAI, Postgres…), surface=app shell (web/cli), service=an internal capability.
- churn: 0 untouched ... 3 among the most-changed in the window (from git log).
- every edge "from"/"to" MUST be an existing node "id".
- recorded: adr (a doc in the repo), pr (only the PR body), commit (only a commit message), none.
- You may omit "stats" and "coverage"; they are derived on render.

Example of the STYLE to match (yours will differ):
{"version":1,"project":{"name":"Acme","slug":"acme","date":"2026-07-25","window":{"from":"2026-01-01","to":"2026-07-25","commits":420}},"graph":{"nodes":[{"id":"job/digest","label":"Daily digest","kind":"job","churn":2,"sub":"emails a summary each morning"},{"id":"svc/support","label":"Support agent","kind":"service","churn":3,"sub":"answers support tickets"},{"id":"svc/billing","label":"Billing","kind":"service","churn":1,"sub":"plans & quotas"},{"id":"ext/stripe","label":"Stripe","kind":"external","churn":0,"sub":"Payments"},{"id":"ext/postgres","label":"Postgres","kind":"external","churn":0,"sub":"Database"}],"edges":[{"from":"svc/support","to":"ext/postgres","kind":"writes","label":"answers, scores"},{"from":"svc/billing","to":"ext/stripe","kind":"calls","label":"charges on trial end"},{"from":"job/digest","to":"svc/support","kind":"triggers","label":"nightly evals"}]},"decisions":[],"blindSpots":[]}

Output ONLY the JSON object.
Works with Claude Code, Cursor, or any agent that can read your repo. It returns one JSON object.
2 · Paste what it gives you back