Why Astro
Astro ships zero JavaScript by default. Your content renders to plain HTML on the server, and interactive islands hydrate only where you ask for it. For a content-heavy personal site — blog, research, galleries — that is exactly the trade you want.
The 45-minute path
npm create astro@latest— pick the blog template, TypeScript strict.- Define a content collection in
src/content.config.tswith a zod schema. - Write your first
.mdxpost — frontmatter is validated at build time. - Add a
[slug].astropage withgetStaticPaths()+render(). - Deploy:
astro buildproduces a fully staticdist/you can host anywhere.
Islands: the part people miss
<Hero client:load /> <!-- hydrates immediately -->
<Chart client:visible /> <!-- hydrates when scrolled into view -->
<Comments client:idle /> <!-- hydrates when the browser is idle -->
Reach for client:visible on anything below the fold. Your Lighthouse score will thank you.
What’s next
Add i18n with [locale] dynamic routes — that’s a separate lesson.