原始内容
Chameleon — Resume Tailor
Chameleon is an AI project that works with Claude Code, Codex, and OpenCode. It tailors a master resume YAML to a target job description, while saving the intermediate job analysis locally for later reuse.
It is designed for one job: start from a truthful master CV, adapt the wording to match a target job description, and produce a ready-to-submit PDF without inventing experience.
What It Does 🛠️
- Keeps your master CV unchanged
- Saves a separate job-analysis JSON artifact for each application
- Creates a separate tailored YAML for each application
- Rewrites only allowed parts of the resume to match the job description's language
- Renders the tailored YAML to PDF with RenderCV
- Scores a tailored CV against a saved job analysis artifact
- Works with Claude Code, Codex, and OpenCode
Constraints 🔒
- No fabricated experience, skills, metrics, titles, or dates
- Only rewording, reordering, and emphasis changes are allowed
- The master CV is never modified during a tailoring run
Prerequisites
- Python 3.10+
- Claude Code, Codex, or OpenCode
Installation
git clone https://github.com/davidalecrim1/chameleon.git
cd chameleon
make install-tools
This creates a .venv and installs rendercv inside it.
Quick Start
1. Start Claude Code, Codex, or OpenCode
All project commands are exposed as slash commands:
/init-cv/chameleon/tailor-cv/score-cv/render-cv
Claude Code:
claude
Codex:
codex
OpenCode:
opencode
2. Import your master CV once
If your source resume is a PDF:
/init-cv ~/Downloads/david-alecrim.pdf
If you already have a RenderCV-compatible YAML:
/init-cv ~/Documents/david-alecrim.yaml
This creates a RenderCV-compatible master file under templates/ and runs a render check.
3. Tailor for a job posting
Pass either a job URL:
/chameleon --cv david_alecrim https://jobs.example.com/senior-engineer-123
Or pasted job description text:
/chameleon "Senior Software Engineer at Acme Corp. We're looking for..."
If you have more than one master CV in templates/, specify which one to use with --cv <name>, where <name> is the filename stem before _cv.yaml:
/chameleon --cv david_alecrim https://jobs.example.com/senior-engineer-123
The /chameleon flow will:
- Fetch and analyze the job description
- Save a JSON artifact under
output/job_analyses/<analysis_id>__<company>__<role>.json - Rewrite the summary, reorder experience highlights, reorder skills, and clear
settings.bold_keywordsif present - Save a tailored YAML to
templates/<username>_<company>_<role>_cv.yaml - Render it to PDF via
make render - Report the analysis ID, saved JSON path, tailored YAML path, and generated PDF path
4. Score a tailored CV against a saved analysis
/score-cv --analysis a7c19f2d --cv templates/david_alecrim_tempo_rust_engineer_cv.yaml
This flow will:
- Resolve the saved analysis from
output/job_analyses/ - Extract structured evidence from the tailored YAML
- Score the CV against the saved analysis
- Report the final score, breakdown, and missing requirements
Local Files
Chameleon stores its working files locally in two main folders:
templates/: local CV YAML filesoutput/: local generated artifacts
Within those folders:
templates/<name>_cv.yamlis treated as a master CV when you pass--cv <name>- Tailored CVs are written as
templates/<username>_<company>_<role>_cv.yaml - Saved job analyses are written as
output/job_analyses/<analysis_id>__<company>__<role>.json - Rendered PDFs, HTML, Markdown, Typst, and image output land in
output/
Example 🎯
The following is the master template CV rendered to PDF:

License
MIT — see LICENSE.