Skip to content

1akashkalita/autoapply

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

27 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

⚑ Job Autofill

πŸš€ The smartest Chrome extension for job applications β€” autofill forms, optimize your resume with AI, and generate tailored cover letters in seconds.

Chrome Extension Manifest V3 OpenAI


✨ What It Does

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

🏁 Quick Start (3 minutes)

1️⃣ Install the Extension

  1. Open Chrome β†’ chrome://extensions/
  2. Enable Developer mode πŸ”§
  3. Click Load unpacked
  4. Select the extension/ folder

2️⃣ Set Up Your Profile

  1. Click the extension icon β†’ Edit profile & settings
  2. Fill in your info manually, or paste JSON that matches the applicant_data.json schema (that filename is gitignored in the repo; see Resume Tool below for the CLI layout)
  3. πŸ“„ Paste resume JSON (master_resume.json shape) in the Resume Data section β€” same local-only convention as the CLI
  4. πŸ“Ž (Recommended) Upload a Base Resume PDF so the extension can attach it to resume/CV file fields and the in-page Attach action
  5. πŸ”‘ Add your OpenAI API key and enable LLM
  6. Click Save

3️⃣ Autofill a Job Application

  1. Open any job application form (optional: use the corner ✦ Job Autofill card β†’ Autofill if it appears)
  2. Click πŸ” Preview to see proposed values (resume upload fields may show as filled when a base PDF is configured)
  3. Review the blue/yellow highlights on the page
  4. Click βœ… Confirm & Fill (or ✏️ Fill from the popup)

4️⃣ AI Optimize for a Job

  1. Open any job posting (job board, company careers page, anywhere)
  2. Click ✨ Optimize in the popup (or Optimize on the in-page card β€” the extension badge may show ✨ as a reminder)
  3. 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
  4. Phase 2 β€” Run optimization: Confirm to run tailoring + cover letter (~15–30 seconds):
    • πŸ“– JD analysis (keywords, skills, qualifications)
    • ✏️ Tailored resume JSON
    • πŸ“ Targeted cover letter
  5. πŸ“₯ Downloads and gap report appear in the popup as before

🧠 AI Resume Optimizer β€” Deep Dive

The flagship feature: you review a gap preview first, then confirm to tailor the resume and generate a cover letter for that job.

πŸ”” On-page opportunities

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).

πŸ”„ How It Works

πŸ“„ Job Page β†’ πŸ” Extract JD β†’ Phase 1: analyze JD + local gap preview β†’ βœ‹ You confirm
    β†’ Phase 2: ✏️ Tailor resume + πŸ“ cover letter β†’ πŸ“₯ Download / vault
  1. Extracts the job description from any page β€” works on LinkedIn, Greenhouse, Lever, Workday, Jobright, Samsung Careers, TikTok Careers, Google Careers, and thousands more
  2. 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)
  3. 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
  4. 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
  5. Generates a cover letter that references the specific company, role, and 1-2 key responsibilities with concrete examples from your experience

πŸ“Š Requirements Gap Report

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

πŸ“ Cover Letter Rules

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"

🎨 Customizable Style Profile

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

🌐 Supported Sites

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

🧩 Autofill Engine

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 DataTransfer API (same mechanism as the widget Attach button)
  • 🚫 No auto-submit β€” you always stay in control

πŸ“ Document Workspace

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

πŸ—οΈ Architecture

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

πŸ”„ Data Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Popup   │───▢│ Background │───▢│ Content Script │───▢│ Job Page β”‚
β”‚   UI     │◀───│  Worker    │◀───│   (DOM ops)    │◀───│   DOM    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
                     β–Ό
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚  OpenAI API  β”‚
              β”‚  (gpt-4o-mini) β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ”’ Prompt Consistency

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

πŸ–¨οΈ PDF Generation

The extension generates print-ready HTML files using the exact same CSS as the Python pipeline:

  1. πŸ“„ Tailored resume β†’ pixel-perfect one-page layout (letter size, 9pt Helvetica)
  2. πŸ“ Cover letter β†’ clean single-column format with header
  3. πŸ“₯ Auto-downloaded to your computer
  4. πŸ–¨οΈ Open the file β†’ browser print dialog auto-opens β†’ Save as PDF (one click)

⚠️ Limitations

  • πŸ“Ž File uploads: The extension sets files with DataTransfer where 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 (CLI β€” Optional)

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.py

πŸ“œ License

MIT


Built with ⚑ by Akash Kalita

About

autoapply and customize resume/cover letters with your own api credits

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors