Building a data driven resume

Intro

Every 6-12 months most people in the corporate word have to set aside time to do through the ordeal of "refreshing their resume". This is a real pain, especially if you've locked yourself into an outdated resume structure! Given my day to day job involves building data driven applications, its hypocritical of myself to use something link MS Word to build out my CV! In this post I'll attempt to persuade you to use jsonresume a free, open source framework for building a data-driven resume.

What is a data driven resume?

When you decide to update your resume, you may notice that the content (text) will largely stay the same, baring a few corrections and additions. However, using a tool like MS Word would require you to do lots of manual copying and pasting as well as trying to form a cohesive layout that can scale as you add more information to it. If we abstract out the data (or resume content) from the layout we will be able to quickly chop and change the layout to suit the job application.

Are there any other advantages of a data driven resume?

If we can separate our data from our layout and have a program to blend the two we can derive additional value from machine learning! There are plenty of possibilities, just imagine if you gave GPT-3 a junk of data on resume's and trained it to do some NLG for a specific role. Obviously I'm not suggesting you go for an out of the box GPT-3 generated resume, but rather that it could provide some suggestions for you to build a well tailored resume. Think of it like a super powered Grammarly!

Also if you are technically minded, you may have noticed that this is very simialar to the MVC framework where we separate out the concerns of components to aid in simplicity for expansion. In this case the data is the Model, the View is the jsonresume-theme build from the handlebars files and CSS, and the Controller is the resume-cli.

How can I get involved with the data driven resume hype?

To get started, I'd head over to jsonresume.org, where they keep up-to-date information on how to get up and running. However, I'll detail below the steps that I took to build out my resume, which you can check out here! There is also a PDF rendering shown below

Step 0 - Installing resumed-cli

At the point in time of writing this blog, I found that there were a few issues with the resume-cli when building out custom themes. However, there is a fork called resumed-cli which works perfectly for building out your custom themes! For ease of transitioning to github actions we will install it locally to the working space we are currently in. However, if you are not wanting to use github actions, you can install it globally.

1
npm install resumed-cli  # Or to install globally `npm install -g resumed-cli`

You can verify your installation by running

1
./node_modules/.bin/resumed --version  # Or simply `resumed` if you installed globally

Step 1 - Generating a resume.json

Given this resume is going to be data driven, we need to create a resume.json with the correct structure, which is given by the jsonresume schema. To do this we can either use resumed to initialize a templated resume.json file, or you can start off by copying mine and editing it from there - link!

1
./node_modules/.bin/resumed init  # Or simply `resumed init` if you installed globally

Step 2 - Using a theme

To find the theme you'd like to use, either head over to jsonresume and find the github repository for the theme you'd like to use, or just search github for repositories that start with the name "jsonresume-theme-", for example jsonresume-theme-github. Now all we have to do is clone the repo for the them we want to use! In my case I forked the stackoverflow theme and made some changes.

1
2
3
4
git clone https://github.com/ghandic/jsonresume-theme-stackoverflow.git
cd jsonresume-theme-stackoverflow
npm install .
cd ..

Step 3 - Building your resume

Now all thats left is for the jsonresume program to do its magic and blend the data with the layout! Simply tell resumed what the name of the theme you're using is (the name proceeding "jsonresume-theme-")

1
./node_modules/.bin/resumed serve --theme stackoverflow  # Or simply `resumed serve --theme stackoverflow` if you installed globally

This should open up a new tab in your browser with your fancy new resume!

Step 4 - Exporting your resume

Its great that we can serve up our resume as a web page but that would be no good when we have to send it to a potential employer! Luckily the team at jsonresume have built some tooling that can export your generated webpage either as a single page HTML file, or even better as a PDF!

To build these artifacts we again make use of the resumed-cli

1
2
3
4
5
# For a single page HTML
./node_modules/.bin/resumed export --theme stackoverflow --format html resume.html  # Or simply `resumed export --theme stackoverflow --format html resume.html` if you installed globally

# For a PDF
/node_modules/.bin/resumed export --theme stackoverflow --format pdf resume.pdf  # Or simply `resumed export --theme stackoverflow --format pdf resume.pdf` if you installed globally

Step 5 - Continuous Integration

Now comes the fancy part, if you want to keep a version history of your resume and publish it to the wider interwebs, you can make use of github actions to build your resume for you, both as a webpage that anyone can access, or as a PDF that anyone can download. Note you can also build this all privately with github actions, feel free to contact me if you'd like to know how!

All you need to do it create a github repo with your resume.json and a github actions yaml file that will be triggered whenever you push to your main branch, here is the pipeline I have set up.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
name: "Publish Resume"
on:
  push:
    branches:
      - master

jobs:
  publish_resume:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-node@v1
        with:
          node-version: "11"

      - name: Install the dependencies
        run: |
          apt-get update && apt-get install -y git
          npm install resumed-cli
          git clone https://github.com/ghandic/jsonresume-theme-stackoverflow.git
          cd jsonresume-theme-stackoverflow
          npm install .
          cd ..
          mkdir public

      - name: Build the resume - html
        run: |
          echo "$(tty)"
          script --return --quiet -c "./node_modules/.bin/resumed export --theme stackoverflow --format html public/index.html" /dev/null

      - name: Deploy the resume - html
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./public

      - name: Build the resume - pdf
        run: |
          script --return --quiet -c "./node_modules/.bin/resumed export --theme stackoverflow --format pdf Andrew_Challis_Resume.pdf" /dev/null
          git config --local user.email "action@github.com"
          git config --local user.name "GitHub Action"
          git add Andrew_Challis_Resume.pdf
          git commit -m "Publishing latest PDF"

      - name: Deploy the resume - pdf
        uses: ad-m/github-push-action@master
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}

Note there are some extra things going on here, such as the runner pushing back to the same repo, the use of script, which is needed as the resumed-cli uses the tty to operate and runners do not have access to tty so we need to make it seem like its accessing the tty with a stream.

Summary

I hope this has persuaded you to join on the hype of data driven resumes! Or at least given you some food for thought on how you could organize your data to drive machine learning as having your data structured like this is the first step! Let me know your thoughts below!

comments powered by Disqus