How this site is built
Builtin the open
A small site, built the way I'd build a platform: few moving parts and everything in Git.
The stack
Astro, static
Every page is plain HTML built ahead of time. No server and no database: a portfolio is static content, so it is served as files.
Very little JavaScript
Pages work without scripts. A few small hand-written ones add the moving light, the header behaviour, the card tilt and the Ctrl/Cmd+K palette. No UI framework is shipped to the browser.
Plain CSS + design tokens
One file of CSS variables holds every colour, size, shadow and timing. Every text colour passes WCAG AA contrast on the dark background.
Self-hosted fonts
Archivo (condensed headings), Inter (body) and JetBrains Mono (labels) are bundled with the site, so no requests go to a font service.
View Transitions
Pages swap in place: the header and the light layer stay put between pages, so the site feels like one continuous dark space.
Content as Markdown
Case studies are Markdown files in a content collection, checked against a schema at build time. Every fact traces back to my CV or my own answers.
Accessible motion
Keyboard focus is always visible, there is a skip link, and every animation switches off under the reduced-motion setting.
Shipping it
Live Every push to main runs this pipeline. The hosting itself is defined in Terraform, with its state kept in HCP Terraform, and nothing is clicked together by hand. The workflow and the Terraform are in the public repo.
- GitHubpush to main
- GitHub Actionscheck · build
- TerraformPages project · HCP state
- Cloudflare Pagesdeploy · serve