{"slug": "applyonce-local-first-job-application-autofill-that-reads-scanned-resumes", "title": "ApplyOnce – Local-first job application autofill that reads scanned resumes", "summary": "ApplyOnce, a local-first job application autofill extension formerly codenamed FastApply, released version 0.2 with layout-aware resume parsing, on-device OCR for scanned resumes, resume re-import, and an optional on-device question classifier. The extension, available on the Chrome Web Store and buildable for Firefox, never submits applications automatically, and its launch gates require detection recall above 0.95 and mapping precision above 0.98.", "body_md": "Formerly codename FastApply; renamed after ASO research (fastapply.co is an existing competitor — see docs/ASO-REPORT.md). Internal storage keys and the IndexedDB name keep the old identifier for data compatibility.\n\nOne-click job application autofill, deterministic-first, local-only. See\n`PLAN.md`\n\nfor the full design and `CLAUDE.md`\n\nfor agent/contributor rules.\n\n**Install:** [Chrome Web Store](https://chromewebstore.google.com/detail/applyonce-job-application/anmljacnioamdkdcohmhbghlbcffbiaf) · Firefox: build from source\n(`npm run build:firefox`\n\n, see \"Load in Firefox\") until the AMO listing is live.\nVersion 0.2 adds layout-aware resume parsing, on-device OCR for scans, resume\nre-import, and an optional on-device question classifier (PLAN.md Part 9).\n\n```\nnpm install\nnpm run typecheck   # tsc --noEmit\nnpm test            # unit tests (vitest + jsdom)\nnpm run eval        # fixture eval: detection recall + mapping precision gates\nnpm run build       # production build (Chrome) → dist/\nnpm run build:firefox   # Firefox build → dist-firefox/\nnpm run e2e:firefox     # live Firefox e2e (Playwright Firefox + RDP sideload)\nnpm run release:firefox # dist-firefox + AMO upload zip + source zip → release/\n```\n\n`npm run build`\n\n`chrome://extensions`\n\n→ enable Developer mode →**Load unpacked**→ select`dist/`\n\n- Open the side panel (click the ApplyOnce toolbar icon), complete onboarding (drop your resume, review the extracted profile, set explicit answers).\n- Open a job posting (Greenhouse / Lever / Ashby / generic form) →\n**Scan this page**→ review →** Fill**.\n\nThe extension never submits an application — you always click submit yourself.\n\n`npm run build:firefox`\n\n`about:debugging#/runtime/this-firefox`\n\n→**Load Temporary Add-on…**→ select`dist-firefox/manifest.json`\n\n.- Firefox treats MV3 site access as optional: open the ApplyOnce sidebar →\n**Settings**→** Allow ApplyOnce on all sites**(or grant it under`about:addons`\n\n→ ApplyOnce → Permissions). Auto-detection is silent until then. - Toolbar icon opens the sidebar; the in-page widget's panel button opens the panel in a tab (Firefox only allows opening the sidebar from a direct user gesture).\n\nDifferences from Chrome are all runtime feature-detected in\n`src/shared/platform.ts`\n\n: no offscreen document (resume parsing runs in the\nbackground event page), `sidebar_action`\n\ninstead of `side_panel`\n\n, and\nFirefox's install-time data-collection consent gates telemetry. See\n`docs/FIREFOX.md`\n\nfor the AMO submission steps.\n\n`src/content/`\n\n— scanner (shadow-DOM aware, radio grouping, widget hints) + filler (native setters, DataTransfer file attach, widget playbook). Only code with page-DOM access; injected on demand via`activeTab`\n\n.`src/shared/`\n\n— pure logic: zod schemas, canonical field ontology, matching cascade (ATS adapter rules → autocomplete tokens → label lexicon → saved answers exact/fuzzy → abstain), confidence + hard risk gates, CV text parser.`src/storage/`\n\n— Dexie vault (profile, documents, saved answers, fill log), optional passphrase AES-GCM encryption, JSON export/import.`src/background/`\n\n— stateless MV3 service worker: routing, job ids in`chrome.storage.session`\n\n, offscreen lifecycle.`src/offscreen/`\n\n— PDF.js / Mammoth resume parsing.`src/sidepanel/`\n\n— React UI: onboarding, profile vault, review-and-fill loop, settings, diagnostics.`fixtures/`\n\n+`evals/`\n\n— the eval corpus is the product spec. Launch gates: detection recall > 0.95, mapping precision > 0.98, zero forbidden fills.\n\n- OCR for scanned PDFs is stubbed (paste-text fallback instead) until Tesseract traineddata can be vendored into the package — no runtime downloads are permitted.\n- Fixture corpus currently holds 4 synthetic pages modeled on real ATS DOM. Replace/extend with SingleFile captures of real postings (PLAN.md Phase 0 target: 40 pages) before trusting the accuracy numbers.\n- Live-browser e2e scripts live in\n`e2e/`\n\n(`verify-extension.mjs`\n\nfor Chromium,`verify-firefox.mjs`\n\nfor Firefox); they run against the synthetic fixtures. Filler behavior on real ATS widgets still needs the 10-application live gate (PLAN.md Phase 4) before launch.", "url": "https://wpnews.pro/news/applyonce-local-first-job-application-autofill-that-reads-scanned-resumes", "canonical_source": "https://github.com/Nyadzayo/ApplyOnce", "published_at": "2026-09-04 08:28:50+00:00", "updated_at": "2026-09-04 08:53:11.511516+00:00", "lang": "en", "topics": ["ai-products", "ai-tools", "natural-language-processing", "computer-vision"], "entities": ["ApplyOnce", "Chrome Web Store", "Firefox", "Greenhouse", "Lever", "Ashby", "Tesseract", "Dexie"], "alternates": {"html": "https://wpnews.pro/news/applyonce-local-first-job-application-autofill-that-reads-scanned-resumes", "markdown": "https://wpnews.pro/news/applyonce-local-first-job-application-autofill-that-reads-scanned-resumes.md", "text": "https://wpnews.pro/news/applyonce-local-first-job-application-autofill-that-reads-scanned-resumes.txt", "jsonld": "https://wpnews.pro/news/applyonce-local-first-job-application-autofill-that-reads-scanned-resumes.jsonld"}}