Framework
Astro 5 with MDX, content collections, and the ClientRouter view transitions API. No client-side framework — every island is vanilla TypeScript.
How this site is built, hosted, and composed.
Astro 5 with MDX, content collections, and the ClientRouter view transitions API. No client-side framework — every island is vanilla TypeScript.
Services, case studies, and blog posts live in typed content collections with Zod schemas. Each entry is an MDX file keyed by locale. The same helpers power en/, /es/, and /ca/.
Hand-written Sass with CSS custom properties. Light and dark themes share a single token layer. No utility framework — the tokens are semantic, W3C DTCG style.
Playfair Display for headings, Inter for body, JetBrains Mono for labels. Loaded from Google Fonts with font-display: swap.
Three locales: en (default at /), es (/es/), ca (/ca/). A typed ui dictionary in src/i18n/ui.ts holds every UI string. useTranslations(locale) falls back to English for missing keys.
Static build deployed to CDN. Umami Cloud for privacy-first analytics. No cookies, no trackers, no ads.
The site is open on GitHub. Feel free to steal any pattern — I certainly borrowed a few.