<?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: Aryan</title>
    <description>The latest articles on DEV Community by Aryan (@aryan404404).</description>
    <link>https://dev.to/aryan404404</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%2F3679827%2F754413de-c4a7-4b05-9a37-b1dc13f5ff88.jpeg</url>
      <title>DEV Community: Aryan</title>
      <link>https://dev.to/aryan404404</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aryan404404"/>
    <language>en</language>
    <item>
      <title>From Tab Chaos to Clarity: Building an AI-Powered Job Application Tracker</title>
      <dc:creator>Aryan</dc:creator>
      <pubDate>Thu, 12 Mar 2026 13:38:55 +0000</pubDate>
      <link>https://dev.to/aryan404404/from-tab-chaos-to-clarity-building-an-ai-powered-job-application-tracker-3him</link>
      <guid>https://dev.to/aryan404404/from-tab-chaos-to-clarity-building-an-ai-powered-job-application-tracker-3him</guid>
      <description>&lt;h2&gt;
  
  
  The Problem That Made Me Build This
&lt;/h2&gt;

&lt;p&gt;Job hunting is exhausting, you spent hours searching for jobs, open 10+ tabs and hit apply to the jobs you think good for you, but then you come back the other day and don't even know where you applied.&lt;br&gt;
Then you suddenly got an email that you are shortlisted (sometimes fraud) and you sit to recall when and where I applied for this job, don't have any idea about the job description, type, location or anything.&lt;br&gt;
Sometimes you miss opportunities just because you didn't opened that particular one platform out of 15,&lt;br&gt;
I was hanging in the same loop every day, every week.&lt;br&gt;
I tried everything spreadsheets, online tool and many more (even the txt file at first) so then I realized I have to bring my dev instincts back, and I really built something useful that I use daily, &lt;strong&gt;JobFlow AI&lt;/strong&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🛡️ What is JobFlow AI
&lt;/h2&gt;

&lt;p&gt;JobFlow AI is like your relatives who keep eyes on everything you do using their connections (As jobFlow has it's &lt;strong&gt;Groq powered extension&lt;/strong&gt; with multiple features) basically, it watches your job hunt so you don't have to.&lt;br&gt;
It's a tool where you can save your jobs instantly keeping there records, from company name, role to the status and many more (Even the posted jobs URL).&lt;br&gt;
It has an &lt;strong&gt;Extension&lt;/strong&gt; that has AI features like,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Match Score&lt;/strong&gt; that compares your resume to the job description by just one click.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto Scrapping&lt;/strong&gt; that scraps all the details about the jobs by one click so we don't manually have to write everything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cold email&lt;/strong&gt; based on the Job role and your resume it generates a personalized cold email, so just copy and send it to the Founder, HR...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;


&lt;/p&gt;
&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/887e1a1ce729484db489b1ae1624101a"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;
  
  
  🔨 Building the Chrome Extension (the hardest part)
&lt;/h2&gt;

&lt;p&gt;First of all why do I have to make an extension? Going to the main site every time I want to save a job and saving it manually is equals to writing them in a txt file, boring and time consuming, you might choose to not track the jobs over adding everything manually, so I needed to find a way so it can be a one click tool and actually time saving.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
Then the easiest way to perform operations being on another site is extension just open click and save EASYYY.&lt;br&gt;
well not that easy, it was the most difficult part of the entire project for me.&lt;br&gt;
It has multiple features like &lt;strong&gt;AI Match Score&lt;/strong&gt;, &lt;strong&gt;Auto Scrap&lt;/strong&gt; and &lt;strong&gt;Cold email generator&lt;/strong&gt;,&lt;br&gt;
but the most difficult to build was &lt;strong&gt;AUTO SCRAPP&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Auto Scrap:
&lt;/h3&gt;

&lt;p&gt;The feature scraps all the important information like job title, role, type, location and every important info so we don't have to type manually.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
I looked at APIs like Jsearch and Serpapi but they either cost money, had rate limits, or returned garbage data I'd still have to clean. So I thought — why not just scrape it directly from the page the user is already on? &lt;br&gt;
And decided to create everything from scratch,&lt;br&gt;
so the question was how will I even make it? the first approach was using &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1. CSS Selectors and DOM&lt;/strong&gt; and it worked 😀, (Just for linkedin 😐).
the problem was these selectors varies from site to site different on different platforms.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;2. AI&lt;/strong&gt; sending the entire page to AI can give you accurate information but it's not an efficient as it also sends some garbage and non essential stuff with your JD and it might mess with the token limit of the AI.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SO I had to choose something, I Decided to go with the &lt;strong&gt;hybrid approach&lt;/strong&gt;.&lt;br&gt;
&lt;strong&gt;CSS Selectors + AI&lt;/strong&gt; that made it possible to work on any platforms.&lt;br&gt;
It sends just the header and description from the page &lt;strong&gt;(CSS Scrapping)&lt;/strong&gt;, so It doesn't scrap each field like #job-title (Nah bad Idea). It just sends &lt;em&gt;header and description&lt;/em&gt; to &lt;strong&gt;AI&lt;/strong&gt;, Thus no garbage just pure information that gives AI less data but important information so the AI can give accurate responses.&lt;br&gt;
And that's how I got 95%+ accuracy in scrapping jobs ;)&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🫂 Two Bodies one soul (JobFlow + Extension and One Backend)
&lt;/h2&gt;

&lt;p&gt;Now there are 2 frontend and one backend, so if user login to the main site the extension has no clue. So should I create a 2 different sign in system for both? or should I store the token in the local Storage?&lt;br&gt;
Both sounds terrible, because local Storage doesn't provide any security so javascript can easily get the information about the token, and that's not a user will expect.&lt;br&gt;
SO what can help? &lt;strong&gt;Cookies&lt;/strong&gt; ,cookies aren't allowed to get via javascript and solves the problem and provide shared session using &lt;strong&gt;sameSite: none&lt;/strong&gt; and &lt;strong&gt;secure: true&lt;/strong&gt;.&lt;br&gt;
so we don't have to login to twice, just login once in main and the extension will get the token from cookies.&lt;br&gt;
So &lt;strong&gt;Login to JobFlow -&amp;gt; use the extension&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🧠 AI Layer
&lt;/h2&gt;

&lt;p&gt;AI isn't only to help the extension scrap the job details, it's also to &lt;strong&gt;give feedback&lt;/strong&gt;, &lt;strong&gt;compares your resume&lt;/strong&gt; (Resume will be uploaded in the main site after signing in just once but you can always update it 😏), and also &lt;strong&gt;generate cold emails&lt;/strong&gt; for you. &lt;/p&gt;
&lt;h3&gt;
  
  
  Why Groq?
&lt;/h3&gt;

&lt;p&gt;There are several AIs available but why &lt;strong&gt;Groq&lt;/strong&gt;? I was going for GEMINI but to be honest (it was not that good as I thought sadly), the responses are very good but the only problems comes is speed, request per day or token (it's slow and less tokens as well).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's why I had to choose something that can be actually fast (not waiting 1 minute just to see if my resume matches or not).&lt;br&gt;
And then how can I forget &lt;strong&gt;Groq&lt;/strong&gt;, I have already used it and already impressed about how fast it was and how good the responses were.&lt;br&gt;
Here are the few things that I considered while using GROQ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chatCompletion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;groq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;llama-3.3-70b-versatile&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;response_format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;json_object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model&lt;/strong&gt; I used &lt;strong&gt;llama-3.3-70b-versatile&lt;/strong&gt; that is a free, fast and gives around &lt;strong&gt;30 request per minute&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response return type&lt;/strong&gt; must be &lt;strong&gt;JSON&lt;/strong&gt; to get the correct data, if I get any other text format then it might break the AI analysis.
so I forced it only to send the JSON data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temperature&lt;/strong&gt; that sets the structure more consistent and not too creative.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt&lt;/strong&gt; : and how can I forget writing a clear prompt so the AI can return something useful not garbage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that's how I was able to use AI to create important features that actually helps job hunting easy not just creating a simple CRUD app.&lt;br&gt;
Now it gives feel good &lt;strong&gt;Scores from 0-100&lt;/strong&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React.js, Tailwind CSS, Context API, Vite, Lucide React&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Nodejs, ExpressJs, MongoDB(Mongoose)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Engine:&lt;/strong&gt; Groq API (Llama 3-70B), Prompt Engineering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extension:&lt;/strong&gt; Manifest V3, Chrome Scripting API, Shadow DOM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployement:&lt;/strong&gt; Render (Backend), Vercel (Frontend)&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  🚀 Try it out!
&lt;/h2&gt;

&lt;p&gt;That's JobFlow AI — built out of frustration at 2am, used daily, and finally documented 😄&lt;br&gt;
The extension isn't on the Chrome Web Store yet, but you can:&lt;/p&gt;

&lt;p&gt;📹 Watch the full demo above&lt;br&gt;
⭐ Star the repo and follow the README to run it locally&lt;br&gt;
🤝 Contribute if you want to help get it on the Web Store!&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Links:
&lt;/h3&gt;

&lt;p&gt;🌐 Live Demo → &lt;a href="https://job-flow-ai-three.vercel.app/" rel="noopener noreferrer"&gt;https://job-flow-ai-three.vercel.app/&lt;/a&gt;&lt;br&gt;
💻 GitHub → &lt;a href="https://github.com/Aryan-404-404/JobFlow-AI" rel="noopener noreferrer"&gt;https://github.com/Aryan-404-404/JobFlow-AI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're currently managing 15 tabs of job applications and a prayer — I built this for you. 🫡&lt;br&gt;
Drop a comment below 👇 what feature would YOU want next? Cover letter generator? Auto-apply?&lt;br&gt;
Happy Coding 🙂&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Building an ATS-Beating Resume Analyzer: From Gemini to Groq</title>
      <dc:creator>Aryan</dc:creator>
      <pubDate>Sun, 08 Mar 2026 14:53:27 +0000</pubDate>
      <link>https://dev.to/aryan404404/building-an-ats-beating-resume-analyzer-from-gemini-to-groq-339p</link>
      <guid>https://dev.to/aryan404404/building-an-ats-beating-resume-analyzer-from-gemini-to-groq-339p</guid>
      <description>&lt;p&gt;Hey guys, I'm Aryan, a full stack developer currently focusing on AI integrations and solving problems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dbm62edvwfia47gi6i6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dbm62edvwfia47gi6i6.gif" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚀 See it in action:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://ai-resume-analyzer-pi-ruby.vercel.app/" rel="noopener noreferrer"&gt;Check out the live site here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source Code:&lt;/strong&gt; &lt;a href="https://github.com/Aryan-404-404/AI-Resume-Analyzer" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tech Stack:&lt;/strong&gt; React, Tailwind CSS, Groq (Llama 3), and pdf.js&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🎯 The Problem: ATS Systems Are Gatekeepers
&lt;/h2&gt;

&lt;p&gt;If you are a developer or a person applying for jobs then you must have faced rejection due to not having a strong resume, resume isn't just about filling empty spaces by anything.&lt;br&gt;
We spend hours in building valuable projects but end up getting a rejection email.&lt;br&gt;
The culprit? &lt;strong&gt;ATS (Applicant Tracking System)&lt;/strong&gt;, instead of using one resume everywhere I decided to create something so I can optimize my resume for every job description, so I built a &lt;strong&gt;GROQ powered resume analyzer&lt;/strong&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚙️ What it actually does:
&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We upload our resume pdf&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We paste the job description&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After hitting analyze the details goes to GROQ (llama-3.3-70b-versatile) and it gives us the response.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The response consist of &lt;strong&gt;ATS score&lt;/strong&gt;, &lt;strong&gt;missing keywords&lt;/strong&gt; and &lt;strong&gt;Detailed analysis of resume including fixes&lt;/strong&gt; based on the job description.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🚧 Problems I faced:
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🤖 AI Rate Limits &amp;amp; Token Bottlenecks:
&lt;/h3&gt;

&lt;p&gt;Choosing the right AI is the core of this project, at first I was using &lt;strong&gt;Gemini (flash 2.0)&lt;/strong&gt; which is incredibly fast and smart but then I faced rate limiting issues.&lt;br&gt;
So then I switched to &lt;strong&gt;GROQ llama-3.3-70b-versatile&lt;/strong&gt; that gives: &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tokens per day (TPD) ~ 500,000&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Requests per minute ~ 30&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔗 The UI Freeze: Enter Web Workers
&lt;/h3&gt;

&lt;p&gt;While processing and parsing resume PDFs I realized for bigger files, it will try to handle all the process of extracting the text in the main thread of JavaScript that can result to freeze the UI few seconds.&lt;br&gt;
So I decided to use &lt;strong&gt;Web Worker&lt;/strong&gt;.&lt;br&gt;
Since JavaScript is single threaded, and performing expensive operations in it freezes UI and I/O operations, thus web worker helps to run these expensive operations to a separate thread preventing the overall flow from freezing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;pdfjsLib&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pdfjs-dist&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// 1. SETUP THE WORKER&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;pdfWorker&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pdfjs-dist/build/pdf.worker.min.mjs?url&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;pdfjsLib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GlobalWorkerOptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;workerSrc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pdfWorker&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;extractTextFromPDF&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
        &lt;span class="c1"&gt;// converting file to ArrayBuffer (binary form 0's and 1's)&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;arrayBuffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arrayBuffer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="c1"&gt;// We hand the binary data to the library.&lt;/span&gt;
        &lt;span class="c1"&gt;// This returns a 'pdf' object that acts like a book (it knows how many pages it has).&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pdfjsLib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDocument&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;arrayBuffer&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;numPages&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTextContent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pageText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;pageText&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error parsing PDF:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Failed to extract text from PDF.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎉 The Final Result:
&lt;/h2&gt;

&lt;p&gt;That's how I built something that truly taught me concepts like web worker and how to integrate AI and write clear prompt.&lt;br&gt;
It's live in the given link below and you can also check out the code in the repo given below, would love to see your feedback about the project.&lt;br&gt;


&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Aryan-404-404" rel="noopener noreferrer"&gt;
        Aryan-404-404
      &lt;/a&gt; / &lt;a href="https://github.com/Aryan-404-404/AI-Resume-Analyzer" rel="noopener noreferrer"&gt;
        AI-Resume-Analyzer
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      AI-powered Resume Analyzer using React, Tailwind CSS, and the Google Gemini API (2.0 Flash). Features PDF parsing, real-time job description matching, and intelligent gap analysis.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🚀 AI Resume Analyzer&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/18f8a526265952d1a4ed04eff457c936721e64e5bf4e3f35cca938efe3f30de5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d3230323332413f7374796c653d666f722d7468652d6261646765266c6f676f3d7265616374266c6f676f436f6c6f723d363144414642"&gt;&lt;img src="https://camo.githubusercontent.com/18f8a526265952d1a4ed04eff457c936721e64e5bf4e3f35cca938efe3f30de5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d3230323332413f7374796c653d666f722d7468652d6261646765266c6f676f3d7265616374266c6f676f436f6c6f723d363144414642" alt="React"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b308ff9a6de632b94c933c0f27975188080f8cf88a115ae10338540f8d9ab8ab/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d3030374143433f7374796c653d666f722d7468652d6261646765266c6f676f3d74797065736372697074266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/b308ff9a6de632b94c933c0f27975188080f8cf88a115ae10338540f8d9ab8ab/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d3030374143433f7374796c653d666f722d7468652d6261646765266c6f676f3d74797065736372697074266c6f676f436f6c6f723d7768697465" alt="TypeScript"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/84af53087957d441ad085a426371a789f1a45cd082080cb9cf63e7dd38ac082d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5461696c77696e645f4353532d3338423241433f7374796c653d666f722d7468652d6261646765266c6f676f3d7461696c77696e642d637373266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/84af53087957d441ad085a426371a789f1a45cd082080cb9cf63e7dd38ac082d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5461696c77696e645f4353532d3338423241433f7374796c653d666f722d7468652d6261646765266c6f676f3d7461696c77696e642d637373266c6f676f436f6c6f723d7768697465" alt="Tailwind CSS"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3bffbac82a769c49374d5628e6b6f926bc359d518aa1c61d3f8d5d4ffdeea4c5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f47726f712d4635353033363f7374796c653d666f722d7468652d6261646765266c6f676f3d67726f71266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/3bffbac82a769c49374d5628e6b6f926bc359d518aa1c61d3f8d5d4ffdeea4c5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f47726f712d4635353033363f7374796c653d666f722d7468652d6261646765266c6f676f3d67726f71266c6f676f436f6c6f723d7768697465" alt="Groq"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/6e43a7c97f30895c8a314333ed8f37d7aa49b4cd705d302e37689a6e8de3c80e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f566974652d3634364346463f7374796c653d666f722d7468652d6261646765266c6f676f3d76697465266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/6e43a7c97f30895c8a314333ed8f37d7aa49b4cd705d302e37689a6e8de3c80e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f566974652d3634364346463f7374796c653d666f722d7468652d6261646765266c6f676f3d76697465266c6f676f436f6c6f723d7768697465" alt="Vite"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A smart, AI-powered career tool that helps developers optimize their resumes for Applicant Tracking Systems (ATS).&lt;/strong&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Live Preview Link&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://ai-resume-analyzer-pi-ruby.vercel.app/" rel="nofollow noopener noreferrer"&gt;https://ai-resume-analyzer-pi-ruby.vercel.app/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This application uses the &lt;strong&gt;Groq Llama 3.3 70B&lt;/strong&gt; model to perform a deep-dive analysis of your resume against specific job descriptions. It provides a detailed match score, identifies missing technical keywords, and offers actionable feedback to help you land more interviews.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Key Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;📄 Smart PDF Analysis:&lt;/strong&gt; Automatically parses and extracts text from uploaded PDF resumes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔍 Job Description Matching:&lt;/strong&gt; Compares your skills directly against the target JD to calculate a relevance score.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📥 Download Reports:&lt;/strong&gt; Export your detailed analysis and missing keyword list (PDF/Text) for offline reference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📊 ATS Score Calculation:&lt;/strong&gt; Detailed breakdown of why your resume passes or fails specific ATS filters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💡 Intelligent Feedback:&lt;/strong&gt; Provides "Quick Fixes" and long-term improvements based on the identified gaps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⚡ Lightning-Fast Processing:&lt;/strong&gt; Powered by Groq's…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Aryan-404-404/AI-Resume-Analyzer" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




</description>
      <category>webdev</category>
      <category>ai</category>
      <category>webworker</category>
      <category>resume</category>
    </item>
  </channel>
</rss>
