The order things actually happened in
This site went live as a single index.html file with no build step, no
framework, and no database — a temporary holding page with a mailto link.
Days later it had a scroll-driven hero animation, a case study with a
video slideshow, and enough visitors that the next request was "I want to
edit this myself and I want it to show up in search." That request is what
actually justifies a framework and a backend — not doing it upfront because
it's the modern default.
What "static first" bought in the meantime
- Zero-config deploys. No build step means no build to break. Every push either works or the diff is obviously wrong.
- No third-party requests at runtime. GSAP and both webfonts are vendored into the repo — downloaded once, committed, served from the same origin as everything else. No CDN outage can take a font down; no Content-Security-Policy has to trust an external host.
- A page that works with nothing turned on. Every animation on this site is additive: strip the JavaScript, and the content is still there, still readable, still linking to the right places. That's not an accessibility footnote — it's what falls out naturally when the default state has to render correctly before you write the enhancement.
Where static actually stops being enough
A static file has no login page. It can't have one — there's nothing to authenticate to, no session to hold, no database row to check permissions against. The instant the ask becomes "let me edit this without asking for a commit," the answer isn't a bigger static file, it's a real backend: a database for the content, auth for the one person allowed to change it, and a build step that can regenerate pages from that data. That's a different architecture, deliberately adopted for a concrete reason — not a static site failing, but a static site having done its job until the job changed.
The migration itself doesn't need to be risky
The riskiest part of moving from hand-written HTML to a framework isn't the framework — it's silently losing the specific, hard-won correctness that accumulated in the old version while nobody was looking. A mobile performance fix, a fallback for JavaScript being disabled, an animation that reverses cleanly when scrolled backward — none of that shows up in a screenshot. Porting it means carrying the same logic over deliberately and re-running the same tests against the new version, not rewriting from memory and hoping nothing was forgotten.
Written by Lars Sohl
