The Problem
Job‑seeking professionals must repeatedly locate postings, evaluate fit, and fill web forms while protecting personal data. Manual copy‑paste is error‑prone, and most automation tools store résumés or credentials in the cloud, violating privacy expectations.
What This Does
The repository ships a privacy‑first “Agent Skill” that can be invoked from a coding agent or the command line.
bin/job-application-agent.mjsis the published CLI entry point (npx job-application-agent@latest install). It boots the installer located ininstaller/src/cli.mjs.- The installer (
installer/src/installer.mjs,runner.mjs,scheduler.mjs) copies the skill into the user’s~/.agents/skills/tree, registers automatic update checks, and writes a local ledger that never leaves the host. - Core job‑application logic lives in
job-application-agent/scripts/job-application.mjs(≈830 LOC). It orchestrates discovery, qualification, and form‑filling using the résumé stored by the secret store (job-application-agent/scripts/secret-store.mjs). - Telemetry is isolated in the
telemetry-workersub‑project.telemetry-worker/src/worker.mjsreceives anonymised usage events fromjob-application-agent/scripts/telemetry-client.mjsand persists them in a Cloudflare Workers KV (defined intelemetry-worker/wrangler.jsonc). The schema for those events is defined injob-application-agent/scripts/telemetry-schema.mjs.
How It Is Wired
- Entry point –
bin/job-application-agent.mjsparses the invoked sub‑command and immediately importsinstaller/src/cli.mjs. - CLI flow –
cli.mjsvalidates arguments, then callsinstaller/src/installer.mjsto perform the filesystem copy and schedule periodicnpmchecks (via thescheduler.mjshelper). - Skill activation – Once installed, an agent loads the skill from
~/.agents/skills/job-application-agent. The agent calls the exported function injob-application-agent/scripts/job-application.mjs. This file is the widest‑impact hub (5 incoming imports, 3 outgoing, instability 0.75). - Discovery & qualification – Inside
job-application.mjsthe code branches heavily (≈70 branch points) to handle different ATS platforms, duplicate detection, and eligibility checks. It reads the résumé fromsecret-store.mjsand writes confirmed applications to a local ledger (installer/src/runner.mjsassists with file I/O). - Telemetry – After each successful step,
telemetry-client.mjsformats an event pertelemetry-schema.mjsand posts it to the worker endpoint (telemetry-worker/public/index.htmlloadsdashboard.js). The worker (worker.mjs) stores the event in KV and updates the public dashboard (public/dashboard.js). - Update loop –
installer/src/scheduler.mjsruns on login and hourly (macOS/Linux/Windows) to invokeinstaller/src/cli.mjswith theupdatesub‑command, which pulls the latest npm version and swaps the skill directory atomically.
No circular dependencies were found; the most connected modules are telemetry-schema.mjs, telemetry-client.mjs, and the installer components. The large monolith job-application.mjs has the highest blast radius because many other modules import it and it imports three others.
How To Use It
# Install the skill (the only required command)
npx job-application-agent@latest install
# Verify installation and update mode
npx job-application-agent@latest status
# Manually trigger an update
npx job-application-agent@latest update
The installer writes to ~/.agents/skills/job-application-agent and creates a hidden ledger at ~/.agents/skills/job-application-agent/.ledger. No additional environment variables are required out‑of‑the‑box. To run the telemetry dashboard locally, serve telemetry-worker/public with any static server (e.g., npx serve telemetry-worker/public).
Real‑World Use
A developer integrates the skill into a personal AI assistant:
import runJobApp from '~/.agents/skills/job-application-agent/scripts/job-application.mjs';
await runJobApp({ resumePath: '~/resume.pdf', target: 'software engineer' });
The assistant calls runJobApp, which discovers matching postings, scores them, fills the forms using the local résumé, and records each submission in the private ledger while sending anonymised metrics to the public dashboard.
Code Health & Issues
- MEDIUM – Enable Dependabot or Renovate – only one manifest (
package.json) and no bot config. Add.github/dependabot.yml. - MEDIUM – Dependency‑vulnerability scan missing – CI workflows lack a scan step. Insert
dependency-review-actionorosv-scanner. - MEDIUM – Checkout persists token –
publish-npm.ymlchecks out with default credentials; setpersist-credentials: falseand supply a token only to the push step.
Additional observations:
- Tests exist for installer, skill, and telemetry (
installer/tests/*.mjs,job-application-agent/tests/*.mjs,telemetry-worker/tests/*.mjs). - No Dockerfile, so containerised deployment must be added manually if required.
- Documentation is limited to
README.md,SKILL.md, and a few reference markdown files; API‑level docs are absent.
The Bottom Line
The repo delivers a functional, privacy‑oriented job‑application automation skill with a clear install path and solid test coverage. High cognitive load in job-application.mjs and lack of automated dependency management are the primary technical liabilities. It is suitable for engineers comfortable refactoring large scripts and who need a self‑hosted solution for private job‑search automation.