resume builder with toml and groff
Go to file
Dozens B. McCuzzins 3f5053b588 coverletter 2024-02-27 17:44:25 -07:00
dist coverletter 2024-02-27 17:44:25 -07:00
lib updates 2024-02-05 16:35:26 -07:00
src coverletter 2024-02-27 17:44:25 -07:00
template coverletter 2024-02-27 17:44:25 -07:00
LICENSE updates 2024-02-05 16:35:26 -07:00 coverletter 2024-02-27 17:44:25 -07:00
justfile coverletter 2024-02-27 17:44:25 -07:00



  1. Keep your resume in plain, organized, highly-editable text.

  2. Separation of concerns: write content first. worry about formatting later.

  3. Version control: keep your resume text in a git repository. track your changes. create new branches for large edits or for tailoring your resume while applying to a specific role.


This is a resume builder.

Data is stored in resume.toml.

It is validated against jsonresume's json-schema.

And it is extracted as json with taplo.

It is converted to groff markup via mustache templates, and then exported to pdf.

You Will Need

  1. groff 1.23.0: for typesetting and pdf output (with the ms macro package; it should be installed anywhere groff is installed)
  2. mustache.js 4.2.0: for templates
  3. taplo 0.8.1: toml toolkit. Provides conversion to JSON, formatting, and validation.
  4. jq 1.6: json queries
  5. (optional) just 1.14.0: just a command runner

Cover Letter

I'm honestly not sure what the point of a cover letter is. But here's how to make one. First, feed a job description and your resume into chatgpt to get a (probably way too stuffy and wordy) cover letter and then tweak it to your liking. Then format it (groff) and templatize it (rec)! Pepper it with slots like {{position}} and {{company}} and then:

cat << EOF | recfmt -f | groff -ms -Tpdf > coverletter.pdf
position: chief lumberjack
company: swarthy lumberjacks of america

Frequently Questioned Answers

Because YAML is a drag.
Because JSON, while highly serializable, is highly annoying to write with its strict, verbose syntax.
Because while I love GNU Recfiles, they are just a little too annoying to query and template when complex table joins are involved.