# START HERE — one question, followed all the way down You have never seen this repository. Somebody types a question into NodeBench, presses Enter, and an answer streams back with sources under it. This page walks that one action through the code **in the order the machine runs it**, not in the order an architecture diagram would draw it. This walkthrough covers `/redesign/chat`; it is not a map of every public, Workspace, Node worker or MCP route. See the README's codebase map for those entry points. Coding agents also read [`AGENTS.md`](../AGENTS.md) and [`AGENT_COORDINATION.md`](../AGENT_COORDINATION.md) before shared-file edits. Read it top to bottom once. Then open `.tours/` in VS Code (CodeTour extension) and walk the same path inside the real files — the tour points at live source, so it cannot go stale the way a copied snippet can. **The gate this page answers to** is the shared HUMAN-READY gate, kept in one place and never restated here: --- ## Before Step 1 — can you even run it? ```bash nvm use # Node version from .nvmrc npm install npx vite --port 5173 # frontend only — this is the honest local start ``` Open . You will see a card that says **"Convex backend not configured."** That is the designed state, not a bug. NodeBench keeps every piece of durable state — users, chat runs, reports, entities — in **Convex**, a hosted backend that this repo does not ship a local substitute for. Without a deployment URL there is no database, so there is no product. To get past that card you need `VITE_CONVEX_URL` pointing at a real Convex deployment (`npx convex dev` provisions one against a Convex account). Everything from Step 3 down needs that backend. Steps 1–2 you can read and run without it. Do **not** start with `npm run dev`. That command runs three processes in parallel and two of them block on credentials you may not have. See `docs/codebase/CONCERNS.md`, defect D4. --- ## Step 1 — The browser loads the app and decides whether the backend is usable **File:** `apps/web/src/main.tsx` **Symbol:** module top level → `createRoot(...).render(...)` **Called by:** the browser, via `