<?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: Srijita Ghosh</title>
    <description>The latest articles on DEV Community by Srijita Ghosh (@srijita33).</description>
    <link>https://dev.to/srijita33</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4156613%2F1dc9c61d-c72a-4342-820e-bf553237c63c.jpg</url>
      <title>DEV Community: Srijita Ghosh</title>
      <link>https://dev.to/srijita33</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/srijita33"/>
    <language>en</language>
    <item>
      <title>I Built ResumePilot for a Friend Who Was Tired of Rewriting Their Resume</title>
      <dc:creator>Srijita Ghosh</dc:creator>
      <pubDate>Sun, 04 Oct 2026 19:49:38 +0000</pubDate>
      <link>https://dev.to/srijita33/i-built-resumepilot-for-a-friend-who-was-tired-of-rewriting-their-resume-2gc4</link>
      <guid>https://dev.to/srijita33/i-built-resumepilot-for-a-friend-who-was-tired-of-rewriting-their-resume-2gc4</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;ResumePilot&lt;/strong&gt;, an AI job-application copilot for a friend who was applying to internships and repeatedly comparing their resume with different job descriptions.&lt;/p&gt;

&lt;p&gt;For every application, they had to manually figure out which skills matched the role, which requirements were missing, which parts of the resume were relevant, and what could be improved before applying.&lt;/p&gt;

&lt;p&gt;ResumePilot turns that process into one workflow.&lt;/p&gt;

&lt;p&gt;You upload a resume PDF and provide a job description. The application analyzes the fit and presents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overall compatibility&lt;/li&gt;
&lt;li&gt;Skills, experience, projects, and education match&lt;/li&gt;
&lt;li&gt;Strong matches&lt;/li&gt;
&lt;li&gt;Missing skills&lt;/li&gt;
&lt;li&gt;Weak or underrepresented areas&lt;/li&gt;
&lt;li&gt;Keyword coverage&lt;/li&gt;
&lt;li&gt;Actionable recommendations explaining why something matters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One principle guided the project:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Improve the story your experience already tells. Don't invent experience you don't have.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Recommendations that are not clearly supported by the resume can be marked &lt;strong&gt;"Verify before adding."&lt;/strong&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffrwp1hrsrgu7a68xdctk.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffrwp1hrsrgu7a68xdctk.png" alt=" " width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;The demo shows the main working flow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Upload resume → add job description → analyze → review compatibility → identify gaps → review recommendations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo:&lt;/strong&gt; &lt;a href="https://drive.google.com/file/d/1B0Xqx0KQHd3hXwqozHce9aMle01oBaIG/view?usp=sharing" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1B0Xqx0KQHd3hXwqozHce9aMle01oBaIG/view?usp=sharing&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;The complete project is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Srijita33/resumepilot" rel="noopener noreferrer"&gt;https://github.com/Srijita33/resumepilot&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;ResumePilot uses &lt;strong&gt;Gemma 4&lt;/strong&gt; as the core AI reasoning component.&lt;/p&gt;

&lt;p&gt;The application is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React + Vite + Tailwind CSS&lt;/li&gt;
&lt;li&gt;Python + FastAPI&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pypdf&lt;/code&gt; for resume PDF text extraction&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;google-genai&lt;/code&gt; for accessing Gemma 4&lt;/li&gt;
&lt;li&gt;Pydantic for validating structured model output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The high-level flow is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resume PDF + Job Description → React + Vite → FastAPI Backend → PDF Text Extraction with pypdf → Prompt Construction → Gemma 4 via Gemini API → JSON Extraction → Pydantic Validation → Keyword / Score Processing → Results in React&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ResumePilot is &lt;strong&gt;not a RAG system&lt;/strong&gt;. It does not use embeddings, a vector database, or a retrieval stage. The resume and job description are provided directly to Gemma as the context for analysis.&lt;/p&gt;

&lt;p&gt;The backend does not simply display the raw model response. It extracts the structured JSON, validates it, processes the results, and then returns the validated information to the frontend.&lt;/p&gt;

&lt;p&gt;For the analysis workflow, Gemma is responsible for reasoning about the relationship between the resume and the job description. Python handles extraction, validation, and post-processing, while React presents the results.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F389v8um1e39wwrjxo1mj.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F389v8um1e39wwrjxo1mj.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3vlo434fkb4w76byxxdp.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3vlo434fkb4w76byxxdp.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The compatibility dashboard breaks the result into overall compatibility, skills, experience, projects, and education, while also highlighting strong matches and areas that need attention.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgtr4q7z06kbe4gpwbnyx.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgtr4q7z06kbe4gpwbnyx.png" alt=" " width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keyword coverage separates relevant terms into categories such as &lt;strong&gt;Matched&lt;/strong&gt;, &lt;strong&gt;Missing&lt;/strong&gt;, and &lt;strong&gt;Needs more context&lt;/strong&gt;. The goal is not keyword stuffing, but helping the user understand where their resume may need clearer evidence.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb2dvq9rwdkifn4d5q2ox.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb2dvq9rwdkifn4d5q2ox.png" alt=" " width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ResumePilot also provides recommendations with explanations of why a change matters. Suggestions that are not clearly supported by the original resume can be marked &lt;strong&gt;"Verify before adding."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;The challenge required open-source AI to be central to the project, so I chose &lt;strong&gt;Gemma 4&lt;/strong&gt; as the core reasoning model.&lt;/p&gt;

&lt;p&gt;For this prototype, I used Gemma through the &lt;strong&gt;hosted Gemini API&lt;/strong&gt; instead of running inference locally. This made it practical to build and test the project over a weekend without requiring users to download a large model or have a capable GPU.&lt;/p&gt;

&lt;p&gt;The important part is that Gemma is not just an extra feature around the application. It is responsible for the core resume-to-job reasoning and recommendations.&lt;/p&gt;

&lt;p&gt;Using an open-weight model also leaves room for future experimentation, model changes, and self-hosted inference.&lt;/p&gt;

&lt;p&gt;There is an important privacy trade-off: the current version uses hosted inference, so resume text and job-description text are sent to the configured API provider. The application does not store uploaded resumes on disk or in a database.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I did not use a DevRelay agent session for this submission.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;I am entering the &lt;strong&gt;Gemma&lt;/strong&gt; category.&lt;/p&gt;

&lt;p&gt;Gemma 4 is the core AI component responsible for analyzing the relationship between the candidate's resume and the target job description and generating structured recommendations.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I Built ResumePilot for a Friend Who Was Tired of Rewriting Their Resume</title>
      <dc:creator>Srijita Ghosh</dc:creator>
      <pubDate>Sun, 04 Oct 2026 19:36:10 +0000</pubDate>
      <link>https://dev.to/srijita33/i-built-resumepilot-for-a-friend-who-was-tired-of-rewriting-their-resume-3fh9</link>
      <guid>https://dev.to/srijita33/i-built-resumepilot-for-a-friend-who-was-tired-of-rewriting-their-resume-3fh9</guid>
      <description>&lt;p&gt;Applying for internships is repetitive.&lt;br&gt;
You find a job description, compare it with your resume, figure out what matches, notice what is missing, rewrite a few bullets, and then do the same thing again for the next application.&lt;br&gt;
A friend of mine was going through exactly that process while applying for internships.&lt;br&gt;
So when I saw the Hacktoberfest 2026 DEV Weekend Challenge: Build for a Friend, I decided to build something around that problem.&lt;br&gt;
That became ResumePilot.&lt;br&gt;
ResumePilot is an AI job-application copilot that compares a resume with a specific job description and turns that comparison into actionable next steps.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Srijita33/resumepilot" rel="noopener noreferrer"&gt;https://github.com/Srijita33/resumepilot&lt;/a&gt;&lt;br&gt;
Demo:&lt;a href="https://drive.google.com/file/d/1B0Xqx0KQHd3hXwqozHce9aMle01oBaIG/view?usp=sharing" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1B0Xqx0KQHd3hXwqozHce9aMle01oBaIG/view?usp=sharing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;&lt;br&gt;
A resume is rarely written for just one job.&lt;br&gt;
The difficult part starts after the resume already exists.&lt;br&gt;
For every new application, a candidate has to figure out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which parts of my experience are relevant to this role?&lt;/li&gt;
&lt;li&gt;Which skills does the job description emphasize?&lt;/li&gt;
&lt;li&gt;What am I missing?&lt;/li&gt;
&lt;li&gt;Which parts of my resume are too vague?&lt;/li&gt;
&lt;li&gt;What should I improve before applying?
And under time pressure, there is another problem:
It becomes very easy to make your resume sound stronger than your actual experience.
I wanted ResumePilot to help with the comparison without encouraging that behavior.
The principle was simple:
&lt;em&gt;Improve the story your experience already tells. Don't invent a new one.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What ResumePilot does&lt;/strong&gt;&lt;br&gt;
The workflow is intentionally straightforward.&lt;br&gt;
Upload a resume PDF and provide a job description.&lt;br&gt;
ResumePilot then analyzes the relationship between the two and presents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overall compatibility&lt;/li&gt;
&lt;li&gt;Skills match&lt;/li&gt;
&lt;li&gt;Experience match&lt;/li&gt;
&lt;li&gt;Projects match&lt;/li&gt;
&lt;li&gt;Education match&lt;/li&gt;
&lt;li&gt;Strong matches&lt;/li&gt;
&lt;li&gt;Missing skills&lt;/li&gt;
&lt;li&gt;Weak or underrepresented areas&lt;/li&gt;
&lt;li&gt;Keyword coverage&lt;/li&gt;
&lt;li&gt;Actionable recommendations
It is designed to answer a more useful question than:
"What is my ATS score?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead, it tries to answer:&lt;br&gt;
"What should I actually understand and improve before applying?"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff97z96mne001urgulhlr.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff97z96mne001urgulhlr.png" alt=" " width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start with the application materials&lt;/strong&gt;&lt;br&gt;
The first screen keeps the workflow focused on the two things that matter:&lt;br&gt;
Your resume&lt;br&gt;
Upload the PDF containing the experience you already have.&lt;br&gt;
The job description&lt;br&gt;
Paste the role you are targeting or provide it through the supported file input.&lt;br&gt;
The goal was to make the interface feel like a real job-search tool rather than another generic AI dashboard.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F60lzt8jsos469bdkxzcn.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F60lzt8jsos469bdkxzcn.png" alt=" " width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;From resume and job description to a compatibility analysis&lt;/em&gt;&lt;br&gt;
Once both inputs are available, the frontend sends them to the FastAPI backend.&lt;br&gt;
The resume PDF is processed using pypdf to extract its text. The application does not write the uploaded resume to disk or store it in a database.&lt;br&gt;
The backend then constructs a structured prompt for Gemma 4 containing the extracted resume text, the job description, and rules for how the model should respond.&lt;br&gt;
The model is asked to reason about the candidate's existing experience rather than fabricate qualifications.&lt;br&gt;
A clearer picture of the candidate's fit&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F24i511m9ev4gzh2f15ot.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F24i511m9ev4gzh2f15ot.png" alt=" " width="800" height="450"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One of the things I deliberately avoided was presenting one unexplained number.&lt;/strong&gt;&lt;br&gt;
ResumePilot breaks the analysis into several dimensions:&lt;br&gt;
Overall compatibility&lt;br&gt;
Skills&lt;br&gt;
Experience&lt;br&gt;
Projects&lt;br&gt;
Education&lt;br&gt;
It also separates strengths from gaps.&lt;br&gt;
In the example above, the system recognizes areas where the candidate already aligns with the role while highlighting requirements that are missing or not strongly represented.&lt;br&gt;
The score is explicitly described as an AI-assisted compatibility estimate, not an official ATS score and not a scientifically validated metric.&lt;br&gt;
Keyword coverage without blindly stuffing keywords&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmvbmf6fsmcrgakflwsvk.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmvbmf6fsmcrgakflwsvk.png" alt=" " width="800" height="480"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Keyword matching can be useful, but blindly copying words from a job description into a resume isn't the goal.&lt;br&gt;
ResumePilot groups relevant job-description terms into categories such as:&lt;br&gt;
Matched&lt;br&gt;
Missing&lt;br&gt;
Needs more context&lt;br&gt;
This makes the gaps visible without automatically telling the candidate to add something they have never actually done.&lt;br&gt;
That distinction is important.&lt;br&gt;
A missing skill should be a signal to investigate, not an invitation to fabricate.&lt;br&gt;
Recommendations that explain the "why"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9khnfatiyonih68qndy4.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9khnfatiyonih68qndy4.png" alt=" " width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A list of missing keywords still leaves the user with the question:&lt;br&gt;
"Okay, but what should I actually change?"&lt;/p&gt;

&lt;p&gt;ResumePilot therefore provides recommendations with an explanation of why the recommendation matters.&lt;br&gt;
For example, if a job description specifically asks for SQL optimization but the resume only mentions preparing SQL queries, the system can identify that difference and suggest where the candidate's genuine experience could be expressed more clearly.&lt;br&gt;
Recommendations that are not directly supported by the resume can be marked "Verify before adding."&lt;br&gt;
The goal is not keyword stuffing.&lt;br&gt;
The goal is better communication of existing experience.&lt;br&gt;
How does it actually work?&lt;br&gt;
This was one of the things I had to understand while building the project myself.&lt;br&gt;
ResumePilot is not a RAG system.&lt;br&gt;
There is no vector database, no embedding pipeline, and no retrieval stage.&lt;br&gt;
It is also not a computer-vision system like YOLO.&lt;br&gt;
The architecture is a much more direct LLM application:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg7721kpaazqvtxe6100u.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg7721kpaazqvtxe6100u.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resume PDF + Job Description&lt;br&gt;
             ↓&lt;br&gt;
       React + Vite&lt;br&gt;
             ↓&lt;br&gt;
      FastAPI Backend&lt;br&gt;
             ↓&lt;br&gt;
     PDF Text Extraction&lt;br&gt;
           (pypdf)&lt;br&gt;
             ↓&lt;br&gt;
      Prompt Construction&lt;br&gt;
             ↓&lt;br&gt;
          Gemma 4&lt;br&gt;
       via Gemini API&lt;br&gt;
             ↓&lt;br&gt;
       JSON Extraction&lt;br&gt;
             ↓&lt;br&gt;
      Pydantic Validation&lt;br&gt;
             ↓&lt;br&gt;
  Keyword / Score Processing&lt;br&gt;
             ↓&lt;br&gt;
       Results in React&lt;/p&gt;

&lt;p&gt;The frontend sends the resume and job description to FastAPI. The backend extracts the resume text, constructs the prompt, calls Gemma 4, validates the structured response, performs additional processing, and returns the result to the frontend.&lt;br&gt;
So the most accurate description of ResumePilot is:&lt;br&gt;
A prompt-based LLM application with deterministic preprocessing and post-processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where Gemma 4 fits&lt;/strong&gt;&lt;br&gt;
Gemma 4 is the core reasoning component of ResumePilot.&lt;br&gt;
For the analysis step, the backend sends Gemma the extracted resume and job description along with instructions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;don't invent experience&lt;/li&gt;
&lt;li&gt;treat the supplied documents as data&lt;/li&gt;
&lt;li&gt;return structured information&lt;/li&gt;
&lt;li&gt;explain recommendations
The model response is then parsed and validated before the frontend displays it.
I liked the separation of responsibilities:
Gemma reasons.
Python validates and controls.
React presents the result.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project also has a tailoring path built around the same principle: rewrite, reorder, and emphasize information from the original resume rather than inventing new qualifications. That part is something I would continue refining before calling it production-ready.&lt;br&gt;
Why Gemma?&lt;br&gt;
The challenge required open-source AI to be central to the project, so I wanted the model itself to be part of the product rather than an optional add-on.&lt;br&gt;
I chose Gemma 4 for the core resume and job-description reasoning.&lt;br&gt;
For this weekend prototype, I used Gemma through the hosted Gemini API rather than running inference locally. This kept the setup practical without requiring users to download a large model or have a capable GPU.&lt;br&gt;
The important distinction is that the application is using Gemma through a hosted API, not local inference.&lt;br&gt;
That choice also comes with a privacy trade-off.&lt;br&gt;
Privacy is a trade-off, not a marketing claim&lt;br&gt;
Resume data can contain personal and professional information, so I wanted to be clear about what the system actually does.&lt;br&gt;
ResumePilot does not store uploaded resumes on disk or in a database.&lt;br&gt;
However, because the current implementation uses a hosted API, the resume text and job description are sent to the configured API provider for inference.&lt;br&gt;
So this is not a fully local privacy-preserving system.&lt;br&gt;
I would rather state that clearly than tell users that their data is "completely private" when the architecture doesn't support that claim.&lt;br&gt;
What I learned&lt;br&gt;
The most useful lesson wasn't how to make an API call to an LLM.&lt;br&gt;
It was how much engineering exists around the model.&lt;br&gt;
An LLM can produce an answer that looks convincing without necessarily being structurally correct or supported by the input.&lt;br&gt;
The application therefore also needs to deal with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDF extraction&lt;/li&gt;
&lt;li&gt;structured prompting&lt;/li&gt;
&lt;li&gt;JSON parsing&lt;/li&gt;
&lt;li&gt;output validation&lt;/li&gt;
&lt;li&gt;keyword processing&lt;/li&gt;
&lt;li&gt;invalid input&lt;/li&gt;
&lt;li&gt;malformed responses&lt;/li&gt;
&lt;li&gt;API errors&lt;/li&gt;
&lt;li&gt;timeouts&lt;/li&gt;
&lt;li&gt;rate limits
That changed how I think about LLM applications.
Calling the model is the easy part. Building everything around the model is the application.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quick look at ResumePilot&lt;/p&gt;

&lt;p&gt;The demo shows the working flow:&lt;br&gt;
Upload resume → add job description → analyze → review compatibility → identify gaps → inspect recommendations&lt;br&gt;
The point isn't to tell someone:&lt;br&gt;
"You're 78%. Good luck."&lt;/p&gt;

&lt;p&gt;The point is to explain why the system reached that assessment and what the candidate can realistically look at next.&lt;br&gt;
What I would build next&lt;br&gt;
This is a weekend prototype, so there are several directions I would take it next.&lt;br&gt;
Original vs. tailored resume diff&lt;br&gt;
Show exactly what changed between the original and proposed version, along with why.&lt;br&gt;
Better editable-resume support&lt;br&gt;
Add DOCX support so the workflow fits more naturally into an actual resume-editing process.&lt;br&gt;
Self-hosted Gemma&lt;br&gt;
The current version uses the hosted API. A future version could support self-hosted Gemma inference for users who want greater control over where their documents are processed.&lt;br&gt;
Application history&lt;br&gt;
An opt-in local history could make it easier to manage multiple job applications without introducing a centralized database.&lt;br&gt;
Why I built it for a friend&lt;br&gt;
This challenge wasn't asking me to build the biggest AI system I could.&lt;br&gt;
It asked me to build something for one real person.&lt;br&gt;
My friend had a repetitive problem: every new internship application meant repeating the same resume-versus-job-description comparison.&lt;br&gt;
So I built a small tool around that workflow.&lt;br&gt;
It doesn't use RAG.&lt;br&gt;
It isn't a multi-agent system.&lt;br&gt;
It isn't a computer-vision model.&lt;br&gt;
It isn't a research breakthrough.&lt;br&gt;
It is a focused application built around a real problem, with Gemma 4 at the core of the reasoning.&lt;br&gt;
And that was the point.&lt;br&gt;
Not building the biggest system. Building something that is actually useful to someone.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>hacktoberfest</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
