A small pipeline to generate tailored résumés and cover letters using OpenAI models.
It ingests existing CVs, extracts structured data into JSON databases, and generates professional outputs in text, Markdown, or PDF formats.
N.B.: The code right now is a mixed billingual codebase but the outputs are in french, prompt modifications in the code will correct this for you.
.
├── generate.py # interactive generator for résumé / cover letter
├── build-letter-db.py # extracts structured letter database (JSON)
├── build-resume-db.py # extracts structured résumé database (JSON)
├── requirements.txt # Python dependencies
├── .env # where you place your openai api key
├── data/ # where validated JSON DBs are stored
├── ingest/ # input CVs (txt, md, pdf, docx)
│ ├── sample-1.txt # example CV
│ └── sample-2.md # example CV
├── output/ # generated résumés / letters
├── prompts/ # LLM prompts for résumé and cover letter
└── specs/ # JSON schemas
├── letter-db-schema.json
└── resume-db-schema.json
-
Clone the repo and enter the directory
git clone <your-repo-url> cd resume-maker
-
Install dependencies
python3 -m venv venv source venv/bin/activate pip install -r requirements.txt -
Set your API key
Rename.env.sampleto.envand place your API keyOPENAI_API_KEY=sk-xxxxx
This reads all files from ingest/ (supports .txt, .md, .pdf, .docx), extracts text, runs through the LLM, validates against the schema, and writes JSON to data/resume-db.json.
python3 build_resume_db.pyBuild/infer a base of motivations, values, and writing style for cover letters:
python3 build_letter_db.pyThis creates data/letter-db.json.
This is the interactive step where you create tailored résumés and cover letters.
Run:
python3 generate.pyYou’ll be guided through:
-
Enter job info
- Job title
- Employer
- (Optional) short description of the role
-
Draft generation
- The tool generates a résumé (and optionally a cover letter) using the structured data from
data/. - The draft is shown in the terminal.
- The tool generates a résumé (and optionally a cover letter) using the structured data from
-
Interactive review & refinement
- Type
yesto accept the draft. - Or type feedback (e.g. “make it shorter”, “add more detail on web experience”), and a new draft will be generated.
- You can repeat this loop until satisfied.
- Type
-
Choose export format(s)
- When you accept a draft, you’ll be asked which formats to export:
txt(plain text)md(Markdown)pdf(print-ready, with headings, bullet lists, and clean typography)
- You can select multiple, comma-separated (e.g.
pdf, md).
- When you accept a draft, you’ll be asked which formats to export:
ingest/ has new CVs. If nothing has changed there, you can skip directly to step 3.
- All generated files are saved to
output/ - Filenames follow this pattern:
<slugified-job-title>-<resume|cover-letter>-<timestamp>.<fmt>
For example:
web-developer-résumé-2025-10-21_12-30-45.pdf
web-developer-cover-letter-2025-10-21_12-32-01.pdf