A clean, ATS-friendly resume typeset in XeLaTeX, with a faint dithered kestrel watermark. Three PDFs are built from one source (in the repo root):
satyajit-resume.pdf— display version with the kestrel watermark (for your site / humans).satyajit-resume-ats.pdf— identical text, no background. Submit this one to ATS / job portals.satyajit-resume-one-pager.pdf— full content condensed to a single page (watermarked).satyajit-resume-one-pager-ats.pdf— the one-pager with no background, for ATS.
No system LaTeX needed — this uses Tectonic (a self-contained XeLaTeX engine) and uv for the Python tooling.
# one-time: install Tectonic (single binary) if you don't have it
curl --proto '=https' --tlsv1.2 -fsSL https://drop-sh.fullyjustified.net | sh # -> ./tectonic
make # builds all three PDFs into the repo root
make ats # just the ATS version
make onepager # just the one-page version
make image # regenerate the dithered kestrel watermark
make preview # refresh the README preview PNGs
make check # run the local open-source ATS checker (see below)Fonts are bundled in src/fonts/ (no system font install needed):
Space Grotesk for display, and
Inter for body — both embedded into the PDF.
The resume is built for clean machine parsing, following current (2024–2026) best practice:
- Single column, real selectable text, standard headings (Experience / Education / Skills).
- Contact details (incl. a location line) live in the body — never in a page header/footer.
- Visible URLs that are also hyperlinked;
Mon YYYYdates; round•bullets; ASCII-only symbols. - No tables/columns for layout, no icons-as-text, no images carrying text.
- The ATS PDF has no background image — the watermark is display-only.
make check runs scripts/ats_check.py, a local checker assembled from the same
open-source engines real ATS use — pdfminer.six + PyMuPDF for extraction and
spaCy for NER — and prints a transparent parse + content score. Current result on
satyajit-resume-ats.pdf: 100/100.
Note:
pyresparser(the popular pip parser) is abandoned and won't load under spaCy 3.8 / Python 3.12, so this repo uses the underlying extraction engines directly.
resume/
├── README.md
├── Makefile
├── satyajit-resume.pdf # display (kestrel watermark)
├── satyajit-resume-ats.pdf # clean ATS version
├── satyajit-resume-one-pager.pdf # condensed single page (watermarked)
├── satyajit-resume-one-pager-ats.pdf # condensed single page, ATS
├── build/ # intermediate tectonic output (not the deliverables)
├── preview/ # PNG previews shown above
├── scripts/ # uv project: dither.py (watermark), ats_check.py (ATS score)
├── src/
│ ├── resume.tex # display build (kestrel watermark)
│ ├── resume-ats.tex # ATS build (defines \ATSMODE -> no watermark)
│ ├── resume-onepager.tex # one-page build (\ONEPAGER -> compact + drop \verbose)
│ ├── resume-onepager-ats.tex # one-page ATS build (\ONEPAGER + \ATSMODE)
│ ├── resume-body.tex # shared header + section includes
│ ├── style.tex # fonts, palette, sizing params, section macros, watermark hook
│ ├── fonts/ # Space Grotesk + Inter (bundled)
│ ├── assets/ # kestrel-source.jpg, kestrel-dither.png, CREDITS.md
│ └── sections/ # summary, experience, skills, education
├── v1/ # archived: original Adobe-design + Awesome-CV resumes
└── v2/ # archived: 2024 LaTeX resume (resume-v2.pdf)
Kestrel photo by Alexis Lours, CC BY 4.0,
via Wikimedia Commons —
downscaled, grayscaled and Atkinson-dithered into a faint watermark by scripts/dither.py.
See src/assets/CREDITS.md.


