CVForge
CVForge is a CLI that turns a YAML file into a clean, ATS-friendly PDF resume using Typst. Edit your content, rerun the command, and regenerate the same layout locally. Ideal for fast iteration and version control.
Why This Tool?
I created CVForge because I needed a fast, reliable way to build and rebuild my resume without:
- Using Word or clunky desktop apps
- Trusting random online resume builders with my personal data
- Spending time on formatting instead of content
CVForge lets you define your CV once in YAML and regenerate it instantly. Change a job title, add a skill, rebuild — done. 100% local, 100% private.
Installation
Using UV (Recommended)
# Install as a tool
uv tool install cvforge
# Update
uv tool upgrade cvforge
# Uninstall
uv tool uninstall cvforge
Using Pip
# Install
pip install cvforge
# Update
pip install --upgrade cvforge
# Uninstall
pip uninstall cvforge
Usage
# Initialize a complete template cv.yaml
cvforge init
# Generate PDF from your YAML file
cvforge cv.yaml
# List all available fonts
cvforge fonts
# Verify ATS compatibility of generated PDF
cvforge ats-check <file.pdf>
Configuration & YAML Structure
Run cvforge init to generate a complete example cv.yaml file with all
fields and compact comments.
Writing cv.yaml
- Keep
name,role, andemailpresent and non-empty. - Keep top-level sections in the order you want them rendered. CVForge renders resume sections in YAML order.
- Use the documented field names and list shapes. Unsupported top-level sections are ignored unless you also customize the Typst template.
- Use
__text__for inline bold emphasis in summaries, bullets, skills, and similar narrative fields. - Keep facts accurate. Do not add employers, dates, credentials, tools, or metrics unless they are real and supplied.
- Use compact, achievement-focused bullets. One or two pages is usually best for ATS parsing.
- For photos, set
phototo a local path relative to the YAML file. Use simplephoto-widthvalues such as"2.5cm","3cm","2in", or"80pt". - After editing, build with
cvforge cv.yamland check the PDF withcvforge ats-check cv.pdf.
Below is the full reference:
| Field | Required | Description |
|---|---|---|
language |
No | Section headings language: "en" (default) or "tr". Does not translate content. |
font |
No | Font family (run cvforge fonts to see available options). |
name |
Yes | Your full name |
role |
Yes | Job title / professional role |
email |
Yes | Contact email |
phone |
No | Phone number |
location |
No | City, Country |
website |
No | Personal website URL |
website-text |
No | Custom display text for the website link |
linkedin |
No | LinkedIn profile URL |
linkedin-text |
No | Custom display text for the LinkedIn link |
github |
No | GitHub profile URL |
github-text |
No | Custom display text for the GitHub link |
photo |
No | Local path to your profile photo, resolved relative to the YAML file |
photo-width |
No | Photo display width (default: "2.5cm"; examples: "3cm", "2in", "80pt") |
summary |
No | Professional summary paragraph |
skills |
No | List of skill categories with Category and Items |
experience |
No | List of work entries with optional description bullet lists |
education |
No | List of education entries with optional description bullet lists |
projects |
No | List of project entries with optional description bullet lists |
certifications |
No | List of certification entries |
awards |
No | List of award entries |
languages |
No | List of language proficiency entries |
interests |
No | List of interest/hobby strings |
Inline Bold Formatting
Use double underscores to make text bold in narrative fields (summary, descriptions, skills, etc.):
summary: "Built and scaled __high-throughput APIs__ for fintech workloads."
Features
- Cross-platform: Linux, Windows, macOS
- ATS Compatible: Clean, parseable text + built-in checker (
cvforge ats-check) - Multi-language Headers: Support for EN/TR out of the box
- Typography Choices: 17 available fonts (
cvforge fonts) - Rich Formatting: Inline bolding via
__text__, profile photo support - 100% Local & Private: No cloud storage, no online rendering
Agent Skill
Use the CVForge agent skill to help coding agents create, edit, build, and validate CVForge resumes.
Support
If you find this project useful, consider supporting its development:
License
This project is licensed under the MIT License.
Metadata
Release files for cvforge 1.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cvforge-1.2.1.tar.gz | 27.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cvforge-1.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 47.1 kB
Release files / cvforge-1.2.1.tar.gz
| Download URL | cvforge-1.2.1.tar.gz |
|---|---|
| Size | 27.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
27fa7c69a431370bbdf22604fe7ae1cdb5ef2201105c2c19af7aff743bf8489d
|
|
BLAKE2b-256 checksum How to use checksums |
63bfcf2b01834f4aba033dcecb497aacc57bfdcc452450a1cba775b0e7a5691a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / cvforge-1.2.1-py3-none-any.whl
| Download URL | cvforge-1.2.1-py3-none-any.whl |
|---|---|
| Size | 19.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
48e26e0375877e54dbb6cbe93ac1dbe5087c4e75959aba7f5decdbada678c252
|
|
BLAKE2b-256 checksum How to use checksums |
270ceb5d654c2584f7abe1baf659092a4daace53281aa3f9e4dddaa3b88b6f16
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|