mypdfcv.com — A modern, client-side resume builder with real-time preview, AI-powered text improvement, and one-click PDF export.
- Real-time preview — See your resume update as you type
- PDF export — One-click, pixel-perfect PDF generation via
@react-pdf/renderer - AI text improvement — In-browser AI (runs via WebAssembly, no data sent to servers)
- Drag-and-drop sections — Reorder resume sections with
@dnd-kit - Profile photo — Upload and crop a profile photo
- LinkedIn import — Pre-fill your resume from your LinkedIn profile (optional OAuth)
- Dark mode — Full light/dark theme support
- Privacy-first — All data stored in
localStorage. Nothing leaves your browser.
MyPDFCV's core logic is published as standalone npm packages — no Next.js required:
| Package | Description |
|---|---|
@mypdfcv/pdf-core |
Resume types, templates, validation schemas, and PDF generation |
@mypdfcv/i18n |
Internationalization with 7 bundled locales |
@mypdfcv/mcp-server |
MCP server for AI-powered resume PDF generation |
Generate resume PDFs directly from AI assistants (Claude, Cursor, etc.) using the Model Context Protocol:
# Claude Code
claude mcp add mypdfcv -- npx -y @mypdfcv/mcp-serverOr add to Claude Desktop / Cursor config:
{
"mcpServers": {
"mypdfcv": {
"command": "npx",
"args": ["-y", "@mypdfcv/mcp-server"]
}
}
}Then ask your assistant: "Generate a resume PDF for John Doe, a senior software engineer"
See the MCP server repo for full documentation.
- Next.js 16 (App Router, Turbopack)
- React 19
- TypeScript
- Tailwind CSS v4
- Zustand — resume state management
- react-hook-form + Zod — form validation
- @react-pdf/renderer — PDF generation
- @dnd-kit — drag-and-drop
- @huggingface/transformers — in-browser AI
- next-auth v5 — LinkedIn OAuth
- PostHog — product analytics
1. Install dependencies and build packages
npm install
npm run build:packages2. Set up environment variables
cp .env.example .env.local3. Generate an AUTH_SECRET
npx auth secretThis writes AUTH_SECRET to .env.local automatically. Alternatively, run openssl rand -hex 32 and set it manually.
4. Start the dev server
npm run devOpen http://localhost:3000.
| Command | Description |
|---|---|
npm run dev |
Start development server |
npm run build |
Build for production |
npm run start |
Start production server |
npm run lint |
Run ESLint |
npm run build:packages |
Build packages |
npm run test:e2e |
Run Playwright e2e tests (headless) |
npm run test:e2e:ui |
Open Playwright UI for interactive debugging |
npm run test:e2e:headed |
Run e2e tests with visible browser |
End-to-end tests use Playwright and cover preview rendering, PDF export, and cross-surface consistency across all 7 templates.
# Install browsers (first time only)
npx playwright install chromiumTests reuse a dev server on port 3000 (reuseExistingServer: true). Make sure npm run dev is running before using test:e2e:ui.
Copy .env.example to .env.local and fill in the values:
| Variable | Description |
|---|---|
AUTH_SECRET |
NextAuth.js secret for session encryption |
NEXTAUTH_URL |
App URL for NextAuth.js callbacks |
LINKEDIN_CLIENT_ID |
LinkedIn OAuth app client ID |
LINKEDIN_CLIENT_SECRET |
LinkedIn OAuth app client secret |
NEXT_PUBLIC_LINKEDIN_OAUTH_ENABLED |
Enable/disable LinkedIn import feature (true/false) |
NEXT_PUBLIC_APP_URL |
Public-facing app URL |
NEXT_PUBLIC_POSTHOG_KEY |
PostHog project API key (optional) |
NEXT_PUBLIC_POSTHOG_HOST |
PostHog ingest host (default: https://us.i.posthog.com) |
To enable "Import from LinkedIn", add these to .env.local:
LINKEDIN_CLIENT_ID=your_client_id
LINKEDIN_CLIENT_SECRET=your_client_secret
NEXT_PUBLIC_LINKEDIN_OAUTH_ENABLED=true
AUTH_SECRET=your_auth_secretLinkedIn app requirements:
- Scopes:
openid,profile,email - Authorized redirect URL:
http://localhost:3000/api/auth/callback/linkedin - Production redirect URL:
https://mypdfcv.com/api/auth/callback/linkedin
Product analytics are powered by PostHog (free tier, 1M events/month). Analytics are optional — the app works without a key.
To enable, add to .env.local:
NEXT_PUBLIC_POSTHOG_KEY=phc_your_key_here
NEXT_PUBLIC_POSTHOG_HOST=https://us.i.posthog.comPrivacy: anonymous profiles only, IP not stored, Do Not Track respected.
| Event | Properties | Metric |
|---|---|---|
resume_created |
templateId, source (blank/template/import) |
Resume creation rate |
resume_deleted |
— | Churn signal |
resume_duplicated |
— | Engagement |
template_selected |
templateId |
Most popular templates |
pdf_exported |
templateId, locale |
Export conversion rate |
ai_improve_requested |
fieldType |
AI feature usage |
ai_improve_accepted |
fieldType |
AI acceptance rate |
file_imported |
fileType |
Import method preference |
linkedin_import |
— | LinkedIn import usage |
locale_changed |
from, to |
Language preferences |
$pageview |
(automatic) | Page traffic |
$pageleave |
(automatic) | Editor dropoff |
The production site runs at mypdfcv.com.
Recommended deployment: Vercel (zero-config for Next.js).
Contributions are welcome! To get started:
- Fork the repository
- Create a feature branch (
git checkout -b feat/your-feature) - Commit your changes
- Push to your fork and open a Pull Request
Please make sure your code passes linting (npm run lint) before submitting.
This project is licensed under the MIT License.
Created by Wesley Ramalho