A Chrome extension that reads any job description and tells you instantly whether the role suits your profile — powered by Google Gemini AI.
JD Match is a private-use Chrome extension that sits quietly in your browser toolbar. When you're browsing job listings on LinkedIn, Naukri, Indeed, Glassdoor, or any major job site — activate it, click Analyze, and within seconds you get:
- A match score out of 100
- A clear verdict (Strong Fit / Good Fit / Partial Fit / Low Fit)
- Your specific strengths that match the role
- Gaps you should be aware of before applying
- A one-line recommendation on whether to apply or skip
- An Apply / Skip badge
No switching tabs. No copy-pasting. No manual comparison. Just open a job and know your fit in seconds.
┌─────────────────────────────┐
│ ⚡ JD MATCH On ●│
├─────────────────────────────┤
│ Dashboard Resume Settings│
├─────────────────────────────┤
│ │
│ ╭──────╮ STRONG FIT │
│ │ 92 │ ✓ Apply │
│ │ /100 │ PM · Acme Corp │
│ ╰──────╯ │
│ │
│ Your 12+ yrs PM experience │
│ directly matches this role.│
│ │
│ ✓ Strengths │
│ ✓ 12+ yrs Program/PM exp │
│ ✓ GenAI delivery leadership│
│ ✓ BFSI domain expertise │
│ │
│ ✗ Gaps │
│ ✗ No Salesforce CRM mention│
│ │
│ ↺ Re-analyze │
└─────────────────────────────┘
| Feature | Description |
|---|---|
| ON / OFF Toggle | Extension is completely invisible when off — no widgets, no activity |
| Match Score | 0–100 score with color coding (green / amber / red) |
| Verdict | STRONG FIT / GOOD FIT / PARTIAL FIT / LOW FIT |
| Strengths & Gaps | Specific bullet points drawn from your actual resume |
| Apply / Skip Badge | Clear yes/no recommendation |
| Auto-scan Mode | Analyzes job pages automatically the moment you open them |
| Floating Widget | Draggable widget appears on job pages — stays out of your way |
| Resume Storage | Paste your CV once, saved locally forever |
| Custom Prompt | Tell the AI what to focus on — role types, deal-breakers, preferences |
| Re-analyze | One click to re-run analysis on the same page |
| Tab Badge | Score appears on the extension icon for the active tab |
The floating widget activates automatically on these platforms:
- LinkedIn Jobs
- Naukri.com
- Indeed
- Glassdoor
- Instahyre
- Foundit (Monster India)
- Shine.com
- Wellfound (AngelList Talent)
- Lever (jobs.lever.co)
- Greenhouse (boards.greenhouse.io)
- Workable (apply.workable.com)
- Workday (myworkdayjobs.com)
- Google Careers
- Amazon Jobs
For any other job site not listed above, use the "Analyze Current Page" button inside the popup — it works on any page.
You open a job listing
│
▼
Content script extracts the job description text
│
▼
Text is sent to the background service worker
│
▼
Background fetches your saved resume + custom prompt from Chrome storage
│
▼
Both are sent to Gemini 2.5 Flash API with a structured analysis prompt
│
▼
Gemini returns a JSON object with score, verdict, strengths, gaps
│
▼
Result is displayed in the floating widget and popup dashboard
│
▼
Score badge appears on the extension toolbar icon
The extension uses a priority-based selector system to find the most relevant part of each job page:
- Tries known job-specific CSS selectors for each supported site (e.g.
.jobs-descriptionfor LinkedIn,.job-descfor Naukri) - Falls back to
<main>,<article>, or[role="main"] - Last resort: extracts from
document.body
Input is trimmed to ~3000 characters each for the resume and JD before sending, keeping the Gemini prompt efficient and the response fast.
| Layer | Technology |
|---|---|
| Runtime | Chrome Extension — Manifest V3 |
| Background | Service Worker (background.js) |
| Content Script | Vanilla JavaScript + CSS injected into job pages |
| Popup UI | HTML + CSS + Vanilla JavaScript (no frameworks) |
| AI Model | Google Gemini 2.5 Flash via REST API |
| Storage | Chrome storage.local API (device-local only) |
| Icons | Python (Pillow) generated PNG assets |
No build tools, no npm, no bundler. Pure browser-native code — load it directly into Chrome.
- Google Chrome browser
- A free Gemini API key (takes 2 minutes — instructions below)
Option A — Clone this repo:
git clone https://github.com/YOUR_USERNAME/jd-match.gitOption B — Download ZIP:
- Click the green Code button → Download ZIP
- Extract the ZIP to a folder on your computer (e.g.
jd-matchon your Desktop)
- Open Chrome and go to:
chrome://extensions - Enable Developer mode using the toggle in the top-right corner
- Click Load unpacked
- Select the
jd-matcherfolder (the one containingmanifest.json) - The ⚡ JD Match icon will appear in your Chrome toolbar
Tip: Pin it for easy access — click the puzzle piece icon in Chrome toolbar → pin JD Match
- Go to https://aistudio.google.com/app/apikey
- Sign in with your Google account
- Click Create API key → Create API key in new project
- Copy the key (starts with
AIza...)
The Gemini API free tier gives you 1,500 requests per day — more than enough for active job hunting. This is separate from your paid Gemini subscription.
- Click the ⚡ icon in Chrome toolbar to open JD Match
- Go to the Settings tab:
- Paste your Gemini API key → click Save Key
- Optionally write custom instructions (see Custom Prompt below)
- Go to the Resume tab:
- Paste your full CV/resume as plain text → click Save Resume
- Toggle the extension ON using the switch in the header
You're ready. Open any job listing and click Analyze This Job in the widget.
- Toggle the extension ON
- Open a job listing on any supported site
- A small ⚡ JD Match widget appears at the bottom-right of the page
- Click Analyze This Job
- Wait ~3–5 seconds for Gemini to analyze
- Your result appears in the widget — and in the popup dashboard
For zero-click analysis:
- Go to Settings tab → enable Auto-scan Job Pages
- Now every time you open a job listing, it analyzes automatically
- The widget shows the result within a few seconds of the page loading
- The extension icon badge also shows your score
Tip: Auto-scan is great when you're quickly browsing a list of jobs. Toggle it off when you only want to analyze specific listings.
You can also trigger analysis directly from the popup:
- Open any job page
- Click the ⚡ icon in your toolbar
- On the Dashboard tab → click Analyze Current Page
If the JD was still loading when you first clicked, or you want a fresh result:
- Click ↺ Re-analyze at the bottom of the result in the widget or popup
The floating widget is draggable. Click and hold the header bar (where it says "⚡ JD Match") and drag it anywhere on the page.
Click the × button on the widget to hide it. It will reappear the next time you navigate to a job page.
The custom prompt is your most powerful personalization tool. It tells Gemini what to focus on when analyzing jobs for you specifically.
Where to set it: Settings tab → Custom Analysis Instructions
Examples:
Focus on Program Manager and Delivery Manager roles.
Prioritize BFSI domain experience.
Flag if the role is contract or freelance — I want full-time only.
Bonus points if the company is an MNC or has ANZ market presence.
I am targeting AI Product Manager roles.
Weigh GenAI, LLM, and conversational AI experience heavily.
Ignore roles that require hands-on ML/data science work.
Flag if the company is a startup under Series B.
I have 12 years of experience. Do not recommend roles below senior level.
Highlight any mention of stakeholder management, enterprise clients, or P&L ownership.
| Score | Verdict | What It Means |
|---|---|---|
| 80 – 100 | 🟢 STRONG FIT | Your profile closely matches. Apply with confidence. |
| 60 – 79 | 🟡 GOOD FIT | Strong overlap. Minor gaps. Worth applying. |
| 40 – 59 | 🟠 PARTIAL FIT | Some match, some gaps. Apply selectively. |
| 0 – 39 | 🔴 LOW FIT | Significant mismatch. Consider skipping. |
This extension was built with privacy as a core principle.
| What | How |
|---|---|
| Your resume | Stored in Chrome's storage.local — on your device only, never transmitted anywhere except to Gemini for analysis |
| Your API key | Stored in Chrome's storage.local — never leaves your browser except as an authentication header to Google's API |
| Your custom prompt | Stored locally — never shared |
| Job page content | Extracted temporarily, sent to Gemini API for analysis, then discarded — never stored |
| Analysis results | Cached per browser tab in memory only — cleared when the tab closes |
| No tracking | Zero analytics, zero telemetry, zero external servers |
| No accounts | No sign-up, no login, no user profiles |
| No ads | This is a personal tool — there are no advertisers |
The only external service this extension communicates with is the Google Gemini API (generativelanguage.googleapis.com) — and only when you trigger an analysis. Google's data handling is governed by their AI Studio Terms of Service.
Widget not appearing on job pages? → Check that the toggle in the popup is ON. The widget only shows on supported job sites when the extension is active.
"Add your Gemini key" error? → Go to Settings tab, paste your key, and click Save Key. Make sure there are no spaces.
"Add your resume" error? → Go to Resume tab, paste your CV text, and click Save Resume.
Parse Error / 0 score? → Usually a token limit issue. Make sure your resume text is plain text (no symbols-heavy formatting). The extension trims input to ~3000 characters each for resume and JD.
Extension context invalidated error? → This happens when Chrome reloads the extension while a job tab is open. Simply refresh the job page (F5) and try again.
Analysis not triggering on a new job site? → The auto-detect covers major platforms. For unlisted sites, use the "Analyze Current Page" button in the popup Dashboard tab — it works on any URL.
Score seems off? → Try adding a custom prompt in Settings to guide the AI towards your specific role targets and priorities.
jd-matcher/
├── manifest.json # Chrome Extension Manifest V3 config
├── popup.html # Extension popup UI (3 tabs)
├── popup.css # Popup styles — dark theme
├── popup.js # Popup logic — tabs, toggle, save, analyze
├── src/
│ ├── background.js # Service worker — API calls, state, badge
│ ├── content.js # Injected into job pages — widget, analysis trigger
│ └── content.css # Floating widget styles
└── icons/
├── icon16.png # Toolbar icon (active)
├── icon48.png
├── icon128.png
├── icon16_off.png # Toolbar icon (inactive/grey)
├── icon48_off.png
└── icon128_off.png
- Input trimming: Resume and JD are each capped at ~3000 characters before sending to Gemini. Very long resumes or JDs may have some content trimmed. Keep your resume concise for best results.
- Dynamic pages: Some job sites load content via JavaScript after the initial page load. If the widget analyzes too quickly on a slow connection, try clicking Re-analyze after the page fully loads.
- Private job boards: Internal company ATS portals or login-gated job pages may not be in the supported site list — use the popup's Analyze Current Page button for those.
- Free tier rate limits: Gemini's free API allows 1,500 requests/day and 15 requests/minute. More than sufficient for job hunting.
This was built as a personal tool. If you find it useful and want to improve it:
- Fork the repo
- Make your changes in the
jd-matcher/folder - Test by loading the unpacked extension in Chrome
- Submit a pull request with a clear description
Ideas welcome — especially around supporting more job sites, improving the match algorithm prompt, or adding a history/log feature.
MIT License — free to use, modify, and distribute. See LICENSE for details.
Built by Mahr K — Senior Program & Product Manager, AI Transformation Leader.
If this helped your job search, feel free to ⭐ star the repo.
Last updated: June 2026