The problem
Most resume builders are either generic templates with no feedback, or expensive subscriptions gatekeeping basic features like ATS scoring. Job seekers need one tool that covers the whole loop: building the CV, checking it against a real job description, tracking applications, and prepping for the interview.
The approach
Built with Next.js and Supabase for auth and storage, with DeepSeek powering the AI features: a real time ATS score sidebar, tailoring suggestions against a pasted job description, a skill gap analyzer, salary insights, an AI interview coach, and a LinkedIn optimizer, on top of 14 templates and PDF import and export. I later moved it onto timfas.com at /cv-builder/ so it lives alongside my other tools instead of on its own domain.
Architecture decisions
I chose Supabase over a self managed database to keep auth, storage, and Postgres in one managed service for a solo built product, trading some vendor lock-in for a much smaller operational surface. I picked DeepSeek for the AI features over a larger frontier model provider mainly on cost per request at the volume a free tier tool needs to sustain, and wrote the interview coach and tailoring prompts to be portable to another provider if that tradeoff changes later.
Lesson learned
Adding a basePath to a Next.js app to share a domain path is not just a config change: every internal client side fetch call to an API route has to be explicitly prefixed with that basePath, or it silently breaks in production while looking fine in development. That single class of bug was found across four separate features during an audit and became the reason a shared withAppBasePath() helper exists in the codebase now, so it cannot be forgotten again.
