JobPilot
Inspiration
The job market is the worst it has been in years. Applications go unanswered. Interviews ghost. Offers disappear. And yet the listings keep coming, hundreds of them, stacked across every job board, projecting a false sense of opportunity.
The cruelest part? A significant portion of those listings are fake. Ghost jobs are real postings for positions that no longer exist, or never did. Companies post them to build talent pipelines, satisfy HR quotas, or simply because no one bothered to take the listing down after the role was filled or cut.
For the average job seeker this is an inconvenience. For someone who is unemployed, switching careers, or trying to break in with no connections, it is devastating. They spend hours tailoring a resume, write a cover letter, hit submit, and hear nothing, not because they were not good enough, but because the job was never real.
We built JobPilot for the people who can least afford to waste that time. Recent graduates with no network. Career changers without referrals. People re-entering the workforce after a gap. They do not lack skill or ambition. They lack leverage.
What it does
JobPilot is a Chrome Extension that automates the entire job application pipeline from inside the browser.
When a user finds a job posting, JobPilot first validates it by cross-referencing the listing against live Google Search data via SerpAPI, flagging ghost jobs before any time is spent on them. If the posting is legitimate, JobPilot uses Google Vertex AI and Gemini 2.5 Flash to generate a tailored, role-specific resume, compiled into a professionally typeset PDF via LaTeX. When the user is ready, JobPilot submits the application automatically.
Verify, build, then apply, all without leaving the browser.
How we built it
JobPilot is split into a Chrome Extension frontend and a cloud-hosted Python backend.
The frontend is built with HTML, CSS, and JavaScript using Manifest V3. It captures job data from the active tab and communicates with the backend via REST, storing user profile and session data locally in chrome.storage.local.
The backend is a FastAPI server running on Uvicorn, written in Python 3.12, and deployed as a Docker container on Google Cloud Run. It orchestrates three purpose-built scripts: a Validation Script that queries SerpAPI to verify job postings, a Resume Script that calls Gemini 2.5 Flash via Google Vertex AI to generate a tailored LaTeX resume and compiles it to PDF using TexLive, and an Application Script that automates form submission using Gemini function calling. Authentication is handled entirely through Google Cloud default credentials, requiring no API keys.
Challenges we ran into
Getting the validation layer to return reliable signals was harder than expected. SerpAPI results vary significantly depending on how a query is structured, and early versions flagged too many legitimate postings as suspicious. We iterated on the query logic until the signal-to-noise ratio was usable in real time.
Prompt engineering for the resume generator took more passes than expected. Getting Gemini to produce clean, structured LaTeX output that compiled without errors required careful input formatting and a lot of edge case handling. Small inconsistencies in the job description input could cascade into broken LaTeX syntax.
Coordinating three scripts that each hit different external services introduced latency and failure-handling complexity. We had to think carefully about how to structure requests, handle timeouts gracefully, and keep the extension feeling responsive even when a backend call was slow.
Accomplishments that we're proud of
We are proud that the end-to-end pipeline actually works. A user can land on a job posting, hit a button, and get back a validated result and a tailored PDF resume in seconds. That felt like a long way off when we started.
We are also proud of the resume output quality. Using LaTeX for compilation rather than a generic export means the resumes look genuinely professional, not like something generated by a template tool.
Deploying a fully containerized backend to Cloud Run with keyless Vertex AI authentication was a clean infrastructure setup that we think will scale well.
What we learned
We learned web scraping and validation. Pulling live job data and cross-referencing it against external sources to determine posting legitimacy taught us how to think about data quality, query design, and making validation fast enough to be useful.
We learned how to use AI to produce better documents. Getting Gemini 2.5 Flash to generate a tailored, well-structured resume from a job description and user profile required real iteration on prompt design, output formatting, and the LaTeX compilation pipeline.
We learned how to call APIs efficiently. Coordinating three scripts each hitting different services taught us how to manage latency, handle failures gracefully, and structure requests for a production environment. Working with Vertex AI and SerpAPI gave us hands-on experience with rate limits, authentication, and response parsing at scale.
What's next for JobPilot
The immediate next step is expanding the Application Script to support more job platforms beyond the initial set. Right now it handles a limited number of submission flows and we want to broaden that coverage significantly.
We also want to add a dashboard inside the extension where users can track which jobs they applied to, which were flagged as ghost postings, and what their resume looked like for each application. That history layer would make JobPilot much more useful over a full job search, not just a single application.
Longer term, we want to use application outcome data to improve the resume generation model. If we can track which resume variations lead to more responses, we can close the feedback loop and make the AI recommendations smarter over time.
Built With
- css
- docker
- google-cloud-run
- google-gemini
- html5
- javascript
- python
- serpapi
- texlive
- uvicron
- vertexai
Log in or sign up for Devpost to join the conversation.