
Personal website
This site: a bilingual blog written in version-controlled Markdown, deployed on Vercel.
- Goal
- A personal space to write and showcase my work.
- Result
- In production on Vercel, tuned for performance, accessibility and SEO.
- Tech stack
- AstroTailwind CSSMarkdownVercel
This site is built with Astro and Tailwind CSS, fully bilingual (French / English), and deployed on Vercel. Posts are Markdown files versioned alongside the code: every publication goes through a pull request, images live in the repository, and a push is all it takes to deploy. A playground to sharpen performance, accessibility and SEO.
The context
This site is the project I keep coming back to, and my testing ground for stacks and tools. Its first version combined Astro for the blog, Next.js for the about page and Notion as a CMS: a webhook triggered a rebuild on every change, and images were copied to Vercel Blob because Notion only exposes temporary URLs.
I have since simplified it: the whole site now runs on Astro alone, and posts are Markdown files in the repository. The old article URLs permanently redirect to the new ones.
What I built
French is the default language and English lives under /en. Each post exists as two files linked by a shared translation key, which drives the language switcher and each post’s hreflang tags. The site has light and dark themes, one RSS feed per language, and structured data (Person, ProfessionalService, BlogPosting, breadcrumbs).
At build time, an Astro integration uses sharp to compose 1200 × 630 Open Graph cards for pages and projects (posts crop theirs from the cover image), so shares on LinkedIn or Slack no longer crop a portrait image. The contact form posts to a Vercel function that sends the message through the Brevo API; it also works without JavaScript, redirecting to a confirmation page.
The stack and why
Astro outputs static HTML and ships almost no JavaScript to the browser, which suits a site that is mostly text. Tailwind CSS handles styling, and code blocks in posts are highlighted by Shiki in both light and dark variants.
Every pull request goes through a GitHub Actions pipeline: Biome linting, type checking with astro check, Vitest unit tests, the build, then Playwright end-to-end tests. Each pull request also gets its own Vercel preview URL, handy for proofreading a post before merging it. Renovate opens dependency updates every Monday and merges minor and patch versions on its own.
Where it stands
The site is in production on Vercel, and its code is public under the MIT license. I keep improving it, especially its performance, accessibility and SEO.
