Back to work

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.

Manifest V3Chrome APIsJavaScriptPDF.jsClaude API
Independent project
ApplyPilot architecture: a Manifest V3 popup writes to Chrome storage, which triggers on-demand injection of a content script into LinkedIn job cards and the Easy Apply modal. The content script traverses the form; for unknown questions the background service worker optionally calls Claude and caches the answer.Popup UIstart/stop · resumesChrome storageprofile · settingsContent scripton-demand injectLinkedInEasy Apply modalBackgroundservice workerClaude APIoptionalKnown rule?yesLocal answer, deterministicnoClaude fallback→ cached

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.

ApplyPilot architecture: a Manifest V3 popup writes to Chrome storage, which triggers on-demand injection of a content script into LinkedIn job cards and the Easy Apply modal. The content script traverses the form; for unknown questions the background service worker optionally calls Claude and caches the answer.Popup UIstart/stop · resumesChrome storageprofile · settingsContent scripton-demand injectLinkedInEasy Apply modalBackgroundservice workerClaude APIoptionalKnown rule?yesLocal answer, deterministicnoClaude fallback→ cached

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.