NOTES ENGINEERING

Why studio86.dev is a static site again

We rebuilt this site from a Node-rendered stack to static files behind nginx. Faster, harder to break, and Google finally understood our URLs.


The previous version of this site was a Node and Express app that rendered pages on request, proxied a Django CMS, and ran under a process manager that needed restarting whenever it got moody. It worked. It was also a running program, with everything that implies: memory to monitor, dependencies to patch, and a process that could crash at 3am for reasons unrelated to anything we changed.

The rebuild is static. Astro compiles every page to plain HTML at build time, nginx serves the files, and the only running code left is the small API that handles contact forms and Stripe checkout. The marketing site itself cannot crash, because there is nothing running to crash.

The bug that justified the whole project

The rebuild surfaced a search problem we didn't know we had. Our sitemap listed URLs with trailing slashes (/work/) while the pages' canonical tags claimed the slashless form (/work). To Google, that's two URLs disagreeing about which one is real. Its crawler followed the canonical, hit a redirect back to the slashed form, and read the loop as conflicting signals. Pages quietly fell out of the index.

The fix was one rule applied everywhere: every URL on the site uses the trailing-slash form, in the sitemap, the canonical tag, the Open Graph tags, the breadcrumb schema, and every internal link. Boring, mechanical, and worth more than any amount of keyword tuning, because no optimization matters on a page Google refuses to index.

What static buys you

  • Speed without effort. Time-to-first-byte sits around 200ms through the CDN. There is no render step to optimize because there is no render step.
  • A tiny attack surface. Static files don't have injection bugs, dependency exploits, or sessions to hijack. The strict security headers stay strict because nothing dynamic needs exceptions.
  • Deploys you can reason about. A deploy is a folder swap behind a symlink. Rollback is pointing the symlink at the previous folder. No migrations, no warm-up, no half-deployed state.
  • Per-page everything at build time. Each page gets its own Open Graph image, structured data, and meta tags, generated once at build instead of computed per request.

Where the line is

Static is the right default for marketing sites, documentation, and most content. It's the wrong tool the moment real application state appears: accounts, dashboards, anything personalized. Our own products (TwitchGuard, 86Sheets) are running services, because they have to be. The discipline is refusing to let the marketing site become one too.

If you're paying for hosting, maintenance, and uptime monitoring on a site that's really just pages, that's worth a conversation. Here's how we build them, starting at $1,000.