Answer custom application questions in one click.
AnswerSpark is a Chrome Extension (Manifest V3) that detects free-text question fields on job application pages — Ashby, Greenhouse, Lever, Workable, Workday, LinkedIn Easy Apply, SmartRecruiters, iCIMS, plus any other page on demand — and generates a tailored answer based on the job description, your saved profile, and your text resume. You review it in a popover and click Insert.
- One click per question. No bulk autofill, no auto-submit.
- Your provider, your key. OpenAI (default) or Anthropic. Keys live in
chrome.storage.localand are sent only toapi.openai.com/api.anthropic.com. - No backend. No accounts. No analytics. Everything is local.
npm install
npm run buildThis produces a dist/ folder. Then in Chrome:
- Open
chrome://extensions. - Toggle Developer mode on.
- Click Load unpacked and pick the
dist/folder. - Pin AnswerSpark to your toolbar.
- First-time install opens the Settings page automatically — fill in profile, paste your resume, and add an API key.
For live-reload during development:
npm run devThen load the printed dist/ folder in Chrome the same way.
- OpenAI (default): https://platform.openai.com/api-keys — key starts with
sk-. Default model isgpt-4o-mini(fast and cheap). - Anthropic: https://console.anthropic.com — key starts with
sk-ant-. Default model isclaude-sonnet-4-5. Direct-from-browser calls are enabled via theanthropic-dangerous-direct-browser-accessheader; only your own key is exposed (locally) and only to Anthropic.
Choose your provider in Settings → AI provider & API key, paste the key, and click Test key to verify. Keys are stored separately per provider, so switching providers doesn't wipe the other key.
- Open a job application on any supported site.
- AnswerSpark adds a small spark button to each detected free-text question.
- Click the spark → review the answer in the popover.
- Tweak tone (Professional / Conversational / Concise), regenerate, or edit inline.
- Click Insert to fill the field. The popover closes and the spark flashes green.
For unsupported pages, click the AnswerSpark icon in your toolbar and hit Scan this page. The extension injects itself via chrome.scripting + activeTab and runs the same detector.
jobs.ashbyhq.com,*.ashbyhq.comboards.greenhouse.io,job-boards.greenhouse.io,*.greenhouse.iojobs.lever.coapply.workable.com,*.workable.com*.myworkdayjobs.com,*.myworkdaysite.comwww.linkedin.com/jobs/*, plus Easy Apply modalsjobs.smartrecruiters.com*.icims.com- Any other page via Scan this page in the popup.
Gets a spark:
<textarea>fields- Long-form text inputs whose label looks like a question (length > 25 chars, contains
?, or starts withwhy / describe / tell us / explain / how / what / share / elaborate) contenteditable="true"answer boxes (e.g., Workday)
Skipped:
- Identity fields: name, email, phone, address, LinkedIn URL, salary, dates, school/company/title, demographic fields, sponsorship/referral questions
- Hidden, disabled, or read-only fields
- Search boxes, password / email / tel / number / url inputs, file uploads, dropdowns, radios, checkboxes
- Anything already decorated with
data-answerspark="1"(no duplicates)
- JD scraped from the page (per-site adapter + generic fallback, capped at ~6,000 chars).
- Your profile and resume from
chrome.storage.local. - The "golden prompt" — see
src/shared/prompt-builder.ts. It enforces truth (no fabrication), ATS keyword alignment, specificity (concrete results from your resume), a STAR shape for behavioral questions, a banned-phrase list, and a hard character limit. - One retry if the answer exceeds the page's character limit, then a sentence-boundary truncation as a final safety net.
- All your data — profile, resume, settings, API keys — is stored in
chrome.storage.local. Nothing is synced to Chrome account storage. - The only network calls the extension makes are to the active provider's endpoint: either
https://api.openai.com/v1/chat/completionsorhttps://api.anthropic.com/v1/messages. The host permissions inmanifest.jsonmake this auditable. - No analytics, no telemetry, no third-party services.
src/
├── background/
│ ├── service-worker.ts # Message routing + post-processing pipeline
│ └── providers/ # LLMProvider interface + OpenAI / Anthropic adapters
├── content/
│ ├── index.ts # Boot, MutationObserver, SPA route hooks
│ ├── detector.ts # Field detection + question/limit extraction
│ ├── jd-extractor.ts # JD scraping (delegates to sites/* + generic)
│ ├── injector.ts # Spark button + popover (Shadow DOM)
│ ├── filler.ts # React/Vue/Angular-safe value setting
│ └── sites/ # Per-ATS adapters
├── popup/ # React popup (status + Scan this page)
├── options/ # React options (profile, resume, key, settings)
├── shared/
│ ├── types.ts # Settings, Profile, JobContext, etc.
│ ├── storage.ts # Typed chrome.storage wrapper
│ ├── messages.ts # Typed runtime message contract
│ └── prompt-builder.ts # The golden prompt + post-processing
└── styles/ # Popup + Options stylesheets
- PDF resume import.
- Multi-resume support (per role family).
- Saved-answer library that learns from your edits.
- Local model option via WebGPU.
MIT.