Skip to content

tim-syntax/answerspark-extension

Repository files navigation

AnswerSpark

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.local and are sent only to api.openai.com / api.anthropic.com.
  • No backend. No accounts. No analytics. Everything is local.

Install (development)

npm install
npm run build

This produces a dist/ folder. Then in Chrome:

  1. Open chrome://extensions.
  2. Toggle Developer mode on.
  3. Click Load unpacked and pick the dist/ folder.
  4. Pin AnswerSpark to your toolbar.
  5. 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 dev

Then load the printed dist/ folder in Chrome the same way.

Getting an API key

  • OpenAI (default): https://platform.openai.com/api-keys — key starts with sk-. Default model is gpt-4o-mini (fast and cheap).
  • Anthropic: https://console.anthropic.com — key starts with sk-ant-. Default model is claude-sonnet-4-5. Direct-from-browser calls are enabled via the anthropic-dangerous-direct-browser-access header; 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.

Usage

  1. Open a job application on any supported site.
  2. AnswerSpark adds a small spark button to each detected free-text question.
  3. Click the spark → review the answer in the popover.
  4. Tweak tone (Professional / Conversational / Concise), regenerate, or edit inline.
  5. 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.

Supported sites

  • jobs.ashbyhq.com, *.ashbyhq.com
  • boards.greenhouse.io, job-boards.greenhouse.io, *.greenhouse.io
  • jobs.lever.co
  • apply.workable.com, *.workable.com
  • *.myworkdayjobs.com, *.myworkdaysite.com
  • www.linkedin.com/jobs/*, plus Easy Apply modals
  • jobs.smartrecruiters.com
  • *.icims.com
  • Any other page via Scan this page in the popup.

What gets a spark — and what doesn't

Gets a spark:

  • <textarea> fields
  • Long-form text inputs whose label looks like a question (length > 25 chars, contains ?, or starts with why / 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)

How the answer is built

  1. JD scraped from the page (per-site adapter + generic fallback, capped at ~6,000 chars).
  2. Your profile and resume from chrome.storage.local.
  3. 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.
  4. One retry if the answer exceeds the page's character limit, then a sentence-boundary truncation as a final safety net.

Privacy

  • 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/completions or https://api.anthropic.com/v1/messages. The host permissions in manifest.json make this auditable.
  • No analytics, no telemetry, no third-party services.

Project layout

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

Roadmap (not in v1)

  • PDF resume import.
  • Multi-resume support (per role family).
  • Saved-answer library that learns from your edits.
  • Local model option via WebGPU.

License

MIT.

About

One-click AI answers for custom job application questions. Works on Ashby, Greenhouse, Lever, Workable, Workday, LinkedIn, and more. Bring your own OpenAI or Anthropic API key.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors