Drop a .whymark file, or paste it. Parsing, highlighting, and history all run on your device — the file is not uploaded, not logged, and not stored on a server.
These live in the whymark repository and are part of the site build, not your history.
A fixed 200ms delay sends every retrying client back at the same instant, so a service that is shedding load gets a synchronized second wave and sheds that too. Retries now double their window per attempt and pick a random wait inside it, capped so a single call cannot stall a request indefinitely. This file really exists in the repo, so this review is live: the controls in the gutter discard an added line or put a removed one back, clicking a highlighted piece of a changed line takes just that piece back to the old text, and `edit` writes your own version straight to `examples/retry.ts`. Three parts of the change are deliberately worth rejecting — a leftover debug log, a widened list of retryable statuses, and a base delay nudged from 200ms to 250ms on the same line as a rename worth keeping. `git checkout examples/` undoes anything you apply.
Five unrelated small fixes, all found by using this tool on its own output rather than by reading the code again. This review predates the rename to whymark, and the diff below is left as it was recorded: the modules appear at their old paths under `src/lib/crev/`, and the blob hashes pin to the commit as it was made. Rewriting a diff to match a later name would break the one property that makes a review worth reading. Writing the first example review surfaced two output bugs: a plain modified file was serialised with `from=<same path>`, which made a round-trip through the parser report it as *renamed*; and `crev prompt` was emitting the human-facing preamble of the prompt template to an agent that only needed the instructions. The CLI also printed "Try --staged" when the user had just passed `--staged`, and `--staged` reviews silently included untracked files, which are by definition not staged. Finally, `npm run lint` rejected the `useMediaQuery` hook, so it is now built on `useSyncExternalStore`. No behaviour in the format itself changed; the parser and serializer fixes only affect what a generated document says about a file.
One integration partner was issuing ~40 search requests a second, which saturated the read replica and slowed checkout for everyone. This adds a fixed-window limiter in front of `/api/search` only: 100 requests per minute per API key, `429` with `Retry-After` when exceeded. It deliberately does not touch the other routes. The window is stored in Redis with `INCR` + `EXPIRE`, so it is shared across the four app instances rather than per-process.
History is stored in this browser's IndexedDB, on this origin only. Clearing it removes the copies of reviews you opened here. Clearing app data also drops local/session storage and this origin's Cache Storage. It cannot erase Vercel request logs for the page itself (paths, IP, user-agent) — those never include the file you dropped.