Skip to main content

Command Palette

Search for a command to run...

404: Resume Not Found

Updated
2 min read
404: Resume Not Found

I revamped my portfolio site from a plain old monochromatic one to a much more attractive one with Demon Slayer themed color palette. Another thought came into my mind - why don’t I update my dusty old resume too and didn’t want to do that every time I update my website. I have recently been spending my time on GitHub Actions and Workflow Orchestration lately, so this came into my mind — “Why don’t I create a workflow which build and exposes a public URL whenever I update my work experience?”

Immediately, I vibe-coded a simple continuous integration service that keeps my resume up-to-date.

Sequence diagram of how the resume CI interacts with other services

The heart of the system is the Flask service, that handles Authentication, La-TeX generation, PDF parsing and uploading the parsed PDF to storage bucket.

Resume CI

It only has a single endpoint /generate which takes in the Authentication key, validates it and upon validation proceeds to the next step to the service layer. The service layer handles most of the core operations - JSON to La-TeX conversion, saving to PDF. Then the saved PDF is upload by the service.

LaTeX Generation

I initially wanted to build this using Go, but the tools weren’t much helpful (or at least easy to use). Hence I chose Python, PyLaTeX and texlive inside the Docker environment.

Authentication

Why did I even need to auth? I’m very paranoid of my GCP bills exploding because I kept my endpoint exposed. Also, I don’t want to spend an entire week building only auth. Moreover, the GitHub Actions (or me from my local) would be only one invoking this API, so the auth needs to be kept simple. Thanks to Swapnil Agarwal’s suggestion, I used the concept of API keys, I generated a simple UUID, which only two entities know, the caller and the resume service.

Deployment

Since the CI service was dockerized, the obvious choice was - Google Cloud Run and the GCS Bucket.

Why GitHub Actions?

I very much wanted to avoid GitHub Actions, because I already use Netlify to deploy my portfolio site and research about post-build notifications, but sadly Netlify doesn’t allow a request body to be passed, hence I opted GitHub actions with its generous free tier.

You can checkout the resume CI service at github/saiyerniakhil/resume-ci.