π The smartest Chrome extension for job applications β autofill forms, optimize your resume with AI, and generate tailored cover letters in seconds.
| Feature | Description |
|---|---|
| π― Smart Autofill | Instantly fill job application forms with your saved profile |
| π Opportunity hints | On job pages, a small in-page card offers Autofill, Optimize, or Attach resume when the page looks relevant; the toolbar badge lights up too |
| π§ AI Resume Optimizer | Two-step flow: preview gaps vs. the JD, then confirm to tailor your resume and generate a cover letter |
| π Cover Letter Generator | Auto-generate targeted, human-sounding cover letters |
| π Requirements Gap Analysis | See exactly which qualifications you meet, partially meet, or need to address |
| π Resume file fields | Upload a Base Resume PDF in Options; the extension can attach it to resume/CV upload fields (and during autofill when mapped) |
| ποΈ Per-Job Document Vault | Keep tailored resumes and cover letters organized by job |
| π¨οΈ One-Click PDF Export | Download print-ready resume and cover letter files instantly |
- Open Chrome β
chrome://extensions/ - Enable Developer mode π§
- Click Load unpacked
- Select the
extension/folder
- Click the extension icon β Edit profile & settings
- Fill in your info manually, or paste JSON that matches the
applicant_data.jsonschema (that filename is gitignored in the repo; see Resume Tool below for the CLI layout) - π Paste resume JSON (
master_resume.jsonshape) in the Resume Data section β same local-only convention as the CLI - π (Recommended) Upload a Base Resume PDF so the extension can attach it to resume/CV file fields and the in-page Attach action
- π Add your OpenAI API key and enable LLM
- Click Save
- Open any job application form (optional: use the corner β¦ Job Autofill card β Autofill if it appears)
- Click π Preview to see proposed values (resume upload fields may show as filled when a base PDF is configured)
- Review the blue/yellow highlights on the page
- Click β Confirm & Fill (or βοΈ Fill from the popup)
- Open any job posting (job board, company careers page, anywhere)
- Click β¨ Optimize in the popup (or Optimize on the in-page card β the extension badge may show β¨ as a reminder)
- Phase 1 β Resume analysis: The extension analyzes the JD and shows a short preview of missing skills, qualifications, and keywords vs. your resume JSON so you know what will be addressed before any heavy work runs
- Phase 2 β Run optimization: Confirm to run tailoring + cover letter (~15β30 seconds):
- π JD analysis (keywords, skills, qualifications)
- βοΈ Tailored resume JSON
- π Targeted cover letter
- π₯ Downloads and gap report appear in the popup as before
The flagship feature: you review a gap preview first, then confirm to tailor the resume and generate a cover letter for that job.
On many job and application pages the extension detects:
- Form fields it can autofill
- Job description text (for optimize)
- Resume/CV file inputs
When it finds something useful, a small β¦ Job Autofill card appears (bottom-right). You can dismiss it for the session; the toolbar icon can show a ! badge when an opportunity was detected. Single-page apps are re-scanned after DOM changes (debounced).
π Job Page β π Extract JD β Phase 1: analyze JD + local gap preview β β You confirm
β Phase 2: βοΈ Tailor resume + π cover letter β π₯ Download / vault
- Extracts the job description from any page β works on LinkedIn, Greenhouse, Lever, Workday, Jobright, Samsung Careers, TikTok Careers, Google Careers, and thousands more
- Phase 1 β AI analyzes the JD; the popup compares highlights to your resume JSON and lists likely missing skills, qualifications, and keywords (quick transparency before spend)
- Phase 2 (after you confirm) β Tailors your resume by rewriting bullet points to mirror the JD's language, reordering for relevance, and improving keyword coverage
- Fills qualification gaps β if your resume doesn't address a key requirement, the optimizer strategically restructures your projects section to better highlight relevant skills and experience
- Generates a cover letter that references the specific company, role, and 1-2 key responsibilities with concrete examples from your experience
After optimization, you get a color-coded breakdown:
| Status | Meaning |
|---|---|
| π’ Met | Your experience directly addresses this requirement |
| π‘ Partial | Related experience exists but doesn't fully cover it |
| π΄ Not Met | No matching experience found |
| π£ Optimized | Resume restructured to better highlight relevant skills |
Every generated cover letter follows strict quality guidelines:
- β 2-3 paragraphs max β concise and direct
- β References specific company name, role, and responsibilities
- β Pulls 2 concrete experience callouts with real numbers
- β Opens with something specific about the role (not "I am writing to apply for...")
- β Closes with one confident sentence
- β No buzzwords: "passionate", "leverage", "synergy", "excited to"
- β No filler: "thank you for your consideration"
Control how your cover letters sound in Options β Cover Letter Style Profile:
Tone: direct, technical, not overly formal
Length: 3 short paragraphs max
Opening style: lead with a specific thing about the company or role
Closing style: one confident sentence
The AI Optimizer extracts job descriptions from virtually any job page:
| Site Type | Examples |
|---|---|
| π’ Job Boards | LinkedIn, Jobright, Indeed, Glassdoor |
| ποΈ ATS Platforms | Greenhouse, Lever, Workday, iCIMS |
| π Company Career Pages | Samsung, TikTok, Google, Apple, Meta, Amazon, Netflix, Stripe, etc. |
| π Any Website | Falls back to intelligent DOM analysis for any page with a job description |
The core form-filling system works independently of the AI features:
- π Rule-based matching for common fields (name, email, phone, education, work auth, etc.)
- βοΈ Framework-safe event dispatch for React, Angular, and Vue forms
- π Built-in adapters for Greenhouse, Lever, and Workday
- π€ Optional LLM fallback for ambiguous or unusual fields
- π Resume PDF on file inputs β when you have a Base Resume PDF saved, mappings to resume/CV-style file fields can attach it via the
DataTransferAPI (same mechanism as the widget Attach button) - π« No auto-submit β you always stay in control
Every job gets its own document bucket:
- π Tailored resumes β AI-generated or manually uploaded
- π Cover letters β AI-generated, uploaded as PDF, or saved as text
- π₯ Smart file names:
Company-Title-YYYYMMDD-tailored-resume.html - π Re-downloadable anytime from the popup
- ποΈ Auto-managed storage with oldest-first trimming
jobautofill/
βββ π§© extension/ Chrome extension (Manifest V3)
β βββ manifest.json
β βββ π§ shared/ Shared utilities & HTML builder
β β βββ constants.js
β β βββ match_rules.js
β β βββ field_extraction.js
β β βββ field_matching.js
β β βββ event_dispatch.js
β β βββ resume_html_builder.js β π PDF-ready resume/cover letter renderer
β β βββ utils.js
β βββ π content/ Content scripts (page interaction)
β β βββ content_main.js β JD extraction + opportunity re-scan (MutationObserver)
β β βββ dom_filler.js β file inputs: synthetic File from base PDF when mapped
β β βββ notification_widget.js β floating β¦ card (Autofill / Optimize / Attach)
β β βββ opportunity_detector.js β detects forms, JD, resume file inputs; badge ping
β β βββ site_adapters/ Greenhouse, Lever, Workday, generic
β βββ βοΈ background/ Service worker
β β βββ service_worker.js β π AI prompts, callOpenAi wrapper, resume tailoring
β βββ π₯οΈ popup/ Extension popup UI (light cards, β¨ Optimize, two-phase AI)
β β βββ popup.html
β β βββ popup.css
β β βββ popup.js
β βββ βοΈ options/ Settings page
β βββ options.html β π Style profile textarea
β βββ options.js β π Style profile load/save
βββ π resume_tool/ CLI pipeline (optional)
βββ jd_analyzer.py
βββ resume_tailor.py
βββ cover_letter.py
βββ resume_renderer.py
βββ data/
βββ master_resume.json β local only (.gitignore)
βββ applicant_data.json β local only (.gitignore)
βββ style_profile.txt
βββββββββββ ββββββββββββββ ββββββββββββββββββ ββββββββββββ
β Popup βββββΆβ Background βββββΆβ Content Script βββββΆβ Job Page β
β UI ββββββ Worker ββββββ (DOM ops) ββββββ DOM β
βββββββββββ ββββββββββββββ ββββββββββββββββββ ββββββββββββ
β
βΌ
ββββββββββββββββ
β OpenAI API β
β (gpt-4o-mini) β
ββββββββββββββββ
All AI calls go through a single callOpenAi() wrapper that enforces:
| Call | Temperature | Format | Validation |
|---|---|---|---|
| π JD Analysis | 0.1 |
JSON | 12 required keys |
| βοΈ Resume Tailor | 0.2 |
JSON | Schema match + gaps array |
| π Cover Letter | 0.5 |
Text | β€ 3 paragraphs |
- π Auto-retry on parse/validation failure at
temperature: 0.0 - β Schema validation for every JSON response
- π‘οΈ Markdown fence stripping as a safety net
The extension generates print-ready HTML files using the exact same CSS as the Python pipeline:
- π Tailored resume β pixel-perfect one-page layout (letter size, 9pt Helvetica)
- π Cover letter β clean single-column format with header
- π₯ Auto-downloaded to your computer
- π¨οΈ Open the file β browser print dialog auto-opens β Save as PDF (one click)
- π File uploads: The extension sets files with
DataTransferwhere the browser allows; some ATS sites use custom upload widgets or shadow DOM and may still ignore or block synthetic files - π Cross-origin iframes may block content script access on some ATS flows
- ποΈ Workday custom controls may need additional adapter tuning
- πΎ Document storage is local to the browser profile (no cloud sync)
- π AI features require an OpenAI API key (autofill works without it)
resume_tool/ provides a standalone CLI pipeline for the same capabilities:
- π JD analysis β
jd_analyzer.py - βοΈ Resume tailoring β
resume_tailor.py - π Cover letter generation β
cover_letter.py - π¨οΈ PDF rendering β
resume_renderer.py - π€ Playwright autofill experiments β
autofill_agent.py
Private data files: resume_tool/data/master_resume.json and resume_tool/data/applicant_data.json are listed in .gitignore so they are never committed. After cloning the repo, create them locally (copy from a backup, export from the extension Options page, or restore from an old commit with git show <commit>:resume_tool/data/applicant_data.json). style_profile.txt remains in the repo as non-sensitive sample text.
cd resume_tool
pip install -r requirements.txt
playwright install chromium
cp .env.example .env
# Edit .env with your OpenAI API key
# Ensure data/master_resume.json and data/applicant_data.json exist locally
python run.pyMIT
Built with β‘ by Akash Kalita