Skip to content

barryridge/resumel

Repository files navigation

resumel: A resume template package for Emacs Org Mode

https://github.com/barryridge/resumel/actions/workflows/test.yml/badge.svg

Overview

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.

Template Gallery

ModernCV AltaCV
ModernCV template preview AltaCV template preview
ModaltaCV AwesomeCV
ModaltaCV template preview AwesomeCV template preview
Jake’s Resume
Jake's Resume template preview

Prerequisites

Upstream LaTeX class files

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 standard article class 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.

Installation

Vanilla Emacs

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)

Doom Emacs

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)

Spacemacs

Add resumel to dotspacemacs-configuration-layers and press SPC f e R.

Other Emacs Distributions

Clone the repository, add it to your load path, and require the package.

Usage

Quick Start

  1. Select a template:
    M-x resumel-select-template RET moderncv RET
        

    This writes #+RESUMEL_TEMPLATE: moderncv into the buffer header and opens a side-window PDF preview of the template (requires PDF files in resumel-preview-pdf-dir; see Template Previews below).

  2. Write your resume using the provided macros (see tests/fixtures/ for examples).
  3. Export to PDF:
    M-x resumel-export RET
        

Template Previews

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 alphabetically

The preview buffer uses whatever PDF viewer Emacs has configured: pdf-view-mode (pdf-tools) if installed, or doc-view-mode otherwise.

Template Variables

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.

Browsing variables

show-X commands show only buffer-set variables; show-all-X commands show all variables including defaults:

CommandScopeShows
M-x resumel-show-variablesCore + templateSet only
M-x resumel-show-all-variablesCore + templateAll (defaults)
M-x resumel-show-core-variablesShared (all templates)Set only
M-x resumel-show-all-core-variablesShared (all templates)All (defaults)
M-x resumel-show-template-variablesCurrent template onlySet only
M-x resumel-show-all-template-variablesCurrent template onlyAll (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.

Getting and setting individual variables

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.

Viewing Template Files

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.

CommandOpens
M-x resumel-view-template-eltemplates/<name>/<name>.el — LaTeX class & defaults
M-x resumel-view-template-orgtemplates/<name>/<name>.org — Org macros
M-x resumel-view-template-pdfSample 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

resumel-mode is a minor mode that provides in-buffer assistance when editing resumel Org files.

Auto-enable

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.

Macro completion

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.

Keyword completion

On a line starting with #+RESUMEL, invoke completion to see all available RESUMEL_* variable names for the current template. A trailing =: = is inserted automatically.

Eldoc

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).

Keymap (C-c ,)

KeyCommandDescription
C-c , eresumel-exportExport the buffer to PDF
C-c , iresumel-initScaffold a new resume from template
C-c , tresumel-select-templateChange the active template
C-c , vresumel-view-exportOpen the exported PDF (pdf-tools / doc-view)
C-c , sresumel-show-all-variablesShow 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.

resumel-init

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.

Testing

make test    # run all tests
make clean   # remove generated results

Tests export all fixture files and compare resulting PDFs against expected outputs using vslavik/diff-pdf (project site).

  • macOS: brew install diff-pdf or MacPorts (port install diff-pdf), per upstream.
  • Linux: On Debian/Ubuntu (enable universe if needed), sudo apt install diff-pdf-wx — the package name is diff-pdf-wx, but it installs vslavik’s diff-pdf command (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-pdf per 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.

Adding New Templates

  1. Create templates/newname/ with newname.el (LaTeX class) and newname.org (macros).
  2. In newname.el, define resumel-newname-variable-defaults as a defaults alist.
  3. Add "newname" to the resumel-default-template choices in resumel.el.
  4. Add a test fixture and expected PDF; run make test.

Acknowledgements

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.

License

resumel is licensed under the GNU GPL.

Contributing

Contributions are welcome. Fork the repository and submit pull requests with relevant tests.

Contact

Please open an issue on the GitHub repository.

About

A resume template package for Emacs Org Mode

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors