FacileCV: an AI resume builder at SaaS scale

Architected and built FacileCV.ai as a production-grade SaaS platform using a Next.js frontend with Deno microservices backend. Features 50+ ATS-optimized templates, dual AI providers, full admin control, Grafana/Prometheus observability, and a scalable monetization system.

Client
TalentCraft SAS, Paris, France
Practice
Software Development
Stack
Next.js · Deno · Stripe · AWS
ATS templates
50+
CV generation
<10min
AI providers
2
Website
facilecv.ai/en(opens in new tab)

The challenge

TalentCraft needed a resume builder that could compete in a market dominated by subscription-heavy, monolithic tools with basic AI and no operational visibility. The platform had to support multi-language content generation, handle unpredictable AI API costs, and scale reliably without becoming a maintenance burden. The client required full transparency into system health, AI expenses, and user behavior from day one.

Our solution

We designed FacileCV around a clean microservices architecture with strict separation of concerns. The Next.js frontend handles the user experience while independent Deno microservices own AI orchestration, PDF generation, payment processing, and background jobs. Each service is independently deployable, observable, and scalable. The result is a platform that holds up in production and stays easy to maintain as the product evolves.

Why microservices, and what stayed together

The temptation on a product like this is to split everything or nothing. We drew the boundaries where the operational profiles genuinely differ. The Next.js application stays one deployable and owns the whole user experience: SSR, routing, authentication, and the step-by-step builder with its real-time preview and draft states. Behind it, separate Deno services own the domains with different failure modes and scaling behavior: AI orchestration, PDF rendering, Stripe payments, and transactional email over configurable SMTP. A provider outage or a rendering backlog now degrades one service instead of the product. Each service is independently deployable, communicates over defined APIs, and updates without touching the rest. The split follows load and risk, not fashion; the frontend never became a mesh of its own.

One engine, two AI providers

CV section generation, achievement rewriting, cover letters, and job-description keyword optimization all run through a single AI service that fronts two providers, OpenAI and Google Gemini. The service hides provider differences behind one API, so the rest of the platform never knows which model answered. That indirection pays twice. Operationally, the platform can hot-switch providers on cost, latency, or quality without a frontend change or a deploy. Financially, it gives every request one place to be metered: token counts, latency, and cost per call land in Prometheus as the request completes. TalentCraft named unpredictable AI API costs as a business risk in the brief, and this is the answer to it. System prompts are versioned, edited from the admin panel, and localized per language, because English and French generation is a prompt problem before it is a UI problem.

Observability as a product feature

The client asked for transparency into system health, AI expenses, and user behavior from day one, so the observability stack was built as part of the product rather than bolted on for the engineers. Every service exposes Prometheus metrics: request latency, error rates, throughput, and the business counters that matter here, such as AI tokens consumed, PDFs generated, and payment events processed. Distributed tracing follows a request from the Next.js frontend through each Deno service, which makes cross-service failures debuggable instead of mysterious. Grafana carries the dashboards and the alerting, and the alert set treats an AI cost anomaly as an incident alongside latency spikes and error thresholds, because a runaway provider bill is an outage for the business. The same data feeds daily, weekly, and monthly usage breakdowns per provider, real-time reconciliation against OpenAI and Gemini invoices, top users by consumption, export statistics, and subscription conversion funnels.

Rendering for the machines that read resumes

A resume template is a rendering contract with software the user never sees. Applicant tracking systems parse PDFs, and a layout that looks sharp to a human can collapse into nonsense in a parser. Every one of the platform's 50+ templates, across six categories from Minimal to Tech, is built against that constraint: correct heading hierarchy, clean parsing structure, machine-readable output. Users can change colors, fonts, and layout, but only within moves that keep the document parseable. Rendering runs in its own Deno service, so template logic never leaks into the main application and a rendering backlog never slows the builder. Finished PDFs land in AWS S3 and are delivered through time-limited signed URLs. End to end, a user goes from profile to exported CV in under 10 minutes, in English or French.

Security and GDPR as architecture

GDPR was treated as an architectural input, not a legal review at the end. The right to erasure forced real deletion paths with a user-controlled recovery period, data portability forced full export, and data minimization decided what never gets collected; the platform runs no advertising cookies or third-party tracking at all, and cross-border transfers sit under Standard Contractual Clauses. The security posture is conventional and thorough: bcrypt for passwords, JWT with JWKS key rotation, optional 2FA, TLS 1.3 on external and inter-service traffic, plus rate limiting, CSRF protection, CSP headers, input validation, and parameterized queries against the OWASP Top 10. Card data never touches the platform; Stripe carries the PCI DSS burden, which is a scope decision as much as a security one. Audit logs record every admin action, and Cloudflare fronts the Vercel-hosted frontend for DDoS protection and edge caching.

What TalentCraft operates day to day

The admin panel exists so that running the platform never requires a deploy. AI providers, model selection, system prompts, and cost thresholds are configured from it, and so are SMTP settings, email templates, JWKS key rotation, and the Stripe and AWS S3 credentials, which means infrastructure changes ship as configuration rather than code. Monetization runs on three one-time tiers through Stripe (Free, Solo at 9.90 EUR, Candidates at 19.90 EUR), a deliberate bet against subscription fatigue in a market saturated with it. Tiers gate CV profile counts, AI quotas, watermarks, and access duration. When a plan expires the account downgrades gracefully and saved CVs are never deleted; holding a resume hostage is a churn tactic, not a product. Webhooks keep Stripe and the application in sync, and coupons, billing history, and user management round out the panel.

The numbers

ATS templates
50+
CV generation
<10min
AI providers
2