Stop sending the same CV to every job. CV Autopilot reads each job description, scores how well you fit, and generates a tailored CV + matching cover letter per role — automatically.
🐍 Pure Python · 📄 LaTeX PDF output · 🌍 Bilingual Arabic/English · 🔒 Your data never leaves your machine
A graduate applies to 50+ roles with one generic CV and hears nothing. The roles aren't the problem — the generic CV is. Recruiters and ATS filters reward CVs that mirror the job's own language. Doing that by hand for every posting is hours of tedious work, so nobody does it.
CV Autopilot does it in seconds: one base CV in, a tailored CV + cover letter per job out.
flowchart LR
A[config.json<br/>your details] --> B[parse CV<br/>cv_parser]
J[jobs.json<br/>postings] --> C[score & match<br/>keyword_extractor]
B --> C
C --> D[tailor per job<br/>cv_tailor]
D --> E[render PDF<br/>latex_renderer]
D --> F[cover letter<br/>cover_email_generator]
J -.no email?.-> G[enrich<br/>Hunter.io]
E --> H[(output/)]
F --> H
G --> H
- Parse your CV (LaTeX or plain text) into structured JSON
- Score every job — keyword taxonomy across 10 categories (networking, security, cloud, PM, banking, software, telecom, certifications…), Arabic + English
- Tailor per job — reordered skills, role-matched summary, most relevant experience surfaced
- Render professional PDFs via LaTeX — one per job
- Generate role-aware cover letters — 6 role categories, each emphasising different projects
- Find recruiter emails — optional Hunter.io enrichment by company domain
In its first real run — the author's own Saudi-market graduate job search — CV Autopilot:
| 392 | job postings parsed and scored |
| 29 | tailored CVs generated from a single base CV |
| 10 | keyword categories matched (bilingual AR/EN) |
| 6 | role-specific cover-letter templates |
| 19 | automated tests, green on CI across Python 3.10–3.12 |
git clone https://github.com/NotMarwan/cv-autopilot
cd cv-autopilot
pip install -r requirements.txt
python setup_wizard.py # enter your details once (writes config.json — stays local)
python src/pipeline.py # tailored CVs ready in output/- Python 3.10+
- For PDF output: a LaTeX distribution with
xelatex(MiKTeX on Windows,texlive-xetexon Linux). Skip with--no-pdfto get.texfiles you can compile on Overleaf.
The pipeline reads jobs from a JSON file (scratch/scraped_wadhefa_jobs.json by default). Each job is:
{
"title": "Network Engineer",
"company": "Acme Corp",
"description": "...",
"requirements": "CCNA, routing, switching...",
"location": "Riyadh",
"status": "Open",
"emails": ["hr@acme.com"],
"url": "https://..."
}Build it however you like — paste jobs by hand, export from a job board, or write a scraper.
If a posting has no contact email, add a Hunter.io API key in config.json (free tier: 25 searches/month):
PYTHONPATH=src python src/enrich_emails.py # dry run
PYTHONPATH=src python src/enrich_emails.py --write # save found emailspython src/pipeline.py # run everything
python src/pipeline.py --step parse # just parse your CV
python src/pipeline.py --step match # just the match report
python src/pipeline.py --step tailor # just tailor CVs
python src/pipeline.py --step render # just render PDFs
python src/pipeline.py --no-pdf # skip PDF compilation
python src/pipeline.py --llm # Claude-powered summary rewriting (needs ANTHROPIC_API_KEY)PYTHONPATH=src python -m pytest tests/ -qEvery push runs the suite on Python 3.10, 3.11, and 3.12 via GitHub Actions (badge above).
Your personal data lives in config.json, which is gitignored — it never leaves your machine.
The repo ships only config.example.json as a template. CV Autopilot generates documents; it does
not send email on your behalf.
Built by Marwan Salah — Computer Engineering & Networks graduate, CCNA-certified — as a real tool for a real Saudi-market job search, not a toy demo.
- GitHub: @NotMarwan
If CV Autopilot helps your search, a ⭐ on the repo is appreciated.
MIT © 2026 Marwan Salah