job-application-agent β Deep Dive Report
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.
Repository Stats
| Metric | Value |
|---|---|
| Files in repo | 142 |
| Versions published | 9 (in 5 days) |
| Unpacked size | ~218 KB |
| Files in npm tarball | 27 |
| Test files | 7 |
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:
| Component | File | ~Lines | Responsibility |
|---|---|---|---|
| Main CLI | job-application.mjs | ~1100 | Single mega-CLI with command router |
| Secret Store | secret-store.mjs | ~130 | OS keychain abstraction |
| Telemetry Client | telemetry-client.mjs | ~150 | Outbound telemetry client |
| Telemetry Schema | telemetry-schema.mjs | ~160 | Event schemas with enum validation |
| Installer | installer.mjs | ~180 | Skill staging, atomic replace, rollback |
| Scheduler | scheduler.mjs | ~110 | launchd plist / systemd timer / Win Task Scheduler |
Architecture Diagram
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.
Workflow Steps
- Discovery β Agent searches job boards or follows provided URLs
- Scoring β
scoreJob(input, target)evaluates each position against the candidate profile - Decision β Gate engine returns
auto-submit,review, orreject - Application β Agent fills out the form via browser automation
- Ledger β Result is appended to the application ledger with round ID
- 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)
| Gate | Purpose | Action on Fail |
|---|---|---|
| Company exclusion | Block listed companies | Hard reject |
| Eligibility | Check work authorization | Hard reject |
| Posting status | Verify job is still open | Hard reject |
| Location/work-mode | Match preferred location/remote | Hard reject |
| Seniority | Match target level | Hard reject |
| Must-have coverage | Required skills present | Flag for review |
| Compensation floor | Salary meets minimum | Flag for review |
Score Components
| Component | Max Points | Description |
|---|---|---|
| Role family match | +25 | Job title matches candidateβs target role |
| Seniority match | +15 | Level aligns with target (junior/mid/senior/staff) |
| Must-have coverage | +40 | Percentage of required skills the candidate has |
| Location/remote match | +10 | Location preference alignment |
| Industry match | +5 | Candidateβs preferred industries |
| Compensation pass | +5 | Salary 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
Local Storage & Privacy Boundaries
Secret Store
The secret store abstracts OS-native credential management:
| Platform | Mechanism | Implementation |
|---|---|---|
| macOS | Keychain | security CLI command |
| Windows | Credential Manager | PowerShell + DPAPI |
| Linux | β Unsupported | Throws 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
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
job-application-agent telemetry off. The identity stripping is robust but regex-based β edge cases may exist.
Installer & Auto-Updates
Installation Flow
- Validates packaged skill integrity
- Stages to a temp directory
- Atomic replace β swaps the old version with the new in one operation
- 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
| Platform | Mechanism | Schedule |
|---|---|---|
| macOS | LaunchAgent plist | Hourly |
| Linux | systemd timer | Hourly |
| Windows | Scheduled Task | Hourly |
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
| Action | Reason |
|---|---|
| Authentication / passwords | Never handle credentials in the browser |
| Legal attestations | Cannot click βI agree to termsβ on userβs behalf |
| Demographic questions | Race, gender, disability β agent skips these |
| Ambiguous claims | Wonβ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
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.