Skip to main content

applyr

Your AI agent's job application tracker — score offers, detect duplicates, generate ATS-safe CVs, all from the terminal.

applyr is the storage layer; your AI coding agent is the brain. Paste a job offer, get a weighted 0–100 compatibility score, an APPLY / SKIP recommendation, skill gaps, and a tailored ATS-safe CV — local, private, agent-native.

Fast to start — one command. Local-first — SQLite on your machine, no API keys, nothing leaves your system.

PyPI version PyPI downloads License: MIT Python CI tests PRs Welcome

FeaturesQuick StartCommandsScoringConfigurationContributing

pip install applyr && applyr init && applyr setup-agent

[!NOTE] Requires Python 3.11+ 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

  • Three-state recommendation — APPLY (>=80%), MAYBE (60-79%), LOW MATCH (<60%) with configurable thresholds
  • Skill-level breakdown — Strong/Partial/Missing per topic with icons (✓/△/✕)
  • "Why you match" — Executive summary of strengths and weaknesses
  • Weighted scoring — 6 configurable topics (tech stack 30%, projects 20%, experience 15%, education 15%, english 10%, cultural fit 10%)
  • Score breakdown — Weighted contribution per topic so you understand why 78%
  • CV tailoring hints — What to emphasize, what to de-emphasize in your CV
  • 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.md that 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>            # Markdown CV with YAML frontmatter
applyr cv review <file.md>         # Recruiter review prompt (accepts .md or .html)
applyr cv pdf <file.md>            # Markdown → ATS-HTML → PDF via Chrome

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
language string en es — the language the CV is written in. Defaults to [cv] language in applyr.toml 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 (offers: 31 columns)
  scoring.py             # Weighted scoring engine
  cv.py                  # Markdown CV + Chrome PDF + recruiter review
  md_render.py           # Narrow markdown → ATS-HTML converter
  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_cli_routing.py    # 115 tests, cli router coverage
  test_cv.py             # CV pipeline tests
  test_md_render.py      # Markdown renderer tests
  test_db.py             # Schema + migration tests
  test_scoring.py        # Scoring engine tests
  test_config.py         # Config loading tests
  test_validators.py     # Input validation tests
  ...

Development

git clone https://github.com/DeibyGS/applyr.git
cd applyr
pip install -e ".[dev]"
pytest                             # 296 tests, ~3s

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 (296 tests)
Architecture & code review Module split & CI

Process: Spec (SDD) → AI implementation → Human review → Test → Merge

Principles & metrics

Principles:

  1. AI never made product decisions — domain model and UX flow are human-designed.
  2. Every feature started from a written spec (SDD) before any code.
  3. AGENT_INSTRUCTIONS.md is a contract, not a suggestion.
  4. PRs follow a 400-line budget with work-unit commits.

Metrics:

PRs 37 (all human-reviewed)
Tests 296 (cli, cv, md_render, db, scoring, config, validators)
Commands 21 + 5 aliases
Schema 31 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

applyr-1.2.0.tar.gz (104.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

applyr-1.2.0-py3-none-any.whl (83.2 kB view details)

Uploaded Python 3

File details

Details for the file applyr-1.2.0.tar.gz.

File metadata

  • Download URL: applyr-1.2.0.tar.gz
  • Upload date:
  • Size: 104.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.5

File hashes

Hashes for applyr-1.2.0.tar.gz
Algorithm Hash digest
SHA256 e21eb32b50052d6f42b4b351b2b1cf31af3b7c9233d55262a4add5e344419bc8
MD5 f8af50aa74a44541cee16f16459432ca
BLAKE2b-256 24f231b910ca82a0f79f77954579b3bdb6143a72456a4a4a6f11d19be906506e

See more details on using hashes here.

File details

Details for the file applyr-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: applyr-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 83.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.5

File hashes

Hashes for applyr-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e440666aa2bcf09fbd10e7db4d7010d5fd2caca81d58dff602854c2a6a87f601
MD5 607c36ba350fc3ac473380a15021e00d
BLAKE2b-256 2de8db75988c5baaa397b5382f7cf9dbed61492fb705437c0ff7b0952c79bc93

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page