Technology Apr 26, 2026 · 3 min read

I built a Chrome extension that tells you exactly why your resume isn't getting callbacks

A close friend of mine applied to 67 jobs over three months. She's talented, her resume is solid, she has real experience. She heard back from 4 of them. The frustrating part wasn't the rejection. It was having no idea why. She was tweaking bullet points, reordering sections, guessing which skills...

DE
DEV Community
by DeckdOut
I built a Chrome extension that tells you exactly why your resume isn't getting callbacks

A close friend of mine applied to 67 jobs over three months. She's talented, her resume is solid, she has real experience. She heard back from 4 of them.

The frustrating part wasn't the rejection. It was having no idea why. She was tweaking bullet points, reordering sections, guessing which skills to emphasise — applying completely blind.

That felt like a solvable problem. So I built DeckdOut.

What it does

It's a Chrome extension that sits on top of job listing pages — LinkedIn, Indeed, Glassdoor, Workday, and 14 others. You upload your resume once. When you're on a job page, you click Analyse and within seconds you get:

  • A match score (0–100) for that specific role
  • The exact keywords the JD is looking for that your resume is missing
  • Your genuine strengths for this position
  • Suggested edits to close the gap
  • A cover letter written for that job
  • A coaching note on what to fix before applying

No tab-switching. No copy-pasting job descriptions into other tools.

The tech

  • Extension: Vanilla JS, Manifest V3, PDF.js for resume parsing
  • Backend: Node.js + Express on Railway
  • Database: Supabase (PostgreSQL + Auth)
  • AI: — XML-tagged prompts to isolate user content cleanly
  • Auth: Supabase JWT (ES256), auto-refresh on 401

One decision I'm glad I made early: keeping the extension in vanilla JS. No React, no bundler, no build step. MV3 has strict CSP rules — inline scripts are blocked, eval is blocked — and a clean vanilla codebase made navigating those constraints much easier.

The AI prompt uses XML tags (<resume>, <job_description>) to prevent any injection between user-supplied content and the instruction layer. Resume text is never stored beyond the session.

What I learned

Job description scraping is harder than it looks. Every platform structures its JD differently — Workday embeds it in nested shadow DOM, LinkedIn lazy-loads it, Indeed splits it across multiple containers. I ended up writing platform-specific PAGE_RULES for 17 sites plus a generic fallback using executeScript on the active tab.

Users don't read error messages. They read the button label. Every status message I wrote was too long. The ones that stuck were 5 words or less.

Freemium conversion is a UX problem, not a pricing problem. The users who converted to Pro weren't the ones who saw the paywall — they were the ones who hit their weekly limit on a day they were actively job hunting. Timing matters more than the price.

Where it's at

DeckdOut is live on the Chrome Web Store. Free plan covers 3 analyses/week. Pro unlocks ATS resume exports, interview prep packs, skill recommendations, a Kanban job tracker, and unlimited history.

If you're building something in the job search or AI space and want to swap notes, I'm happy to chat.

Chrome Web Store · Website

DE
Source

This article was originally published by DEV Community and written by DeckdOut.

Read original article on DEV Community
Back to Discover

Reading List