Skip to content
Guillaume Ojardias
Home page of Guillaume Ojardias’ personal website
Side projectWeb

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.

On the blog