Software engineer in Montpellier, currently at Talkspirit. TypeScript across the stack — React and TanStack on the front, Fastify, Prisma and Postgres on the back, with a bias for explicit contracts between the two.
A Magic: The Gathering deck builder that generates print-ready proxy sheets. A pnpm/Turborepo monorepo with Zod contracts at every boundary, ADRs for the decisions worth recording, automated releases, and a Scryfall ingestion pipeline that syncs around 34,500 cards. Accounts, the card database and the design system work today — the deckbuilding itself is what I'm on now.
Three parts are public and need no account:
| Design system | Storybook — components, tokens, accessibility checks |
| API reference | OpenAPI, rendered with Scalar |
| Documentation | Architecture, ADRs, specs |
Easier to show than to claim. Three pull requests, picked because the reasoning is written down:
- #115 — killing an OOM crash-loop — the
nightly sync had been dying for three days at a ~1.9 GB heap. Two instrumentation probes isolated
the leak to per-row Prisma upserts rather than the streaming path. Replaced with one bulk
INSERT … ON CONFLICTper table: 3m13s for 34,529 cards under a 512 MB cap, against ~15 minutes and an OOM before. - #92 — streaming a 2 GB JSON dump — an async generator, so backpressure comes for free: the parser only advances when the consumer pulls. Invalid rows are reported through a callback rather than thrown, so one malformed card cannot abort a 90k-row sync.
- #111 — putting the worker in production — Docker, Redis with AOF persistence, and a fail-closed password guard. The persistence choice is argued in the description: a Redis-only restart would silently drop the cron schedule while the worker stayed connected.
jerem.io — my landing page. React, Three.js particle background, static build.
- fireflies — a PixiJS and GSAP particle swarm from 2021. Paused.
- machupichu — a Pokémon team builder that never got past its Puppeteer sprite scraper. Paused.



