The Overengineered Resume with Zola, JSON Resume, Weasyprint, and Nix
The author details their journey in streamlining resume creation by separating content and design, utilizing tools like JSON Resume, Zola, and Weasyprint. Automation via NixOS and GitHub Actions enhances the process.
Read original articleThe article discusses the author's journey in overengineering his resume creation process using various tools and technologies. The author aimed to separate content and presentation, maintain version control, support multiple output formats including PDF and web pages, and avoid using LaTeX. The process involved using JSON Resume for data representation, Zola for static site generation, and Weasyprint for HTML-to-PDF conversion. The author leveraged YAML for resume data, Tera templates for rendering, and CSS for styling. Automation was achieved through NixOS, direnv, and a justfile for seamless local development. Continuous integration was set up using GitHub Actions to render the PDF resume on each commit without storing it in the repository. The author shared insights into tooling setup, local development experience, and potential future enhancements for the automated resume generation process. The result is a data-driven resume that satisfies the author's engineering preferences and provides a structured approach for resume maintenance and distribution.
Related
My weekend project turned into a 3 years journey
Anthony's note-taking app journey spans 3 years, evolving from a secure Markdown tool to a complex Electron/React project with code execution capabilities. Facing challenges in store publishing, he prioritizes user feedback and simplicity, opting for a custom online deployment solution.
Writing HTML by hand is easier than debugging your static site generator
The blog author discusses challenges of static site generators versus manual HTML coding, citing setup complexities and advocating for simplicity, stability, and control in website management. Emphasizes static data benefits.
Node 18 Ate My Website
The author upgraded their Next.js website to Node.js 18, facing issues with deprecated dependencies. They rebuilt the site with TypeScript, Contentlayer, Tailwind CSS, and Vercel Analytics, emphasizing simplicity and emerging technologies.
In Praise of Low Tech DevEx
The article explores Low-Tech DevEx (LTD) in developer tools, favoring text-based options like vim and make for portability, speed, and user-centric design. It promotes Unix principles for improved developer productivity.
Let's Treat Docs Like Code
Treating documentation like code involves using tools like GitHub, automation, and static site generators. Importance of learning these tools, best practices for efficient writing, protecting branches, case studies, and resources are discussed. Insights on building documentation sites are provided.
For me personally, I found LaTeX to be the perfect solution. I have my resume tex setup so I can set toggles to define what gets output. E.g. applying for a manager position, I might keep it brief and more technical.
The resume is modular and can be updated by updating external txt files and not the LaTeX itself. It looks nice, is always consistent, has nice links, etc.
It's optimized for all the ATS nonsense it inevitably gets run through, it generates a PDF, and I've made it near impossible for recruiters to copy and paste and repurpose it without retyping much of it, and I have a tone of tech tricks in their like invisible text that automated systems might see.
If LaTeX itself is sufficient, I can't imagine needing to add in something like Nix and a webserver or how that would be better in any way.
I've found that I change job summaries so often, that automating it was a net negative in time spent on the thing. So now I just do the same as the digitally challenged: copy a Word file to "resume (DATE).docx" and change the contents as needed.
My younger self would be surprised, and slightly annoyed, at how often I use the "dumb" solutions for problems.
I - like OP - use JSON Resume [1]. Besides that I just have a Github Action which creates a PDF and also updates a web-based version [2] hosted in AWS S3. My favourite thing about this setup is that if I want to make a small change I can just log in to Github and commit a quick edit in the repo [3] through Github's web-based UI A new PDF is generated and the web-based version being updates automatically.
[2] http://geoff-clayton-cv.s3-website-eu-west-1.amazonaws.com/
It's neither visually pleasing nor is it more easily readable than other CVs that I have seen.
It's fine for a CV to be visually ugly as long as its readable, or visually attractive in spite of being less readable. You can't fail at both dimensions.
If you're really happy with a CV that looks and reads like this, save yourself all the effort and make a RTF document instead.
That said, I never send the same resume to everyone. I tailor a resume for each job I apply to. This doesn't mean leaving off positions or lying. It does mean taking the work done in a position and giving it a slant toward the target job.
For example, let's say I created a web app that shows a sales dashboard, with stats visualization, from raw daily sales data.
Job 1 (applying for Front-End) - Created monthly sales dashboard web site using React, MaterialUI, SASS, Node, Riak, and D3. Dashboard provided grid-based summary over individual weeks, months, and years. It also provided configurable line graphs and pie charts for various sales metrics. Data pre-processing done with Sci-Kit. Later added sales prediction using Machine Learning.
Job 2 (applying for Data Analysis) - Analyzed raw daily sales data to determine data cleansing needed, and created tool pipeline using Python NumPy, SciKit, and scikit-learn. Integrated pipeline into Riak data source ingest, and then built sales dashboard web site to visualize the data. Provided ML model for sales prediction built with scikit-learn, with XX parameters. Model achieved YY accuracy with only a ZZ mean error.
Same work in both, but I highlight the tasks most relevant to the target job.
Other thoughts are that Latex is a good way to get a well laid out PDF resume (PDF is not the web, you should have two versions of your resume), and I agree with other commenters - the final product needs more polish if it was actually going to be used to produce a resume to send in (I think it's fine as a proof of concept though).
I first looked at Canva templates, but apparently nowadays you are supposed to do black/white and no fancy designs for ATS readability. Then I tried it with Google Docs b/w resumee template, which kinda got me to write actual skills. Then I approached the coach, got her template and iterated, and then I also added some rules from here (https://principiae.be/pdfs/ECV-1.01.pdf).
I also involved ChatGPT to analyze job postings and to get the mix of keywords in my resumme right. Tools like https://tagcrowd.com/ also help with that. For example, I am targeting 'IT analyst' roles, and it does make sense that I have the word 'analysis' a few times in my CV.
E: mine is basically structured the following way
Name
Title
Summary
3x5 ATS keywords/skills specific to my profile and role
last ten years, also written in a way that 'gamifies' ATS: 'Year, worked as ROLE at Company, did XYZ'
--page 2--
Education (degree + grades)
Skills Training
Languages
Some more IT skills (programming languages, project management, ...)
E2: I obviously have no idea what I am doing, but I got three interview proposals for 10 applications, so I guess 30%.
I've found that splitting data and representation is not as feasible as it sounds. You add a job and suddenly your CV doesn't fit on a page anymore, and cutting details from previous jobs isn't enough. So you change the layout, ever so slightly, because the data changed. And version control? Nice for building, but it's not like you'll ever go back in time anyway.
What's nice though is defining the data and then trying different layouts to see what works.
I noticed the container they run uses nix too, which is nice although I don't care about it as long as it works. I could add signing of the pdf maybe some day for fun. What's great with this approach is how little hassle there is and nothing to install, nowhere, and produces the same clean resume I've used for over a decade (but needed to install a thousand things I could never remember from one computer to another).
Not sure if you can say that it was over engineered or not but I used the following:
* Frontend framework : Next.js / React (Functional components with React Hooks)
* Rendering : Static Site Generation
* Programming language : Typescript
* CI/CD : Github actions
* Unit test : jest
* Design : SASS / Responsive design
* Data validation : AJV / JSON Schema / Joi
* Infrastructure : Cloudflare pages / Terraform
* Package management: Yarn
* Linting & Formatting : ESLint / StyleLint / Prettier
* Pattern matching : ts-pattern
* CSS framework : react-bootstrap
* Monorepo : nx
* PDF generation : jspdf
* Contact form : web3forms
* Captcha : hCaptcha
I am quite happy with the final output : https://www.remikeat.com
It would pull the data from
https://data.remikeat.com/resume.en.json
https://data.remikeat.com/resume.jp.json
https://data.remikeat.com/resume.fr.json
So I can just update the JSON and the webpage will update itself.
Also as the PDF is generated locally, the PDF also get updated automatically.
And I didn't know there was a JSON standard for resume. Maybe, I should migrate the format I designed to this open standard.
Ultimately, I wanted to add a portfolio section, where I would show some of my projects like
https://stackl.remikeat.com which is a stack language interpreter written in Ocaml and compiled to js with js_of_ocaml.
I cribbed a CV template from overleaf and put some jinja2 in it to take the content from CV note in my note taking app: https://hitchdev.com/orji/using/latex-cv/
With termux I can then hit a button to run a script and it will instantly generate a pretty PDF using latex from an orgzly note and fire off an android share intent.
The nice thing about this set up was that if a recruiter called me while I was out and wanted a CV quickly with a couple of tweaks made I could just do it on my note taking app and email an updated PDF in a few seconds.
In theory I could easily change the style of the CV but in practice I haven't felt the need to touch it in years.
A simple file (Word doc, Numbers, Google Doc) that receives a change every few years and is exported as a PDF seems to do the task better.
With that expectation set, the end product was severely underwhelming. The visual flare is non-existent.
It was basically a cartoon version of him, walking through his various life accomplishments.
It was well-done, and all, but I found it a bit annoying. Also, it was Flash.
When you have 1,000 resumes from laid off software engineers from FANG companies that all look mostly the same, how do you decide who to call?
I’ve been thinking lately that an interesting project might be to look for publicly available resumes of people who have recently accepted new jobs within the tech industry and compare their resumes against those of people who have been looking for a new job for a while. The comparison would be qualitative if only a few resumes are available or perhaps quantitative (i.e., a classification model) if many are available.
Recruiters are not looking for the same signals as hiring managers, and since I’m not a recruiter, I would really like to know exactly what it is that they are looking for.
As an example of this kind of discrepancy that caught me totally off-guard, I was slightly below the “years of experience” requirement on a particular job posting that seemed to match my background perfectly. The recruiter I was talking to had reached out about another job posting where I did meet the YoE requirement, but I said the other posting was a significantly better fit for my skills and experience. The recruiter replied that the YoE requirement was not negotiable, so I was put onto the interview loop for the much less applicable role because of this arbitrary and narrowly missed line in the sand (and of course I failed that interview, wasting both my time and theirs).
A hiring manager would care less about years in seat and more about capability. That such a YoE requirement might be used as a hard filter when scanning resumes caught me by surprise—I had previously sent out plenty of resumes where I narrowly missed the YoE requirement, and in retrospect, my application was probably discarded immediately while using up the “quota” of how many times I could apply to that company. These sorts of insights from the recruiting world would be great to know in advance from the candidate’s perspective.
The diffing and version pinning is nice. Throughout intern application season I usually make updates to my resume and it's nice to be able to easily go back to the version of the resume that I applied with whenever I get a callback from a company.
Mine: https://github.com/nickorlow/resume
Website with link pointing to latest pdf: https://nickorlow.com
I also do something similar with cheat-sheets for classes. Using git for collaboration it is really nice: https://github.com/nickorlow/cs-331-cheatsheet
I do like the concept in the article of separating the data from the presentation.
Recently, I started turning it into a template and added some documentation. The next step is to feed the data (experience, education) through JSON so it's easier for others. It is automated to the point of generating a new preview GIF every time I push to master. I still manually hit CTRL+P to get the PDF though, it feels faster than implementing automation.
I'll hopefully do a Show HN in the future but until then, here is a demo on GitHub Pages: https://mrtysn.github.io/cv/
https://github.com/jkitching/1pager-printable-html
It can be used for creating a PDF locally, or the HTML file can also be viewed directly in the browser - both should look identical.
When I was looking into different ways of converting HTML into PDF, everything I came across did a pretty bad job at correctly supporting CSS layouts and positioning. So I ended up just using headless Chrome for printing. Perhaps WeasyPrint does a better job with CSS support?
And hey, overdesigned or not, it's a resume that ended up on the front page of Hacker News, making it all worth it given what a resume is supposed to do.
Just use markdown > html > pdf using a custom css style sheet
This is what I use for my resume:
oh boy. wait until you see europass standard.
appetizer: it's a pdf, with embedded xml, with html snipet field values.
If you're going to that trouble, finish the swing. The final product here is BAD.
The person reading the resume doesn't know it's automated so no credit points for that, and it looks like a person didn't pay attention to basic detail. This does you no good, it hurts you.
Example glitches:
The contact row dropping LinkedIn to next line. The ragged bullets hanging to the left of the left margin relative to headlines. The dates not right aligned. The too-large font making it take ALL of two pages for just a decade.
These things do get judged at a glance when someone's looking at lots of PDFs.
Also, just because a resume goes into an ATS doesn't mean the hiring manager isn't looking at the original PDF. Usually the ATS surfaces/sorts applicants but one reads the original PDF or Word doc anyway, because the ATS interpretation is often unreliable on its own.
All that said...
One idea to counter the above advice is either in italics under the contact line or in a clear footer, put a colophon or imprint saying: This PDF was auto-generated from my job history data, blogged about the automation here: https://full.web.link/resume-blog-post
But still, exhibit a higher bar for the end product. Engineers that fall in love with over-engineering without regard for the output and "end user experience" are everywhere, and a problem. Engineers that produce above-the-bar output end users appreciate, while ironically over-engineering, with full tongue in cheek recognition of the over-engineering, are rare.
It's a static site/document generator that supports bibliographies, jupyter notebooks, and good old fashioned markdown. It works well for complex academic resumes and CV's, as well as blogs and library documentation.
I use a template for my website : https://jjd.io/
github repo : https://github.com/jdonaldson/jjd.io
Also, if anyone has any positive/negative comments on my site, let er rip! I'm still working on it.
Related
My weekend project turned into a 3 years journey
Anthony's note-taking app journey spans 3 years, evolving from a secure Markdown tool to a complex Electron/React project with code execution capabilities. Facing challenges in store publishing, he prioritizes user feedback and simplicity, opting for a custom online deployment solution.
Writing HTML by hand is easier than debugging your static site generator
The blog author discusses challenges of static site generators versus manual HTML coding, citing setup complexities and advocating for simplicity, stability, and control in website management. Emphasizes static data benefits.
Node 18 Ate My Website
The author upgraded their Next.js website to Node.js 18, facing issues with deprecated dependencies. They rebuilt the site with TypeScript, Contentlayer, Tailwind CSS, and Vercel Analytics, emphasizing simplicity and emerging technologies.
In Praise of Low Tech DevEx
The article explores Low-Tech DevEx (LTD) in developer tools, favoring text-based options like vim and make for portability, speed, and user-centric design. It promotes Unix principles for improved developer productivity.
Let's Treat Docs Like Code
Treating documentation like code involves using tools like GitHub, automation, and static site generators. Importance of learning these tools, best practices for efficient writing, protecting branches, case studies, and resources are discussed. Insights on building documentation sites are provided.