Browser Automation · Applied AI
ApplyPilot
Job Application Automation Chrome Extension
A Manifest V3 extension combining deterministic Easy Apply automation, local resume matching, and optional Claude fallback.
Problem
Repetitive application forms contain a mix of predictable fields, site-specific UI behavior, resume-selection decisions, and occasional open-ended questions. ApplyPilot was built to automate the deterministic parts while keeping the LLM as a bounded fallback rather than the default decision-maker.
Architecture
The extension uses a Manifest V3 popup, Chrome storage, a background service worker, and an on-demand injected content script. The content script handles LinkedIn interaction and form traversal; the service worker handles state updates and optional Claude requests.
The popup handles profile/settings, start/stop, autofill-only mode, resume management, live counts/history, exports, and optional AI configuration. The content script handles job discovery, Easy Apply detection, filtering/skipping, form traversal, field filling, resume upload, submit/dismiss flow, and recovery logic. The background service worker handles state updates, optional Anthropic/Claude requests, and answer caching/logging.
Browser automation loop
The content script discovers Easy Apply jobs on the page, filters or skips them using blacklist and already-applied detection, traverses and fills the form fields, uploads the selected resume, then submits or dismisses before moving to the next job, with recovery logic for stuck pages and frozen modals along the way.
Resume Matching
Local PDF extraction
Users can upload multiple resumes. PDF text is extracted locally with bundled PDF.js, combined with editable resume keywords, and scored against each job.
Weighted resume matching
Manual keywords receive 3x weight, extracted CV terms 2x, and filename terms 1x. The highest-scoring resume is selected for the application.
Form Logic
Deterministic-first handling
Common fields are handled locally from saved profile settings and label-based rules rather than being sent to an LLM. The extension recognizes patterns around contact information, experience, salary, work authorization, relocation, language proficiency, education, and related application fields.
Optional Claude fallback
If an unknown question cannot be answered by deterministic logic and AI answering is enabled, the extension sends the relevant profile, job context, selected CV text, and unanswered questions to Claude. Answers are requested as structured JSON and cached locally by normalized field type and label.
Claude fallback is optional and opt-in. Not every application or field calls Claude, only the questions the deterministic rules cannot resolve.
Answer cache
When the same normalized question appears again, the cached answer is reused locally instead of making a new Anthropic call.
Reliability
Start/Stop and recovery
Automation only starts after an explicit user action. The workflow detects already-applied roles, skipped jobs, stuck states, frozen modals, and LinkedIn's daily Easy Apply limit, and provides Stop controls and recovery paths.
Tracking and debugability
Applied and skipped jobs are recorded with reasons/status, with live counters, CSV export, and an AI debug log for auditing optional LLM interactions.
Privacy
Local extraction
PDF extraction and resume matching run locally.
Opt-in Anthropic request boundary
The Anthropic request path is opt-in; CV/job context is only sent when the Claude fallback is enabled and needed.
Limitations
- · LinkedIn DOM/UI changes can break selectors and require maintenance.
- · Browser automation depends on page state and modal behavior.
- · Deterministic rules cannot cover every possible application question.
- · Claude fallback requires the user's API key and network access.