applyr
Your AI agent's job application tracker. Score offers, detect duplicates, generate ATS-safe CVs — all from the terminal.
pip install applyr && applyr init && applyr setup-agent
Requires: Python 3.12+ and an AI coding agent (Claude Code, Cursor, OpenCode, or any agent that reads instruction files).
How it works
You: paste a job offer into your AI agent
|
v
Agent: reads cv-master.md + evaluates 6 topics
runs applyr add '<json>'
|
v
applyr: 74% compatibility (>= 65% threshold)
>> RECOMMENDATION: APPLY
Skill gaps: English, Experience
| (you confirm)
v
Agent: generates tailored CV from cv-master.md
runs recruiter review (ATS score: 87/100)
delivers PDF ready to send
applyr is the storage layer. Your AI agent is the brain.
Features
- Weighted scoring — 6 configurable topics (tech stack 30%, projects 20%, experience 15%, education 15%, english 10%, cultural fit 10%)
- Threshold gate — automatic APPLY/SKIP based on your minimum score (default: 65%)
- Duplicate detection — same company+title? applyr catches it before you waste time
- ATS-safe CVs — locked single-column CSS, standard fonts, no images. Your agent fills content, never touches structure
- Recruiter review — built-in prompt scores your CV 0-100 with specific improvements
- 21 commands — pipeline, stats, gaps, trends, salary insights, follow-ups, compare, export, and more
- Local and private — SQLite on your machine. No API keys, no subscriptions, nothing leaves your system
- Agent-native — ships with
AGENT_INSTRUCTIONS.mdthat tells Claude/Cursor/OpenCode exactly what to do
Quick start
1. Install and initialize
pip install applyr
applyr init
This creates ~/.applyr/ with config, database, CV template, and agent instructions.
2. Fill your profile
Edit ~/.applyr/cv-master.md with your complete professional profile. This is the only source of truth — the agent reads it to score offers and write CVs.
3. Connect your agent
applyr setup-agent # Auto-detects Claude/Cursor/OpenCode
applyr setup-agent --agent claude # Or specify: claude | cursor | opencode | generic
Done. Paste a job offer into your agent and say "analyze this".
What your agent sees
You: "Analyze this AI Engineer posting at Acme Corp"
Agent: Checks duplicates → none found
Scores: tech_stack 85%, experience 40%, projects 90%...
applyr add '<json>'
→ "74% match. APPLY recommended. Generate CV?"
You: "Yes"
Agent: applyr cv generate 1 → fills from cv-master.md
applyr cv review → ATS score: 87/100, READY TO SEND
applyr cv pdf → delivers PDF
You: "Analyze this Data Analyst role at SmallCo"
Agent: applyr add '<json>'
→ "42% match. SKIP recommended. Gaps: no R/Tableau, 0 data roles."
You: "What should I learn?"
Agent: applyr gaps → "Experience: seen in 15 offers, avg gap 20%"
Commands
Tracking
applyr add '<json>' # Register offer (agent builds the JSON)
applyr list [--status S] # All offers or filtered
applyr show <id> # Full detail + topic scores
applyr pipeline # Grouped by status
applyr update <id> <status> # Change status, add notes
applyr delete <id> # Remove an offer
applyr search <keyword> # Search by company/title/tech
Analytics
applyr stats # Conversion funnel + metrics
applyr gaps # Skills to improve (by frequency)
applyr trends # Applications per week
applyr summary --json # Weekly summary for LLM
applyr compare 1 3 4 # Side-by-side offers
applyr plan # Learning priorities
applyr salary [--seniority mid] # Salary insights
applyr followups # Overdue + upcoming
CV pipeline
applyr cv generate <id> # ATS HTML skeleton
applyr cv review <file.html> # Recruiter review prompt
applyr cv pdf <file.html> # Chrome headless → PDF
System
applyr doctor # Health check
applyr export --format json # Export everything
applyr version # Show version
Aliases and flags
| Alias | Command | Flag | Effect | |
|---|---|---|---|---|
ls |
list |
--json |
Structured JSON output | |
st |
stats |
--no-color |
Disable colors (also respects NO_COLOR) |
|
fu |
followups |
|||
cmp |
compare |
|||
sal |
salary |
Scoring
Each topic is scored 0-100 by the AI agent, then weighted:
| Topic | Weight | What it measures |
|---|---|---|
tech_stack |
30% | Required technologies vs. your skills |
projects |
20% | Portfolio relevance to the role |
experience |
15% | Years, seniority, industry match |
education |
15% | Degree level and field |
english |
10% | Language level vs. requirement |
cultural_fit |
10% | Work mode, location, values |
Formula: sum(score * weight) / sum(weights) — configurable in ~/.applyr/applyr.toml.
Threshold: score >= 65% → APPLY. Below → SKIP. Configurable.
Status flow
pending ──> applied ──> waiting ──> in_process ──> offer
| | |
v v v
discarded rejected rejected
Configuration
# ~/.applyr/applyr.toml
[general]
threshold = 65 # Min % to recommend applying
followup_days = 10 # Days before follow-up reminder
[weights] # Auto-normalized, no need to sum to 1.0
tech_stack = 30
education = 15
experience = 15
projects = 20
english = 10
cultural_fit = 10
Offer fields reference
| Field | Type | Valid values | Required |
|---|---|---|---|
title |
string | Any | Yes |
company |
string | Any | No |
summary |
string | Any | No |
date_received |
string | YYYY-MM-DD |
No |
date_applied |
string | YYYY-MM-DD |
No |
status |
string | pending applied waiting in_process rejected discarded offer |
No |
canal |
string | linkedin_easy linkedin_direct email portal referral other |
No |
work_mode |
string | remote hybrid onsite |
No |
location |
string | Any | No |
salary_min / salary_max |
integer | Amount | No |
salary_period |
string | annual monthly hourly |
No |
seniority_level |
string | trainee entry_level junior mid senior lead director |
No |
role_category |
string | backend frontend fullstack ai devops data mobile qa other |
No |
tech_stack |
string | Comma-separated | No |
job_url |
string | URL | No |
contact_name / contact_role |
string | Any | No |
cover_letter |
integer | 0 or 1 |
No |
notes |
string | Any | No |
topics |
object | See Scoring section | No |
Project structure
applyr/
cli.py # Entry point
config.py # TOML config
db.py # SQLite schema (28 columns)
scoring.py # Weighted scoring engine
cv.py # ATS CV + Chrome PDF + recruiter review
commands/
core.py # add, list, show, update, delete, search, init, setup-agent
analytics.py # stats, gaps, trends, pipeline, compare, plan, salary
workflow.py # export, doctor
templates/
AGENT_INSTRUCTIONS.md
tests/
test_scoring.py # 54 unit tests
test_config.py
test_db.py
test_validators.py
Development
git clone https://github.com/DeibyGS/applyr.git
cd applyr
pip install -e ".[dev]"
pytest # 54 tests, ~0.1s
Built with AI
applyr was designed to work for AI agents — it made sense to build it with one, as a pair programming partner.
| Human-owned | AI-assisted (human-reviewed) |
|---|---|
| Domain model & 28-column schema | Python implementation |
| Scoring engine & threshold logic | CLI scaffolding |
| ATS CV template & locked CSS | Test suite (54 tests) |
| Architecture & code review | Module split & CI |
Process: Spec (SDD) → AI implementation → Human review → Test → Merge
Principles & metrics
Principles:
- AI never made product decisions — domain model and UX flow are human-designed.
- Every feature started from a written spec (SDD) before any code.
AGENT_INSTRUCTIONS.mdis a contract, not a suggestion.- PRs follow a 400-line budget with work-unit commits.
Metrics:
| PRs | 17 (all human-reviewed) |
| Tests | 54 unit (scoring, config, db, validators) |
| Commands | 21 + 5 aliases |
| Schema | 28 columns, 3 tables, migration system |
| Models | Claude Opus 4.6, DeepSeek V4 Flash |
Measured with ClaudeStat.
License
MIT — use it, fork it, improve it.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file applyr-0.5.1.tar.gz.
File metadata
- Download URL: applyr-0.5.1.tar.gz
- Upload date:
- Size: 46.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
337c4893ebb8a2b4fa0058f563afa09e5bd5bbea576dd7d48089fe6ddea78cff
|
|
| MD5 |
13331e7b54857b6f4e5e8973253f86a7
|
|
| BLAKE2b-256 |
75d313f0063d275cc9381c7d0844a483fc406d22f75f97b7d787cc64a488d8a1
|
File details
Details for the file applyr-0.5.1-py3-none-any.whl.
File metadata
- Download URL: applyr-0.5.1-py3-none-any.whl
- Upload date:
- Size: 46.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0b4efae7cf23855de12c17cdf9190f91d37c8dc161cb87ebe3163751d08569fc
|
|
| MD5 |
7cc082c57b4feed80b7c716fa04165ac
|
|
| BLAKE2b-256 |
c90f21eea004afb232418faf505a78ca402fa2909b1a2577827b75ea795ff7a5
|