Projects
What I build on my own time. The common thread is guardrails: making a system prove its own claims before I trust it.
The four below are private, either because they hold my own health and money data or because they are not finished. Happy to walk through any of them. The ones further down are public and linked.
Featured
Repères 2027
Astro • TypeScript • no client dependencies
A voting advice app for the 2027 French presidential election. In this category credibility is the product, so the build enforces it. Every candidate position needs a dated source, every candidate answers the identical set of statements, and the build fails if either is untrue. Ties are broken by a session seed and shown as ties. There is no server, so answers never leave the browser.
Each rule answers a failure of Elyze, the app that did this in 2022. It broke ties by internal candidate id, so the same candidate always won. It covered a fraction of the declared candidates. And it reserved the right to resell user answers, until the CNIL announced it would check and it stopped collecting data. Ships around 10 KB of JavaScript.
Wattson and Sparfuchs
Python • Claude Code skills
Two personal advisors built the same way. Wattson is an endurance coach that reads my training data from intervals.icu. Sparfuchs handles tax and money as a French citizen living in Germany.
The architecture is the point. Scripts do the calculations and hand back JSON; the model reads it and gives an opinion. In Sparfuchs every legal constant sits in one file with its source and the date it was checked, and the setup script complains when that date gets old. It is my working answer to where a language model is allowed to be trusted, and the honest limit is that the split is a convention I hold myself to, not something the code enforces.
llm-vps
Terraform • Docker Compose • llama.cpp • Caddy
A self hosted, OpenAI compatible LLM endpoint on a rented box, defined as code. Point any OpenAI SDK at it and it works.
The README opens with a cost table, and further down it concedes the thing a README like this usually leaves out: for small, bursty workloads a hosted API running the same open weight models is cheaper and much faster. Self hosting wins on fixed cost, data locality and no rate limits. Pick it for those reasons, not price.
Portulan
Product work, no code yet
A quote and proposal tool for small French travel agencies. Pre-discovery, with nothing built yet. It ends in a go or stop gate based on how many custom quotes the design partner actually produces a month. Writing code to find that out would be the expensive way round.
Also
EuroLens
Next.js • TypeScript • Supabase • public EU data only
Track what the European Parliament is voting on, in plain English, and see how your own MEPs voted. Roll-call results for all 720 members, filterable by country and political group.
It started with a language model writing the explanations. I took it out. Explanations are now composed from the official record through a fixed glossary, which means they are instant, reproducible, and cannot invent a fact that is not in the data. On a tool whose whole claim is being non partisan, a model that occasionally makes something up is not a feature. No API keys, no per request cost.
EuroLens on GitHub · Live site
HBO Max x SensCritique
Chrome extension • JavaScript
Puts SensCritique ratings on HBO Max tiles, because I kept opening a second tab to decide what to watch.
Voyages
Next.js • TypeScript • Tailwind • shadcn/ui
A travel agency site with a quote request flow and seasonal SEO content.