All apps · 0 apps
cv-manager
Docker app from vincentmakes' Repository
Overview
Readme
View on GitHubCV Manager / Resume Builder
This is a CV / Resume management system with an editable theme, persistent database storage, and Docker deployment ready for Unraid.
Features
- 7 Sections: About, Timeline (auto-generated), Experience, Certifications, Education, Skills, Projects
- Custom Sections: Add your own sections with different layout possibilities
- Full CRUD: Add, edit, delete any item
- Visibility Toggles: Hide items from PDF export while keeping them in database
- Print/PDF Export: Clean print styles, hidden items excluded
- Import/Export: Backup and restore your CV data as JSON - ideal to process the data via any LLM for optimization
- Persistent Storage: SQLite database survives container restarts
- Multi CV: Save different of your CV. Preview them and load them as need be
- Responsive Design: Works on desktop and mobile
- Auto-Generated Timeline: Timeline automatically builds from your experiences
- ATS Optimized: Schema.org markup, semantic HTML, hidden keywords for job site parsing
- SEO Ready: Dynamic robots.txt and sitemap.xml for the public site
Quick Start (Docker)
One-Line Install
curl -fsSL https://raw.githubusercontent.com/vincentmakes/cv-manager/main/install.sh | bash
Or download and run:
wget https://raw.githubusercontent.com/vincentmakes/cv-manager/main/install.sh
chmod +x install.sh
./install.sh
Manual Option 1: Docker Compose
# Clone or copy the files
cd cv-manager
# Create data directory
mkdir -p /mnt/user/appdata/cv-manager/data/uploads
# Start the container
docker-compose up -d --build
# Access at:
# - http://localhost:3000 (Admin - full edit access)
# - http://localhost:3001 (Public - read-only)
Manual Option 2: Docker Compose with Named Volume
Use docker-compose.volume.yml if you prefer Docker-managed volumes:
docker-compose -f docker-compose.volume.yml up -d --build
Manual Option 3: Docker Run
# Build the image
docker build -t cv-manager .
# Run with persistent data
docker run -d \
--name cv-manager \
-p 3000:3000 \
-p 3001:3001 \
-v /mnt/user/appdata/cv-manager/data:/app/data \
--restart unless-stopped \
cv-manager
Two Server Modes
| Port | Mode | Description |
|---|---|---|
| 3000 | Admin | Full edit access, toolbar, all controls |
| 3001 | Public | Read-only, no toolbar, no edit buttons, security hardened |
Public Server Security Features (Port 3001)
- GET-only: All POST/PUT/DELETE requests blocked
- Rate limiting: 60 requests/minute per IP
- Security headers: X-Frame-Options, CSP, XSS protection
- No sensitive data: Email/phone not exposed in API
- Visible items only: Hidden items not returned by API
- No IDs exposed: Database IDs not included in responses
- SEO files: Dynamic robots.txt and sitemap.xml
Cloudflare Tunnel Setup
Point your CF tunnel to port 3001 for public access:
# In your cloudflared config
ingress:
- hostname: cv.yourdomain.com
service: http://cv-manager:3001
The sitemap.xml and robots.txt are automatically generated with the correct domain based on the incoming request headers.
Unraid Deployment
Method 1: Install from Unraid Apps
- In the Apps tab, look for "cv manager".
- Install cv-manager first then cv-manager-public
Method 2: Docker Compose Manager Plugin
- Install the "Docker Compose Manager" plugin from Community Apps
- Create a new stack with the
docker-compose.ymlcontent - Set the path for data persistence (e.g.,
/mnt/user/appdata/cv-manager/data) - Start the stack
Data Persistence
The SQLite database is stored in the data directory. Make sure to:
- Mount
/app/datato a persistent location on your host - Back up the
cv.dbfile periodically - Use the Export feature for JSON backups
Profile Picture
To add your profile picture:
- Name your picture
picture.jpeg - Place it in the
data/uploads/folder:- Docker:
/app/data/uploads/picture.jpeg(inside container) - Unraid bind mount:
/mnt/user/appdata/cv-manager/data/uploads/picture.jpeg - Docker volume: Use
docker cp picture.jpeg cv-manager:/app/data/uploads/
- Docker:
The picture will automatically display instead of initials. If no picture is found, initials are shown as fallback.
Supported format: JPEG (must be named picture.jpeg)
API Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/profile |
Get profile data |
| PUT | /api/profile |
Update profile |
| GET | /api/experiences |
List all experiences |
| POST | /api/experiences |
Create experience |
| PUT | /api/experiences/:id |
Update experience |
| DELETE | /api/experiences/:id |
Delete experience |
| GET | /api/certifications |
List certifications |
| POST | /api/certifications |
Create certification |
| PUT | /api/certifications/:id |
Update certification |
| DELETE | /api/certifications/:id |
Delete certification |
| GET | /api/education |
List education |
| POST | /api/education |
Create education |
| PUT | /api/education/:id |
Update education |
| DELETE | /api/education/:id |
Delete education |
| GET | /api/skills |
List skill categories |
| POST | /api/skills |
Create skill category |
| PUT | /api/skills/:id |
Update skill category |
| DELETE | /api/skills/:id |
Delete skill category |
| GET | /api/projects |
List projects |
| POST | /api/projects |
Create project |
| PUT | /api/projects/:id |
Update project |
| DELETE | /api/projects/:id |
Delete project |
| GET | /api/timeline |
Get auto-generated timeline |
| GET | /api/sections |
Get section visibility |
| PUT | /api/sections/:name |
Update section visibility |
| GET | /api/cv |
Export all CV data |
| POST | /api/import |
Import CV data |
Importing Your Existing Data
Create a JSON file with your CV data and use the Import button, or POST to /api/import:
{
"profile": {
"name": "Your Name",
"initials": "YN",
"title": "Your Title",
"subtitle": "Your tagline",
"bio": "Your bio...",
"location": "City, Country",
"linkedin": "https://linkedin.com/in/yourprofile",
"languages": "English, French"
},
"experiences": [
{
"job_title": "Senior Developer",
"company_name": "Company Inc",
"start_date": "2020-01",
"end_date": "",
"location": "Remote",
"country_code": "us",
"highlights": ["Led team of 5", "Delivered project X"]
}
],
"certifications": [
{
"name": "AWS Solutions Architect",
"provider": "Amazon",
"issue_date": "Jan 2023"
}
],
"education": [
{
"degree_title": "MSc Computer Science",
"institution_name": "University",
"start_date": "2010",
"end_date": "2014",
"description": "Focus on AI"
}
],
"skills": [
{
"name": "Programming",
"icon": "💻",
"skills": ["JavaScript", "Python", "Go"]
}
],
"projects": [
{
"title": "Project Name",
"description": "What it does",
"technologies": ["React", "Node.js"]
}
]
}
Environment Variables
| Variable | Default | Description |
|---|---|---|
PORT |
3000 |
Server port |
PUBLIC_PORT |
3001 |
Server port Read only |
DB_PATH |
./data/cv.db |
SQLite database path |
Development
# Install dependencies
npm install
# Run in development mode (auto-reload)
npm run dev
# Run in production mode
npm start
License
MIT
Install cv-manager on Unraid in a few clicks.
Find cv-manager in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
Categories
Download Statistics
Total Downloads Over Time
Related apps
Explore more like this
Explore allLinks
Details
vincentmakes/cv-manager:latestRuntime arguments
- Web UI
http://[IP]:[PORT:3000]- Network
bridge- Shell
sh- Privileged
- false
Template configuration
Admin interface web port
- Target
- 3000
- Default
- 3000
- Value
- 3000
Database and profile pictures storage. IMPORTANT: Use same path for both Admin and Public containers to share data.
- Target
- /app/data
- Default
- /mnt/user/appdata/cv-manager/data
- Value
- /mnt/user/appdata/cv-manager/data
Node environment (leave as production)
- Target
- NODE_ENV
- Default
- production
- Value
- production