Overview
my-career.info is a consumer career platform that takes a job seeker from a blank page to a live, shareable presence: build a CV in a themed editor, publish it as a personal career site on a custom subdomain, check it against applicant tracking systems, search live vacancies and track every application — all from one account.
The entire product is a single Next.js 15 App Router application on Vercel, backed by MongoDB and monetised as a freemium subscription with a 14-day trial, automated email lifecycle and Stripe billing. It ships fully localised in English, French and Spanish.
The Challenge
Career tools are a crowded market; the product had to earn its place by joining up what is usually four separate tools:
- From document to destination. A CV shouldn't end life as a PDF attachment — each user needed a live personal site at
name.my-career.info, published in one click. - Beating the robots. Most rejections happen before a human reads anything. Users needed an honest ATS compatibility score with concrete fixes, and a way to match their CV against a specific vacancy.
- Real jobs, not sample data. Live vacancy search and recommendations, with external API costs kept under control.
- A trial that converts itself. A 14-day trial with usage quotas, template gating and a timed email journey — with no servers to run any of it on.
- Three languages, one codebase. Every page, email and validation message localised, with the right locale chosen per user, not per request.
The Solution
One serverless application does all of it. A custom middleware layer splits traffic at the edge: requests to a user subdomain are rewritten to a site-serving route, while main-domain traffic flows through locale negotiation that prefers the user's saved language (read from their session token) before falling back to browser headers. Behind that sit feature modules — CV building, site publishing, ATS scanning, job search, application tracking and subscription management — sharing one MongoDB datastore and one authentication layer.
A structured CV editor rendering through a template factory of 14+ themed designs — corporate, minimal, technical, elegant, cyberpunk, gothic and more — each a self-contained renderer behind a common interface, with premium designs gated by plan.
One-click publishing renders the CV to static HTML in Vercel Blob storage. Edge middleware maps name.my-career.info to the stored site and serves it with CDN caching (stale-while-revalidate) — a personal website with zero per-site hosting.
A rule-based CV analyser walks the document structure, scoring keyword coverage, formatting and completeness with severity-ranked findings and concrete suggestions — plus per-vacancy matching that scores a CV against a specific job description.
Live vacancy search through the Reed API with filtering, a recommendation engine scoring jobs against the user's profile, and per-plan search quotas keeping external API spend predictable.
A pipeline for every application — status stages from draft through screening to offer, priorities, and notes — closing the loop between finding a role and landing it.
A 14-day trial with per-plan usage quotas and template access, driven by a scheduled email journey — welcome, day 1/3/7/12 nudges, feature highlights and last-chance conversion — dispatched by a Vercel cron every six hours.
The CV Builder & Template System
The builder treats a CV as structured data, not a document. Users edit sections through a guided interface with an onboarding tour and progress tracking; rendering is delegated to a template factory where each of the 14+ themes implements a common renderer interface. Adding a design is a single new class — no changes to the editor, publisher or scanner. The same structured data feeds every downstream feature: the published site, the ATS score and the job matcher all read from one source of truth.
Publishing & Edge Routing
Publishing renders the chosen template to a complete HTML document stored in Vercel Blob. At request time, edge middleware inspects the host header: a valid subdomain is rewritten to a lightweight route that fetches the stored HTML and returns it with s-maxage and stale-while-revalidate caching. Thousands of personal sites can exist with no build step, no per-site infrastructure and no cold-start penalty for visitors.
The ATS Scanner
The scanner is a deterministic, explainable analyser rather than a black box. A validation engine walks the CV's structure applying named rules — each with a severity (error / warning / info), a path to the offending field and a suggested fix — alongside keyword services scoring coverage against role expectations. A companion matcher compares the CV to a specific vacancy's description, so users can tune an application before sending it. Scans are quota-controlled per plan, making the feature both a core utility and an upgrade driver.
Lifecycle Email & Monetisation
The trial converts through a timed, localised email journey built as React components and delivered via Resend: a welcome sequence, day 1/3/7/12 check-ins, feature-highlight campaigns for the ATS scanner, analytics and premium templates, and an escalating conversion arc for the final days. A Vercel cron runs the automation every six hours and a second job expires lapsed trials — no queue workers, no servers.
Billing is Stripe end-to-end: checkout, a self-service customer portal, and a webhook service reconciling subscription lifecycle events into the user's plan, quotas and template access. Middleware enforces plan limits on every gated action, with in-product usage meters and upgrade prompts surfacing the paywall honestly.
Internationalisation
Localisation runs deeper than translated strings. next-intl drives locale-prefixed routing for English, French and Spanish, but locale selection is user-centric: middleware reads the preferred language stored in the session token first, then negotiates from browser headers. Emails are localised through the same message catalogues, and hreflang metadata keeps search engines pointed at the right variant.
Security & Cross-Cutting Concerns
- Authentication — NextAuth with a MongoDB adapter and bcrypt-hashed credentials; session tokens carry the user's locale preference for edge-side routing.
- Validation — Zod schemas at API boundaries keep untrusted input out of the datastore.
- Rate limiting — request throttling on sensitive endpoints, alongside per-plan quota enforcement.
- Payments — Stripe webhooks verified and handled idempotently, so billing state and product access never drift.
Engineering Standards
TypeScript throughout, with domain enums replacing stringly-typed state across application statuses, plans, templates and API routes. A Vitest suite covers the core services — trial logic, quotas, scanning — and runs as part of the build. ESLint and Prettier gate every commit, and the Vercel pipeline skips deployments for test-only changes to keep releases cheap and frequent.
Technology Stack
| Framework | Next.js 15 (App Router), React 19, TypeScript |
| Styling | Tailwind CSS 4, lucide-react / react-icons |
| Data | MongoDB (native driver + @auth/mongodb-adapter) |
| Auth | NextAuth, bcrypt credentials, locale-aware JWT sessions |
| i18n | next-intl — EN / FR / ES, locale-prefixed routing, hreflang |
| Edge routing | Custom middleware — subdomain rewrites + locale negotiation |
| Site publishing | Vercel Blob (static HTML), CDN caching (SWR headers) |
| Billing | Stripe — checkout, customer portal, idempotent webhooks |
| Resend, React email templates, localised campaigns | |
| Scheduled work | Vercel Cron — email automation, trial expiration |
| Integrations | Reed jobs API (quota-controlled) |
| Validation | Zod schemas, rule-based CV validation engine |
| Observability | Vercel Analytics, Speed Insights |
| Quality | Vitest, Testing Library, ESLint, Prettier |