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.
This article was originally published by DEV Community and written by DeckdOut.
Read original article on DEV Community