{"slug": "i-built-resumepilot-for-a-friend-who-was-tired-of-rewriting-their-resume", "title": "I Built ResumePilot for a Friend Who Was Tired of Rewriting Their Resume", "summary": "A developer built ResumePilot, an AI job-application copilot that compares a resume PDF against a specific job description and returns a multi-dimensional compatibility analysis covering skills, experience, projects and education. The tool uses pypdf to extract resume text in memory and sends a structured prompt to Gemma 4 via a FastAPI backend, deliberately avoiding a single opaque score and framing missing keywords as signals to investigate rather than invitations to fabricate experience.", "body_md": "Applying for internships is repetitive.\n\nYou 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.\n\nA friend of mine was going through exactly that process while applying for internships.\n\nSo when I saw the Hacktoberfest 2026 DEV Weekend Challenge: Build for a Friend, I decided to build something around that problem.\n\nThat became ResumePilot.\n\nResumePilot is an AI job-application copilot that compares a resume with a specific job description and turns that comparison into actionable next steps.\n\nGitHub: [https://github.com/Srijita33/resumepilot](https://github.com/Srijita33/resumepilot)\n\nDemo:[https://drive.google.com/file/d/1B0Xqx0KQHd3hXwqozHce9aMle01oBaIG/view?usp=sharing](https://drive.google.com/file/d/1B0Xqx0KQHd3hXwqozHce9aMle01oBaIG/view?usp=sharing)\n\n**The problem**\n\nA resume is rarely written for just one job.\n\nThe difficult part starts after the resume already exists.\n\nFor every new application, a candidate has to figure out:\n\n**What ResumePilot does**\n\nThe workflow is intentionally straightforward.\n\nUpload a resume PDF and provide a job description.\n\nResumePilot then analyzes the relationship between the two and presents:\n\nInstead, it tries to answer:\n\n\"What should I actually understand and improve before applying?\"\n\n**Start with the application materials**\n\nThe first screen keeps the workflow focused on the two things that matter:\n\nYour resume\n\nUpload the PDF containing the experience you already have.\n\nThe job description\n\nPaste the role you are targeting or provide it through the supported file input.\n\nThe goal was to make the interface feel like a real job-search tool rather than another generic AI dashboard.\n\n*From resume and job description to a compatibility analysis*\n\nOnce both inputs are available, the frontend sends them to the FastAPI backend.\n\nThe 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.\n\nThe 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.\n\nThe model is asked to reason about the candidate's existing experience rather than fabricate qualifications.\n\nA clearer picture of the candidate's fit\n\n**One of the things I deliberately avoided was presenting one unexplained number.**\n\nResumePilot breaks the analysis into several dimensions:\n\nOverall compatibility\n\nSkills\n\nExperience\n\nProjects\n\nEducation\n\nIt also separates strengths from gaps.\n\nIn 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.\n\nThe score is explicitly described as an AI-assisted compatibility estimate, not an official ATS score and not a scientifically validated metric.\n\nKeyword coverage without blindly stuffing keywords\n\nKeyword matching can be useful, but blindly copying words from a job description into a resume isn't the goal.\n\nResumePilot groups relevant job-description terms into categories such as:\n\nMatched\n\nMissing\n\nNeeds more context\n\nThis makes the gaps visible without automatically telling the candidate to add something they have never actually done.\n\nThat distinction is important.\n\nA missing skill should be a signal to investigate, not an invitation to fabricate.\n\nRecommendations that explain the \"why\"\n\nA list of missing keywords still leaves the user with the question:\n\n\"Okay, but what should I actually change?\"\n\nResumePilot therefore provides recommendations with an explanation of why the recommendation matters.\n\nFor 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.\n\nRecommendations that are not directly supported by the resume can be marked \"Verify before adding.\"\n\nThe goal is not keyword stuffing.\n\nThe goal is better communication of existing experience.\n\nHow does it actually work?\n\nThis was one of the things I had to understand while building the project myself.\n\nResumePilot is not a RAG system.\n\nThere is no vector database, no embedding pipeline, and no retrieval stage.\n\nIt is also not a computer-vision system like YOLO.\n\nThe architecture is a much more direct LLM application:\n\nResume PDF + Job Description\n\n             ↓\n\n       React + Vite\n\n             ↓\n\n      FastAPI Backend\n\n             ↓\n\n     PDF Text Extraction\n\n           (pypdf)\n\n             ↓\n\n      Prompt Construction\n\n             ↓\n\n          Gemma 4\n\n       via Gemini API\n\n             ↓\n\n       JSON Extraction\n\n             ↓\n\n      Pydantic Validation\n\n             ↓\n\n  Keyword / Score Processing\n\n             ↓\n\n       Results in React\n\nThe 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.\n\nSo the most accurate description of ResumePilot is:\n\nA prompt-based LLM application with deterministic preprocessing and post-processing.\n\n**Where Gemma 4 fits**\n\nGemma 4 is the core reasoning component of ResumePilot.\n\nFor the analysis step, the backend sends Gemma the extracted resume and job description along with instructions such as:\n\nThe 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.\n\nWhy Gemma?\n\nThe 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.\n\nI chose Gemma 4 for the core resume and job-description reasoning.\n\nFor 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.\n\nThe important distinction is that the application is using Gemma through a hosted API, not local inference.\n\nThat choice also comes with a privacy trade-off.\n\nPrivacy is a trade-off, not a marketing claim\n\nResume data can contain personal and professional information, so I wanted to be clear about what the system actually does.\n\nResumePilot does not store uploaded resumes on disk or in a database.\n\nHowever, because the current implementation uses a hosted API, the resume text and job description are sent to the configured API provider for inference.\n\nSo this is not a fully local privacy-preserving system.\n\nI would rather state that clearly than tell users that their data is \"completely private\" when the architecture doesn't support that claim.\n\nWhat I learned\n\nThe most useful lesson wasn't how to make an API call to an LLM.\n\nIt was how much engineering exists around the model.\n\nAn LLM can produce an answer that looks convincing without necessarily being structurally correct or supported by the input.\n\nThe application therefore also needs to deal with:\n\nA quick look at ResumePilot\n\nThe demo shows the working flow:\n\nUpload resume → add job description → analyze → review compatibility → identify gaps → inspect recommendations\n\nThe point isn't to tell someone:\n\n\"You're 78%. Good luck.\"\n\nThe point is to explain why the system reached that assessment and what the candidate can realistically look at next.\n\nWhat I would build next\n\nThis is a weekend prototype, so there are several directions I would take it next.\n\nOriginal vs. tailored resume diff\n\nShow exactly what changed between the original and proposed version, along with why.\n\nBetter editable-resume support\n\nAdd DOCX support so the workflow fits more naturally into an actual resume-editing process.\n\nSelf-hosted Gemma\n\nThe 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.\n\nApplication history\n\nAn opt-in local history could make it easier to manage multiple job applications without introducing a centralized database.\n\nWhy I built it for a friend\n\nThis challenge wasn't asking me to build the biggest AI system I could.\n\nIt asked me to build something for one real person.\n\nMy friend had a repetitive problem: every new internship application meant repeating the same resume-versus-job-description comparison.\n\nSo I built a small tool around that workflow.\n\nIt doesn't use RAG.\n\nIt isn't a multi-agent system.\n\nIt isn't a computer-vision model.\n\nIt isn't a research breakthrough.\n\nIt is a focused application built around a real problem, with Gemma 4 at the core of the reasoning.\n\nAnd that was the point.\n\nNot building the biggest system. Building something that is actually useful to someone.", "url": "https://wpnews.pro/news/i-built-resumepilot-for-a-friend-who-was-tired-of-rewriting-their-resume", "canonical_source": "https://dev.to/srijita33/i-built-resumepilot-for-a-friend-who-was-tired-of-rewriting-their-resume-3fh9", "published_at": "2026-10-04 19:36:10+00:00", "updated_at": "2026-10-04 19:42:34.929068+00:00", "lang": "en", "topics": ["artificial-intelligence", "ai-tools", "generative-ai", "large-language-models", "ai-products"], "entities": ["ResumePilot", "Gemma 4", "FastAPI", "pypdf", "Hacktoberfest 2026 DEV Weekend Challenge", "Srijita33"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/i-built-resumepilot-for-a-friend-who-was-tired-of-rewriting-their-resume", "markdown": "https://wpnews.pro/news/i-built-resumepilot-for-a-friend-who-was-tired-of-rewriting-their-resume.md", "text": "https://wpnews.pro/news/i-built-resumepilot-for-a-friend-who-was-tired-of-rewriting-their-resume.txt", "jsonld": "https://wpnews.pro/news/i-built-resumepilot-for-a-friend-who-was-tired-of-rewriting-their-resume.jsonld"}}