Fill job applications on Greenhouse, Lever, Ashby, Workday, and SmartRecruiters with tailored, resume-aware content generated by OpenAI — in one click.
ApplyAI is a free, open-source Chrome extension that reads any job listing, understands the role, and fills the application form with answers tailored to your resume and writing style. No backend, no tracking, no data stored off your machine.
Features · Installation · Setup · Usage · Supported Portals · How It Works · Privacy · Development · Contributing
- Overview
- Features
- Demo
- Installation
- Setup
- Usage
- Supported Job Portals
- How It Works
- Configuration
- Project Structure
- Privacy & Security
- Known Limitations
- Troubleshooting
- Development
- Roadmap
- Contributing
- License
- Author
- Acknowledgments
ApplyAI turns the most tedious part of a modern job search — filling out the same form on Greenhouse for the hundredth time — into a one-click action. It:
- Detects when you are on a job application form on a supported portal.
- Extracts the job title, company, and full job description from the page.
- Reads your resume (and optional writing sample) from local storage.
- Generates tailored answers for every field using OpenAI.
- Fills the form with the generated content — you review and submit.
Everything runs in your browser. Your API key, resume, and personal data never touch a server you do not control.
Perfect for: software engineers, product managers, designers, and any job seeker applying to many roles at modern tech companies that use Greenhouse, Lever, Ashby, Workday, or SmartRecruiters.
| Feature | Description |
|---|---|
| One-Click Auto-Fill | Detect a job form, click once, walk away with a fully filled application. |
| Tailored Cover Letters | Cover letters are written specifically for the role and company, never generic. |
| Resume-Aware Answers | The AI matches your real experience to the job requirements — no hallucinated skills. |
| Tone Matching | Provide a writing sample and the AI mirrors your voice, vocabulary, and formality. |
| Multi-Portal Support | Works on Greenhouse, Lever, Ashby, Workday, and SmartRecruiters out of the box. |
| Privacy First | No backend, no telemetry, no accounts. Data stays in your browser. |
| Bring Your Own Key | Use your own OpenAI API key. You pay OpenAI directly — typically less than $0.01 per application with gpt-4o-mini. |
| Configurable Behavior | Toggle auto-detect, auto-fill, and cover letter generation per your workflow. |
| Context Menu Action | Right-click anywhere on a job page to analyze with ApplyAI. |
| Open Source (MIT) | Audit the code, fork it, self-host it. |
ApplyAI is a Manifest V3 Chrome extension. Install it as an unpacked extension from source in under two minutes.
- Google Chrome, Microsoft Edge, Brave, Arc, or any Chromium-based browser (version 114+ recommended)
- An OpenAI API key (instructions below)
Clone the repository:
git clone https://github.com/muhammad-saadd/applyai.git
cd applyaiOr download the latest release as a ZIP from the Releases page and extract it.
- Open your browser and navigate to
chrome://extensions(oredge://extensions,brave://extensions, etc.). - Toggle Developer mode on (top-right corner).
- Click Load unpacked.
- Select the
applyaifolder you just cloned or extracted. - The ApplyAI icon appears in your toolbar. Pin it for easy access (puzzle-piece icon → pin).
Click the ApplyAI icon. You should see the popup with status indicators. If you see warnings about a missing API key or resume, that is expected — proceed to setup.
- Go to platform.openai.com/api-keys.
- Sign in (or create an account).
- Click Create new secret key.
- Name it (e.g., "ApplyAI") and copy the key. It starts with
sk-.... - Add a payment method under Billing if you have not already.
- (Optional but recommended) Set a usage limit under Usage limits.
Cost note: A typical application fill with
gpt-4o-minicosts less than $0.01. One hundred applications cost roughly $0.50–$1.00.
Open the ApplyAI options page (right-click the icon → Options, or click the icon → Open Settings).
- Recommended: Paste your resume text directly into the Resume textarea.
- Alternative: Upload a
.txtor.pdffile. (PDF support uses basic text extraction; for best results, copy-paste.) - Click Save.
Paste a cover letter, email, or any writing that represents your natural voice. ApplyAI will mirror your tone, sentence length, and vocabulary when generating cover letters and short answers.
In Behavior Settings, toggle:
- Auto-detect job pages — show the floating ApplyAI banner automatically.
- Auto-fill on detection — generate and fill without a second click (use with care).
- Generate cover letter — turn off if you only want short-answer fields filled.
In the API Key field, paste your sk-... key and click Save.
You are ready to apply.
- Navigate to a job application page on a supported portal.
- The ApplyAI banner slides in from the top: "ApplyAI: Job application detected."
- Click Fill with AI.
- A modal appears showing the generated content for each field.
- Review and edit anything you want to change.
- Click Fill All Fields.
- The form is populated. Add the final touches (resume file upload, references) and submit.
- On any job listing or application page, click the ApplyAI icon.
- The popup shows the detected job title and company (or a warning if none is detected).
- Click Generate & Fill Application.
- Review the modal, edit, and confirm.
- Right-click anywhere on the page.
- Select Analyze this job with ApplyAI.
- The fill flow starts.
| Portal | Domain | Status | Notes |
|---|---|---|---|
| Greenhouse | greenhouse.io |
Primary | Most reliable detection and field extraction. |
| Lever | lever.co |
Primary | Full support for Lever-hosted application forms. |
| Ashby | ashbyhq.com |
Secondary | Tested against Ashby v2 application flows. |
| Workday | myworkdayjobs.com |
Secondary | Heavy SPA — some variants may need a manual refresh. |
| SmartRecruiters | smartrecruiters.com |
Experimental | Varying form implementations; results may vary. |
| Other sites | any | Fallback | A generic extractor attempts to detect and fill any standard form. |
Want support for a new portal? Open an issue with the URL pattern and, if possible, a sample page.
ApplyAI follows a clean, five-stage pipeline that runs entirely in your browser.
+-------------+ +---------------+ +----------------+ +----------------+ +-------------+
| 1. Detect | --> | 2. Extract | --> | 3. Build Prompts| -> | 4. Generate | --> | 5. Fill |
| Portal | | Job + Form | | (system+user) | | via OpenAI | | the Form |
+-------------+ +---------------+ +----------------+ +----------------+ +-------------+
| | | | |
hostname DOM scan & Resume + JD + gpt-4o-mini Unique selector
matching portal-specific field schema chat completion + native input
extractors event dispatch
content_scripts/detector.js matches window.location.hostname to a known portal (Greenhouse, Lever, Ashby, Workday, SmartRecruiters) or falls back to a generic detector.
A portal-specific extractor (greenhouse.js, lever.js, ashby.js, workday.js, or generic.js) walks the DOM to capture:
- Job title and company name
- Full job description text
- A list of fillable form fields with their names, types, and current values
The service worker assembles two prompts:
- System prompt — defines the AI's role as an expert job application assistant, with optional tone-matching instructions derived from your writing sample.
- User prompt — contains your resume, the extracted job data, and the list of fields to fill.
A single POST to https://api.openai.com/v1/chat/completions returns a JSON object keyed by field name. Field types drive instructions (e.g., short text vs. 2-3 paragraph cover letter).
For each generated value, the content script:
- Locates the target input/textarea using a robust unique-selector algorithm (id →
data-automation-id→data-testid→name→aria-label→ CSS path). - Sets the value via the native HTMLInputElement value setter (bypasses React/Vue controlled-input guards).
- Dispatches
inputandchangeevents so the framework registers the update. - Highlights the field briefly so you can see what was changed.
You review, edit, and submit. ApplyAI never clicks submit for you.
All configuration lives in the Options page and is persisted via chrome.storage.local.
| Setting | Default | Description |
|---|---|---|
apiKey |
(empty) | Your OpenAI API key. Stored locally. |
aiModel |
gpt-4o-mini |
Any chat-completion model. gpt-4o-mini is the best cost/quality balance. |
resumeText |
(empty) | Your resume, plain text. |
writingSample |
(empty) | Optional. Used for tone matching. |
settings.autoDetect |
true |
Show the floating banner on supported portals. |
settings.autoFill |
false |
Skip the modal and fill the form immediately (review afterward). |
settings.includeCoverLetter |
true |
Generate cover_letter and why_this_company fields. |
applyai/
├── manifest.json # Extension manifest (V3)
├── background/
│ └── service_worker.js # Message broker + OpenAI client
├── content_scripts/
│ ├── detector.js # Portal detection + banner + orchestrator
│ ├── modal.js # Review-and-fill modal + toast UI
│ ├── greenhouse.js # Greenhouse extractor
│ ├── lever.js # Lever extractor
│ ├── ashby.js # Ashby extractor
│ ├── workday.js # Workday extractor
│ └── generic.js # Fallback extractor
├── popup/
│ ├── popup.html
│ ├── popup.js
│ └── popup.css
├── options/
│ ├── options.html
│ ├── options.js
│ └── options.css
├── utils/
│ ├── ai.js # OpenAI client + prompt builders
│ ├── parser.js # Resume and job-description helpers
│ └── storage.js # chrome.storage.local wrappers
├── icons/
│ ├── icon16.png
│ ├── icon48.png
│ └── icon128.png
├── LICENSE # MIT
├── README.md # You are here
└── .gitignore
ApplyAI is designed with a zero-server architecture.
- No backend. There is no ApplyAI server. The extension only talks to OpenAI's API.
- Local storage only. Your API key, resume, and writing sample are stored in
chrome.storage.localand never leave your machine except in direct API calls to OpenAI. - No telemetry. No analytics, no crash reporting, no usage tracking, no fingerprinting.
- Minimal permissions. The extension requests only
storage,activeTab,scripting, andcontextMenus— and only runs content scripts on the five supported portal domains. - You stay in control. ApplyAI never submits an application on your behalf. You always review and click submit yourself.
- Open source. Every line of code is auditable in this repository.
When you trigger a fill, ApplyAI sends OpenAI:
- The job title, company, and full job description (extracted from the page).
- Your resume text.
- Your writing sample, if you provided one.
- The list of field names and types being requested.
OpenAI's API data usage policy applies. As of 2024, OpenAI does not use API inputs to train models by default.
- PDF parsing is basic. For best results, copy-paste your resume as plain text.
- Workday is heavy. Workday uses deep SPAs; some field variants may not be detected on first load. A manual page refresh usually helps.
- SmartRecruiters is experimental. Form implementations vary by tenant.
- SPA in-page navigation is not tracked. If a portal navigates you to the application without a full reload, hit refresh once.
- File inputs are not auto-filled. Browser security restrictions prevent JS from setting the value of
<input type="file">. Upload your resume manually. - OpenAI costs are yours. You pay OpenAI directly. Monitor usage in your OpenAI dashboard.
- AI can be wrong. Always review generated content before submitting. You are responsible for the truthfulness of your application.
- Confirm the URL matches one of the supported portals.
- Refresh the page.
- Check that the extension is enabled on that site (
chrome://extensions→ ApplyAI → Site access). - Open the browser DevTools console and look for
ApplyAIlog messages.
- Open the Options page and confirm the key starts with
sk-and was saved. - Test the key with
curl:
curl https://api.openai.com/v1/models \
-H "Authorization: Bearer sk-YOUR-KEY"A 200 response means the key is valid.
- Add your resume on the Options page and click Save.
- The job description might be empty. ApplyAI needs a job description to generate tailored content.
- Your resume might be too short. Add more detail.
- Try a more capable model (e.g.,
gpt-4o) in the Options page.
- Some frameworks aggressively reset inputs. Click into the field and type a character — the AI-filled value usually "wakes up" the controlled state.
- File an issue with the portal name and a screenshot.
- Vanilla JavaScript (no build step, no framework)
- Chrome Extensions Manifest V3
- OpenAI Chat Completions API
- HTML / CSS for the popup and options pages
- Clone the repo.
- Make your changes.
- In
chrome://extensions, click the Reload button on the ApplyAI card. - Refresh any open application pages.
- 2-space indent, single quotes, semicolons, trailing commas.
- No external dependencies — keep it that way.
- Module namespacing under the global
ApplyAIobject inside content scripts.
- Greenhouse: https://boards.greenhouse.io/example
- Lever: https://jobs.lever.co/example
- Ashby: https://jobs.ashbyhq.com/example
- Workday: https://example.wd5.myworkdayjobs.com/en-US/Careers
- SmartRecruiters: https://jobs.smartrecruiters.com/example
(Replace example with any real company using the platform.)
- LinkedIn Easy Apply support
- Indeed application support
- Custom prompt templates
- Multi-language cover letters
- Application tracking dashboard
- Chrome Web Store listing
- Firefox port
- Local LLM support (Ollama, llama.cpp)
- Resume improvement suggestions
Contributions are welcome and appreciated.
- Fork the repository.
- Create a feature branch:
git checkout -b feature/your-feature - Commit your changes:
git commit -m "Add your feature" - Push to the branch:
git push origin feature/your-feature - Open a Pull Request with a clear description of the change.
For new portal extractors, please open an issue first to discuss the approach. For bug reports, include the URL, browser version, and a screenshot or console output.
Released under the MIT License. You are free to use, modify, and distribute this project — commercially or otherwise — as long as the copyright notice is preserved.
Muhammad Saad
- GitHub: @muhammad-saadd
- LinkedIn: muhammadsaad-pk
If ApplyAI saved you time, consider starring the repo — it helps others find it.
- Built on top of the OpenAI Chat Completions API.
- Inspired by the universal pain of filling out yet another Greenhouse form.
- Thanks to every contributor and user who reports bugs and suggests features.
If this project helped you land an interview, pay it forward — open a PR, file an issue, or star the repo.
Made with care for job seekers everywhere.