Dashboard

job-application-agent β€” Deep Dive Report

Version 1.0.0
Date Aug 20, 2026
Tags
code-reviewnpm-packageagent-skills
Summary: A comprehensive code review and architectural analysis of the job-application-agent npm package β€” an Agent Skill + CLI that lets coding agents discover, evaluate, fill out, submit, and track job applications autonomously.

What It Does (TL;DR)

An Agent Skill + CLI that lets a coding agent discover, evaluate, fill out, submit, and track job applications on a candidate’s behalf. It packages:

  • A deterministic scoring engine in pure Node.js (no LLM calls required for the math)
  • Local state management with append-only ledgers, attention queues, and friction logs
  • OS-backed secure storage (macOS Keychain / Windows Credential Manager) for the candidate profile
  • Privacy-preserving telemetry that ships through a Cloudflare Worker β†’ PostHog pipeline with strict identity stripping
  • An installer that drops the skill into ~/.agents/skills/ and registers an hourly auto-update background job

The agent is told to use it via natural language (β€œsearch jobs”, β€œapply https://…”, β€œshow attention queue”) and the CLI handles all the deterministic bookkeeping. The agent itself only does browser interaction + discovery.

πŸ’‘ Key Insight
The architecture cleanly separates deterministic logic (scoring, state, telemetry) from non-deterministic logic (browser interaction, form filling) β€” the agent handles the fuzzy stuff, the CLI handles the math.

Repository Stats

MetricValue
Files in repo142
Versions published9 (in 5 days)
Unpacked size~218 KB
Files in npm tarball27
Test files7

File Layout

job-application-agent/
β”œβ”€β”€ bin/
β”‚   └── job-application-agent.mjs      ← npm bin entry
β”œβ”€β”€ installer/
β”‚   └── src/
β”‚       β”œβ”€β”€ cli.mjs                     ← install/update/status commands
β”‚       β”œβ”€β”€ installer.mjs               ← staging, rollback, vendor copy
β”‚       β”œβ”€β”€ runner.mjs                  ← auto-update shell script gen
β”‚       └── scheduler.mjs               ← launchd / systemd / Task Scheduler
β”œβ”€β”€ job-application-agent/
β”‚   β”œβ”€β”€ SKILL.md                        ← agent-facing spec
β”‚   β”œβ”€β”€ references/
β”‚   β”‚   β”œβ”€β”€ ANALYTICS.md
β”‚   β”‚   β”œβ”€β”€ APPLICATION_GUIDANCE.md
β”‚   β”‚   β”œβ”€β”€ AUTONOMY.md
β”‚   β”‚   β”œβ”€β”€ BROWSER_UPLOADS.md
β”‚   β”‚   β”œβ”€β”€ RUNS.md
β”‚   β”‚   └── SCHEMAS.md
β”‚   β”œβ”€β”€ scripts/
β”‚   β”‚   β”œβ”€β”€ job-application.mjs         ← main CLI (command router)
β”‚   β”‚   β”œβ”€β”€ secret-store.mjs            ← keychain/cred manager wrapper
β”‚   β”‚   β”œβ”€β”€ telemetry-client.mjs        ← outbound telemetry
β”‚   β”‚   β”œβ”€β”€ telemetry-schema.mjs        ← event validation
β”‚   β”‚   └── windows-profile-store.ps1   ← DPAPI wrapper for Win
β”‚   └── tests/                          ← 7 test files
β”œβ”€β”€ LICENSE
β”œβ”€β”€ package.json
β”œβ”€β”€ README.md
β”œβ”€β”€ SECURITY.md
└── scripts/
    β”œβ”€β”€ ci/
    β”œβ”€β”€ smoke-package.mjs
    └── ...

Architecture & Components

The system is composed of several tightly-scoped modules, each with clear responsibilities:

ComponentFile~LinesResponsibility
Main CLIjob-application.mjs~1100Single mega-CLI with command router
Secret Storesecret-store.mjs~130OS keychain abstraction
Telemetry Clienttelemetry-client.mjs~150Outbound telemetry client
Telemetry Schematelemetry-schema.mjs~160Event schemas with enum validation
Installerinstaller.mjs~180Skill staging, atomic replace, rollback
Schedulerscheduler.mjs~110launchd plist / systemd timer / Win Task Scheduler

Architecture Diagram

AI Agent (Claude / Cursor / Copilot / Codex) Natural language commands β†’ browser interaction β†’ form filling job-application.mjs β€” Command Router (~1100 lines) Scoring Engine scoreJob() Ledger System Append-only Round Manager Batch tracking Friction Log UX issues Secret Store Keychain / DPAPI Telemetry β†’ CF Worker β†’ PostHog Installer Atomic + Rollback Auto-Updater launchd / systemd Vendor Sync Targets ~/.codex/skills/ Β· ~/.claude/skills/ Β· ~/.cursor/skills/ Β· ~/.copilot/skills/ Β· ~/.gemini/skills/
Figure 1 β€” High-level architecture: Agent layer β†’ CLI core β†’ Infrastructure layer β†’ Vendor sync

Workflow: How a Job Gets Applied To

The system uses a round-based execution model for batch operations. When the agent starts a batch, it initiates a β€œround” with a target count:

{
  roundId: "round-2026-08-20-001",
  requestedCount: 30,
  startedAt: "2026-08-20T10:00:00Z",
  status: "active"
}

Each roundId gets attached to ledger entries throughout the round. The round-complete logic rejects if you didn’t hit the target count, enabling resumable workflows across agent sessions and crash recoveries.

πŸ“ Design Choice
Round-based tracking means a crashed agent can resume exactly where it left off. The ledger is the source of truth β€” not the agent's memory.

Workflow Steps

  1. Discovery β€” Agent searches job boards or follows provided URLs
  2. Scoring β€” scoreJob(input, target) evaluates each position against the candidate profile
  3. Decision β€” Gate engine returns auto-submit, review, or reject
  4. Application β€” Agent fills out the form via browser automation
  5. Ledger β€” Result is appended to the application ledger with round ID
  6. Follow-up β€” Attention queue surfaces applications needing responses

Scoring Engine Deep Dive

The core scoreJob(input, target) function is a deterministic gate-decision engine. No LLM calls β€” just pure math.

Decision Gates (in order)

GatePurposeAction on Fail
Company exclusionBlock listed companiesHard reject
EligibilityCheck work authorizationHard reject
Posting statusVerify job is still openHard reject
Location/work-modeMatch preferred location/remoteHard reject
SeniorityMatch target levelHard reject
Must-have coverageRequired skills presentFlag for review
Compensation floorSalary meets minimumFlag for review

Score Components

ComponentMax PointsDescription
Role family match+25Job title matches candidate’s target role
Seniority match+15Level aligns with target (junior/mid/senior/staff)
Must-have coverage+40Percentage of required skills the candidate has
Location/remote match+10Location preference alignment
Industry match+5Candidate’s preferred industries
Compensation pass+5Salary above floor

Auto-Submit Guard

The auto-submit threshold is intentionally strict β€” all conditions must be met:

decision === "review"
seniority === "senior" || seniority === "staff"
no experience mismatch
score >= 80
must-have coverage >= 70%
all gates passed
⚠️ Safety Note
Auto-submit is off by default. The agent operates in review-each mode unless explicitly told to auto-submit, and even then, the guard checks are strict.

Local Storage & Privacy Boundaries

Secret Store

The secret store abstracts OS-native credential management:

PlatformMechanismImplementation
macOSKeychainsecurity CLI command
WindowsCredential ManagerPowerShell + DPAPI
Linux❌ UnsupportedThrows explicit error

Ledger System

All state changes are written to append-only ledgers with:

  • Idempotency keys β€” prevents duplicate applications
  • Duplicate detection β€” same job URL + company flagged
  • Round accounting β€” tracks counts per round for batch completion checks
  • Friction logs β€” records UX issues encountered during application for later review
πŸ’‘ Privacy Win
The candidate profile (name, contact, work history) never touches the filesystem as plaintext. It lives in the OS keychain, encrypted at rest by the OS itself.

Telemetry Pipeline

The telemetry system is designed to be privacy-preserving while still useful for the developer.

Event Architecture

  • 13 documented event types with strict enum validation
  • Max 4 KB payload per event
  • Events validated against schema before sending
  • Ships to Cloudflare Worker β†’ PostHog

Identity Stripping

The containsDirectIdentity() function uses regex to reject payloads containing:

  • Email addresses
  • Phone numbers
  • URLs (may contain identifying paths)
  • LinkedIn/GitHub profile references
⚠️ Telemetry is ON by Default
Telemetry is enabled out of the box. Disable via the CLI command: job-application-agent telemetry off. The identity stripping is robust but regex-based β€” edge cases may exist.

Installer & Auto-Updates

Installation Flow

  1. Validates packaged skill integrity
  2. Stages to a temp directory
  3. Atomic replace β€” swaps the old version with the new in one operation
  4. Rollback β€” if anything fails mid-install, the previous version is restored

Vendor Sync

The installer copies the skill to all known agent vendor directories:

~/.codex/skills/
~/.claude/skills/
~/.cursor/skills/
~/.copilot/skills/
~/.gemini/skills/

Auto-Update Scheduler

PlatformMechanismSchedule
macOSLaunchAgent plistHourly
Linuxsystemd timerHourly
WindowsScheduled TaskHourly

Auto-update can be disabled via CLI. The installer also supports manual update and status commands.

Safety Guardrails

Hard Stops β€” Agent Will NOT Do These

ActionReason
Authentication / passwordsNever handle credentials in the browser
Legal attestationsCannot click β€œI agree to terms” on user’s behalf
Demographic questionsRace, gender, disability β€” agent skips these
Ambiguous claimsWon’t fabricate experience or skills

Browser Session Rules

  • Never inspect cookies or local storage
  • Reuses the existing browser session (doesn’t create new logins)
  • Privileged path-based upload β€” uses known upload paths, not page scraping

Submission Rules

  • No submission without visible confirmation (agent must see a success state)
  • Duplicate detection prevents applying to the same job twice
  • Default mode: review-each β€” human reviews each application before submit
πŸ“ Balanced Approach
The guardrails are thoughtful β€” they prevent the agent from making legally binding decisions while still allowing genuine automation of the tedious parts (searching, scoring, form-filling).

Final Verdict

What It Does Well βœ…

  • Architecture is thoughtful β€” clean separation of deterministic vs. non-deterministic logic
  • Privacy claims backed by code β€” keychain integration is real, telemetry stripping is implemented
  • Credential handling is real β€” not just β€œstore in a JSON file”, actual OS keychain
  • Append-only ledgers β€” crash-safe, auditable, resumable
  • Auto-update opt-out β€” respects user autonomy
  • Honest about scope β€” doesn’t overpromise

Caveats ⚠️

  • 9 versions in 5 days β€” very early, API may still be shifting
  • Linux unsupported for profile store (major gap for developer audience)
  • Telemetry on by default β€” should be opt-in for a privacy-focused tool
  • PostHog retention caveat β€” data lives on third-party infra
  • Single-author project β€” bus factor of 1
  • Browser-uploads still requires agent for form-filling β€” not fully autonomous

Recommendation

If you…Verdict
Are on macOS/Windowsβœ… Worth trying
Want privacy-respecting deterministic agent skillβœ… Good fit
Are comfortable with Node + browser automationβœ… Good fit
Want hosted SaaS❌ Not for you
Need multi-user support❌ Not for you
Are on Linux❌ Wait for support
Want battle-tested project❌ Too early

Bottom line: Pin v3.1.1, disable telemetry first, and give it a shot on macOS. The architecture is sound β€” the main risks are project maturity and single-author dependency.