LiveCV is a modern resume builder application that helps job seekers create professional resumes optimized for Applicant Tracking Systems (ATS). Powered by RenderCV for high-quality PDF generation and Appwrite for secure cloud storage and authentication.
- RenderCV Integration: Professional PDF generation using Typst rendering engine
- Appwrite Backend: Secure cloud storage, authentication, and user management
- Live PDF Preview: Real-time debounced preview as you edit
- Multiple Themes: Classic, ModernCV, SB2Nov, and Engineering resume styles
- ATS Optimization: Score analysis and keyword matching
- Job Description Matching: AI-powered resume tailoring
- Real-time Collaboration: Socket.IO-powered live editing
- Dual Preview Modes: Toggle between HTML and PDF preview
- Smart Caching: In-memory PDF caching for instant previews
- Cloud Storage: Resume persistence with automatic versioning
- Dashboard: Manage multiple resumes with version history
- OAuth Integration: Sign in with Google or GitHub via Appwrite
- Resume Limit Management: Automatic 5-resume limit per user with smart cleanup
- Node.js (v14+)
- npm or yarn
- Python 3.8+ (for RenderCV)
- pip (Python package installer)
- Clone the repository:
git clone https://github.com/sidgureja7803/LiveCV.git
cd LiveCV- Install RenderCV (required for PDF generation):
pip install rendercvOr use the npm script:
cd server
npm run setup:rendercv- Install dependencies for both client and server:
# Install client dependencies
cd client
npm install
# Install server dependencies
cd ../server
npm install- Configure environment variables:
Server (.env file in server directory):
Copy the example file and fill in your values:
cd server
cp .env.example.server .envEdit .env with your configuration:
# REQUIRED - Server Configuration
PORT=5001
NODE_ENV=development
FRONTEND_URL=http://localhost:5173
# REQUIRED - Appwrite Configuration
APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1
APPWRITE_PROJECT_ID=your_project_id
APPWRITE_API_KEY=your_api_key
APPWRITE_DATABASE_ID=livecv-production
APPWRITE_COLLECTION_RESUMES=resumes
APPWRITE_COLLECTION_USERS=users
APPWRITE_BUCKET_PDFS=resume-pdfs
APPWRITE_BUCKET_YAMLS=resume-yamls
# OPTIONAL - AI Features
AIMLAPI_API_KEY=your_aiml_api_key
OPENAI_API_KEY=sk-your_openai_keyClient (.env file in client directory):
Copy the example file and fill in your values:
cd client
cp .env.example.client .envEdit .env with your configuration:
# REQUIRED - API Configuration
VITE_API_URL=http://localhost:5001
# REQUIRED - Appwrite Configuration (must match server)
VITE_APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1
VITE_APPWRITE_PROJECT_ID=your_project_id
VITE_APPWRITE_DATABASE_ID=livecv-productionImportant Notes:
- All
REQUIREDvariables must be set for the application to work OPTIONALvariables enable additional features (AI scoring, job matching)- Ensure Appwrite configuration matches between client and server
- Never commit your
.envfiles to version control - See
.env.example.serverand.env.example.clientfor detailed documentation
- Start the development servers:
# Start client (in client directory)
npm run dev
# Start server (in server directory)
npm run devCleanup Script
LiveCV includes an automated cleanup script to remove unnecessary files from the repository:
# Run from project root
./server/scripts/cleanup.shThis script will:
- Remove all
.DS_Storefiles (macOS system files) - Remove macOS resource fork files (
._*) - Remove temporary files (
*.tmp) - Remove vim swap files (
*.swp,*.swo,*~) - Remove log files from the root directory
Note: Build artifacts in node_modules/ and dist/ are already ignored by .gitignore and don't need manual cleanup.
LiveCV uses RenderCV for professional PDF generation with multiple theme options. Templates are dynamically generated from user data, not loaded from static files.
User Input (JSON) β Backend Conversion β RenderCV YAML β PDF Generation
- User fills out resume form in the frontend
- Frontend sends resume data as JSON to backend
- Backend converts JSON to RenderCV YAML format
- RenderCV generates PDF with selected theme
- PDF is cached and streamed to user
LiveCV supports 5 professional RenderCV themes:
| Theme | Best For | Style |
|---|---|---|
| Classic | Business professionals, finance, management | Traditional two-column with blue accents |
| ModernCV | Software engineers, product managers | Modern design with sidebar |
| Sb2nov | Developers, tech leads | Compact, popular among engineers |
| EngineeringResumes | Software/hardware engineers | Technical roles, skills highlighted |
| EngineeringClassic | Researchers, PhD candidates | Academic focus, publications ready |
Frontend (client/src/config/templates.ts):
- Template metadata (name, description, category)
- Thumbnail images for preview
- Theme IDs that map to RenderCV themes
Backend (server/utils/jsonToYamlMapper.js):
- JSON to YAML conversion logic
- Theme-specific design configuration
- Field mapping and validation
Server Templates Directory (server/templates/):
- Example YAML and PDF files for reference
- Used for testing and documentation
- NOT loaded by the application at runtime
To add a new RenderCV theme to LiveCV:
-
Verify RenderCV Support: Ensure the theme exists in RenderCV
rendercv --help # Check available themes -
Update Backend Mapper (
server/utils/jsonToYamlMapper.js):function getThemeDesign(theme) { switch(theme) { case 'your-new-theme': return { theme: 'your-new-theme', // Theme-specific configuration }; // ... other themes } }
-
Add Frontend Configuration (
client/src/config/templates.ts):{ id: 'your-new-theme', name: 'Your Theme Name', description: 'Theme description', category: 'professional', thumbnail: '/images/your-theme-thumb.png', // ... other metadata }
-
Add Thumbnail Image: Place preview image in
client/public/images/ -
Test Generation:
cd server npm run render:local -
(Optional) Add Example Files: Add sample YAML/PDF to
server/templates/for documentation
Test all themes locally:
cd server
npm run render:localThis generates PDFs for all themes and saves them to server/test-output/.
- Official Documentation: https://docs.rendercv.com/
- GitHub Repository: https://github.com/sinaatalay/rendercv
- Theme Gallery: https://docs.rendercv.com/user_guide/themes/
This section covers common issues and their solutions when setting up or using LiveCV.
Cause: RenderCV is not installed or not in PATH
Solutions:
-
Install RenderCV using pip:
pip install rendercv
-
If using Python 3.x specifically:
pip3 install rendercv
-
Verify installation:
rendercv --version
-
If still not found, check Python PATH:
python3 -m pip show rendercv
Cause: RenderCV requires Python 3.8 or higher
Solution:
-
Check your Python version:
python3 --version
-
If below 3.8, install a newer version:
- macOS:
brew install python@3.11 - Ubuntu/Debian:
sudo apt install python3.11 - Windows: Download from https://www.python.org/downloads/
- macOS:
-
Reinstall RenderCV with the new Python version:
python3.11 -m pip install rendercv
Cause: Insufficient permissions for system-wide installation
Solution:
-
Install for current user only:
pip install --user rendercv
-
Or use sudo (not recommended):
sudo pip install rendercv
-
Or use a virtual environment (recommended):
python3 -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate pip install rendercv
Cause: Incorrect endpoint or network issues
Solutions:
-
Verify Appwrite endpoint in
.env:# Should be exactly: APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1 -
Check if Appwrite is accessible:
curl https://cloud.appwrite.io/v1/health
-
Verify firewall/proxy settings aren't blocking the connection
-
Check Appwrite status: https://status.appwrite.io/
Cause: Incorrect credentials in environment variables
Solutions:
-
Verify credentials in Appwrite Console:
- Go to https://cloud.appwrite.io/console
- Select your project
- Check Project ID in Settings
- Verify API key in Settings > API Keys
-
Ensure no extra spaces in
.envfile:# Wrong: APPWRITE_PROJECT_ID = your-id-here # Correct: APPWRITE_PROJECT_ID=your-id-here
-
Regenerate API key if necessary:
- Go to Project Settings > API Keys
- Create new key with required scopes:
databases.*storage.*users.read
-
Restart server after updating
.env:cd server npm run dev
Cause: Database collections or storage buckets not created
Solutions:
-
Create required collections in Appwrite Console:
- Go to Databases > Create Collection
- Create
resumescollection - Create
userscollection
-
Create required storage buckets:
- Go to Storage > Create Bucket
- Create
resume-pdfsbucket - Create
resume-yamlsbucket
-
Update
.envwith actual bucket IDs:APPWRITE_BUCKET_PDFS=actual-bucket-id-here APPWRITE_BUCKET_YAMLS=actual-bucket-id-here
-
Verify IDs match between client and server
.envfiles
Cause: Invalid YAML structure or RenderCV issues
Solutions:
-
Check server logs for detailed error:
cd server npm run dev # Look for RenderCV error messages
-
Test RenderCV directly with sample YAML:
cd server/templates rendercv render John_Doe_ClassicTheme_CV.yaml -
Validate YAML syntax:
cd server node test_yaml_validation.js -
Check for missing required fields:
cv.name(required)cv.email(required)design.theme(required)
-
Verify theme name is valid:
- Valid:
classic,moderncv,sb2nov,engineeringresumes - Invalid:
Classic,modern-cv,engineering_resumes
- Valid:
Cause: Browser PDF viewer issues or CORS problems
Solutions:
-
Check browser console for errors (F12)
-
Try downloading PDF instead of previewing
-
Verify CORS configuration in
server/server.js:app.use(cors({ origin: process.env.FRONTEND_URL, credentials: true }));
-
Clear browser cache and reload
-
Try a different browser (Chrome, Firefox, Safari)
Cause: No caching or large resume content
Solutions:
-
Verify caching is enabled in
rendercvService.js -
Check cache statistics:
curl http://localhost:5001/api/render/cache/stats
-
Reduce resume content size (very long descriptions)
-
Check server resources (CPU, memory)
-
Consider increasing cache TTL in
rendercvService.js:const cache = new NodeCache({ stdTTL: 3600 }); // 1 hour
Cause: Incorrect API URL or server not running
Solutions:
-
Verify server is running:
cd server npm run dev # Should see: Server running on port 5001
-
Check
VITE_API_URLinclient/.env:VITE_API_URL=http://localhost:5001
-
Test API directly:
curl http://localhost:5001/api/render/health
-
Check for port conflicts:
lsof -i :5001 # macOS/Linux netstat -ano | findstr :5001 # Windows
Cause: Appwrite session issues or configuration mismatch
Solutions:
-
Clear browser cookies and local storage
-
Verify Appwrite configuration matches between client and server
-
Check Appwrite Console > Auth settings:
- Email/Password auth enabled
- OAuth providers configured (if using)
-
Test authentication directly in Appwrite Console
-
Check browser console for detailed error messages
Cause: Frontend not receiving resume count from backend
Solutions:
-
Check API response includes count:
curl -H "Authorization: Bearer YOUR_TOKEN" \ http://localhost:5001/api/resume/user/all -
Verify
ResumeLimitWarningModalcomponent is imported -
Check browser console for React errors
-
Verify
resumeLimitService.jsis working:# Check server logs when creating resume
Cause: .env file not in correct location or syntax errors
Solutions:
-
Verify
.envfile location:- Server:
server/.env - Client:
client/.env
- Server:
-
Check for syntax errors:
# Wrong: PORT = 5001 APPWRITE_ENDPOINT = "https://cloud.appwrite.io/v1" # Correct: PORT=5001 APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1
-
Restart development servers after changing
.env -
Verify
.envis not in.gitignore(it should be!) -
Use
.env.examplefiles as reference
Cause: Frontend URL not whitelisted in server CORS config
Solutions:
-
Update
FRONTEND_URLinserver/.env:FRONTEND_URL=http://localhost:5173
-
Verify CORS middleware in
server/server.js -
Check browser is using correct frontend URL
-
Clear browser cache and reload
Cause: Appwrite permissions or database configuration
Solutions:
-
Check Appwrite Console > Database > Resumes collection:
- Verify collection exists
- Check permissions (users should have read/write)
-
Check server logs for Appwrite errors
-
Verify API key has
databases.*scope -
Test database connection:
cd server node server/config/validateConfig.js
Cause: Storage bucket permissions or size limits
Solutions:
-
Check Appwrite Console > Storage > Buckets:
- Verify buckets exist
- Check file size limits (increase if needed)
- Verify permissions
-
Check file size:
# PDFs should be < 5MB typically -
Verify API key has
storage.*scope -
Check server logs for detailed error
Cause: Various performance bottlenecks
Solutions:
-
Enable PDF caching (should be default)
-
Optimize resume content (reduce text length)
-
Check network latency to Appwrite
-
Monitor server resources:
top # Linux/macOS # Check CPU and memory usage
-
Consider upgrading Appwrite plan if on free tier
-
Use production build for frontend:
cd client npm run build npm run preview
If you're still experiencing issues:
-
Check Server Logs: Most errors are logged with details
cd server npm run dev # Watch for error messages
-
Check Browser Console: Frontend errors appear here (F12)
-
Verify Configuration: Run validation script
cd server node config/validateConfig.js -
Test Core Functionality: Run integration tests
cd server npm run test:integration -
Check Documentation:
- RenderCV: https://docs.rendercv.com/
- Appwrite: https://appwrite.io/docs
- Node.js: https://nodejs.org/docs/
-
Create GitHub Issue: Include:
- Error messages from logs
- Steps to reproduce
- Environment details (OS, Node version, Python version)
- Configuration (without sensitive data)
Run through this checklist to identify issues quickly:
- Python 3.8+ installed:
python3 --version - RenderCV installed:
rendercv --version - Node.js 14+ installed:
node --version - Server dependencies installed:
cd server && npm install - Client dependencies installed:
cd client && npm install - Server
.envfile exists and configured - Client
.envfile exists and configured - Appwrite project created and accessible
- Appwrite collections created (resumes, users)
- Appwrite buckets created (resume-pdfs, resume-yamls)
- Server starts without errors:
cd server && npm run dev - Client starts without errors:
cd client && npm run dev - Can access frontend: http://localhost:5173
- Can access backend health: http://localhost:5001/api/render/health
- RenderCV test works:
cd server && npm run render:local
LiveCV supports real-time collaboration through Socket.IO. When multiple users are editing the same resume, changes are synchronized in real-time.
The Socket.IO connection is established in the ResumeBuilder component and managed through the useSocketIo hook.
LiveCV uses Appwrite as its complete backend infrastructure, handling:
- Email/Password Authentication: Secure user signup and login
- OAuth Integration: Sign in with Google or GitHub
- Session Management: Automatic session handling and token refresh
- User Profiles: Store and manage user information
Appwrite Database stores all resume metadata:
- Collection:
resumes- User ID (owner)
- Resume name
- Theme (classic, moderncv, etc.)
- YAML content
- PDF URL and file metadata
- Creation and update timestamps
- Content hash for change detection
Features:
- Document-based NoSQL database
- Real-time queries
- User-specific permissions (users can only access their own resumes)
- Automatic indexing
- Version tracking
Appwrite Storage handles all resume files:
Bucket: resume-pdfs
- Stores generated PDF files
- User can download anytime
- Secure URLs with expiration
- File size tracking
Bucket: resume-yamls
- Stores YAML source files
- Can regenerate PDFs from YAML
- Enables resume editing/versioning
- Text-based for easy storage
Features:
- Automatic file compression
- CDN integration for fast delivery
- User-specific file permissions
- Antivirus scanning
- Encryption at rest
User Signs Up (Appwrite Auth)
β
User Creates Resume (Frontend Form)
β
Backend Checks Resume Limit (5 max)
βββ If at limit β Show warning modal
βββ User confirms β Delete oldest resume
βββ Continue with creation
β
Backend Generates YAML
β
RenderCV Creates PDF
β
Backend Saves to Appwrite:
βββ YAML β Storage Bucket (resume-yamls)
βββ PDF β Storage Bucket (resume-pdfs)
βββ Metadata β Database (resumes collection)
β
User Can:
βββ View PDF instantly (CDN URL)
βββ Download PDF
βββ Edit resume (loads from database)
βββ See resume count (X/5 resumes)
βββ Access from any device
Document-Level Security:
Permission.read(Role.user(userId)) // Only owner can read
Permission.update(Role.user(userId)) // Only owner can update
Permission.delete(Role.user(userId)) // Only owner can deleteStorage Security:
- Each file has user-specific read/write permissions
- Files are encrypted at rest
- Secure HTTPS URLs only
- Optional file expiration
-
Resume Limit Management: Each user can save up to 5 resumes
- Automatic cleanup of oldest resumes when limit is reached
- Warning modal before deletion with download option
- Visual indicator showing resume count (e.g., "4/5 resumes")
- Prevents storage bloat while keeping recent work
- Oldest resume determined by
updatedAttimestamp - Associated PDF and YAML files automatically deleted from storage
-
Resume Versioning: Track changes over time
- Content hash for change detection
- Update timestamps
- Can revert to previous versions
-
Multi-Device Access:
- Resumes stored in cloud
- Access from any device
- No data loss on logout
-
Fast Delivery:
- PDF URLs served via CDN
- Instant downloads
- Cached for performance
- Create Appwrite Account: https://cloud.appwrite.io
- Create Project: Get your Project ID
- Generate API Key:
- Required scopes:
databases.*,storage.*,users.read
- Required scopes:
- Create Database:
livecv-production - Create Collections:
resumeswith attributes (see APPWRITE_SETUP_GUIDE.md)usersfor additional user data
- Create Storage Buckets:
resume-pdfs(PDF files)resume-yamls(YAML files)
- Setup OAuth (Optional):
- Enable Google OAuth
- Enable GitHub OAuth
Detailed Setup: See APPWRITE_SETUP_GUIDE.md for step-by-step instructions
| Feature | Appwrite | Traditional Backend |
|---|---|---|
| Setup Time | ~30 minutes | Days/weeks |
| Authentication | Built-in OAuth | Need to implement |
| Database | NoSQL ready | Need to setup |
| File Storage | Built-in CDN | Need S3/storage |
| Security | Document-level | Manual implementation |
| Scaling | Automatic | Manual configuration |
| Cost | Free tier available | Server costs |
Backend (server/services/appwriteService.js):
saveResumeMetadata()- Save resume to databaseupdateResumeMetadata()- Update existing resumegetResumeMetadata()- Retrieve resume by IDlistUserResumes()- Get all user's resumesdeleteResumeMetadata()- Delete resumeuploadPDF()- Upload PDF to storageuploadYAML()- Upload YAML to storagedownloadFile()- Download file from storagedeleteFile()- Delete file from storage
Frontend (client/src/contexts/AuthContext.tsx):
- User authentication
- Session management
- OAuth login (Google/GitHub)
- User profile access
- Fast Development: Pre-built auth, database, storage
- Secure by Default: Built-in encryption and permissions
- Scalable: Handles thousands of users
- Cost-Effective: Free tier for development
- Developer-Friendly: Great documentation and SDKs
- Open Source: Self-hostable if needed
LiveCV + Appwrite = Complete SaaS Application β¨
LiveCV implements a smart 5-resume limit per user to ensure optimal storage usage and encourage users to maintain their most relevant resumes.
-
Automatic Enforcement: When you attempt to create a 6th resume, the system automatically identifies your oldest resume (based on last update time)
-
User Warning: Before deletion, a warning modal appears showing:
- Which resume will be deleted (name and last updated date)
- Option to download the resume before it's deleted
- "Cancel" button to abort the operation
- "Continue" button to proceed with creation
-
Smart Cleanup: Upon confirmation:
- The oldest resume metadata is deleted from the database
- Associated PDF file is removed from Appwrite storage
- Associated YAML file is removed from Appwrite storage
- New resume is created successfully
-
Visual Indicators:
- Dashboard shows resume count: "4/5 resumes"
- Color-coded indicator when approaching limit
- Remaining slots displayed clearly
Dashboard View:
βββββββββββββββββββββββββββββββββββ
β My Resumes [4/5] β β Resume count indicator
βββββββββββββββββββββββββββββββββββ€
β β‘ Software Engineer Resume β
β β‘ Frontend Developer Resume β
β β‘ Full Stack Resume β
β β‘ Senior Developer Resume β
βββββββββββββββββββββββββββββββββββ
When creating 5th resume:
βββββββββββββββββββββββββββββββββββ
β β οΈ Resume Limit Warning β
βββββββββββββββββββββββββββββββββββ€
β You have reached the maximum β
β of 5 resumes. Creating a new β
β resume will delete: β
β β
β "Software Engineer Resume" β
β Last updated: 2 months ago β
β β
β [Download First] [Cancel] β
β [Continue] β
βββββββββββββββββββββββββββββββββββ
- Focus on Quality: Encourages maintaining tailored, up-to-date resumes
- Storage Efficiency: Prevents unlimited storage usage
- Best Practice: Most job seekers need 2-3 tailored versions
- Easy Management: Keeps dashboard clean and organized
The resume limit is enforced by resumeLimitService.js:
- Queries user resumes ordered by
updatedAttimestamp - Identifies oldest resume when limit is reached
- Deletes resume document and associated files atomically
- Handles errors gracefully (e.g., file already deleted)
- Logs all deletion operations for audit trail
Note: The limit applies per user account. Each user has their own independent 5-resume quota.
LiveCV now uses RenderCV for professional PDF generation. This pipeline provides:
βββββββββββββββββββ
β React Frontend β
β (Form Inputs) β
ββββββββββ¬βββββββββ
β Resume JSON
β (debounced 800ms)
βΌ
βββββββββββββββββββ
β API Gateway β
β POST /api/renderβ
β /:id/preview β
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββ
β jsonToYamlMapper.js β
β β’ Maps JSON β RenderCV YAML β
β β’ Handles theme configuration β
β β’ Validates structure β
ββββββββββ¬βββββββββββββββββββββββββ
β YAML Content
βΌ
βββββββββββββββββββββββββββββββββββ
β rendercvService.js β
β β’ Content hash for caching β
β β’ Execute RenderCV CLI β
β β’ In-memory cache (1hr TTL) β
ββββββββββ¬βββββββββββββββββββββββββ
β
ββββ Cache Hit? β Return PDF
β
ββββ Cache Miss β
βββββββββββββββββββ
β RenderCV CLI β
β (Python) β
β β’ YAML β Typst β
β β’ Typst β PDF β
ββββββββββ¬βββββββββ
β PDF Buffer
βΌ
βββββββββββββββββββ
β Cache Storage β
β & Stream PDF β
βββββββββββββββββββ
β
βΌ
βββββββββββββββββββ
β React <iframe> β
β Live Preview β
βββββββββββββββββββ
1. utils/jsonToYamlMapper.js
- Converts frontend resume JSON to RenderCV YAML schema
- Supports themes:
classic,moderncv,sb2nov,engineeringresumes - Handles date formatting, social networks, and nested structures
- Validates YAML before rendering
2. services/rendercvService.js
- Executes RenderCV CLI with timeout protection
- SHA-256 content hashing for cache keys
- In-memory caching with
node-cache(1-hour TTL) - Automatic cleanup of temporary files
- Cache statistics tracking
3. controllers/renderController.js
previewPDF: Streams PDF for iframe previewdownloadPDF: Downloads PDF with custom filenamegeneratePDF: Generates PDF from raw JSONgetYAML: Returns YAML representation for debugging
4. routes/renderRoute.js
GET /api/render/:id/preview?theme=classic- Live previewGET /api/render/:id/download?theme=classic- Download PDFPOST /api/render/generate- Generate from JSONGET /api/render/health- Health check
5. services/appwriteService.js (Optional)
- Stores YAML content in Appwrite Database
- Uploads compiled PDFs to Appwrite Storage
- Tracks PDF metadata (theme, size, hash)
- Enables "download later" functionality
1. hooks/useDebouncedPreview.ts
- Custom React hook for debounced PDF generation
- 800ms delay after user stops typing
- Automatic cleanup of blob URLs
- Abort controller for request cancellation
- Loading and error states
2. Updated ResumeBuilder.tsx
- Toggle between HTML and PDF preview modes
- RenderCV theme selector (Classic, ModernCV, etc.)
- Live PDF iframe preview
- Debounced preview generation
- Download functionality
# Navigate to server directory
cd server
# Run local test script
npm run render:localThis will:
- Check if RenderCV is installed
- Generate PDFs for all 4 themes
- Save YAML and PDF outputs to
server/test-output/ - Display cache statistics
Preview PDF:
curl -X GET "http://localhost:5001/api/render/{resumeId}/preview?theme=classic" \
-H "Authorization: Bearer {token}" \
--output preview.pdfGenerate PDF from JSON:
curl -X POST "http://localhost:5001/api/render/generate" \
-H "Content-Type: application/json" \
-d '{
"resumeData": {...},
"theme": "classic",
"fileName": "John_Doe_Resume.pdf"
}' \
--output resume.pdfGet YAML representation:
curl -X GET "http://localhost:5001/api/render/{resumeId}/yaml?theme=moderncv" \
-H "Authorization: Bearer {token}"- First render: ~2-5 seconds (depends on resume complexity)
- Cached renders: <50ms (instant)
- Debounce delay: 800ms (configurable)
- Cache TTL: 1 hour
- Concurrent requests: Handled via queue (can add worker pool)
- classic - Traditional two-column layout with blue accents
- moderncv - Modern design with sidebar
- sb2nov - Popular among software engineers
- engineeringresumes - Optimized for technical roles
RenderCV not installed:
pip install rendercv
# or
cd server && npm run setup:rendercvPermission errors on temp files:
# Ensure /tmp directory is writable
chmod 777 /tmpPDF not generating:
- Check RenderCV installation:
rendercv --version - Check server logs for YAML validation errors
- Test locally:
npm run render:local - Verify Python version:
python3 --version(3.8+ required)
The system now supports both rendering modes:
- PDF Mode (RenderCV): Professional, ATS-optimized PDFs
- HTML Mode (Legacy): Browser-rendered HTML templates
Toggle between modes using the preview mode selector in the UI.
- Worker thread pool for concurrent rendering
- Redis-based distributed caching
- Custom Typst templates
- Real-time collaboration on PDF annotations
- PDF versioning and history
- Batch PDF generation API