Inspiration
Applying to jobs means typing the same name, email, phone number, school, and work history into a different form every single time. Even though you upload a resume at the very top of the page, platforms like Greenhouse, Lever, Ashby, Workday, and Eightfold still make you fill out dozens of boxes by hand. Each site has its own annoying quirks: custom searchable dropdowns, hidden radio buttons for demographic disclosures, drag-and-drop file boxes, and multi-page wizards.
We wanted an AI assistant that could do the tedious work for you inside your own browser—where you are already logged in—but only if it never made things up. Guessing the wrong answer to "Are you legally authorized to work in the US?" or "Will you require visa sponsorship?" is much worse than leaving a field blank. That led to our core rule for Resumate: fill what we know for sure, stop and flag anything we don't, and never click the final Submit button behind the user's back.
What it does
Resumate is an AI-powered Chrome extension and local bridge that fills out job application forms for you right inside your browser.
- You give it your resume once. You can upload your resume (
.pdfor.md) or a saved profile in Chrome's side panel, or simply paste your resume to the AI. Resumate organizes your history into a clean, structured profile—covering contact info, education, work experience, projects, skills, awards, work authorization, and custom Q&A—and keeps it synced. - It reads the page like a human, not a wall of code. Job portals are full of messy HTML. Resumate translates the page into a clean, compact outline where every button or input box gets a simple tag (like
@e12) grouped under its actual question or section (such as "Work Experience 1" or "Are you authorized to work?"). That way, repeated fields like "Company Name" or "Yes / No" buttons are never confused. - It sees only what changed after each action. When the AI clicks a dropdown (like "Country" or "University"), it doesn't have to re-read the entire webpage. Resumate sends back a tiny "delta" update showing only the newly opened options or error messages—making the AI fast and cutting token usage by over 90%.
- It fills out the whole form in one go. Instead of clicking one field at a time and waiting, the AI bundles dozens of fields into a single batch action. It uses safe placeholders (like
${preferences.general.email}) that our system swaps out with your verified information right before typing. - It handles stubborn website widgets. It clicks styled checkboxes and radio buttons through their visible labels, attaches your resume PDF directly into upload boxes without popping open your computer's file-picker window, and checks that every field actually kept the value it was given.
- It leaves the final check to you. If a form asks an open-ended or unfamiliar question (like "How did you hear about this role?"), Resumate skips it and lists it clearly under User Actions Remaining so you can finish it in seconds and hit Submit yourself.
- It stays in its own lane. Resumate locks the job tab into a dedicated purple "AutoResume (MCP)" tab group in Chrome. It cannot touch or read your personal email, banking, or other open tabs, and its side panel shows a live, step-by-step feed of everything the AI is doing.
How we built it
Most AI apps run outside your browser, while web forms live inside it. To connect the two safely without using a separate "headless" bot browser (which websites easily block with CAPTCHAs), we built Resumate in three connected pieces:
- A Local AI Server (Node.js using the Model Context Protocol):
We built a lightweight local server using the Model Context Protocol (MCP)—the open standard that lets desktop AI apps like Claude Desktop, Cursor, Windsurf, and Gemini use external tools. This server exposes 36 browser and profile tools, validates your resume data against a strict JSON schema, swaps template variables (
${preferences.*}) with your real details, and even includes a built-in PDF reader to extract text from your uploaded resume. - A Local WebSocket Bridge:
The local server talks to our Chrome extension over a private local connection (
ws://127.0.0.1:9001). It automatically cleans up stuck background ports on startup, blocks unauthorized websites from connecting, and adjusts timeouts dynamically when running large batches of actions. - A Chrome Manifest V3 Extension & Side Panel: Inside Chrome, our background worker manages the purple tab group, connects to Chrome's built-in DevTools Protocol (CDP) to perform genuine hardware-level mouse clicks, hovers, drags, and key presses, and powers the live side panel UI. Meanwhile, lightweight scripts inside the job tab build the compact page outline, keep track of form fields even when the webpage re-renders, type text at a natural human pace, and inject resume files.
To tie it all together, we wrote an AI Skill guide that teaches any connected AI model a 7-step workflow: check your saved profile → confirm the target tab → scan the page → open any hidden dropdowns in one batch → fill out the entire form in a single "mega-batch" → attach your resume → verify the filled values and hand the page back to you.
Challenges we ran into
- Modern web forms actively fight automation. Many job sites are built with React or Vue, which ignore simple scripts that just change an input box's text. To make values stick, we had to hook into the browser's native input setters and trigger the exact sequence of typing, change, and blur events the website expects. Other sites hide the real radio button or file input completely (
0x0pixels) behind a decorative label, so we had to teach our scanner to "rescue" hidden inputs and redirect clicks to their visible labels. - Webpages that rebuild themselves mid-fill. On sites like Workday, choosing your country in one dropdown often causes the webpage to destroy and rebuild the state and city boxes right below it. Originally, this broke the AI's
@eXtags mid-batch. We solved this by creating self-healing semantic anchors—a fingerprinting system that recognizes a rebuilt input box by its role, label, and section so it keeps the exact same@eXtag even after the page refreshes its layout. - Fixing our own "double-snapshot" bug. In an earlier version, our server took a second snapshot of the page right after every action, which accidentally erased the "what changed" diff and told the AI nothing had happened. We redesigned the flow so the Chrome extension waits a brief
75msfor the page to settle after an action and captures the diff in a single pass. - Preventing silent blank answers on critical questions. Early on, if a template placeholder didn't match anything in your profile, the system quietly turned it into an empty string
"". We realized that silently leaving a legal or required field blank is dangerous. We updated the template engine so truly optional fields (like a personal website or academic minor) can stay blank, while missing required or work-authorization fields immediately stop and alert the AI. - Keeping three moving parts in sync. Chrome automatically puts extension background workers to sleep after 30 seconds of inactivity. We had to build a heartbeat system, session-storage backups, and two-way sync events so that uploading or deleting a resume in Chrome's side panel immediately updates the local server and vice versa.
Accomplishments that we're proud of
- An end-to-end system that actually works on real job portals: Watching an AI agent read a multi-section application form, open custom dropdowns, fill out dozens of fields in seconds, attach a PDF resume, and stop cleanly before the Submit button feels like magic.
- Over 90% reduction in AI token cost: By stripping out layout clutter, summarizing closed
<select>menus inline, and sending compact "delta" diffs after actions instead of re-sending the whole page, we shrank the data sent to the AI on a 40-field application from ~185,000 characters down to ~14,500 characters. - Self-auditing and fixing our hardest edge cases: Instead of just trusting happy-path demos, we audited our own system, built a 15-part automated test suite, and fixed real-world failure modes—adding read-back verification (
form_inputchecks that the value actually stuck), sticky-banner collision detection (checking if a cookie banner is blocking a button before clicking), and smart aliases (solocation.cityandaddress.cityboth work seamlessly). - Privacy by design: By confining the AI to the purple
AutoResume (MCP)tab group and redacting the titles and URLs of every other tab in your window, users never have to worry about the AI peeking at their personal browsing.
What we learned
- Giving the AI a clean map matters more than fancy clicking tools. The biggest leap in accuracy didn't come from how we clicked buttons—it came from how we formatted the page outline. Grouping inputs clearly under their parent question made the AI dramatically smarter at handling complex forms.
- "The click fired" doesn't mean "the form changed." On modern websites, dispatching an event is only half the battle. Reading the value back from the page after typing—and checking whether a popup or cookie banner is covering a button—is the difference between a brittle demo and a reliable tool.
- Hybrid browser control is the sweet spot. Using Chrome's low-level DevTools Protocol (CDP) gives us genuine hardware-style clicks that open stubborn dropdowns, while using in-page DOM setters lets us paste multi-paragraph cover letters or job descriptions instantaneously without timing out.
What's next for Resumate
- Built-in browser chat (no desktop app required): Our side panel already has a settings tab where you can save API keys for Gemini, Claude, OpenAI, or local Ollama models alongside a one-click quick-autofill button. Next, we are connecting those saved keys to a full in-panel chat loop so anyone can run the entire AI agent directly inside Chrome without installing a desktop MCP client.
- Support for cross-domain embedded forms (
iframes): Resumate already sees inside Shadow DOM components and same-domain frames, but some company career pages embed Greenhouse or iCIMS forms inside cross-domain<iframe>boxes. We're adding multi-frame aggregation so the AI can seamlessly fill embedded portals too. - One-click tailored cover letters & multi-tab queues: Letting you open 5–10 job postings in the
AutoResume (MCP)tab group, generate a custom cover letter for each role on the fly, and have Resumate prep every tab up to the final review screen so you can verify and submit them one after another.
Built With
- mcp
- node.js
Log in or sign up for Devpost to join the conversation.