Laburator
CLI job-search assistant powered by LangGraph. Fetches job listings via API, processes them through an LLM, and generates tailored CVs, cover letters, and interview questions for each position.
Installation
# Clone the repo
git clone <repo-url>
cd laburator
# Install with pip (editable, recommended)
pip install -e .
# Or with uv
uv pip install -e .
# Verify it works
laburator --help
Setup
Copy .env.example to .env and fill in your API keys:
cp .env.example .env
API Keys
Laburator requires two API keys. Both go in the .env file.
OpenCode Zen (LLM)
Used to generate CVs, cover letters, analysis, etc.
- Go to https://opencode.ai/zen and sign up.
- Once logged in, create an API key from the dashboard.
- Copy it into
.envasMODEL_API_KEY.
The endpoint and model are preconfigured in .env.example:
MODEL_API_KEY=sk-...
MODEL_API_ENDPOINT=https://opencode.ai/zen/v1
MODEL_NAME=deepseek-v4-flash-free
jsearch API (job search)
Used to fetch live job listings.
- Go to https://openwebninja.com and sign up.
- Subscribe to the jsearch API plan (free tier: 200 requests/month).
- Copy your API key into
.envasJOB_SEARCH_API_KEY:
JOB_SEARCH_API_KEY=ak_...
CV
Create your own cv.md at the project root with your personal experience, skills, and education. This is used by the LLM to tailor CVs, cover letters, and interview questions for each job.
A sample is provided as reference:
cp cv.md.example cv.md # then edit it with your own data
The CV supports any markdown content — sections like Summary, Experience, Education, Skills, and Languages are all parsed and passed as context to every skill.
LLM Wiki (optional)
If you have reference knowledge — technical notes, company background, industry research — you can place .md files in ~/Proyectos/llmwiki/wiki/ (or the path configured as LLMWIKI_DIR in .env). These files are loaded and injected into every skill prompt as supplementary context, giving the LLM more relevant background to work with.
Skills (custom prompts)
Skills are markdown files containing the system prompt for each LLM call. Built-in skills ship with the package:
| File | Generates |
|---|---|
jobsynthesis.md |
Job analysis |
createcv.md |
Tailored CV |
presentationletter.md |
Cover letter |
interviewquestions.md |
Interview Q&A |
To customise a skill, create ~/.config/laburator/skills/<name>.md with the same filename — it will take precedence over the built-in. For example:
mkdir -p ~/.config/laburator/skills
# Override the CV prompt
cp src/laburator/skills/createcv.md ~/.config/laburator/skills/
# Now edit ~/.config/laburator/skills/createcv.md to your liking
Every skill call receives the job listing (JSON), your CV, and the wiki knowledge base as context automatically.
Output
Results are saved under ~/.local/share/laburator/output/, organized by date:
~/.local/share/laburator/output/
├── cache/ # cached job listings (JSON)
│ └── python-developer/
│ └── jobs.json
└── 2026-06-19/ # one folder per run date
├── ait-python-developer/ # one folder per job
│ ├── job.md # job analysis (skills, summary)
│ ├── cv.md # tailored CV
│ ├── presentation.md # cover letter
│ └── interview.md # interview questions
├── randstad-usa-senior-full-stack-python-developer/
│ └── ...
└── ...
Files appear in real time as each skill completes — you don't have to wait for the full pipeline to finish.
Usage
# Search for jobs (fetch-only, no LLM calls)
laburator search "python developer" --pages 1 --remote
# Run the full pipeline: fetch + LLM analysis + output files
laburator synth "python developer" --pages 1 --remote
# List cached searches
laburator list
# Run a single skill on a cached job
laburator run <job-id> --skill createcv
# Show configuration
laburator config
Verification
Run laburator config to confirm both keys are loaded (they'll be partially masked in the output).
Release files for laburator 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| laburator-0.1.0.tar.gz | 15.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| laburator-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 38.6 kB
Release files / laburator-0.1.0.tar.gz
| Download URL | laburator-0.1.0.tar.gz |
|---|---|
| Size | 15.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
19d11053e63f7dc2bdc744118be6e9c4dd83b0f5641d8204a540c636761f533d
|
|
BLAKE2b-256 checksum How to use checksums |
299f04bb07d3380ff6c4b647f728411ef35d41f77bc5b6c23e6bd28870ff5279
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.5
|
Release files / laburator-0.1.0-py3-none-any.whl
| Download URL | laburator-0.1.0-py3-none-any.whl |
|---|---|
| Size | 22.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a78a1fc6e6b187d6cff494fb95dac2914c5f31eb2ac63a58443e6dce2e65007b
|
|
BLAKE2b-256 checksum How to use checksums |
d57115cdcabf43fb7ce4dd0c5f909873a16ede333265250e4260ffe72cce8d3a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.5
|