All Lab projects

Website Rebuild

AstroTypeScriptCloudflare WorkersGA4 / GTM

Problem

The legacy site was a static, dated page, and its hosting had quietly split in two without anyone noticing: the apex domain forwarded through Squarespace, but the actual content it forwarded to was served from a Heroku app nobody was maintaining. Worse, the content itself -- résumé entries, case studies -- lived only in a PDF, so nothing on any page was guaranteed to match what the résumé actually said.

Architecture

An Astro static site with typed content collections for case studies, lab projects, and résumé entries, deployed as Cloudflare Workers Static Assets. The résumé section in particular is data-driven: a single YAML source feeds the human-readable page, a machine-readable /resume.json endpoint, and is kept in verbatim sync with the downloadable résumé PDF -- the same claim about a project never gets written three different ways in three different places.

Engineering process

Each phase -- content model, contact form, analytics, accessibility, domain cutover -- shipped and was verified live in production before the next one started, not just marked done in code. That discipline caught real bugs directly: a GTM base tag firing on the wrong trigger type that silently dropped every page_view event; an Astro v6 runtime API removal that only broke on Windows; a case-sensitive email match that made the contact form's sandbox sender reject valid addresses; and a missing heading hierarchy on detail pages that a manual accessibility pass caught after automated tooling missed it.

Launch

Production cutover meant retiring the legacy split entirely: a Cloudflare Custom Domain, DNSSEC re-enabled with a hand-verified DS record, a www-to-apex redirect, and Search Console domain verification, done as a sequence of separately-authorized steps rather than one large change.

Outcome

Live in production with a 100/100 Lighthouse Performance and Accessibility score on desktop, working analytics, a contact form verified end to end with a real send, and DNSSEC validating cleanly all the way to a resolver.

Takeaways

Modeling the résumé and case studies as structured content instead of prose baked into page templates made the "did I update this everywhere" problem mostly disappear. The PDF is still verified by hand since it is a separately compiled asset, but everything else on the site now derives from one file.