Blog post

The Trade-offs of a Static-First Site

What a fully static deploy gives up, and why we still chose it over an edge runtime.

Static means every URL is a file in dist/. That removes a long list of failure modes — but it also rules out a few things people sometimes assume the site can do.

What goes away

  • Per-request personalization. The site does not know who is viewing it.
  • Live previews of unpublished content without a build. A new post needs bun run build (or a branch deploy) to appear at a URL.
  • A/B tests that branch on the server. Anything dynamic moves to the client and runs against a public endpoint.

What we get back

  • Cache rules become trivial. Cloudflare serves the same bytes to every visitor, indefinitely, until the next deploy.
  • The blast radius of a bad change is the next build, not the next request.
  • Local dev matches production almost exactly, because there is no runtime layer to diverge from.

When we would change our mind

If a feature genuinely needs server-side context — geolocated content, authenticated dashboards, signed URLs — that feature gets its own service rather than reshaping the marketing site. The split keeps both halves small.