<?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: Parth Parmar</title>
    <description>The latest articles on DEV Community by Parth Parmar (@parth-parmar).</description>
    <link>https://dev.to/parth-parmar</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%2F3880031%2F7293b491-7e4b-463f-a27b-dba5080805a1.jpeg</url>
      <title>DEV Community: Parth Parmar</title>
      <link>https://dev.to/parth-parmar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/parth-parmar"/>
    <language>en</language>
    <item>
      <title>How I Built an AI-Powered Job Search Pipeline That Tailors My Resume for Every Application</title>
      <dc:creator>Parth Parmar</dc:creator>
      <pubDate>Fri, 17 Apr 2026 04:17:35 +0000</pubDate>
      <link>https://dev.to/parth-parmar/how-i-built-an-ai-powered-job-search-pipeline-that-tailors-my-resume-for-every-application-22i9</link>
      <guid>https://dev.to/parth-parmar/how-i-built-an-ai-powered-job-search-pipeline-that-tailors-my-resume-for-every-application-22i9</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Job hunting in 2026 is mostly busywork:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hours scrolling LinkedIn and job portals&lt;/li&gt;
&lt;li&gt;Customizing the same resume 30+ times (same content, different keywords)&lt;/li&gt;
&lt;li&gt;Losing track of applications&lt;/li&gt;
&lt;li&gt;Missing JD keywords that matter for ATS systems&lt;/li&gt;
&lt;li&gt;Cold outreach skipped because researching each company takes too long&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built a tool to automate all of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scrape jobs → Filter → Score (AI) → Tailor resume (AI) → Generate PDF → Export Excel → Open top URLs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One command runs the whole pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; src.main &lt;span class="nt"&gt;--keywords&lt;/span&gt; &lt;span class="s2"&gt;"React Developer"&lt;/span&gt; &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s2"&gt;"India"&lt;/span&gt; &lt;span class="nt"&gt;--pages&lt;/span&gt; 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Scraping
&lt;/h3&gt;

&lt;p&gt;Four scrapers (LinkedIn, Internshala, Naukri, Indeed) with a shared base class handling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rotating user agents via &lt;code&gt;fake-useragent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Random 1.5-3.5s delays between requests&lt;/li&gt;
&lt;li&gt;Full job description fetching from detail pages&lt;/li&gt;
&lt;li&gt;Rate limiting to avoid getting blocked&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LinkedIn uses their public guest API, Internshala parses HTML, Naukri tries JSON API then falls back to HTML.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Filtering
&lt;/h3&gt;

&lt;p&gt;Drops jobs that don't meet your criteria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Salary below threshold (parses &lt;code&gt;₹ 4,50,000 - 6,00,000&lt;/code&gt; → 6.0 LPA)&lt;/li&gt;
&lt;li&gt;Internships (&lt;code&gt;--exclude-internships&lt;/code&gt; by default)&lt;/li&gt;
&lt;li&gt;Tags product companies (Razorpay, Swiggy, CRED, etc.) vs service (TCS, Infosys)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Scoring with AI
&lt;/h3&gt;

&lt;p&gt;Every job gets sent to Claude with your resume:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"match_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"matched_keywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"React"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Redux"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WebSocket"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"missing_keywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"AWS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Kubernetes"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recommendation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Strong Match"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4+ years React experience matches the 3+ requirement..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two backends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anthropic SDK (if you have an API key)&lt;/li&gt;
&lt;li&gt;Claude Code CLI via subprocess (if you have Claude Code installed — no API key needed)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Resume Tailoring
&lt;/h3&gt;

&lt;p&gt;For top matches (≥70/100), Claude rewrites your resume:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reorders skills by JD relevance&lt;/li&gt;
&lt;li&gt;Rewrites bullets using EXACT JD vocabulary&lt;/li&gt;
&lt;li&gt;Injects &lt;code&gt;core_competencies&lt;/code&gt; badges for the modern PDF style&lt;/li&gt;
&lt;li&gt;Validates structure — can't fabricate skills, can't change company names/dates&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. PDF Generation
&lt;/h3&gt;

&lt;p&gt;Two styles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Classic&lt;/strong&gt;: fpdf2, system fonts (Georgia/Times fallback). ATS-safe, plain, small file size.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern&lt;/strong&gt;: HTML + Playwright Chromium. Space Grotesk + DM Sans fonts, cyan-purple gradient header, keyword badges.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Excel Export
&lt;/h3&gt;

&lt;p&gt;4-sheet workbook with openpyxl:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;All Jobs&lt;/strong&gt;: sorted by score, color-coded (green ≥70, yellow 40-69, red &amp;lt;40), clickable URLs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Top Matches&lt;/strong&gt;: ≥70 only, product companies highlighted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cold Outreach&lt;/strong&gt;: 20 curated product companies (Razorpay, CRED, Postman, BrowserStack, etc.) with LinkedIn links&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summary&lt;/strong&gt;: stats, salary distribution, skill gaps&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. One-Click Apply
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;--open-top 10&lt;/code&gt; opens the top 10 job URLs in your browser. Zero friction to apply.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Scheduled Scans
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;--schedule daily&lt;/code&gt; sets up a Windows Task Scheduler entry or crontab line. Fresh postings get fewer applicants — first-mover advantage.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Works, What Doesn't
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Works reliably:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LinkedIn (guest API is stable)&lt;/li&gt;
&lt;li&gt;Internshala (HTML scraping, 40 jobs/page)&lt;/li&gt;
&lt;li&gt;All AI-powered parts (with API key or Claude Code CLI)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Known limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Naukri often returns 400 (their API is inconsistent)&lt;/li&gt;
&lt;li&gt;Indeed returns 403 (Cloudflare anti-bot)&lt;/li&gt;
&lt;li&gt;Requests + BS4 can't render JS-heavy pages (would need Playwright scrapers — contributions welcome)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/parth-r-parmar/ai-job-pipeline
&lt;span class="nb"&gt;cd &lt;/span&gt;ai-job-pipeline
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Edit resume.json with your data&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; src.main &lt;span class="nt"&gt;--keywords&lt;/span&gt; &lt;span class="s2"&gt;"React Developer"&lt;/span&gt; &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s2"&gt;"India"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Results end up in &lt;code&gt;output/&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;p&gt;Python 3.10+ · requests · BeautifulSoup · openpyxl · fpdf2 · Playwright · Anthropic SDK · Claude Code CLI&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Playwright-based scrapers for Naukri/Indeed&lt;/li&gt;
&lt;li&gt;LinkedIn detail pages (currently only getting listing-level data)&lt;/li&gt;
&lt;li&gt;Email digest for scheduled runs&lt;/li&gt;
&lt;li&gt;Optional browser extension for one-click scraping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MIT licensed. Feedback, issues, and PRs welcome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo: &lt;a href="https://github.com/parth-r-parmar/ai-job-pipeline" rel="noopener noreferrer"&gt;https://github.com/parth-r-parmar/ai-job-pipeline&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>ai</category>
      <category>career</category>
    </item>
  </channel>
</rss>
