This documentation is also published as Markdown for efficient machine reading: the whole site is indexed at /llms.txt, and every page has a clean Markdown copy at the same URL with .md appended. These are generated from the same source and cost far fewer tokens to read than this rendered HTML.

Skip to main content

April 15, 2026

A dev loop that keeps up

By Phil Scott

Save a file, see the change — the shorter that loop, the more you actually iterate instead of batching edits and checking later. Pennington's dev server keeps it short: save, and the browser updates itself.

Edit content, the browser follows

The dev server watches your content directory. Save a markdown file and it pushes a refresh to the browser over a WebSocket — no manual reload. A 300ms debounce coalesces rapid saves into a single reload, so a formatter-on-save doesn't trigger a storm of refreshes. It works under a plain dotnet run, with a reconnect guard so the browser recovers cleanly after a server restart.

.cs edits, too

Code samples come from source files via :symbol fences, so a sample reflects the current source every time the docs render. Edit the referenced .cs and the next render re-reads it, so the embedded sample reflects what you just typed — no copy to keep in sync. The watcher reacts only to source-file extensions (*.cs, *.json, and so on), so most build churn never registers, and the 300ms debounce coalesces whatever does into a single reload — a rebuild burst doesn't thrash anything. Point it at a focused content root so a stray *.cs under bin/ or obj/ never sneaks in. The hot reload explanation covers how the watcher and the WebSocket fit together.