Local-first job application assistant for sourcing roles, scoring fit, generating tailored application materials, and experimenting with browser-based ATS automation.
ApplyAI is the project I am actively building to solve my own job-search workflow: reduce repetitive application work while keeping human review in the loop for risky or irreversible steps.
This repository is a work in progress. The product surface, data model, and automation pipeline are implemented enough to run locally and demonstrate the architecture, but it is not a hosted production service.
Current focus:
- Reliable local job queue and profile workflow
- Resume parsing and application material generation with Anthropic
- Review-first browser automation for Greenhouse, Lever, and agentic ATS flows
- Safer pauses for captcha, novel questions, and final-submit review
Not production-ready yet:
- Broad real-world ATS validation across every form variant
- Multi-user deployment hardening
- Full regression test suite for live browser automation
- Hosted demo environment
- User auth with NextAuth, Prisma, SQLite, and local email/password accounts
- Resume upload and profile extraction from PDF text
- Job ingestion from RemoteOK, Greenhouse, Lever, and Arbeitnow
- Job queue with match scoring, status tracking, and source metadata
- Claude-powered match scoring, resume tailoring, cover-letter drafting, and tone checks
- Autopilot, review, and manual operating modes
- Fast-path submitters for Greenhouse and Lever
- Playwright-based agentic fallback for Workday, SuccessFactors, iCIMS, Taleo, LinkedIn, Indeed, Glassdoor, ZipRecruiter, and custom apply pages
- Captcha pause/resume flow with desktop notification
- Review-before-submit pause so the user approves before the final submit click
- Saved-answer cache for recurring custom application questions
- Selector/template cache for repeated ATS form shapes
- Live AI activity panel for scoring, preparation, submission, pauses, and failures
As an international student on a tight job-search timeline, I wanted a system that could help me move faster without blindly submitting low-quality applications. ApplyAI is a technical operations project wrapped around a real personal problem: intake jobs, rank them, prepare application assets, and automate repetitive form work while preserving human control where mistakes carry account, reputation, or compliance risk.
The interesting engineering problem is not just "fill forms." It is orchestration under uncertainty: unreliable external sites, changing DOMs, anti-bot controls, rate limits, model cost limits, human approval checkpoints, and durable state when a workflow pauses midway.
Job sources
-> normalization and dedupe
-> Prisma job/application queue
-> match scoring and asset generation
-> mode-aware pipeline tick
-> ATS strategy selection
-> fast-path submitter or agentic Playwright flow
-> captcha/question/review pause states
-> status, logs, and notifications
Core modules:
src/lib/jobSources/: RemoteOK, Greenhouse, Lever, and Arbeitnow ingestionsrc/lib/applicationPipeline.js: queue orchestration, scoring, preparation, submit handoffsrc/lib/applySubmit/meta.js: ATS detection and strategy selectionsrc/lib/applySubmit/greenhouse.js: Greenhouse fast-path submittersrc/lib/applySubmit/lever.js: Lever fast-path submittersrc/lib/applySubmit/agent.js: Playwright + Claude-guided fallback flowsrc/lib/applySubmit/captcha.js: captcha detection and pause handlingsrc/lib/applySubmit/answerDrafts.js: custom-question answer drafting and cache supportsrc/components/AiPanel.jsx: live activity, approval, resume, and answer chipsprisma/schema.prisma: users, profiles, jobs, applications, logs, saved answers, and ATS templates
| Mode | Behavior |
|---|---|
| Manual | Jobs can be reviewed and prepared, but the pipeline does not submit automatically. |
| Review | The system scores and prepares applications, then waits for approval before submission. |
| Autopilot | The system scores, prepares, and attempts submission within daily caps, risk checks, and pause conditions. |
Even in Autopilot, the app pauses for captcha, unknown custom questions, and review-before-submit checkpoints.
| Apply target | Current strategy |
|---|---|
| Greenhouse | Fast-path form submitter, with agent handoff for complex fields |
| Lever | Fast-path form submitter, with agent handoff for complex fields |
| Workday, SuccessFactors, iCIMS, Taleo | Agentic Playwright flow |
| LinkedIn, Indeed, Glassdoor, ZipRecruiter | Agentic flow, labeled high-risk |
| Mailto/email-only | Manual fallback |
| Unknown/custom company pages | Agentic fallback |
The goal is not to bypass platform controls. Captchas and final submission are intentionally human-gated.
- Next.js 14.2, React 18
- Prisma + SQLite
- NextAuth
- Anthropic SDK
- Playwright and Playwright Extra
- Zod
- PDF parsing with
pdf-parse
npm install
cp .env.example .env.local
npx prisma migrate dev
npm run devOpen http://localhost:3000.
Required environment values:
DATABASE_URL="file:./dev.db?connection_limit=1"
NEXTAUTH_SECRET="change-me-to-a-long-random-string"
NEXTAUTH_URL="http://localhost:3000"
ANTHROPIC_API_KEY="sk-ant-..."
ANTHROPIC_MODEL="claude-sonnet-4-6"Notes:
postinstallrunsprisma generateand installs Playwright Chromium.- Browser automation works best with a real Chrome or Edge profile path configured in Settings.
- Close Chrome/Edge before running automation against the same profile.
| Command | Purpose |
|---|---|
npm run dev |
Start the local development server |
npm run build |
Generate Prisma client and build Next.js |
npm run start |
Start the built app |
npm run browser:install |
Install Playwright Chromium manually |
npm run db:migrate |
Create/apply Prisma migrations |
npm run db:studio |
Open Prisma Studio |
Verified locally:
- Prisma client generation
- Database migration flow
- Production build with
npm run build - ESLint with
npm run lint(currently passes with two warnings) - Local app startup and unauthenticated redirect to login
Not fully exercised in public verification:
- Live end-to-end submission across real third-party job boards
- Real captcha challenge/resume flow
- Account-risk behavior on LinkedIn, Indeed, Glassdoor, or ZipRecruiter
ApplyAI is intentionally conservative around irreversible actions. Captchas are paused for the user, high-ban-risk sources are labeled, and final submit review is enabled by default. The app should be treated as a local research/prototype tool, not a guarantee that every external application flow can or should be automated.