Skip to content
← All Projects
Q

Quick Resume Apply

Personal project

A Chrome extension that auto-fills job applications across major job boards using a stored resume profile. Detects application forms on LinkedIn, Indeed, Greenhouse, Lever, and other ATS platforms, then intelligently maps resume fields to form inputs, turning a 10-minute application into a single click.

Key Features

  • Auto-detects job application forms on 20+ major job boards and ATS platforms
  • Intelligent field mapping: matches resume data to form inputs regardless of label variations
  • One-click apply with customizable cover letter templates per job type
  • Resume profile manager with multiple resume variants for different roles
  • Application tracker dashboard showing submitted, viewed, and responded status
  • Privacy-first: all data stored locally in browser, never sent to external servers

The challenge

Applying for jobs at any serious volume is the same ten minutes over and over. The resume is already written, the work history has not changed since the last submission, and yet every posting asks for the same name, email, phone, education, and employment dates to be typed back in by hand. Applicant tracking systems make that worse rather than better, because each one asks for the same information in its own vocabulary. LinkedIn, Indeed, Greenhouse, Lever, and the long tail of ATS platforms behind them label the same field several different ways, order sections differently, and split or combine names, dates, and locations according to no shared convention. Ordinary browser autofill gives up quickly on that variation, because it was built for checkout forms with predictable semantics rather than for hiring software where the only reliable constant is that nothing is named consistently twice.

The approach

The core of the extension is a field-mapping layer rather than a form filler. A stored resume profile holds the canonical data once, and the mapping happens per input at fill time rather than through a hand-maintained template per site. That distinction is the whole product, because the same field arrives under a different name on every board — one form's given name is another's first and a third's legal first name — and covering 20+ of them only works if those variations resolve to the same stored value without anyone enumerating them site by site. Shipping a Chrome extension rather than a web app follows directly from the problem: the application form lives on someone else's domain, and only an extension can read and complete it in place. A web app would have meant copy and paste, which is the exact friction being removed. The same reasoning drives the privacy decision. Everything stays in browser-local storage and never reaches an external server, because a resume profile is effectively an identity document and a tool that fills forms locally has no reason to hold one remotely. TypeScript keeps the mapping rules type-checked, and React with Tailwind builds the profile manager and tracker interface.

The outcome

Every one of those decisions bought something and cost something. Filling a form in place on someone else's domain is only possible from inside the browser, so the tool is a Chrome extension and stops where the desktop browser stops — an application that arrives by email or gets started on a phone is outside what it can reach, which was the accepted price of removing the copy and paste rather than relocating it. Keeping the profile in browser-local storage makes the privacy guarantee a property of the architecture rather than a policy statement, and it also means the profile stays wherever the browser is: nothing follows the user to a second machine, and nothing is recoverable from a server, because there is no server holding it. Generalizing the mapping instead of maintaining a template per site is what buys 20+ boards of coverage, at the cost of being best-effort rather than guaranteed, since a form can always name something in a way nothing anticipated. And the application tracker exists for the same reason the extension does: the volume it makes possible is precisely the volume that stops being possible to hold in your head.

Tech Stack

TypeScriptChrome Extensions APIReactTailwind CSS