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 under /_llms/. 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.