How it works

Edit in Overleaf, and one fixed URL always serves the latest compiled PDF. No download, no re-upload. A scheduled GitHub Action pulls your project, compiles it, and commits the PDF.

The flow

Overleaf Action pulls + compiles Commits PDF Fixed link

Step 1: Get your two secrets

Project ID comes from the Overleaf URL overleaf.com/project/<ID>. The cookie: open DevTools (F12) → Network → reload → click any www.overleaf.com request → copy the full cookie: request header.

The cookie is revoked if you log out of Overleaf, and expires after a while. When the Action starts failing, just re-copy it.

Step 2: Create a public repo + add secrets

Make a public GitHub repo (e.g. resume). Then in Settings → Secrets and variables → Actions, add OVERLEAF_COOKIE and OVERLEAF_PROJECT_ID. Public is needed for free GitHub Pages, meaning your .tex source is browsable too.

Step 3: Add the workflow

Create .github/workflows/build.yml. The wizard generates this for you with the right filenames filled in. It runs on a schedule, downloads the project zip, compiles, and commits the PDF under a fixed name.

Step 4: Pick the right engine

Plain templates compile on pdfLaTeX, the default. Templates like Deedy use fontspec, which fails on pdfLaTeX with a fatal "requires XeTeX or LuaTeX" error; pick XeLaTeX in the wizard (or LuaLaTeX if your template needs it). For custom fonts, bundle the font files inside your Overleaf project so the build can find them. If your resume uses minted for code, turn on the minted option so the build enables shell-escape and installs Pygments.

If your main .tex lives in a subfolder, give its path (e.g. resume/main.tex) as the main filename.

Step 5: Pick your stable link

Two ways to serve the committed PDF from a fixed URL:

GitHub Pages

Settings → Pages → deploy from main / root. Reliable fresh updates.

username.github.io/repo/resume.pdf

raw.githack

Zero setup, serves with correct PDF type. Caches harder, so updates lag a bit.

raw.githack.com/username/repo/main/resume.pdf

Step 6: Wrap for a clean viewer

Once live, wrap the link in the Google viewer so it opens like a native PDF reader on mobile and desktop. The wizard builds this URL from whatever live link you paste.

Two gotchas: scheduled workflows pause after 60 days of repo inactivity (the wizard adds a manual run button as backup), and updates aren't instant; they appear on the next cron run.