resumel is an Emacs package for creating professional resumes and CVs using Org Mode and LaTeX templates. It supports the following templates:
- ModernCV: A modern curriculum vitae class for LaTeX.
- AltaCV: Yet another LaTeX CV template / résumé.
- ModaltaCV: Custom variant combining the ModernCV aesthetic with AltaCV’s two-column layout.
- AwesomeCV: Awesome CV is LaTeX template for your outstanding job application.
- Jake’s Resume: A simple, ATS-friendly single-column resume template.
Templates are modular: each lives in its own directory with a .el file (LaTeX class definition) and a .org file (macros). Common macros are shared via resumel.org. Swap templates with a single keyword.
| ModernCV | AltaCV |
![]() |
![]() |
| ModaltaCV | AwesomeCV |
![]() |
![]() |
| Jake’s Resume | |
![]() |
- Emacs 26.1+ Download Emacs
- LaTeX distribution: TeX Live / MiKTeX / MacTeX
- diff-pdf (project site, GitHub): Václav Slávik’s visual PDF comparer, required for tests.
The package’s Org and Emacs Lisp templates live under templates/ in this repository. The underlying LaTeX classes for ModernCV, AltaCV / ModaltaCV, and Awesome-CV are maintained upstream. Many TeX installations already ship them; if yours does not (for example a minimal TeX Live scheme), install them into your user texmf tree so LaTeX can find the .cls files.
- Jake’s Resume (
jakes) uses the standardarticleclass only; no extra class repository is required.
You can install the upstream repositories with:
M-x resumel-install-templates RET
By default this uses resumel-template-install-root (~/texmf), cloning into tex/latex/moderncv, tex/latex/altacv, and tex/latex/awesomecv (AltaCV serves both AltaCV and ModAltaCV). Shallow clones (--depth 1) keep downloads small. After cloning or pulling, the command runs mktexlsr on that tree when available.
If you use a directory other than the usual user texmf location, set TEXMFHOME to that directory (or extend TeX’s search path another way) so kpathsea can find the files, then run mktexlsr on it.
Manual shell equivalent (same layout as CI):
mkdir -p "$HOME/texmf/tex/latex"
git clone --depth 1 https://github.com/moderncv/moderncv.git "$HOME/texmf/tex/latex/moderncv"
git clone --depth 1 https://github.com/liantze/AltaCV.git "$HOME/texmf/tex/latex/altacv"
git clone --depth 1 https://github.com/posquit0/Awesome-CV.git "$HOME/texmf/tex/latex/awesomecv"
mktexlsr "$HOME/texmf"With resumel-mode, C-c , u runs the same command.
git clone https://github.com/barryridge/resumel.git(add-to-list 'load-path "/path/to/resumel/")
(require 'resumel)
(require 'resumel-install) ;; optional: M-x resumel-install-templates
;; optional key binding:
(global-set-key (kbd "C-c r") 'resumel-export)In packages.el:
(package! resumel
:recipe (:host github :repo "barryridge/resumel"
:files ("*.el" "*.org" "templates")))Run doom sync, then in config.el:
(use-package resumel
:config (require 'resumel))
;; optional key binding:
(map! :global "C-c r" #'resumel-export)- Select a template:
M-x resumel-select-template RET moderncv RETThis writes
#+RESUMEL_TEMPLATE: moderncvinto the buffer header and opens a side-window PDF preview of the template (requires PDF files inresumel-preview-pdf-dir; see Template Previews below). - Write your resume using the provided macros (see
tests/fixtures/for examples). - Export to PDF:
M-x resumel-export RET
When resumel-select-template is called, resumel shows a live PDF preview in a
right side window as you scroll through the template candidates. The preview
updates with each candidate and is automatically removed once you confirm or
cancel the selection.
By default, previews are enabled (resumel-show-preview-on-select is t) and
resumel looks for sample PDFs in the tests/expected/ directory of the package
installation. If you clone the full repository and run the tests, the PDF files
will already be there.
To disable previews:
(setq resumel-show-preview-on-select nil)To point resumel at a custom directory of sample PDFs (e.g. your own previously exported resumes):
(setq resumel-preview-pdf-dir "/path/to/my/sample-resumes/")PDF files in that directory should be named <template>-*.pdf (e.g.
moderncv-mine.pdf, altacv-mine.pdf).
resumel selects among multiple matches using resumel-preview-pdf-pattern, a
regexp matched against the filename. The default -complex\.pdf$ prefers the
more detailed fixture PDFs. Override to taste:
(setq resumel-preview-pdf-pattern "-basic\\.pdf$") ; prefer basic PDFs
(setq resumel-preview-pdf-pattern "") ; first alphabeticallyThe preview buffer uses whatever PDF viewer Emacs has configured: pdf-view-mode
(pdf-tools) if installed, or doc-view-mode otherwise.
Override any template variable by adding a #+RESUMEL_<VAR>: value keyword to your Org file header:
#+RESUMEL_TEMPLATE: moderncv
#+RESUMEL_MODERNCV_COLOR: green
#+RESUMEL_GEOMETRY: scale=0.8, top=1.5cm, bottom=1.5cm
For a portable profile (name, headline, email, phone, social links) that works across templates, see docs/profile.md. Portable keywords are merged into Org export on M-x resumel-export; template-specific keys such as #+RESUMEL_JAKES_EMAIL: apply when a portable key is unset.
show-X commands show only buffer-set variables; show-all-X commands show all variables including defaults:
| Command | Scope | Shows |
|---|---|---|
M-x resumel-show-variables | Core + template | Set only |
M-x resumel-show-all-variables | Core + template | All (defaults) |
M-x resumel-show-core-variables | Shared (all templates) | Set only |
M-x resumel-show-all-core-variables | Shared (all templates) | All (defaults) |
M-x resumel-show-template-variables | Current template only | Set only |
M-x resumel-show-all-template-variables | Current template only | All (defaults) |
This opens a *resumel: template variables* buffer with overridden values highlighted. Edit variables directly in the buffer — changes sync immediately back to the Org file. Press C-c r to refresh, q to close.
M-x resumel-get-template-variable RET MODERNCV_COLOR RET M-x resumel-set-template-variable RET MODERNCV_COLOR RET burgundy RET
resumel-get-template-variable returns the effective value (buffer keyword if set, otherwise the template default). resumel-set-template-variable inserts or updates the #+RESUMEL_<VAR>: keyword.
To inspect a template’s LaTeX class definition or available macros, open the template source files directly:
M-x resumel-view-template-el RET moderncv RET ; open moderncv.el M-x resumel-view-template-org RET moderncv RET ; open moderncv.org
Both commands prompt with completion and default to the template currently
selected in the active Org buffer. The file opens in another window via
find-file-other-window.
| Command | Opens |
|---|---|
M-x resumel-view-template-el | templates/<name>/<name>.el — LaTeX class & defaults |
M-x resumel-view-template-org | templates/<name>/<name>.org — Org macros |
M-x resumel-view-template-pdf | Sample PDF for the chosen template |
resumel-view-template-pdf also shows a live side-window preview while you
navigate candidates (like resumel-select-template), but does not change the
template selection in your Org file.
resumel-mode is a minor mode that provides in-buffer assistance when editing resumel Org files.
The mode activates automatically when an Org buffer contains a #+RESUMEL_TEMPLATE: keyword. You can also force it on in all Org buffers:
(setq resumel-mode-auto-enable t)Or enable it manually with M-x resumel-mode.
Inside a macro call (after {{{), invoke completion (C-x C-o, or your framework’s trigger) to see all available macro names with descriptions and arity hints.
On a line starting with #+RESUMEL, invoke completion to see all available RESUMEL_* variable names for the current template. A trailing =: = is inserted automatically.
When point is on a macro name or #+RESUMEL_ keyword, the echo area shows a help string (macro description or keyword name). Controlled by resumel-mode-eldoc (default t).
| Key | Command | Description |
|---|---|---|
C-c , e | resumel-export | Export the buffer to PDF |
C-c , i | resumel-init | Scaffold a new resume from template |
C-c , t | resumel-select-template | Change the active template |
C-c , v | resumel-view-export | Open the exported PDF (pdf-tools / doc-view) |
C-c , s | resumel-show-all-variables | Show all template variables |
Use C-u C-c , v to export first, then open the PDF. The opened file is the same path Org uses (e.g. from #+EXPORT_FILE_NAME); with the pdf-tools package installed, Emacs uses pdf-view-mode.
M-x resumel-init (or C-c , i) scaffolds the current buffer as a new resumel resume. It prompts for a template (same live preview as resumel-select-template) and inserts boilerplate configuration (including #+EXPORT_FILE_NAME), a short starter Summary section, and skeleton body sections with example macros so M-x resumel-export can run on the first try. If the buffer already has content, it asks for confirmation before erasing.
make test # run all tests
make clean # remove generated resultsTests export all fixture files and compare resulting PDFs against expected outputs using vslavik/diff-pdf (project site).
- macOS:
brew install diff-pdfor MacPorts (port install diff-pdf), per upstream. - Linux: On Debian/Ubuntu (enable
universeif needed),sudo apt install diff-pdf-wx— the package name isdiff-pdf-wx, but it installs vslavik’sdiff-pdfcommand (Ubuntu packages). Alternatively: Homebrew on Linux (brew install diff-pdf), build from source per the upstream README, or your distribution’s package where available (e.g. Fedora/CentOS:dnf install diff-pdfper upstream).
Batch Emacs inherits PATH from whatever runs make test (your shell, CI, or IDE). If the wrong binary is found first, set RESUMEL_DIFF_PDF to the full path of vslavik’s diff-pdf.
- Create
templates/newname/withnewname.el(LaTeX class) andnewname.org(macros). - In
newname.el, defineresumel-newname-variable-defaultsas a defaults alist. - Add
"newname"to theresumel-default-templatechoices inresumel.el. - Add a test fixture and expected PDF; run
make test.
resumel is inspired by and builds on Aidan Scannell’s my-org-resume.
Developed with the assistance of Cursor, Claude, ChatGPT, gptel, and agent-shell.
resumel is licensed under the GNU GPL.
Contributions are welcome. Fork the repository and submit pull requests with relevant tests.
Please open an issue on the GitHub repository.




