Install
$ agentstack add skill-mehdi-ks-ats-cv-skill-via-latex-skill ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
LaTeX CV Generator
Turns any uploaded CV into a single-page, visually polished, ATS-compatible LaTeX CV — packaged as a zip ready to drop into Overleaf.
The output always has:
- Compiler: XeLaTeX (mandatory — the design uses
fontspec) - Design: green accent spine, centered serif name, clickable company URLs
- ATS compliance: section headers use plain
\MakeUppercase(noLetterSpace) so ATS extractors read "SUMMARY" not "S U M M A R Y" - Single page: all spacing is tuned to fit; warn the user if content risks overflow
Read references/base_template.tex for the full LaTeX preamble and command definitions before generating any .tex output. Read references/overleaf_guide.md for the tutorial text to bundle in the zip.
Step 1 — Parse the CV
Read the uploaded file. Extract these fields:
| Field | Notes | |---|---| | Full name | | | Tagline | 1-line role descriptor in ALL CAPS, parts separated by · | | Location, phone, email, LinkedIn URL | | | Summary | 3–4 sentence prose paragraph | | Skills | Group into categories e.g. Data & Analytics / Systems & Cloud / Engineering / Languages (adapt to the person) | | Work experience | Per role: job title, company, location, work mode, start–end dates, 2–5 bullet points | | Education | Institution, degree, years | | Leadership & Recognition | Title, org, year (compact, one line each) |
If any field is ambiguous or missing, ask the user before proceeding. Do not invent content.
Step 2 — Collect Company URLs
For each employer, institution, and leadership org, find the correct public website:
- Prefer official corporate/about pages over client-facing homepages
- If a company website is broken or unavailable, use their LinkedIn page:
https://www.linkedin.com/company// - If unsure, leave the URL as
{}and add a% TODO: verify URLcomment in the .tex file - Use web search to look up URLs you don't know
Step 3 — Handle Logos
Each \jobheader call needs a logo_.png file (lowercase, underscores, no spaces).
If the user provides logos (in a zip or folder): use them as-is, rename to match the convention.
If no logos are provided: generate placeholder PNGs using Python + Pillow:
from PIL import Image, ImageDraw, ImageFont
def make_placeholder_logo(initials, filename, size=200,
bg=(15,110,86), fg=(255,255,255)):
img = Image.new("RGBA", (size, size), (0,0,0,0))
draw = ImageDraw.Draw(img)
draw.ellipse([0, 0, size-1, size-1], fill=bg)
try:
font = ImageFont.truetype(
"/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf",
size // 3)
except Exception:
font = ImageFont.load_default()
bbox = draw.textbbox((0, 0), initials, font=font)
w, h = bbox[2]-bbox[0], bbox[3]-bbox[1]
draw.text(((size-w)//2, (size-h)//2), initials, fill=fg, font=font)
img.save(filename)
Run pip install Pillow --break-system-packages if needed. After generating, tell the user which logos are placeholders and suggest they replace them with real ones.
Logo height: use 0.50cm for most logos. Use 0.65cm for logos that appear small due to extra padding in the PNG.
Step 4 — Generate main.tex
Read references/base_template.tex. It contains the complete LaTeX preamble — colors, fonts, geometry, command definitions. Do not rewrite the preamble; copy it verbatim and fill in only the document body sections marked with % >>.
Critical rules — never break these:
\cvsectionand\sklabelmust use\MakeUppercase, never\tracked— this is the ATS fix- All bullet itemize blocks:
{\fontsize{9}{11}\selectfont \begin{itemize} ... \end{itemize}} - Add
\vspace{-3pt}before the first\jobheaderafter each\cvsection{Work Experience}to close the gap - Leave
% TODO: verify URLcomments for any URL you are not confident about - The
\jobheadercommand takes 6 arguments: logo file, title, company+location, date, url, logo height - The
\recogentrycommand takes 4 arguments: logo file, title, org+date, url
Bullet writing guide:
- Start every bullet with a strong action verb (Architected, Delivered, Built, Led, Reduced…)
- Include at least one hard number per bullet where possible (%, ×, counts, time savings)
- Keep bullets to 1–2 rendered lines max
Step 5 — Assemble and Deliver the Zip
mkdir -p /tmp/cv_latex_output
# Copy main.tex and all logo_*.png files into /tmp/cv_latex_output/
# Copy the overleaf tutorial:
cp references/overleaf_guide.md /tmp/cv_latex_output/OVERLEAF_SETUP.md
cd /tmp/cv_latex_output && zip -r /tmp/cv_overleaf.zip .
Save the zip to the workspace outputs folder, then present it with present_files.
Design Constants (do not change)
| Token | Value | |---|---| | Accent green | #0F6E56 | | Accent light green | #1D9E75 | | Body font | TeX Gyre Heros (via fontspec) | | Name font | TeX Gyre Pagella (via \namefont) | | Name size | 25pt / 27pt leading | | Accent rule under name | \rule{0.24\textwidth}{0.8pt} | | Section header | 9pt bold, \MakeUppercase, NO LetterSpace | | Skill label | 8.5pt bold, \MakeUppercase | | Job title | 10pt bold | | Company line | 8.5pt, accent color | | Bullet body | 9pt / 11pt leading | | Margins | top 5mm, bottom 4mm, left 16mm, right 10mm | | Green spine | 4pt wide TikZ rect, left edge, full page height | | Bullet marker | \textcolor{accentlt}{\rule{4pt}{1.2pt}} |
Single-Page Constraint
The CV must fit on one page. If content is too long, in order:
- Reduce older/less-relevant bullets first
- Drop short internship bullets to 1 line
- Trim the summary to 2–3 sentences
- As a last resort, reduce bullet font from 9pt to 8.5pt
Always tell the user if content was trimmed.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: Mehdi-Ks
- Source: Mehdi-Ks/ATS-CV-Skill-via-Latex
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.