A local-first tool to generate beautiful, professional CVs from JSON data and HTML templates. Perfect for developers, designers, and professionals who want full control over their CV presentation.
- π§ JSON-based data input - Easy to edit and version control
- π¨οΈ PDF output - High-quality, print-ready CVs using Puppeteer
- π§ Local-first - No cloud dependencies, your data stays private
- π¨ Web-based editor - Visual editor with live preview (CV-JSON Web Editor)
- π± CLI tool - Command-line interface for automation
- π― Role-specific guidance - Skills, verbs, and schema for different roles
Before you begin, ensure you have the following installed:
- Node.js 18+ - JavaScript runtime for the CLI tool
- Chrome/Chromium - For PDF generation (optional, falls back to HTML)
- Modern web browser - For the web-based editor
- Handlebars for templating
- Puppeteer for PDF generation
- Commander.js for CLI interface
Follow these steps to create your professional CV:
# Install Node.js dependencies
npm install
# Make the CLI tool executable
chmod +x src/generate.js# Navigate to docs directory
cd docs
# Start local server on port 9000
python3 -m http.server 9000
# Or using Node.js (if you have serve installed)
npx serve -s . -l 9000Access the editor at: http://localhost:9000
- Visit https://jobpare.github.io/cvgen/ (online editor)
- The editor automatically loads the backend developer example
- Edit your CV data using the form editor or JSON view
- See live preview of your CV as you type
- Data is automatically saved to localStorage as you type
?data=backend-cv-schema- Backend developer example (default)?data=frontend-cv-schema- Frontend developer example?data=my-custom-job- Create new CV with custom job ID?data=https://api.example.com/cv/123- Load from external URL
- Click "Download JSON" to save your CV data as a JSON file
- Save it as
my-cv.jsonin your project directory - Data is automatically saved to localStorage with key
cvgen_{job_id}
Available Templates:
template-1.html- Clean, professional single-column layout
Output Formats:
- HTML - Web-friendly, can be opened in any browser
- PDF - Print-ready, professional format (requires Chrome/Chromium)
# Generate HTML file (recommended for most users)
node src/generate.js generate \
-t docs/cv-templates/template-1.html \
-i docs/cv-json-example/backend-cv-schema.json \
-o output/my-cv.html
# Generate PDF file
node src/generate.js generate \
-t docs/cv-templates/template-1.html \
-i docs/cv-json-example/frontend-cv-schema.json \
-o output/my-cv.pdf
# Validate your data before generating
node src/generate.js generate \
-t docs/cv-templates/template-1.html \
-i docs/cv-json-example/backend-cv-schema.json \
--validate-onlyYour generated CV will be saved in the output/ directory!
Jobpare CV Generator uses a modern web-based approach combining HTML/CSS/JavaScript for the editor and Node.js for document generation. This provides a simpler alternative to traditional LaTeX-based CV solutions.
- Web Editor: Online editor at jobpare.github.io/cvgen/ with instant live preview
- JSON Data: Version control friendly, platform-independent format
- Templates: Handlebars.js for flexible, logic-less templating
- Generation: HTML output + PDF conversion via Puppeteer
- Preloading: Automatic example CV loading for fast access and offline use
- URL-Driven: Simple
?data=parameter system for loading different CVs - Curated Content: Skills and action verbs lists compiled from most-used terms across the web
| Feature | π Jobpare CV Generator | π Traditional LaTeX (e.g., Awesome-CV) |
|---|---|---|
| Setup | Simple npm install |
Complex LaTeX distribution setup |
| Learning Curve | Basic HTML/CSS or JSON | Steep; requires LaTeX syntax |
| Live Preview | Instant browser preview | Compile β View cycle |
| Customization | Visual editor or tweakable CSS | Manual code editing |
| Version Control | Clean JSON + template files | Mixed text + binary artifacts |
| Cross-Platform | Works on any OS with Node.js + Chrome | OS-specific LaTeX quirks |
| Dependencies | Minimal (Node.js, Puppeteer/Chrome) | Full LaTeX suite (TeX Live, MikTeX, etc.) |
| Output Quality | Clean, professional, print-ready PDF | Excellent typographic control |
cvgen delivers most of the output quality of LaTeX with a dramatically simpler setup and developer-friendly workflow.
Integrate the CV editor into your application using the simple postMessage API. The editor accepts CV data and processes it silently.
Note: The PostMessage integration is handled by integration.js which provides secure one-way communication to the CV editor.
// Open CV editor
const editorUrl = `https://jobpare.github.io/cvgen/?data=my-cv-123`;
const editorWindow = window.open(editorUrl, '_blank');
// Wait a moment for editor to load, then send data directly
setTimeout(() => {
editorWindow.postMessage({
type: 'SET_CV_JSON',
data: {
profile: { name: 'John Doe', email: '[email protected]' },
summary: 'Experienced developer...',
experiences: [/* ... */],
education: [/* ... */],
skills: { programming_languages: ['JavaScript', 'Python'] }
}
}, 'https://jobpare.github.io');
}, 1000);
// No need to listen for responses - data is processed silentlyThe integration uses a straightforward approach:
- Open CV Editor - Open the editor in a new window
- Wait for Load - Give the editor a moment to initialize
- Send CV Data - Send your CV data using
SET_CV_JSON - Done - Data is processed silently, no response needed
This approach is ultra-simple and reliable for most use cases.
{
type: 'SET_CV_JSON',
data: { /* CV JSON object */ }
}The editor processes data silently - no responses are sent back. Check the editor console for processing logs.
Important: Always validate the origin of PostMessage events for security:
window.addEventListener('message', (event) => {
// Always check the origin
if (event.origin !== 'https://jobpare.github.io') return;
// Process the message...
});Never use '*' as target origin in production - always specify the exact origin for security.
The editor automatically loads data from localStorage using the URL parameter (?data=my-cv-123) and saves with key cvgen_my-cv-123. PostMessage data is immediately applied and saved.
?data=cv_123453- Load from localStorage with specific CV ID?data=https://api.example.com/cv/123- Load from external URL?data=backend-cv-schema- Load backend developer example?data=frontend-cv-schema- Load frontend developer example- No parameter - Load backend developer example (default)
The editor automatically preloads example CVs into localStorage on first load:
- Backend Example:
cvgen_backend-cv-schema(default) - Frontend Example:
cvgen_frontend-cv-schema
This ensures fast loading and offline availability of example data without requiring external requests.
The editor uses a simple URL parameter system to load different CVs:
- Job ID:
?data=my-job-123- Loads from localStorage with keycvgen_my-job-123 - External URL:
?data=https://api.example.com/cv/123- Fetches data from external URL - Example CVs:
?data=backend-cv-schemaor?data=frontend-cv-schema- Loads preloaded examples - Default: No parameter loads backend developer example
https://jobpare.github.io/cvgen/ # Backend example (default)
https://jobpare.github.io/cvgen/?data=frontend-cv-schema # Frontend example
https://jobpare.github.io/cvgen/?data=my-custom-cv # Custom CV
https://jobpare.github.io/cvgen/?data=https://api.com/cv # External URL
- All data is automatically saved to localStorage with key
cvgen_{job_id} - Changes are saved in real-time as you type
- Data persists between browser sessions
- External URLs are fetched fresh each time
jobpare-cvgen/
βββ src/
β βββ generate.js # π§ CLI generator
β βββ validation/
β βββ schema.js # π JSON validation schema
βββ docs/ # π Web interface source
β βββ index.html # π Web editor (deployed to GitHub Pages)
β βββ js/
β β βββ editor.js # π§ Editor logic
β βββ css/
β β βββ editor.css # π¨ Editor styles
β βββ cv-templates/
β β βββ template-1.html # π HTML template
β βββ cv-json-example/ # π― Example CV data
β β βββ backend-cv-schema.json # π€ Backend developer example
β β βββ frontend-cv-schema.json # π€ Frontend developer example
β βββ img/ # πΌοΈ Images and assets
βββ output/ # π Generated CVs
βββ package.json # π¦ Node.js dependencies
βββ README.md # This file
- Example:
docs/cv-json-example/backend-cv-schema.json - Skills: Programming languages, frameworks, databases, cloud platforms
- Focus: Technical achievements, system design, mentoring
- Example:
docs/cv-json-example/frontend-cv-schema.json - Skills: JavaScript frameworks, UI libraries, design tools
- Focus: User experience, design systems, performance optimization
Your CV data should follow this complete JSON structure:
{
"profile": {
"name": "Your Name",
"position": "Your Target Position",
"email": "[email protected]",
"phone": "+1 (555) 123-4567",
"location": "City, State",
"linkedin": "linkedin.com/in/yourprofile",
"github": "github.com/yourusername",
"website": "yourwebsite.com"
},
"summary": "2-3 sentences about your background, expertise, and career goals",
"experiences": [
{
"company": "Company Name",
"position": "Job Title",
"location": "City, State",
"start_date": "MM/YYYY",
"end_date": "MM/YYYY or 'Present'",
"description": "Brief company description and your role",
"achievements": [
"Use action verbs from action-verbs.txt",
"Quantify your impact when possible",
"Focus on results and outcomes"
]
}
],
"education": [
{
"institution": "University Name",
"degree": "Degree Type",
"field_of_study": "Field of Study",
"end_date": "MM/YYYY",
"gpa": "GPA (optional)"
}
],
"skills": {
"programming_languages": ["From skills.txt"],
"frameworks": ["From skills.txt"],
"custom_category": ["Any dynamic skills you want"]
},
"projects": [
{
"name": "Project Name",
"description": "Brief project description and your role",
"technologies": ["Tech stack used"],
"github_url": "github.com/yourusername/project",
"live_url": "project-demo.com (optional)"
}
],
"certifications": [
{
"name": "Certification Name",
"issuer": "Issuing Organization",
"date": "MM/YYYY",
"expiry_date": "MM/YYYY or null"
}
],
"languages": [
{
"language": "Language Name",
"proficiency": "Native/Fluent/Intermediate/Basic"
}
]
}- File:
docs/cv-templates/template-1.html - Figma Design: View Template 1 Design
- Style: Clean, professional, single-column layout
- Features:
- Responsive design
- Color-coded sections
- Skill tags
- Print-optimized
- Handlebars templating
# Generate HTML file (recommended for most users)
node src/generate.js generate -t docs/cv-templates/template-1.html -i docs/cv-json-example/backend-cv-schema.json -o output/cv.html
# Generate PDF file (requires Chrome/Chromium)
node src/generate.js generate -t docs/cv-templates/template-1.html -i docs/cv-json-example/frontend-cv-schema.json -o output/cv.pdf
# Force HTML output even with .pdf extension
node src/generate.js generate -t docs/cv-templates/template-1.html -i docs/cv-json-example/backend-cv-schema.json -o output/cv.pdf --html-only
# Validate data without generating output
node src/generate.js generate -t docs/cv-templates/template-1.html -i docs/cv-json-example/backend-cv-schema.json --validate-only
# Help
node src/generate.js generate --help| Option | Description |
|---|---|
-t, --template |
Path to HTML template file |
-i, --input |
Path to JSON input file |
-o, --output |
Path for output file (PDF or HTML) |
--html-only |
Generate HTML file only (skip PDF generation) |
--validate-only |
Only validate JSON data |
This project is licensed under the MIT License - see the LICENSE file for details.
See Contribution.md for the project roadmap and ways to contribute.
Happy CV building! π
For questions or support, please open an issue on GitHub.

