Antoine Duvauchelle Product Engineer · Paris
I build design systems, polished UI, and the guardrails that let teams — and agents — ship them.
Ten years shipping production frontends, from startup studios to the booking funnel of Rail Europe. I care about the last 10% (interaction details, accessibility, perceived speed) and about making the right path the easy one for whoever builds next.
Before code, I was a journalist. I still write docs as if someone is actually going to read them.
Selected work
-
Rail Europe · 2025 — now
Instead of a rewrite, a revamp — a legacy Rails monolith moved toward modern Rails and Hotwire, the mobile apps brought onto the same codebase, and booking pages made to feel faster.
- front-end bundle size
- −40%
- average, critical booking pages
- −1.3 s
{ } View contract
A case study teaser in the “Selected work” grid: cover, eyebrow, title, summary, impact.
- Selectors
.cards .card .card-cover .is-portrait .is-wide .card-title .card-link .card-summary- Accessibility
- One link per card, on the title; its
::after stretches the hit area over the whole card. - The “View contract” toggle comes after the
<article>, so the article holds the teaser only. - The focus ring is drawn around the card, through that
::after. - The cover keeps the alt text written in the content.
- Contrast
--color-fg on --color-surface ≥ 4.5: title and summary--color-muted on --color-surface ≥ 4.5: eyebrow and impact labels
- Don't
- Don't add a second link or control inside a card, except the “View contract” toggle: the stretched link would cover it.
- Don't use a full page or a device mockup as a card cover, and don't zoom it on hover.
From src/system/contracts.ts · checked by
tests/system.test.ts ·
Card on /system
-
Rail Europe · 2024
First in-house engineer on a from-scratch rebuild of the B2C booking site, alongside a team of consultants. Developer, Scrum Master and facilitator — and, for months, a bit of the missing roles too.
- people on the team
- 21
- in-house engineer
- 1st
{ } View contract
A case study teaser in the “Selected work” grid: cover, eyebrow, title, summary, impact.
- Selectors
.cards .card .card-cover .is-portrait .is-wide .card-title .card-link .card-summary- Accessibility
- One link per card, on the title; its
::after stretches the hit area over the whole card. - The “View contract” toggle comes after the
<article>, so the article holds the teaser only. - The focus ring is drawn around the card, through that
::after. - The cover keeps the alt text written in the content.
- Contrast
--color-fg on --color-surface ≥ 4.5: title and summary--color-muted on --color-surface ≥ 4.5: eyebrow and impact labels
- Don't
- Don't add a second link or control inside a card, except the “View contract” toggle: the stretched link would cover it.
- Don't use a full page or a device mockup as a card cover, and don't zoom it on hover.
From src/system/contracts.ts · checked by
tests/system.test.ts ·
Card on /system
-
Side project · 2026
A framework-free static site generator for data stories, built with Claude Code in a few days. The interesting part isn't the speed — it's the frame that kept the agent honest.
- automated tests
- 379
- empty repo to live site
- 1 day
{ } View contract
A case study teaser in the “Selected work” grid: cover, eyebrow, title, summary, impact.
- Selectors
.cards .card .card-cover .is-portrait .is-wide .card-title .card-link .card-summary- Accessibility
- One link per card, on the title; its
::after stretches the hit area over the whole card. - The “View contract” toggle comes after the
<article>, so the article holds the teaser only. - The focus ring is drawn around the card, through that
::after. - The cover keeps the alt text written in the content.
- Contrast
--color-fg on --color-surface ≥ 4.5: title and summary--color-muted on --color-surface ≥ 4.5: eyebrow and impact labels
- Don't
- Don't add a second link or control inside a card, except the “View contract” toggle: the stretched link would cover it.
- Don't use a full page or a device mockup as a card cover, and don't zoom it on hover.
From src/system/contracts.ts · checked by
tests/system.test.ts ·
Card on /system
-
Holivia · 2022 — 2024
The whole frontend of a mental-health platform, designed and rebuilt — including a calming audio player and video calls with therapists, in vanilla JavaScript, CSS and HTML.
{ } View contract
A case study teaser in the “Selected work” grid: cover, eyebrow, title, summary, impact.
- Selectors
.cards .card .card-cover .is-portrait .is-wide .card-title .card-link .card-summary- Accessibility
- One link per card, on the title; its
::after stretches the hit area over the whole card. - The “View contract” toggle comes after the
<article>, so the article holds the teaser only. - The focus ring is drawn around the card, through that
::after. - The cover keeps the alt text written in the content.
- Contrast
--color-fg on --color-surface ≥ 4.5: title and summary--color-muted on --color-surface ≥ 4.5: eyebrow and impact labels
- Don't
- Don't add a second link or control inside a card, except the “View contract” toggle: the stretched link would cover it.
- Don't use a full page or a device mockup as a card cover, and don't zoom it on hover.
From src/system/contracts.ts · checked by
tests/system.test.ts ·
Card on /system
How I work
-
Design systems, for humans and agents
Tokens, documented components and Storybook as a shared language between design and code. Now making them readable by AI agents too — starting with this site.
-
UI craft and accessibility
Semantic HTML, keyboard and focus first, inclusive states, reduced motion. Perceived performance is craft too — optimistic rendering, progressive enhancement, no layout shifts.
-
Guardrails over gatekeeping
Tests, performance budgets, linting and CI that encode the conventions, so nobody has to be the bottleneck. And proof of improvement — measured before and after, so a refactor shows its value.
-
Framing the agent
I build with Claude Code. Most of the work is the frame — CLAUDE.md conventions, phased plans compacted into logs, decisions recorded as ADRs, and test gates that fail when the agent drifts.
-
Teaching and enabling teams
Scrum Master and team facilitator for a 21-person SvelteKit rebuild, often filling the gaps of missing roles. Pairing, reviews, docs and conventions that let a team contribute with confidence.
Want the full picture?
Every role, project and skill on one page, ready to print.
Read my CV