Updated: 2026-05-26
This website was created by Matteo Cervelli using a mix of personal skills and AI. I previously had a website on WordPress, then rebuilt it in early 2025 as a static site to “keep control”. In 2026 I migrated to Astro to go fully self-hosted and learn the modern JavaScript ecosystem.
I wanted something lightweight, fast, and in my hands end to end.
Site generator
matteocervelli.com is a static website. It is built with Astro 6 as the SSG — Static Site Generator — with bilingual output (English and Italian). Content lives in Markdown and MDX files under src/content/, with full TypeScript inference via Astro’s Content Layer API.
Hosting and deployment
The site is self-hosted on a Hetzner dedicated server (AX42), routed through Cloudflare for DNS and CDN. The Astro build is packaged as a Docker image and deployed via Forgejo CI/CD. Forgejo is my self-hosted Git forge — it runs all builds and deploys; GitHub is a public mirror only.
The production container builds the static dist/ output and serves it on port 4321.
API and gateway
Newsletter and lead magnet forms are static frontend forms that POST to same-origin /api/* paths. Those paths are routed by the infrastructure to Mercurius — a self-hosted gateway service I run alongside the site. Mercurius owns subscriber writes, email delivery, and confirmation flows. The site itself has no secrets and no server-side logic.
Content workflow
My passion for Markdown comes from Obsidian, which I moved to a few years ago for all my notes and writing. I write everything in Obsidian — bilingual — and sync to the site repo. For someone who came from a closed CMS, having everything in plain files is still liberating.
AI tooling
I build with Claude Code and Codex, both from the terminal and alongside VS Code or Vim. They changed how I work: I can move fast on the frontend and infrastructure even in ecosystems where I’m still learning. Everything generated by AI is read, understood, and owned by me before it ships.
For more on how I use AI on the site, read my AI use policy.
Colors and typography
The color palette:
- MC Purple: #AF00BF
- MC Peach Light: #FFE8D1
- MC Black: #303030
The fonts:
Other tools
- Google Workspace — email, Drive, documentation
- Umami Analytics — self-hosted, privacy-first analytics
- Canva — graphics
- Unsplash — stock images
- Stripe — payments
- Fiscozen — accounting for Italian VAT (affiliate)
Final note: A huge Thank you to Steph Ango, both for his work on Obsidian and for the design and logic of his blog from which mine takes much inspiration.