A modern CV management system built on Payload CMS 3 and Next.js 16, designed for companies to create, manage, and export professional CVs.
- Multi-language support — German and English with localized content
- Flexible skill system — Organize skills in hierarchical groups with customizable proficiency levels
- PDF export — Generate professional PDFs with customizable branding and layout
- PostgreSQL — Migrations run automatically on startup
- S3 storage — Media files in any S3-compatible storage, Garage included in the provided setups
- OAuth integration — Single sign-on with your identity provider
- Multi-tenant — Manage CVs across multiple organizations
A ready-to-use configuration is provided in the docker-compose directory. It runs the tegonal/cv-manager image with PostgreSQL and Garage behind Caddy.
- Copy the directory with all its files, including
.env. - Set your own secrets in
.envas described in its README. The stack refuses to start until they are set. - Run
docker compose up -din that directory and openhttps://localhost(or yourPUBLIC_URL).
Database migrations run automatically on startup, also when upgrading to a new version.
| Variable | Description |
|---|---|
PAYLOAD_SECRET |
Strong secret for encryption (required) |
PUBLIC_URL |
URL under which the instance is reachable, defaults to http://localhost:3000 |
DATABASE_URI |
PostgreSQL connection string, e.g. postgres://user:pass@host:5432/db (required) |
Media files are stored in S3-compatible storage (required):
S3_ENDPOINT=https://s3.example.com
S3_BUCKET=cv-manager-media
S3_ACCESS_KEY_ID=your-access-key
S3_SECRET_ACCESS_KEY=your-secret-key
S3_REGION=us-east-1 # defaults to garageThe provided docker compose setup includes Garage as S3-compatible storage, and so do the local development services.
Configure SMTP for password recovery emails:
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=your-smtp-user
SMTP_PASS=your-smtp-password
SMTP_FROM_ADDRESS=noreply@example.comWithout SMTP, password recovery tokens are printed to the application logs.
Enable single sign-on with your identity provider:
OAUTH_ENABLED=true
OAUTH_CLIENT_ID=your-client-id
OAUTH_CLIENT_SECRET=your-client-secret
OAUTH_TOKEN_ENDPOINT=https://auth.example.com/token
OAUTH_AUTHORIZE_ENDPOINT=https://auth.example.com/authorize
OAUTH_USERINFO_ENDPOINT=https://auth.example.com/userinfoConfigure PDF appearance through the admin panel (Settings) without code changes:
| Setting | Where | Options |
|---|---|---|
| Footer | Company Info | Name, address, city, website |
| Logo | PDF Style | Upload (SVG, PNG, JPG), width (mm), position (left/right), margins, first page only/all pages |
| Typography | PDF Style | Font family (Rubik, Open Sans, Lato, Roboto, Merriweather, Playfair Display) |
| Colors | PDF Style | Primary color (borders, highlights), secondary color (skill indicators) |
| Skill Levels | PDF Style | Display as text, dots, or progress bars |
| Page Layout | PDF Style | Format (A4/Letter), margins in mm, separate first page margins, first page centered or left-aligned |
Layouts beyond these settings are code: fork the repository, adapt the react-pdf template in src/payload/plugins/cv-pdf-generator/templates/default/index.tsx and build your own image. Shared utilities in templates/lib/ provide date formatting, Lexical rich-text rendering, and Tailwind CSS helpers.
Set up these entities before creating CVs:
| Entity | Purpose |
|---|---|
| Organizations | Tenants, users and their data belong to an organization |
| Skill Groups | Categories like "Programming Languages", "Frameworks" |
| Skills | Individual skills within groups |
| Levels | Proficiency levels for skills and languages (e.g. Junior, Expert) |
| Languages | Spoken languages, the proficiency is set per CV |
| Companies | Employers and clients referenced in the work experience |
| Projects | Shared project references |
Each CV contains:
| Section | Content |
|---|---|
| Profile | Personal info, photo, introduction, contact details, links |
| Skills | Languages, highlights, hierarchical skill groups with levels, other skills |
| Education | Highlights, degrees, certifications, courses |
| Experience | Highlights and project history with descriptions |
Skills can be nested to match different career profiles:
Frontend Developer:
Frontend Technologies
├── React — Expert
├── Vue.js — Senior
└── Angular — Junior
Full Stack Developer:
Full Stack Development
├── Backend Frameworks — Expert
│ └── Spring, Node.js, Django
├── Databases — Senior
│ └── PostgreSQL, MongoDB
└── Frontend — Advanced
└── React, Vue.js
Requires Node.js 24 and Docker.
nvm use
yarn install
yarn run services:start # Start Postgres, Garage (S3) and Mailpit
cp .env.example .env # Preconfigured for the local services
yarn run devMails are caught by Mailpit at http://localhost:8025. On first start, an admin user admin@test.com / admin and demo data are created.
yarn run check # Lint, format, and type-checkAfter schema changes, generate a migration:
yarn run migrate:create