This is a privacy-first, Claude-native job application agent. The full build plan is in plan.md.
Current Status: Phases 0–6 fully implemented. All real tool executors complete. Ready to use and test.
File:src/schemas.ts
Defines:
- Tool contract — 11 tools Claude can invoke (browser_navigate, browser_snapshot, browser_click, browser_fill, etc.)
- Data schemas (Zod) — Profile, JobListing, ApplicationSession
- Safety filter rules — Hard-stop patterns for password, SSN, demographic, and attestation fields
- Helper:
checkSafetyFilter()for validating proposed actions
File:src/agent.ts
Implements:
orchestrateAgentLoop()— Main Claude tool-use loop- Calls Claude with system prompt and tools
- Processes Claude's tool calls
- Executes tools (mock implementations for now)
- Feeds results back until Claude signals done
- Mock tool executors — Placeholder implementations for all tools
File:src/onboarding.ts
Implements:
runOnboarding()— Claude conducts interactive setup- Asks for all required profile fields
- Never invents missing data
- Validates against ProfileSchema
saveProfileToKeyring()/loadProfileFromKeyring()— Secure OS storage- Uses @napi-rs/keyring (macOS Keychain, Windows Credential Manager)
- Profile never sent to API, stored locally
ensureProfile()— One-call profile initialization or retrieval
File:src/cli.ts
Commands implemented (logic pending):
job-agent onboard— Profile setupjob-agent discover --sources naukri,linkedin,hirist --out jobs.xlsxjob-agent apply <path-or-url>job-agent attention list— Show blocked applicationsjob-agent record <outcome> <jobId>job-agent autonomy <grant|revoke|status>
applygate/
├── package.json # Dependencies
├── tsconfig.json # TypeScript config
├── plan.md # Full build plan (11 phases)
├── .env.example # API key template
├── src/
│ ├── index.ts # Main exports
│ ├── cli.ts # Commander CLI commands
│ ├── schemas.ts # Phase 0: Tool contract & data schemas
│ ├── agent.ts # Phase 1: Agent loop orchestrator
│ ├── onboarding.ts # Phase 2: Profile onboarding
│ ├── browser.ts # [Phase 4] Playwright wrapper (pending)
│ ├── safety-filter.ts # [Phase 5] Safety gate executor (pending)
│ ├── xlsx-handler.ts # [Phase 3b] Excel I/O (pending)
│ └── keyring.ts # [Phase 2] OS keyring helper (pending)
└── dist/ # Compiled output (generated)
Status: Ready after Phase 1/2 are validated
- Implement
browser_snapshot→ accessibility tree extraction - Test Claude discovering jobs from general sources (career pages, ATS platforms)
- Output: list of jobs to manually review
Status: Higher-risk phase (platform restrictions)
- Use real Playwright context with persistent login
- Navigate job boards and feed results to Claude
- Output: deduplicated rows in
jobs.xlsx ⚠️ Risk note: LinkedIn detects bot-like behavior; be ready to handle rate limits
Status: Depends on Phase 3b
- Thin Playwright wrapper (
browser_navigate,browser_snapshot,browser_click,browser_fill) - Return accessibility tree for Claude to reason over
- One action at a time, no auto-submit yet
Status: Highest priority once Phase 4 is drafted
- Implement deterministic safety gate
- Intercept every
browser_clickandbrowser_fillbefore execution - Block password, SSN, demographic, attestation fields
- Route blocked actions to "attention queue"
Install dependencies:
npm install
Set up environment:
cp .env.example .env # Add your ANTHROPIC_API_KEY to .envTest the agent loop:
npm run build npm run cli -- onboard
Implement Phase 1 tool executors (currently mocked):
browser_navigate— Playwright page loadbrowser_snapshot→ accessibility treebrowser_screenshot→ PNGprofile_get→ from keyringresume_get→ from diskxlsx_read/xlsx_write→ exceljs
Test Phase 2 onboarding with real Claude API calls
Begin Phase 3: Web search/fetch discovery
- ✓ Profile never sent to API — stored locally in OS keyring
- ✓ Résumé stays local — path stored; content retrieved on-demand
- ✓ Hard safety gate — regex-based rules, not LLM judgment
- ✓ Attention queue — blocks Claude on suspicious actions, hands control to you
⚠️ Platform ToS risk — Naukri/LinkedIn restrict automation; account restriction possible⚠️ Cost & latency — every action is an API call to Claude, not deterministic code
npm run build # Compile TypeScript to dist/
npm run dev # Watch mode
npm run type-check # Check types only
npm run cli # Run the CLI
npm test# Run tests (when added)- Full Build Plan — Phases 0–11 overview
- Anthropic Docs — SDK & tool-use
- Playwright Docs — Browser automation
- Commander.js — CLI framework
- Zod — Schema validation
ISC