A local, multi-provider AI resume-tailoring tool. Paste a job description and it generates a tailored resume, an ATS optimization report, and an optional cover letter — with your real contact details and honest experience preserved (it never fabricates skills or experience).
Privacy note: This project contains no hardcoded API keys and no personal data. API keys are read from environment variables at runtime, and all generated output (your resumes, job history, cached config) is git-ignored. The only placeholder left in the source is
[Your Full Name]in the cover-letter template — supply your own when you run it.
- Multi-provider AI — DeepSeek, Anthropic (Claude), or OpenRouter.
- Live model discovery — the GUI auto-populates the model list from each provider's API (with pricing + context-window info) and caches it for 24h.
- CLI + GUI — a
tailor.shquick launcher and a Gradio web UI (server.sh). - Fit analysis gate — optionally scores how well your resume matches a posting before spending tokens tailoring it.
- ATS notes — a keyword/match-strength optimization report per application.
- PDF export — Markdown → PDF via WeasyPrint (no pandoc/LaTeX required).
- Application tracker — a dashboard + status JSON over your
jobs/folders. - Full test suite —
pytest.
- Python 3.10+
pip(avenvis recommended)- Network access to your chosen provider's API
- An API key for at least one provider (set via environment variable)
# 1. Clone
git clone <your-fork-url> resume-tailor
cd resume-tailor
# 2. Create & activate a virtual environment
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 3. Install dependencies
pip install -r requirements.txt
# 4. Add your base resume (see "Your resume" below)Keys are never stored in files — they are read from environment variables at
launch. Add them to your shell profile (~/.bashrc, ~/.zshrc, etc.) and reload:
export DEEPSEEK_API_KEY="sk-..."
export ANTHROPIC_API_KEY="sk-ant-..."
export OPENROUTER_API_KEY="sk-or-..."You only need one provider's key to use the app. To load-balance across several keys, provide them comma-separated:
export DEEPSEEK_API_KEY="sk-a,sk-b,sk-c"The app reads a Markdown resume from base_resumes/<language>/. This folder is
git-ignored so your real resume never leaves your machine. Drop your file there:
base_resumes/
english/
my-resume.md # your real resume (NOT committed)
portuguese/
meu-curriculo.md # optional
A base_resumes/README.md template is included to show the expected format and the
[Your Full Name] / contact-header convention. The first .md found in the chosen
language folder is used unless you pass --resume.
# Tailor a resume from a job-description file
python -m src.tailor_resume -j path/to/job-description.txt -l english -p openrouter
# Piped / pasted description
echo '<job description>' | ./tailor.sh
# Also export a PDF
python -m src.tailor_resume -j posting.txt --pdf./server.sh start # start at http://localhost:7860
./server.sh status # is it running?
./server.sh stop # stop it
./server.sh restart # restart./start-gui.sh is a thin alias to server.sh.
test-job.txt is a generic sample posting you can run immediately to try the CLI:
python -m src.tailor_resume -j test-job.txt -l english -p openrouterpytest # runs the full suiteresume-tailor/
├── config/
│ └── settings.py # provider registry, models, prompts (edit here)
├── src/
│ ├── tailor_resume.py # CLI entry point
│ ├── models.py # AI provider classes (DeepSeek/Claude/OpenRouter)
│ ├── model_discovery.py # live model-list fetch + cache
│ ├── utils.py # file I/O, PDF export, job-info extraction
│ ├── gui.py # Gradio web UI
│ └── dashboard.py # application tracker
├── tests/ # pytest suite
├── requirements.txt
├── server.sh / start-gui.sh / tailor.sh
├── base_resumes/ # YOUR resume (git-ignored)
├── jobs/ # generated output (git-ignored)
└── data/ # runtime cache (git-ignored)
Most behaviour is centralized in config/settings.py (provider defaults, model
ids, system prompts, pricing, temperature). Edit there first.
No license file is included yet. If you intend to publish this, add a LICENSE
(e.g. MIT) before making the repo public.