v0.3.0 — Astro 5 Migration
Major migration from single-file HTML (1916 lines, 200KB) to Astro 5 static site.
What changed
- Data-driven content — all projects live in `src/data/projects.ts`. Edit one file, rebuild, deploy.
- Build-time GitHub API — star counts baked into the static HTML via `scripts/fetch-stars.mjs`. No runtime rate limits for visitors.
- Componentized — FeaturedCard, LiveCard, CatalogEntry, SkillCard, Divider.
- Auto-computed counts — category filter badges, `statLive`, and total counts now derive from the data array. No more hardcoded drift.
- CI/CD — GitHub Actions builds + deploys on every push to main, with a daily cron refreshing star counts.
- Preserved — `legacy.html` committed as full backup of the pre-migration single-file site.
Under the hood
- Astro 5 + TypeScript + lightningcss
- Sitemap auto-generated
- Service worker cache bumped to `portfolio-v3`
- Output: 147 KB compressed HTML (was 206 KB)
- Build: ~540 ms cold
Gotchas fixed
"Catalog entries are hardcoded HTML"→ mapped from data array"Category filter counts are hardcoded — must update manually"→ auto-derived"statLive count is hardcoded in hero"→ `{liveApps.length}`
See CHANGELOG.md for full history.