I built this site with Astro because it ships almost no JavaScript by default, yet still lets me drop in React components wherever I need interactivity.
The stack
- Astro — static-first framework with built-in content collections
- React — for interactive islands (the dark-mode toggle and contact form)
- TypeScript — type safety end to end
- Tailwind CSS — fast, consistent styling
Islands, not pages
The whole site is static HTML, except two small React “islands”:
<ThemeToggle client:load />
<ContactForm client:load />
Everything else renders to plain HTML at build time, which is why the pages load instantly. It’s the kind of architecture I wish more apps used.
Want the source structure? It’s all driven from a single src/data/site.ts
file, so updating my CV or projects is a one-file change.