Fitex
Tailoring a CV to each job offer, without ever letting it lie
- Context
- Personal product
- Role
- Everything: design, development, infrastructure, product
- Period
- Winter 2025 to July 2026
- Stack
- Next.js, NestJS, PostgreSQL, Stripe, WXT, OpenAI
- Live
- fitex.obstinate.fr

From a tool for me…
At the end of 2025 I was looking for a contract. Tailoring your CV to every offer is the right thing to do, and it takes forever. I wrote a tool that did it for me.
In about two weeks: around fifteen applications, four or five interviews, and the contract I am on today.
…to a product for others
In March 2026 I started turning it into a product: an extension that picks up the offer on the page where you are reading it, a web platform, paid credits.
A tool that works for me and a product that strangers trust with their CV and their bank card are not the same job.
What made it tricky
- An AI that tailors a CV tends to embellish it. On offers full of technical detail, it picked technologies from the ad and slipped them into the CV. A CV that lies is worse than a generic one.
- A CV has to fit on one page, whatever the AI has rewritten.
- The CV remains the user’s own LaTeX document, compiled on my server. Compiling someone else’s code means opening a door to them.
- Payments: a credit must not vanish when a generation fails.
Decisions
- Offer selectedin the extension
- Credits reserved
- Tailoring by the modelanti-fabrication tests
- LaTeX compilationsandboxed
- Page measuredshorten or fill out
- One-page PDF
Measuring fabrication instead of hoping
I built an evaluation bench: twenty CVs, eight of them traps, automatic checks and a model that judges the result. The prompt imposes explicit tests on every change, for example a term that is absent from the original CV, or a role whose scope grows.
Every significant change to the prompt goes through the bench before it reaches production.
One page, checked at compile time
The model was bad at holding the “one page” instruction. Rather than insist, the server measures how full the page really is at compile time.
Too long: the CV is shortened deterministically until it fits. Less than 40% full: it is filled out.
Compiling other people’s LaTeX without opening up the server
Every compilation runs without shell access, capped at 1 GB of memory and 60 seconds, three at a time at most. Dangerous LaTeX commands are refused before compilation even starts.
Credits reserved, not debited
Credits are reserved when a generation starts, in a single database operation, and returned if it fails or if the user cancels.
Three models plugged in, one in production
Anthropic, OpenAI and Gemini are called directly, without an SDK, with the cost of every call recorded. That let me compare them on the evaluation bench. In production, it is GPT.
An extension that depends on no site
No per-site script for job boards: each one would break at the first page change, and they would all need maintaining. You click the text of the offer to select it, anywhere, or you paste it. The generation shows its progress step by step.

Result
- “no fabrication” score on the evaluation bench, out of 10
- 2.7 → 10
- “no fabrication” score on the evaluation bench, out of 10
- overall score on the same bench, out of 10
- 5.6 → 8.4
- overall score on the same bench, out of 10
- around fifteen applications, four or five interviews, one contract
- 2 weeks
- around fifteen applications, four or five interviews, one contract
Live, in French and in English, with data export and deletion (GDPR). The extension is not yet published on the Chrome Web Store.
Fitex