Paste a URL, then chat with an agent that has actually read the page.
▸ Live demo — https://url-cheat-sheet.vercel.app
Instead of skimming a long article, RFC, or doc yourself, drop in its URL and just ask. The agent reads the page for you and answers grounded in the actual content — and every answer cites the source lines it used, so you can verify it rather than take it on faith. Useful for getting the gist of a dense page, pulling specific facts out of a wall of text, or interrogating documentation without reading it end to end.
- Paste a URL. The server fetches the page and extracts its readable
content: an SSRF-guarded fetch, a prompt-injection scan (
vard), and Readability parsing that strips nav/ads/boilerplate down to clean text plus a heading outline. If a page can't be fetched, is too large, or trips the safety scan, you get a clear status (extracting→flagged/extract-error) rather than a silent failure. - The page becomes the agent's memory. The extracted document is the only thing the agent can see — answers come from the page, not the model's prior knowledge.
- Ask questions. Chat streams answers from Claude. Under the hood the agent works through the document with four tools — outline it, search it, read specific line ranges — then finalizes a reply with citations back to the source lines. Long sessions stay anchored to what the page actually says.
Chatting uses your own Anthropic API key (see Bring your own key).
Agent tools (packages/agent/src/tools/):
outline— heading structure with line numbers; call first to see what's covered.grep_doc— case-insensitive substring search with surrounding context; supports OR-union for synonym exploration.read_lines— up to 200 lines of raw text by 1-based range.finalize— client-side sentinel; the model emits it to end its turn with a non-empty answer + citations.
API routes (apps/web/src/routes/api/):
POST /api/extract— fetch + SSRF guard +vardscan + Readability; returns typedExtractResponse(text, title, sourceUrl, headings, byteSize, scan) or typedExtractError.POST /api/chat— streaming chat via Vercel AI SDK v6.GET /api/health— liveness.
Chatting needs an Anthropic API key — paste it into the settings (⚙)
drawer. The key is held in memory only (never localStorage, disk,
or any other store) and is sent with the chat request for that turn;
close or restore the tab and it's gone. See the spec at
docs/specs/2026-05-20-byo-anthropic-key.md.
Extraction (/api/extract) needs no key — only the chat does.
bun install
bash scripts/setup-git-hooks.sh # one-shot: wire pre-push hook (blocks push-to-main)
bash scripts/setup-bd.sh # one-shot: provision custom bd statuses for the agentic workflow
bun run dev # SvelteKit on http://localhost:5173bun run typecheck && bun run lint && bun run test && bun run buildapps/web/— SvelteKit app (Vercel target). State-machine UI at/;api/{chat,extract,health}routes.packages/agent/— 4-tool agent (outline,grep_doc,read_lines,finalize), URL extract pipeline (url/{fetch,sanitize,ssrf,extract}.ts), system prompt,streamChatentry.packages/schemas/— shared Zod schemas (chat request, message, extract request/response, QA case).packages/evals/— promptfoo runner + suites. Canary suite undersuites/canary/.packages/qa/— QA case loader (parseCasevalidates QA cases against the schema).docs/— specs, plans, reviews, QA, evals, ADRs (seedocs/README.md).scripts/— one-shot setup (setup-git-hooks.sh,setup-bd.sh) plus orchestrator helpers (render-pr-body.sh,bd-pr-audit.sh,session-prime.sh)..claude/— vendored superpowers, project skills, team specs..beads/— task DB (bd v1.x: worktree-safe by default, no flags needed).
Read CLAUDE.md and invoke the using-this-repo skill first.
Bun 1.3, TypeScript 6, SvelteKit 2.60 (Svelte 5 runes), Vite 8 + Rolldown,
Vitest 4, Vercel AI SDK v6, Zod 4, promptfoo. ESLint 9 + Prettier 3.8.
Deploy: Vercel with adapter-vercel experimental_bun1.x runtime.