Work · Personal site · 2026
yausell.com
This site: a 5.8 MB self-extracting page rebuilt as a static Astro site that scores 100 on every Lighthouse category, with CI that keeps it there.
The problem
The original site was a single 5.8 MB HTML file that unpacked itself in the browser. Visitors saw an “Unpacking” placeholder until every image, font and script had been decoded from base64, and nothing about it was readable by search engines or AI assistants.
Constraints
- Keep the design and its signature effects: the lanyard badge, the WebGL depth portrait and the particles.
- Static hosting on Vercel, one maintainer, and no client framework.
- Make the facts editable without touching components.
Decisions
- Pre-render everything. Astro builds every page to HTML with its CSS inlined, so the first response is the page.
- Size images for their slots. AVIF with WebP fallbacks at two widths per image; the 2.3 MB portrait became 23 to 84 KB.
- Ship one font subset and an icon sprite. Seven Inter files became one Latin variable subset, and six icon stylesheets became an inline sprite of the icons in use.
- Make effects progressive. The page is complete without JavaScript. Heavy work starts after load, only on capable desktops, and never under reduced motion.
- Render the fold first. Sections below the fold use
content-visibilityuntil idle time, and anchor jumps render everything first so they land exactly. - Guard it in CI. Every pull request runs the build with a CSP hash check, size budgets and an internal link check, then Lighthouse on mobile and desktop and axe in both themes.
Outcome
The page went from 5.85 MB to about 117 KB on first visit, and every page scores 100 for performance, accessibility, best practices and SEO on mobile and desktop, with no layout shift. Anyone can re-run the measurement with the PageSpeed Insights link below.
Contact
Let’s build something considered.
For senior frontend roles, product collaborations, or to compare notes on building things next to a day job, email is the fastest way to reach me.