Architecture maps for JS/TS and Python web apps
Every arrow on this map has a receipt.
Evident reads a codebase and draws what talks to what: routes, middleware, database tables and external services. Click anything and it shows the exact lines of code that prove it.
Or give it to your coding agent
One command adds the Evident skill to Claude Code, Codex, Cursor and other agents. It checks the blast radius before an edit and cites file:line instead of guessing.
- 100.0% route precision
- 100.0% route→table recall
- 8 benchmark repos
- 0 lines of your code executed
- 1GET /cars/:idapp/(main)/cars/[id]/page.jsx:28-41
- 2middleware.js:52 middlewareguardsmiddleware.js:52
- 3CarPage()handlesapp/(main)/cars/[id]/page.jsx:28-41
- 4Clerkusesmiddleware.js:55
- 5NotFound()callsapp/(main)/cars/[id]/page.jsx:33
- 6getCarById()callsapp/(main)/cars/[id]/page.jsx:30
- 7serializedCarData()callsactions/car-listing.js:300
- 8Carreadsactions/car-listing.js:245-247
- 9DealershipInforeadsactions/car-listing.js:291-295
- 10TestDriveBookingreadsactions/car-listing.js:270-279
- 11Userreadsactions/car-listing.js:240-242
- 12UserSavedCarreadsactions/car-listing.js:258-265
A real trace from the gallery. Each hop cites the line that creates it.
What GET /cars/:id touches, hop by hop. Click a box for the line of code behind it.
Why Evident
Most architecture diagrams are guesses. This one shows its work.
AI diagram tools ask a model to imagine your system from its folders. The result looks right until a box turns out not to exist. Evident extracts the facts first and lets the model do one small, checked job.
| Typical AI diagram tools | Evident | |
|---|---|---|
| Where boxes come from | An LLM reading the file tree and README | Static analysis of the code |
| Level of detail | Folders and modules | Routes → middleware → handlers → tables, services, env vars |
| Proof for an arrow | None | file:line at the exact commit, one click away |
| Accuracy | Not measured | Hand-labelled benchmark, re-run in CI on every change |
| What the LLM decides | What exists and how it connects | Only group names, over nodes that already exist; it can't add a box |
How it works
Five stops from repo to map
The same pipeline runs on the web, in the CLI and in the Claude skill. Only the last stop involves an LLM, and its output is validated against the graph.
01Parse
tree-sitter reads every file as text. Nothing is installed, imported or run.
npm install: never · eval: never02Extract
Framework and ORM adapters find routes, middleware, handlers, models, SDK calls and env vars.
route:POST /api/orders03Link
Imports, aliases and calls are resolved, so each route connects to the tables it touches.
POST /api/orders → createOrder() → Order04Check
Health rules flag writes without auth, unvalidated bodies, import cycles and unused models.
unguarded-write · POST /api/orders05Group
An LLM may only label groups of nodes that already exist. Anything else is rejected.
group:orders (inferred)
What it answers
The questions you have on day one of a new codebase
What does this request do?
Pick a route. The path lights up through middleware, handlers and calls to every table and service it touches, with the code for each hop.
GET /cars/:id → 11 hopsWhat breaks if I change this?
Select a table, file or env var and see everything that depends on it before you edit it.
TestDriveBooking: 25 routes, 59 dependentsIs this endpoint safe?
Health checks flag writes with no auth guard, unvalidated request bodies, import cycles, unused models and undocumented env vars.
info ARCJET_KEY is read but not listed in .env.example.
Examples from aadilsal/MotorAi, 39 routes, 6 models, 4 services.
Accuracy
Measured, not promised
8 repos, each pinned to a commit and labelled by hand. Every engine change is scored in CI, and the build fails if any number drops by more than 2 points.
| Category | Precision | Recall | Labelled items |
|---|---|---|---|
| routes | 100.0% | 100.0% | 460 |
| models | 100.0% | 100.0% | 26 |
| services | 100.0% | 100.0% | 16 |
| route → table edges | 100.0% | 100.0% | 168 |
Full results and history · Supports Express, Fastify, NestJS, Next.js, FastAPI, Flask, Django with Prisma, Drizzle, TypeORM, Mongoose, Django ORM, SQLAlchemy. Per-adapter scores
Three ways to use it
Same engine, wherever you work
On the web
Paste a public GitHub URL and get the map in under a minute. Every view has a link you can share, pinned to the commit.
github.com/owner/repo → Map this repoIn your terminal
The same engine runs offline on private code. It writes only inside .evident/ and opens this map on localhost.
evident analyze .
evident trace "POST /api/orders"
evident impact Order
evident openIn your coding agent
The Evident skill works in Claude Code, Codex, Cursor and other agents. It checks the blast radius before an edit and cites file:line instead of guessing. It installs the CLI on first use, after asking.
npx skills add aadilsal/Evident
> what breaks if I change User?
“3 routes write User: …”Try it now
Open a pre-analysed map, or map your own repo
- aadilsal/MotorAiPrisma + Next.js39 routes · 6 models · 7 findings
- aadilsal/MunshiPrisma + Express + Next.js56 routes · 11 models · 10 findings
- aadilsal/AjaiConsultancyAssignmentPrisma + NestJS + Next.js24 routes · 3 models · 7 findings
- aadilsal/Insight-OSNext.js + FastAPI24 routes · 0 models · 4 findings
- aadilsal/SpotterTruckLoggingDjango ORM + Django24 routes · 6 models · 23 findings