Skip to content

Zero JavaScript, by default

Open your browser's view-source on this post. Look for a <script> that loads a framework runtime. There isn't one — and there isn't one on the blog index, or on any of its paginated pages either. None of them declare reactive behavior, so none of them pay for it.

That is the whole bargain. A .md file is plain CommonMark. Rename it to .wd and you unlock directives — state, loops, conditionals — but you only ship the ~7.7 KB runtime on the pages that actually use them. A listing built from a collection loop resolves entirely at build time, so it stays static HTML.

The extension is the feature gate

There is no flag to toggle, no "static export" mode to remember. The compiler tracks whether a page declared anything reactive and emits runtime: false into routes.json when it didn't. A collection listing, a paginated archive, a page of prose with a code block — all static, all cacheable on a CDN forever, all fast on the first byte because there is nothing to hydrate.

When you do want an island of interactivity — a search box, a cart, a sortable table — you declare it, and only that page loads the runtime. The rest of the site stays weightless.