<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: DeckdOut</title>
    <description>The latest articles on DEV Community by DeckdOut (@deckdout).</description>
    <link>https://dev.to/deckdout</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3898376%2F0d744703-a4aa-4622-8d86-da87b90ea266.png</url>
      <title>DEV Community: DeckdOut</title>
      <link>https://dev.to/deckdout</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deckdout"/>
    <language>en</language>
    <item>
      <title>I built a Chrome extension that tells you exactly why your resume isn't getting callbacks</title>
      <dc:creator>DeckdOut</dc:creator>
      <pubDate>Sun, 26 Apr 2026 06:17:02 +0000</pubDate>
      <link>https://dev.to/deckdout/i-built-a-chrome-extension-that-tells-you-exactly-why-your-resume-isnt-getting-callbacks-4ao0</link>
      <guid>https://dev.to/deckdout/i-built-a-chrome-extension-that-tells-you-exactly-why-your-resume-isnt-getting-callbacks-4ao0</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

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

&lt;p&gt;That felt like a solvable problem. So I built &lt;a href="https://www.deckdout.net" rel="noopener noreferrer"&gt;DeckdOut&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;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:&lt;/p&gt;

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

&lt;p&gt;No tab-switching. No copy-pasting job descriptions into other tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  The tech
&lt;/h2&gt;

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

&lt;p&gt;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, &lt;code&gt;eval&lt;/code&gt; is blocked — and a clean vanilla codebase made navigating those constraints much easier.&lt;/p&gt;

&lt;p&gt;The AI prompt uses XML tags (&lt;code&gt;&amp;lt;resume&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;job_description&amp;gt;&lt;/code&gt;) to prevent any injection between user-supplied content and the instruction layer. Resume text is never stored beyond the session.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Job description scraping is harder than it looks.&lt;/strong&gt; 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 &lt;code&gt;PAGE_RULES&lt;/code&gt; for 17 sites plus a generic fallback using &lt;code&gt;executeScript&lt;/code&gt; on the active tab.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Freemium conversion is a UX problem, not a pricing problem.&lt;/strong&gt; 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.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where it's at
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/deckdout/oplpmifnhjdkhpjbiicfpinopailnjah" rel="noopener noreferrer"&gt;Chrome Web Store&lt;/a&gt; · &lt;a href="https://www.deckdout.net" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>career</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
