# YAMLResume: Resumes as Code in YAML YAMLResume allows people to create and version control resumes using YAML and generate pixel perfect PDFs with professional layout and typesetting in a breeze. # CLI URL: (/en/docs/cli) YAMLResume provides a CLI tool to help you manage your resume. You can follow the [installation guide](/docs/installation) to install it. Please note that we have a [docker image](/docs/installation#docker-users) for you, which has `yamlresume` CLI installed with all the necessary dependencies. For each sub-command in this guide, you can run it in docker by appending the sub-command after `yamlresume/yamlresume`. For example, to create a new resume in yamlresume CLI: ```sh yamlresume new my-resume.yml ``` You can also run it in docker by: ```sh docker run --rm -v $(pwd):/home/yamlresume yamlresume/yamlresume new my-resume.yml ``` ## Help [#help] Show CLI help and all available commands: ```console $ yamlresume help Usage: yamlresume [options] [command] YAMLResume — Resume as Code in YAML __ __ _ __ __ _ ____ \ \ / // \ | \/ | | | _ \ ___ ___ _ _ ___ ___ ___ \ V // _ \ | |\/| | | | |_) / _ \/ __| | | / _ \/ _ \ / _ \ | |/ ___ \| | | | |___| _ < __/\__ \ |_| | | | | | | __/ |_/_/ \_\_| |_|_____|_| \_\___||___/\____|_| |_| |_|\___| Options: -V, --version output the version number -v, --verbose verbose output -h, --help display help for command Commands: ai AI-powered resume generation build [options] build a resume to Docx, HTML, Markdown or LaTeX/PDF dev [options] build a resume on file changes (watch mode) doctor check environment for YAMLResume dependencies languages i18n and l10n support new [filename] create a new resume templates manage resume templates validate validate a resume against the YAMLResume schema help [command] display help for command ``` Show YAMLResume CLI version: ```console $ yamlresume -V 0.5.0 ``` ## New [#new] Create a new resume. The default resume filename is `resume.yml`, but you can specify a custom filename: ```console $ yamlresume new --help Usage: yamlresume new [options] [filename] create a new resume Arguments: filename output filename (default: "resume.yml") Options: -h, --help display help for command $ yamlresume new my-resume.yml ✔ Created my-resume.yml successfully. ``` ## Build [#build] Build a resume from YAML to PDF. It will generate the latex code and PDF at the same time, with some intermediate files `.aux`, `.log` etc, if you use [XeTeX](/docs/installation#xetex) as the typesetting engine. ```console $ yamlresume build --help Usage: yamlresume build [options] build a resume to LaTeX, PDF, Markdown, or HTML Arguments: resume-path the resume file path Options: --no-pdf only generate TeX file without PDF (for LaTeX layouts) --no-validate skip resume schema validation -o, --output output directory for generated files -t, --timeout timeout for LaTeX compilation in seconds (default: 30, 0 to disable) -h, --help display help for command $ yamlresume build my-resume.yml ◐ Generating resume PDF file with command: xelatex -halt-on-error my-resume.tex... ✔ Generated resume PDF file successfully. ``` ### `--no-pdf` [#--no-pdf] If you only want to generate the LaTeX file without PDF, you can use `--no-pdf` option. ```console $ yamlresume build --no-pdf my-resume.yml ``` ### `--no-validate` [#--no-validate] If you want to skip the resume schema validation, you can use `--no-validate` option. ```console $ yamlresume build --no-validate my-resume.yml ``` ### `--output` [#--output] If you want to specify a custom output directory for the generated files, you can use the `-o, --output` option. ```console $ yamlresume build -o ./output my-resume.yml ``` ### `--timeout` [#--timeout] If you want to customize the timeout for LaTeX compilation, you can use the `--timeout` option. The default timeout is 30 seconds. You can disable the timeout by setting it to 0. ```console $ yamlresume build --timeout 60 my-resume.yml ``` ## Dev [#dev] Build a resume from YAML to PDF on file changes. It accepts the same options as [`build`](#build) however it will automatically rebuild the resume when the YAML file is changed (aka, watch mode). This would be very convenient for you to preview your resume changes in real time. ```console $ yamlresume dev --help Usage: yamlresume dev [options] build a resume on file changes (watch mode) Arguments: resume-path the resume file path Options: --no-pdf only generate TeX file without PDF --no-validate skip resume schema validation -h, --help display help for command ``` ## Validate [#validate] Validate a resume against the YAMLResume [schema](/docs/compiler/schema). ```console $ yamlresume validate --help Usage: yamlresume validate [options] validate a resume against the YAMLResume schema Arguments: resume-path the resume file path Options: -h, --help display help for command ``` For example, for the following resume: ```yml lineNumbers # yaml-language-server: $schema=https://yamlresume.dev/schema.json --- content: basics: name: Andy Dufresne headline: Headed for the Pacific phone: "(213) 555-9876" email: hi@pp url: https://ppresume.com/gallery summary: | - Computer Science major with strong foundation in data structures, algorithms, and software development - Pixel perfect full stack web developer, specialised in creating high-quality, visually appealing websites - Experiened in databases (SQL, NoSQL), familiar with server-side technologies (Node.js, Express, etc.) - Team player, with detail-oriented mindset and a keen eye for design and user experiences location: address: 123 Main Street region: California city: S country: United States postalCode: "95814" education: - institution: University of Southern California url: https://www.cs.usc.edu/ degree: Bachelor area: Computer Engineering and Computer Science score: "3.8" startDate: Sep 1, 2016 endDate: courses: - D - Programming Language Concepts summary: | - Developed proficiency in programming languages such as Java, C++, and Python - Gained hands-on experience in software development through various projects and assignments - Strong communication and teamwork skills acquired through group projects and presentations layouts: - engine: latex typography: fontSize: 13pt ``` `yamlresume validate` will give you a list of potential errors, with clear positional information ```console $ yamlresume validate invalid-resume.yml invalid-resume.yml:9:12: warning: email is invalid. email: hi@pp ^ invalid-resume.yml:19:11: warning: city should be 2 characters or more. city: S ^ invalid-resume.yml:31:11: warning: courses should be 2 characters or more. - D ^ invalid-resume.yml:41:17: warning: font size option is invalid, it must be one of the following: ["10pt", "11pt", "12pt"] fontSize: 13pt ^ ✖ Resume validation failed. ``` ## Doctor [#doctor] Check your environment for YAMLResume dependencies. This command helps diagnose setup issues by verifying that all required tools and fonts are properly installed. ```console $ yamlresume doctor System: OS: macOS 14.6.1 CPU: (10) arm64 Apple M1 Max Binaries: Node: 25.6.0 - /opt/homebrew/bin/node Yarn: 1.22.22 - /Users/hanyu/Library/pnpm/yarn npm: 11.8.0 - /opt/homebrew/bin/npm pnpm: 10.6.3 - /opt/homebrew/bin/pnpm ℹ Checking XeTeX... XeTeX: XeTeX 3.141592653-2.6-0.999994 (TeX Live 2022) ℹ Checking Tectonic... Tectonic: tectonic 0.15.0 ℹ Checking Fonts... Linux Libertine O: Not Installed Linux Libertine: Installed Noto Serif CJK SC: Installed Noto Sans CJK SC: Installed ``` The doctor command checks: * **System information**: OS, CPU architecture * **Binaries**: Node.js, npm, pnpm, Yarn, Bun * **LaTeX engines**: XeTeX and Tectonic availability * **Fonts**: Required fonts for optimal resume rendering (Linux Libertine for Latin text, Noto CJK for Chinese/Japanese/Korean) This is particularly helpful when setting up YAMLResume on a new machine or troubleshooting resume build issues. ## Languages [#languages] List all available languages. The language code follows the spec in [ISO 639 specification](https://www.iso.org/iso-639-language-code). You can specify the language code in `locale.language` in order to change the language of your resume. Changing the language of your resume will automatically translate all fixed terms. You can check more details in our [content -> multi languages](/docs/locale) section. ```console $ yamlresume languages list | locale.language | Language Name | | --------------- | ------------------------------- | | en | English | | zh-hans | Simplified Chinese | | zh-hant-hk | Traditional Chinese (Hong Kong) | | zh-hant-tw | Traditional Chinese (Taiwan) | | es | Spanish | | fr | French | | no | Norwegian | | nl | Dutch | | ja | Japanese | | de | German | | id | Indonesian | | pt-br | Brazilian Portuguese | ``` ## Templates [#templates] List all available templates. You can change the resume template by setting `layouts.[].template` in your YAML resume. [PPResume Templates](https://docs.ppresume.com/typesetting/templates) for more details. ```console $ yamlresume templates list | layouts.[].template | Engine | Template Name | Description | | ------------------- | ------ | ---------------- | ------------------------------------------------------------------- | | jake | latex | Jake's Resume | A simple, straight-forward resume template based on Jake's Resume | | moderncv-banking | latex | ModernCV Banking | ModernCV template with banking style | | moderncv-casual | latex | ModernCV Casual | ModernCV template with casual style | | moderncv-classic | latex | ModernCV Classic | ModernCV template with classic style | | calm | html | Calm | Clean and minimalist design suitable for all professionals. | | vscode | html | VS Code | Dark theme inspired by Visual Studio Code, tailored for developers. | | calm | docx | Calm | Clean and minimalist design suitable for all professionals. | ``` # Quick Start URL: (/en/docs) ## Introduction [#introduction] Creating a resume may not be difficult, but it is definitely a boring, lengthy and tedious process. With YAMLResume, you can create and version control your resumes with YAML and create pixel perfect PDFs with professional layout and typesetting in a breeze. YAMLResume is the core engine of [PPResume](https://ppresume.com), a LaTeX based builder. It has helped [thousands of people](https://blog.ppresume.com/posts/2024-recap) around the world create pixel perfect, professional looking resumes and land their dream jobs. Here we decided to open source the engine, in order to give people the right and freedom to say [no to vendor lock-in](https://blog.ppresume.com/posts/no-vendor-lock-in) YAMLResume New and Build Resume ## Getting Started [#getting-started] ### Docker Users [#docker-users] If you are a docker user, you are in luck, we have a [docker image](https://hub.docker.com/r/yamlresume/yamlresume) for you, which has [yamlresume cli](https://www.npmjs.com/package/yamlresume) installed with all its dependencies, such as [XeTeX](https://www.tug.org/xetex/) and some [recommended fonts](/docs/installation#font). You can just create a new resume with the following command: ```sh docker run --rm -v $(pwd):/home/yamlresume yamlresume/yamlresume new my-resume.yml ``` Edit `my-resume.yml` accordingly and then build the resume from yaml to pdf: ```sh docker run --rm -v $(pwd):/home/yamlresume yamlresume/yamlresume build my-resume.yml ``` ### macOS Users [#macos-users] Let's assume that you're using macOS with [Homebrew](https://brew.sh/) as the package manager. If you are not, please see the [Installation](/docs/installation) guide for detailed instructions for your operating system. #### Install Node.js [#install-nodejs] You need to [install Node.js](https://nodejs.org/en/download/package-manager/all#macos) 20.x or newer. ```sh brew install node ``` #### Install Typesetting Engine [#install-typesetting-engine] YAMLResume needs a [typesetting engine](/docs/installation#typesetting-engine) to generate PDF. Currently it supports two typesetting engines: * [XeTeX](/docs/installation#xetex) * [Tectonic](/docs/installation#tectonic) ```sh brew install mactex ``` ```sh brew install tectonic ``` #### Install YAMLResume [#install-yamlresume] Installing `yamlresume` is a breeze. You can install it using your favourite Node.js package manager: ```sh npm install -g yamlresume ``` ```sh pnpm add -g yamlresume ``` ```sh yarn global add yamlresume ``` ```sh bun add -g yamlresume ``` You can also install [`yamlresume` via Homebrew](http://formulae.brew.sh/formula/yamlresume): ```sh brew install yamlresume ``` Verify `yamlresume` is installed successfully: ```console $ yamlresume help Usage: yamlresume [options] [command] YAMLResume — Resume as Code in YAML __ __ _ __ __ _ ____ \ \ / // \ | \/ | | | _ \ ___ ___ _ _ ___ ___ ___ \ V // _ \ | |\/| | | | |_) / _ \/ __| | | / _ \/ _ \ / _ \ | |/ ___ \| | | | |___| _ < __/\__ \ |_| | | | | | | __/ |_/_/ \_\_| |_|_____|_| \_\___||___/\____|_| |_| |_|\___| Options: -V, --version output the version number -v, --verbose verbose output -h, --help display help for command Commands: ai AI-powered resume generation build [options] build a resume to Docx, HTML, Markdown or LaTeX/PDF dev [options] build a resume on file changes (watch mode) doctor check environment for YAMLResume dependencies languages i18n and l10n support new [filename] create a new resume templates manage resume templates validate validate a resume against the YAMLResume schema help [command] display help for command ``` #### \[Optional] Install Fonts [#optional-install-fonts] ##### Linux Libertine Font [#linux-libertine-font] We also recommend installing the [Linux Libertine font](/docs/installation#linux-libertine) for the best looking PDF output, but this is optional. ```sh brew install font-linux-libertine ``` ##### Noto Fonts [#noto-fonts] If you need to create a CJK (Chinese, Japanese, Korean) resume, we recommend that you install the [Noto font](https://fonts.google.com/noto): ```sh brew install font-noto-sans-cjk font-noto-serif-cjk ``` #### Create Your First YAML Resume [#create-your-first-yaml-resume] OK, we have everything ready, we can now create a yaml resume now with `yamlresume new`: ```console $ yamlresume new my-resume.yml ✔ Created my-resume.yml successfully. ``` Edit `resume.yml` accordingly, then you can generate a PDF with `yamlresume build`: ```console $ yamlresume build my-resume.yml ◐ Generating resume PDF file with command: xelatex -halt-on-error my-resume.tex... ✔ Generated resumep PDF file successfully. ``` You can also use `yamlresume dev` to build the resume on file changes: ```console $ yamlresume dev my-resume.yml ◐ Generating resume PDF file with command: xelatex -halt-on-error my-resume.tex... ✔ Generated resume PDF file successfully. ◐ Watching file changes: my-resume.yml... ``` ## Sample Resume [#sample-resume] Here is the complete YAML code for a two-page sample resume, tailored for a [software engineer](https://github.com/yamlresume/yamlresume/blob/main/packages/cli/resources/resume.yml): ```yml lineNumbers --- content: basics: name: Andy Dufresne headline: Headed for the Pacific phone: "(213) 555-9876" email: hi@ppresume.com url: https://ppresume.com/gallery # All summary fields supports a limited rich text capabilities in markdown # syntax: # # - bold, (e.g, `**bold**`) # - italic, (e.g, `*italic*`) # - ordered list, unordored list and nested sub list # - links (e.g. `[link](https://ppresume.com)`) summary: | - Computer Science major with strong foundation in data structures, algorithms, and software development - Pixel perfect full stack web developer, specialised in creating high-quality, visually appealing websites - Experiened in databases (SQL, NoSQL), familiar with server-side technologies (Node.js, Express, etc.) - Team player, with detail-oriented mindset and a keen eye for design and user experiences location: address: 123 Main Street city: Sacramento region: California country: United States postalCode: "95814" profiles: - network: Line url: https://line.com/PPResumeX username: PPResumeX - network: Twitter url: https://twitter.com/PPResumeX username: PPResumeX education: - institution: University of Southern California url: https://www.cs.usc.edu/ # Valid degree options: # # - 'Middle School' # - 'High School' # - 'Diploma' # - 'Associate' # - 'Bachelor' # - 'Master' # - 'Doctor' degree: Bachelor area: Computer Engineering and Computer Science score: "3.8" # Should be a valid date string that can be parsed by `new Date(dateStr)` # in JavaScript, eg. '2020-01', '2020-02-03', 'Jul 1, 2023' etc. # # The date part would be removed in the final output as most of the time # people won't really care about the exact date for your working # experience or education background, etc. # ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date startDate: Sep 1, 2016 # Leave endDate blank to indicate "Present" endDate: Jul 1, 2020 courses: - Discrete Methods in Computer Science - Programming Language Concepts - Data Structures and Object-Oriented Design - Operating Systems - Computer Architecture - Database Systems - Computer Networking - Introduction to the Theory of Computing summary: | - Developed proficiency in programming languages such as Java, C++, and Python - Gained hands-on experience in software development through various projects and assignments - Strong communication and teamwork skills acquired through group projects and presentations work: - name: PPResume url: https://ppresume.com startDate: Dec 1, 2022 endDate: "" position: Senior Software Engineer summary: | - Developed and implemented efficient and scalable code, ensuring high-quality and maintainable web applications - Collaborated with cross-functional teams to gather project requirements and translate them into technical solutions - Conducted thorough testing and debugging to identify and resolve any issues or bugs in the software - Actively participated in code reviews, providing valuable feedback to improve code quality and adherence to best practices - Mentored and guided junior developers, fostering a collaborative and growth-oriented team environment keywords: - Scalibility - Growth - Quality - Mentorship - name: PPResume url: https://ppresume.com startDate: Sep 1, 2020 endDate: Dec 1, 2022 position: Software Engineer summary: | - Created reusable React components to ensure code efficiency and maintainability - Integrated with RESTful APIs to fetch and display dynamic data on the frontend - Implemented client-side routing using React Router for smooth navigation between pages - Actively participated in Agile development methodologies, attending daily stand-up meetings and sprint planning sessions keywords: - RESTful - React - Agile languages: # Valid language fluency options: # # - 'Elementary Proficiency' # - 'Limited Working Proficiency' # - 'Minimum Professional Proficiency' # - 'Full Professional Proficiency' # - 'Native or Bilingual Proficiency' - language: English fluency: Native or Bilingual Proficiency keywords: - TOEFL 110 - IELTS 7.5 - language: Chinese fluency: Elementary Proficiency keywords: [] skills: # Valid skill level options: # # - 'Novice' # - 'Beginner' # - 'Intermediate' # - 'Advanced' # - 'Expert' # - 'Master' - name: Web Development level: Expert keywords: - Python - Ruby - CSS - React - JavaScript - name: DevOps level: Intermediate keywords: - Python - Kubernetes - Docker - Shell - Ansible - name: Design level: Intermediate keywords: - Sketch - Figma - Photoshop awards: - title: Dean's List awarder: University of Southern California date: Oct 2016 summary: | Awarded to students who achieve a high academic standing by maintaining a specified grade point average (GPA) during a semester. certificates: - name: AWS Certified Developer - Associate url: https://aws.amazon.com/certification/ issuer: AWS date: Mar 2021 publications: - publisher: ACM Transactions on Interactive Intelligent Systems url: https://dl.acm.org/journal/tiis name: Enhancing Human-Computer Interaction through Augmented Reality releaseDate: Dec 2017 summary: | - Explores the potential of augmented reality (AR) in improving interaction between humans and computers - Highlights benefits of AR in various areas such as gaming, education, healthcare, and design - Discusses challenges and future directions of AR technology in enhancing user experience references: - name: Dr. Amanda Reynolds phone: "(555) 123-4567" relationship: Computer Science Professor email: amanda.reynolds@usc.edu summary: | Andy Dufresne shows exceptional problem-solving skills and a solid understanding of programming concepts, he would bring immense value to any team or organization he becomes a part of. projects: - name: EduWeb url: https://www.eduweb.xyz/ description: A web-based educational platform for interactive learning startDate: Sep 2016 endDate: Dec 2016 summary: | - Designed to enhance online learning experiences - Facilitates students' engagement and collaboration through interactive features and user-friendly interface - Offers a wide range of courses across various subjects - Aims to improve the way students learn through the power of the web keywords: - Education - Online Learning - HCI interests: - name: Sports keywords: - Soccer - Swimming - Bicycling - Hiking - name: Music keywords: - Piano - Guitar volunteer: - organization: USC Computer Science and Engineering Society url: https://www.usccsesociety.org/ position: Tech Mentor startDate: Sep 2015 endDate: Jul 2023 summary: | - Volunteered as a Tech Mentor at USC Computer Science and Engineering Society - Provided guidance and assistance to fellow students in their technical projects and coursework - Assisted in organizing workshops, coding competitions, and networking events for the society members - Contributed to fostering a collaborative and supportive environment within the student community locale: # Use `yamlresume languages list` to get the list of supported languages language: en layouts: - engine: latex page: margins: top: 2.5cm left: 1.5cm right: 1.5cm bottom: 2.5cm showPageNumbers: true # Use `yamlresume templates list` to get the list of available templates template: moderncv-banking typography: # LaTeX engine only supports 10pt, 11pt, and 12pt fontSize: 11pt - engine: markdown - engine: html # Use `yamlresume templates list` to get the list of available templates template: calm typography: # HTML engine only supports font size in px unit, from 14px to 20px fontSize: 16px ``` Here are the screenshots of the [generated PDF](https://github.com/yamlresume/yamlresume/blob/main/packages/cli/resources/resume.pdf): Sample Resume Page 1 Sample Resume Page 2 You can check [PPResume Gallery](https://ppresume.com/gallery) for more examples, with support for different [templates](https://ppresume.com/gallery/templates) and [multi-languages](https://ppresume.com/gallery/languages). ## Learn More [#learn-more] # Installation URL: (/en/docs/installation) YAMLResume is a Node.js tool, under the hood, it transform your resumes from the YAML format to LaTeX code and then call a LaTeX typesetting engine to compile the generated LaTeX code to PDF. Besides, to get optimal PDF output, we also suggest to install some fonts. In a nutshell, you need to install the followings to get started with YAMLResume: * Node.js * [yamlresume package](https://www.npmjs.com/package/yamlresume) * a typesetting engine * \[optional] some fonts This sounds a bit complicated, but don't worry, we have your back. ## Docker Users [#docker-users] If you are a docker user, you are in luck, we have a [docker image](https://hub.docker.com/r/yamlresume/yamlresume) for you. This image has everything pre-packaged, including: * [Node.js](/docs/installation#nodejs) * [yamlresume CLI](/docs/installation#yamlresume) * [XeTeX](/docs/installation#xetex) * [some recommended fonts](/docs/installation#font) You can create a new resume instantly with the following command: ```sh docker run --rm -v $(pwd):/home/yamlresume yamlresume/yamlresume new my-resume.yml ``` This command will create a new resume called `my-resume.yml` in your current directory. Steps: 1. `docker run ... yamlresume/yamlresume` - runs a new container from the `yamlresume/yamlresume` image, if this image is not existed in your local machine, it will pull it from the [Docker Hub](https://hub.docker.com/r/yamlresume/yamlresume). 2. `--rm` - automatically removes the container when it exits 3. `-v $(pwd):/home/yamlresume` - mounts the current directory (`$(pwd)`) into the container at `/home/yamlresume`, allowing the container to access local files 4. `new my-resume.yml` - run yamlresume CLI [new](/docs/cli#new) sub-command to create a new resume with the filename `my-resume.yml` Edit `my-resume.yml` accordingly and then build the resume from yaml to pdf: ```sh docker run --rm -v $(pwd):/home/yamlresume yamlresume/yamlresume build my-resume.yml ``` Basically, you can call all of the `yamlresume` [CLI sub-commands](/docs/cli) in this way—just append the sub-command after `yamlresume/yamlresume` and then follow the corresponding usage guide. The `-v` flag here is quite important here because it mounts the current directory (`$(pwd)`) into the container at `/home/yamlresume`, allowing a two way file sync between the local directory and the container. If you have trouble to pull down `yamlresume/yamlresume` image from [Docker Hub](https://hub.docker.com/r/yamlresume/yamlresume), don't worry, we have a [github mirror](https://github.com/yamlresume/yamlresume/pkgs/container/yamlresume) for you. You can get the [ghcr image](https://github.com/yamlresume/yamlresume/pkgs/container/yamlresume) by: ```sh docker pull ghcr.io/yamlresume/yamlresume ``` ### Permission Issues [#permission-issues] Sometimes you may run into [permission issues](https://github.com/yamlresume/yamlresume/issues/24) when running the Docker container because the `yamlresume/yamlresume` image is built with a `USER yamlresume` instruction, which by default runs with less privilege. There are two ways to solve this issue: 1. Use your host username/group ID to run the container: ```sh docker run --rm -v $(pwd):/home/yamlresume -u $(id -u):$(id -g) yamlresume/yamlresume new my-resume.yml ``` This is the recommended way to run the container. As long as your host user has access to the current directory, you can run the container with your host username/group ID. 2. Use `-u root` to run the container with root access: ```sh docker run --rm -v $(pwd):/home/yamlresume -u root yamlresume/yamlresume new my-resume.yml ``` This is the least recommended way to run the container. It is not recommended because it may cause security issues, so you should only do this if you are sure about what you are doing. Last but not least, if you are running the `yamlresume` Docker container in GitHub Actions, then root access may be required as per [GitHub's documentation](https://docs.github.com/en/actions/reference/runners/github-hosted-runners#docker-container-filesystem): > Note: GitHub Actions must be run by the default Docker user (root). Ensure > your Dockerfile does not set the USER instruction, otherwise you will not be > able to access GITHUB\_WORKSPACE. Ref: [Understanding the Docker USER Instruction](https://www.docker.com/blog/understanding-the-docker-user-instruction/) ## Non-Docker Users [#non-docker-users] If you are not a docker user, please follow the appropriate instructions below to install yamlresume CLI and all the necessary dependencies based on your operating system. At the time of writing, our guide covers macOS, Windows, and some Linux distros (Ubuntu and and RHEL based distros). ### Node.js [#nodejs] Node.js 20.x or newer is required. Theoretically `yamlresume` should work with Node.js 18, however it is highly recommended to use Node.js 20 or newer because Node.js 18 LTS is scheduled to reach End-of-Life on [30 April 2025](https://nodejs.org/en/blog/release/v18.20.8). There may be like 100+ methods to install Node.js on different OS, you can check the official [Node.js Download](https://nodejs.org/en/download) to get started. We recommend using a [package manager](https://nodejs.org/en/download/package-manager/all) to install Node.js. For [Homebrew](https://brew.sh/) users: ```sh brew install node ``` For [Chocolatey](https://chocolatey.org/) users: ```sh choco install nodejs.install ``` For Ubuntu 24.10 or newer: ```sh sudo apt install nodejs ``` For Ubuntu 24.04 or older, please take a look at [NodeSource](https://downloads.nodesource.com/#debian) to get Node.js 20 or newer. For RHEL-based linux like Fedora, AlmaLinux, Rocky Linux, etc.: ```sh sudo dnf install nodejs ``` ### YAMLResume CLI [#yamlresume-cli] Installing `yamlresume` is a breeze. You can install it using your favourite Node.js package manager: ```console npm install -g yamlresume ``` ```console pnpm add -g yamlresume ``` ```console yarn global add yamlresume ``` ```console bun add -g yamlresume ``` If you're a macOS user and you use [Homebrew](https://brew.sh/), you can also install [yamlresume via Homebrew](http://formulae.brew.sh/formula/yamlresume): ```sh brew install yamlresume ``` Verify that `yamlresume` is installed successfully: ```console $ yamlresume help Usage: yamlresume [options] [command] YAMLResume — Resume as Code in YAML __ __ _ __ __ _ ____ \ \ / // \ | \/ | | | _ \ ___ ___ _ _ ___ ___ ___ \ V // _ \ | |\/| | | | |_) / _ \/ __| | | / _ \/ _ \ / _ \ | |/ ___ \| | | | |___| _ < __/\__ \ |_| | | | | | | __/ |_/_/ \_\_| |_|_____|_| \_\___||___/\____|_| |_| |_|\___| Options: -V, --version output the version number -v, --verbose verbose output -h, --help display help for command Commands: ai AI-powered resume generation build [options] build a resume to Docx, HTML, Markdown or LaTeX/PDF dev [options] build a resume on file changes (watch mode) doctor check environment for YAMLResume dependencies languages i18n and l10n support new [filename] create a new resume templates manage resume templates validate validate a resume against the YAMLResume schema help [command] display help for command ``` If you just want to give `yamlresume` a try without installing it, you can use `npx`, `pnpx` or other similar tools: ```console npx yamlresume help ``` ```console yarn dlx yamlresume help ``` ```console pnpx yamlresume help ``` ```console bun exec yamlresume help ``` ### Typesetting Engine [#typesetting-engine] Under the hood, `yamlresume` does the job of a compiler, parsing a YAML resume to an [AST](https://github.com/yamlresume/yamlresume/blob/main/packages/core/src/compiler/ast.ts) and then [transforming the AST to LaTeX code](https://github.com/yamlresume/yamlresume/blob/main/packages/core/src/compiler/codegen/latex.ts). As a mini-compiler, `yamlresume` relies on a typesetting engine to compile the generated LaTeX code to PDFs. Therefore you must first install a typesetting engine first before you can use `yamlresume` to generate resume PDFs. YAMLResume currently supports two typesetting engines: [XeTeX](#xetex) and [Tectonic](#tectonic). At the time of writing, [LaTeX](https://www.latex-project.org/) is still the best choice of typesetting engine for producing professional looking PDFs. [Typst](https://typst.app/) is a great alternative, but it is still in its early stage and its CJK support is not mature and production ready yet. Previously I wrote a post [On Typesetting Engines](https://blog.ppresume.com/posts/on-typesetting-engines) explaining the reasons why I chose LaTeX over other typesetting engines when I founded [PPResume](https://ppresume.com). #### XeTeX [#xetex] [XeTeX](https://tug.org/xetex/) is a [TeX](https://en.wikipedia.org/wiki/TeX) typesetting engine using [Unicode](https://en.wikipedia.org/wiki/Unicode) and supporting modern font technologies such as [OpenType](https://en.wikipedia.org/wiki/OpenType), [Graphite](https://fonts.adobe.com/fonts/graphite) and [Apple Advanced Typography (AAT)](https://en.wikipedia.org/wiki/Apple_Advanced_Typography). It is a very mature, stable typesetting engine that is widely used by many academic and scientific people. The easiest way is to install the **MacTeX** distribution. It includes XeTeX along with many other TeX-related programs and packages. You can download it from the [MacTeX website](https://www.tug.org/mactex/) or install it via homebrew: ```sh # install the full mactex brew install mactex # or if you want to save some disk space brew install mactex-no-gui ``` MacTeX is a large distribution, so it may take some time to download and install and it takes up around 5GB of disk space. If you want a smaller distribution, you can install **BasicTeX**, which is a minimal version of MacTeX: ```sh brew install --cask basictex ``` After installing BasicTeX, you may need to install additional packages manually using the `tlmgr` command: ```sh sudo tlmgr update --self sudo tlmgr install moderncv fontawesome5 collection-fontsrecommended ``` You can check Kostiantyn Lysenko's blog, [YAMLResume - Resume as Code](https://lysenko.dev/posts/2025-01-yamlresume-resume-as-code/) for more details about basictex with YAMLResume. [MiKTeX distribution](https://miktex.org) is a popular choice for Windows and includes XeTeX. You can download it from the [MiKTeX website](https://miktex.org/download). Alternatively, you can install **TeX Live** for Windows, which also includes XeTeX. Download it from the [TeX Live website](https://www.tug.org/texlive/acquire-netinstall.html). Most Linux distributions offer TeX Live through their package managers. XeTeX is typically included in the `texlive-xetex` package or a larger `texlive-full` meta-package. For Ubuntu, if your network is good and you have around 10GB of disk spaces, you can install the full texlive distribution: ```sh sudo apt install texlive-full ``` Otherwise, you can install the minimum required packages: ```sh sudo apt install texlive-xetex texlive-fonts-extra texlive-lang-all ``` For RHEL-based linux like Fedora, AlmaLinux, Rocky Linux, you can install the full TeX Live distribution if you have enough disk space and good network: ```sh sudo dnf install texlive-scheme-full ``` Otherwise you can install the minimum required packages: ```sh sudo dnf install \ texlive-scheme-medium \ texlive-moderncv \ texlive-ctex \ texlive-academicons ``` Alternatively, you can always install TeX Live directly from the [TeX Live website](https://www.tug.org/texlive/acquire-netinstall.html) using their installer, which works across different Linux distributions. Verify that XeTeX is installed successfully: ```console $ xetex -v XeTeX 3.141592653-2.6-0.999994 (TeX Live 2022) kpathsea version 6.3.4 Copyright 2022 SIL International, Jonathan Kew and Khaled Hosny. There is NO warranty. Redistribution of this software is covered by the terms of both the XeTeX copyright and the Lesser GNU General Public License. For more information about these matters, see the file named COPYING and the XeTeX source. Primary author of XeTeX: Jonathan Kew. Compiled with ICU version 70.1; using 70.1 Compiled with zlib version 1.2.11; using 1.2.11 Compiled with FreeType2 version 2.11.1; using 2.11.1 Compiled with Graphite2 version 1.3.14; using 1.3.14 Compiled with HarfBuzz version 3.4.0; using 3.4.0 Compiled with libpng version 1.6.37; using 1.6.37 Compiled with pplib version v2.05 less toxic i hope Using Mac OS X Core Text and Cocoa frameworks ``` #### Tectonic [#tectonic] [Tectonic](https://tectonic-typesetting.github.io) is a modernized, complete, self-contained [TeX](https://en.wikipedia.org/wiki/TeX)/[LaTeX](https://www.latex-project.org/) engine, powered by [XeTeX](https://tug.org/xetex/) and [TeXLive](https://www.tug.org/texlive/). A full TeX Live distribution typically takes up several GB of disk space, while tectonic's initial installation takes up only 10+ MB. It automatically downloads support files, so you don't have to install a complete LaTeX distribution. When you start using a new LaTeX package, Tectonic simply downloads the files it needs and continues processing. Tectonic provides an official [installation guide](https://tectonic-typesetting.github.io/en-US/install.html), but this would just put tectonic in the directory where you ran the installation command, `yamlresume` needs a global `tectonic` command in your `$PATH`, so you need to figure that out with some shell hacks on your own. If you're a macOS user, you're in luck because Homebrew provides prebuilt package: ```sh brew install tectonic ``` In to my experience, tectonic still has some minor compatibility issues with official XeTeX, so if you do not mind the long download tim eof a full TeX Live distribution, XeTeX is still the recommended choice here. ### Font [#font] #### Linux Libertine [#linux-libertine] YAMLResume adopts [Linux Libertine](https://www.dafont.com/linux-libertine.font) as the default font for Latin characters. It is highly recommended to install it in order to get an optimal PDF output. For Homebrew users: ```sh brew install font-linux-libertine ``` Otherwise you can download the latest version of [Linux Libertine](https://www.dafont.com/linux-libertine.font) from the website and install the font with macOS's [Font Book](https://support.apple.com/en-gb/guide/font-book/fntbk1000/mac). Download the latest version of [Linux Libertine](https://www.dafont.com/linux-libertine.font) from the website and extract the archive and install the font. For Ubuntu users, Linux Libertine font is already included in `texlive-fonts-extra` package, however, if you want to install it manually, you can do so by: ```sh sudo apt install fonts-linuxlibertine ``` For RHEL-based linux like Fedora, AlmaLinux, Rocky Linux, you can install the Linux Libertine font by: ```sh sudo dnf install linux-libertine-fonts ``` #### Google Noto [#google-noto] If you need CJK resumes, you will also need to install [Google Noto fonts](https://fonts.google.com/noto/) for [best unicode coverage](https://github.com/ppresume/community/issues/63). For Homebrew users: ```sh brew install font-noto-sans-cjk font-noto-serif-cjk ``` Download Noto fonts and follow the [official guide](https://fonts.google.com/noto/use#use-noto-fonts) to install on Windows. For Ubuntu users: ```sh sudo apt install fonts-noto-cjk fonts-noto-cjk-extra ``` For RHEL-based linux like Fedora, AlmaLinux, Rocky Linux, you can install the Noto fonts by: ```sh sudo dnf install google-noto-sans-cjk-fonts google-noto-serif-cjk-fonts ``` ## Troubleshooting [#troubleshooting] You can [raise an issue](https://github.com/yamlresume/yamlresume/issues/new) if you have trouble to install `yamlresume` or its dependencies. You can enable verbose logging by passing a `--verbose` flag to `yamlresume` or its subcommands. ### Getting Tired? [#getting-tired] If you are getting tired of the installation process, you can try [PPResume](https://ppresume.com), which is a hosted, commercial resume builder solution who open sourced YAMLResume. # Generate URL: (/en/docs/ai/generate) The `yamlresume ai generate` command generates a complete, realistic resume file from a position and target language. ```console $ yamlresume ai generate --help Usage: yamlresume ai generate [options] generate a new resume with AI Arguments: filename output filename Options: -p, --position target position or job title -l, --language target locale language -m, --model AI provider model to use -b, --base-url AI provider base URL -h, --help display help for command Environment variables: Required (one API key for the selected cloud provider): DEEPSEEK_API_KEY DeepSeek API key OPENAI_API_KEY OpenAI API key MOONSHOT_API_KEY Kimi (Moonshot AI) API key Optional: OLLAMA_HOST Ollama host for local models YAMLRESUME_AI_MODEL model override (overridden by --model) YAMLRESUME_AI_BASE_URL API base URL override (overridden by --base-url) ``` ## Supported providers [#supported-providers] YAMLResume supports multiple LLM providers through OpenAI-compatible endpoints. The provider is inferred from environment variables: | Provider | Required env variable | Default model | Optional overrides | | ---------------------------------------------- | --------------------- | ------------------- | ----------------------------------------------- | | [DeepSeek](https://www.deepseek.com/) | `DEEPSEEK_API_KEY` | `deepseek-v4-flash` | `YAMLRESUME_AI_MODEL`, `YAMLRESUME_AI_BASE_URL` | | [Kimi](https://www.moonshot.cn/) (Moonshot AI) | `MOONSHOT_API_KEY` | `kimi-k2.6` | `YAMLRESUME_AI_MODEL`, `YAMLRESUME_AI_BASE_URL` | | [Ollama](https://ollama.com/) (local) | `OLLAMA_HOST` | `llama3.2` | `YAMLRESUME_AI_MODEL`, `YAMLRESUME_AI_BASE_URL` | | [OpenAI](https://openai.com/) | `OPENAI_API_KEY` | `gpt-5` | `YAMLRESUME_AI_MODEL`, `YAMLRESUME_AI_BASE_URL` | ## Examples [#examples] Set a provider API key and run: ```console $ export OPENAI_API_KEY=sk-... $ yamlresume ai generate --position "Software Engineer" --language en resume.yml ``` Override model and base URL via CLI flags: ```console $ yamlresume ai generate \ --position "Registered Nurse" \ --language en \ --model gpt-5 \ --base-url https://custom.openai.endpoint/v1 \ resume.yml ``` Or via environment variables: ```console $ export YAMLRESUME_AI_MODEL=gpt-5 $ export YAMLRESUME_AI_BASE_URL=https://custom.openai.endpoint/v1 $ yamlresume ai generate --position "Registered Nurse" --language en resume.yml ``` ## How it works [#how-it-works] `yamlresume ai generate` builds a detailed prompt from the [YAMLResume schema](/docs/compiler/schema) rules and a sample resume, then asks the LLM to produce a complete resume. The prompt instructs the model to: * Output only valid YAML, without markdown fences. * Keep YAML comments so the generated file remains friendly for editor/IDE validation. * Follow all schema constraints such as field lengths, date formats, enum values, and valid URLs. * Invent original, realistic content tailored to the target position and locale, without copying the sample resume's personal details. The generated text is then parsed and validated. If validation fails, the model is asked to fix the errors and try again, up to the configured retry limit. ## Programmatic API [#programmatic-api] The [`@yamlresume/ai`](https://www.npmjs.com/package/@yamlresume/ai) package also exposes a programmatic API for generating resumes: ```ts import { generateResume } from "@yamlresume/ai"; import { openai } from "@ai-sdk/openai"; const model = openai("gpt-5"); const yaml = await generateResume({ position: "Software Engineer", language: "en", model, }); ``` # AI URL: (/en/docs/ai) YAMLResume provides AI-powered resume generation through the [`@yamlresume/ai`](https://www.npmjs.com/package/@yamlresume/ai) package and the `yamlresume ai` CLI command. ## Overview [#overview] The AI capabilities are built on top of the [Vercel AI SDK](https://sdk.vercel.ai/) and support multiple LLM providers. The generated resume is parsed and validated against the [YAMLResume schema](/docs/compiler/schema), with automatic retries if validation fails. ## Subcommands [#subcommands] ```console $ yamlresume ai --help Usage: yamlresume ai [options] [command] AI-powered resume generation Options: -h, --help display help for command Commands: generate [options] generate a new resume with AI help [command] display help for command ``` ## Learn More [#learn-more] # Comparisons URL: (/en/docs/comparisons) YAMLResume is designed to be a complete, opinionated resume solution. To help you understand how it fits into the broader landscape of resume tools and formats, we provide detailed comparisons with existing alternatives. Each comparison covers feature differences, design philosophy, and practical trade-offs so you can choose the right tool for your workflow. ## Alternatives [#alternatives] # YAMLResume VS JSON Resume URL: (/en/docs/comparisons/json-resume) [JSON Resume](https://jsonresume.org) is a pioneer in building an open standard for a structured data format for resumes. Its first [official release](https://jsonresume.org/blog/first-official-release) was on July 31, 2014—more than 10 years ago. From its official website: ```markdown ## Origins and Conceptualization JSON Resume was conceived as a solution to the fragmented and inconsistent landscape of resume formats. Traditional resumes, typically created in formats like Microsoft Word or PDF, often suffer from compatibility issues when parsed by different systems. Recognizing this problem, Thomas Davis and Roland Sharp initiated JSON Resume as an open-source project to create a universal, machine-readable format for resumes. ## Development Milestones The project began gaining momentum in the early 2010s, with significant milestones such as the creation of the JSON Resume schema, the development of the first CLI tools, and the establishment of the JSON Resume registry. These milestones were driven by community contributions and the growing recognition of the need for a standardized resume format in the tech industry. ``` JSON Resume did an excellent job in establishing an open standard for structured resume data. However, it is **data-only**—it specifies how to structure your resume in JSON but provides no opinionated solution for turning that data into a beautiful, professionally typeset document. YAMLResume is deeply inspired by [JSON Resume](https://jsonresume.org/) and takes a more **opinionated, batteries-included** approach. Here is how they compare: ## Feature Comparison [#feature-comparison] | Feature | YAMLResume | JSON Resume | | ------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------- | | **Data Format** | YAML | JSON | | **Internationalization** | [10 languages](/docs/locale) built-in | None | | **Rich Text Support** | A selected set of [Markdown rich text syntax](/docs/content/rich-text) in `summary` fields | None | | **Schema Validation** | [Strict schema validation](/docs/compiler/schema) with [compiler](/docs/compiler/architecture) + IDE integration | [Basic JSON Schema validation](https://jsonresume.org/schema) | | **Font Customization** | [Font family, font size, line spacing](/docs/layouts/latex), etc | None | | **Layout Customization** | [Page margins, page numbers, paper size](/docs/layouts/latex#page), etc | None | | **Section Customization** | [Aliases](/docs/layouts/sections/aliases) and [reorder](/docs/layouts/sections/reorder) | None | | **Typesetting Engine** | [DOCX](/docs/layouts/docx), [HTML](/docs/layouts/html), [LaTeX](/docs/layouts/latex), [Markdown](/docs/layouts/markdown) | HTML | | **Output Formats** | DOCX, HTML, LaTeX/PDF, Markdown | [HTML and PDF](https://github.com/jsonresume/resume-cli) | | **Templates** | multiple official [LaTeX](/docs/layouts/latex/templates) and [HTML](/docs/layouts/html/templates) templates | Tens of [HTML themes](https://jsonresume.org/themes) | | **Dev Mode** | [Dev mode](/docs/cli#dev) with auto-rebuild | Yes | | **Conversion Tool** | [json2yamlresume](/docs/ecosystem/json2yamlresume) helps convert JSON Resume to YAMLResume | N/A | | **Docker Support** | [Official docker image](/docs/contributing/docker) with LaTeX and YAMLResume pre-installed | None | | **GitHub Action** | [Official GitHub action](https://github.com/yamlresume/action) for CI/CD | None | | **Homebrew** | [Homebrew formula](https://formulae.brew.sh/formula/yamlresume) for easy installation on macOS and Linux | None | | **Web Playground** | Interactive web-based [playground](/playground) | None | ## Key Differences Explained [#key-differences-explained] If we have to choose one word to summarize the difference between YAMLResume and JSON Resume, it would be **opinionated**. JSON Resume is a data standard that defines how to structure your resume in JSON, but it leaves almost everything else up to you. YAMLResume takes a more opinionated, batteries-included approach that provides not just the data format but also a rich set of tools to validate, customize, render, and distribute your resume across multiple formats and languages. ### Content [#content] YAMLResume and JSON Resume share similar content structures, but YAMLResume extends the data model with stronger schema validation, more standardized fields, rich text support in `summary` fields, and a flatter structure: #### Stronger schema validation [#stronger-schema-validation] YAMLResume comes with a [very comprehensive Zod schema](/docs/compiler/schema), with which it can validate your resume at compile time and enforce type safety, format correctness with [clang-style error messages](/docs/cli#validate): For example, for the following resume that comes with an invalid email, a too-short city name, and an out-of-range font size: ```yml lineNumbers # yaml-language-server: $schema=https://yamlresume.dev/schema.json --- content: basics: name: Andy Dufresne headline: Headed for the Pacific phone: "(213) 555-9876" email: hi@pp #[!code highlight] url: https://ppresume.com/gallery summary: | - Computer Science major with strong foundation in data structures, algorithms, and software development - Pixel perfect full stack web developer, specialised in creating high-quality, visually appealing websites - Experiened in databases (SQL, NoSQL), familiar with server-side technologies (Node.js, Express, etc.) - Team player, with detail-oriented mindset and a keen eye for design and user experiences location: address: 123 Main Street region: California city: S #[!code highlight] country: United States postalCode: "95814" education: - institution: University of Southern California url: https://www.cs.usc.edu/ degree: Bachelor area: Computer Engineering and Computer Science score: "3.8" startDate: Sep 1, 2016 endDate: courses: - D - Programming Language Concepts summary: | - Developed proficiency in programming languages such as Java, C++, and Python - Gained hands-on experience in software development through various projects and assignments - Strong communication and teamwork skills acquired through group projects and presentations layouts: - engine: latex typography: fontSize: 13pt #[!code highlight] ``` `yamlresume validate` will show you a list of potential errors, with clear positional information: ```console $ yamlresume validate my-resume.yml my-resume.yml:9:12: warning: email is invalid. email: hi@pp ^ my-resume.yml:38:10: error: city is too short. city: S ^ my-resume.yml:41:14: error: font size must be between 10pt and 12pt. fontSize: 13pt ^ ``` YAMLResume also ships with an official [JSON Schema](/docs/compiler/schema/json) for IDE auto-completion, on-hover documentation, and real-time validation in editors like VS Code. Auto completion in VS Code with YAMLResume's JSON Schema: