Building CVs with Go and ConTeXt.
Go to file
Dan Anglin b2ce85b146
All checks were successful
/ test (pull_request) Successful in 25s
/ lint (pull_request) Successful in 25s
ci(fix): update environment variables
2023-12-06 14:48:20 +00:00
.forgejo/workflows ci(fix): update environment variables 2023-12-06 14:48:20 +00:00
cmd refactor: add golangci-lint with code refactoring 2023-08-21 03:07:06 +01:00
docs fix: create separate types for work and education 2023-08-19 00:29:55 +01:00
example feat: add a field for location type, code refactor 2023-08-15 17:25:00 +01:00
internal refactor: add golangci-lint with code refactoring 2023-08-21 03:07:06 +01:00
magefiles Update Project 2023-12-06 14:42:18 +00:00
schema fix: create separate types for work and education 2023-08-19 00:29:55 +01:00
.gitignore chore: move main.go to cmd/spruce 2023-08-16 23:33:28 +01:00
.golangci.yml refactor: add golangci-lint with code refactoring 2023-08-21 03:07:06 +01:00
.hadolint.yaml feat: new cv builder tool 2023-02-18 21:01:28 +00:00
Dockerfile fix: docker support improvements 2023-08-16 03:33:13 +01:00
go.mod build: replace make with mage 2023-08-11 14:59:21 +01:00
go.sum build: replace make with mage 2023-08-11 14:59:21 +01:00
LICENSE feat: new cv builder tool 2023-02-18 21:01:28 +00:00
README.asciidoc Update Project 2023-12-06 14:42:18 +00:00

Spruce - A tool for building CVs


Spruce is a tool that generates a PDF document from a CV written in JSON. The PDF generation is completed in two steps:

  1. The application parses the JSON document and generates a TEX file using the TEX template files located in the templates directory.

  2. The application then uses ConTeXt to generate the final PDF document from the generated TEX file.


Below is a list of required tools for installing and using spruce.


A minimum version of Go 1.21.0 is required for installing spruce. Please go here to download the latest version.


ConTeXt is required for generating the PDF documentation. You can go to the installation page to find out how to install ConTeXt for your Operating System.

The Carlito font (ttf-carlito)

Carlito is a free, metric compatible alternative to the Calibri font from Microsoft and is used when generating the PDF documentation.

For Debian/Ubuntu distributions you can use apt to install the font.

apt install font-crosextra-carlito

For Arch Linux you can use pacman.

pacman -S ttf-carlito

Alternatively you can download the font from Font Library.

Once Carlito is installed youll need to update ConTeXt so it can find the font when generating the PDF:

mtxrun --script fonts --reload

Mage (Optional)

The project includes a magefile for automating the build and installation of the spruce binary. With Mage the build information is built into the binary when it is compiled. You can visit the website for instructions on how to install Mage.

Docker (Optional)

You can use Docker to build and use a docker image built with spruce and ConText installed. This could be useful for those who are comfortable using Docker and dont want to install the above dependencies directly onto their machines.


With Mage

You can install spruce with Mage using the following commands:

git clone
cd spruce
mage install

The default install prefix is set to /usr/local so spruce will be installed to /usr/local/bin/spruce. If you dont have sudo privileges or you want to change the install prefix you can set the SPRUCE_INSTALL_PREFIX environment variable before installing.

SPRUCE_INSTALL_PREFIX=~/.local mage install

With Go

If your GOBIN directory is included in your PATH then you can install spruce with Go.

git clone
cd spruce
go install ./cmd/spruce

Building the Docker image

You can build a docker image using the Dockerfile included in this project. The build will build and install the spruce binary as well as install all the required dependencies in the final image. You can build the docker image with the following command:

docker build -t spruce .

Verifying the installation

Run spruce to verify your installation. You should see the usage printed onto your screen.

$ spruce
  spruce - A command-line tool for building CVs


  spruce [flags]
  spruce [command]

  create        creates a new CV JSON file
  generate      generates a PDF file from an existing CV JSON file
  version       print the application's version and build information

  -help, --help
        print the help message

Use "spruce [command] --help" for more information about a command.

If youve build the docker image you can get the same help message with the following command:

docker run --rm -it spruce

If you have installed spruce with Mage, you can get the build information to confirm that you have installed the correct version.

$ spruce version --full
  Version: v0.1.0-14-ge503dbf
  Git commit: e503dbf
  Go version: go1.21.0
  Build date: 2023-08-12T13:00:51Z

If youve built the docker image you can verify it with the following command:

docker run --rm spruce version --full

Generating the example PDF Document

Once youve installed spruce you can generate a PDF file from the example CV by running the following command:

spruce generate --input example/cv.json

This will create a file called cv.pdf which you can view with your favourite PDF viewer.

If youre using the docker image you can generate the PDF file using the following command:

docker run --rm -v ./example:/workspace spruce generate --input cv.json --output cv.pdf

The PDF file will be created in the example folder.

Creating your own CV

To create your own CV run spruce create. You can use additional flags to populate the CV with basic details such as your first name, last name and current job title. Run spruce create --help to see all available flags. After executing this command youll find a file called cv.json which will contain the skeleton of your CV JSON document.

$ spruce create
│time=2023-08-18T13:21:10.120+01:00 level=INFO msg="CV successfully created" filename=cv.json

You can now start populating the fields with your favourite text editor. Please refer to the schema reference for more information on each field. You can also check out the example CV as an additional guide.

Once youre happy with your CV you can run spruce generate to generate the PDF documentation.

$ spruce generate
time=2023-08-18T13:32:03.240+01:00 level=INFO msg="Creating the Tex file."
time=2023-08-18T13:32:03.252+01:00 level=INFO msg="Tex file successfully created." filename=/tmp/cv-builder-1016910977/cv.tex
time=2023-08-18T13:32:03.252+01:00 level=INFO msg="Creating the PDF document."
time=2023-08-18T13:32:06.416+01:00 level=INFO msg="PDF document successfully created." filename=/tmp/cv-builder-1016910977/cv.pdf
time=2023-08-18T13:32:06.416+01:00 level=INFO msg="File successfully copied." source=/tmp/cv-builder-1016910977/cv.pdf destination=cv.pdf


  • The Markdown Resume: This project uses ConTeXt and pandoc to convert Markdown based CVs into multiple formats including PDF, HTML and DOCX. This is where I discovered ConTeXt.

  • melkir/resume: This project generates CVs using Go and LaTeX.