A local, AI-powered resume content engine. Tailor combines your rich personal
profile with a target job posting and uses a locally running Ollama
model (default gemma4:latest) to produce tailored resume content as
JSON Resume data.
Tailor is a content engine, not a renderer. It decides what to say and how to word it for a specific job and emits structured JSON. A separate tool imports that JSON and handles layout / PDF.
- Generate tailored resume content from
profile + job postingvia your local model. - Store your profile neatly as rich, human-editable YAML — paragraphs, many bullets, timelines, and multiple "position framings" per experience.
- Pull job postings from arbitrary sites (HTTP, with a headless-browser fallback for JS-rendered boards), and use the model to normalize the messy page into structured data.
- Python ≥ 3.10
- Ollama running locally with a model installed
(e.g.
ollama pull gemma4) - Optional: Playwright for JS-heavy job boards
(
uv pip install playwright && playwright install chromium)
cd ~/personal/prosperis/tailor
uv venv --python 3.10
uv pip install -e ".[dev]" # add ",browser" for PlaywrightRun the CLI with uv run tailor ... or activate the venv and use tailor.
# 0. Check Ollama connectivity & model
uv run tailor doctor
# 1. Create your profile (or copy the bundled example to explore)
uv run tailor profile init
uv run tailor profile use-example # optional: load the example profile
uv run tailor profile edit experiences # opens YAML in $EDITOR
uv run tailor profile validate
# 2. Pull a job posting (auto browser-fallback; or paste manually)
uv run tailor job fetch "https://boards.greenhouse.io/acme/jobs/123"
uv run tailor job add --file posting.txt # manual fallback
uv run tailor job list
uv run tailor job show acme-payments-senior-backend-engineer
# 3. Generate tailored JSON Resume content
uv run tailor generate --job acme-payments-senior-backend-engineer
# -> data/output/<slug>.json (+ .meta.json with selection trace)Each item is rich by design (never just title + one sentence):
| Field | Meaning |
|---|---|
summary |
Free multiline narrative (paragraphs allowed) |
bullets |
Unbounded list of detailed achievement points |
timeline |
start / end (or per-position stints) |
positions |
Multiple title framings of one role; the generator picks one |
tags |
Keywords used for relevance matching |
See data/profile/example/ for a complete worked example.
CLI (typer): tailor profile | job | generate | doctor
├── profile/ YAML store + Pydantic models (rich items)
├── jobs/ fetch (httpx → Playwright fallback) + Ollama extract → Job JSON
└── generate/ two-step (select → word) → JSON Resume
└── ollama/ shared httpx client (only layer that calls the model)
The generation pipeline is two-step: the model first selects and scores relevant profile items (cheap, reliable on long profiles), then words only those items toward the job — constrained by prompt to use only your stored facts.
Edit config.toml:
[ollama]
url = "http://localhost:11434"
model = "gemma4:latest"
timeout = 300Override the model per command with --model/-m.
uv run pytest # Ollama is mocked; no model requiredDesign spec: docs/superpowers/specs/2026-06-15-tailor-design.md