Automatically fill job application forms using your personal professional data and AI. Works on any website — Google Forms, Lever, Greenhouse, Workday, Ashby, custom career pages, and more.
- Features
- Architecture
- Setup and Installation
- AI Provider Setup
- Loading the Extension
- Usage Guide
- Privacy and Security
- File Structure
| Feature | Status |
|---|---|
| In-page sidebar (no popup) | Done |
| Personal profile store (local, browser only) | Done |
| Detect text inputs, textareas, selects, radio buttons | Done |
| Google Forms support | Done |
| Per-field AI fill trigger with hover popout | Done |
| Five fill modes: Crisp, Short, Medium, Long, Add Context | Done |
| Voice input (speech-to-text) for context | Done |
| Length picker inside context modal | Done |
| Editable preview modal before inserting | Done |
| Fill All Fields from sidebar | Done |
| Google Gemini API integration | Done |
| Ollama local LLM support | Done |
| Injection on/off toggle | Done |
| Works with React / Vue / Angular controlled inputs | Done |
| Dynamic form re-scan (SPA support) | Done |
| Export / Import profile as JSON | Done |
| API key stored securely in local storage | Done |
+-----------------------------------------------------------------------+
| PhilAI Extension |
| |
| chrome.storage.local |
| +---------------------------+ +-----------------------------+ |
| | profile {} | | Background Service Worker | |
| | apiKey | | background/service_worker | |
| | aiModel | | . AI API proxy | |
| | llmProvider | | . Prompt builder | |
| | ollamaUrl | | . Gemini + Ollama routing | |
| | ollamaModel | +-------------+---------------+ |
| | injectionEnabled | | messages |
| +---------------------------+ +-------------v---------------+ |
| | Content Scripts | |
| | (injected on every page) | |
| | | |
| | detector.js | |
| | finds all form fields | |
| | | |
| | ui_injector.js | |
| | hover popout per field | |
| | | |
| | modal.js | |
| | preview, edit, confirm | |
| | context input + voice | |
| | | |
| | sidebar.js / sidebar.css | |
| | profile editor | |
| | AI provider config | |
| | injection toggle | |
| | fill all trigger | |
| | | |
| | content_main.js | |
| | orchestrates everything | |
| +-----------------------------+ |
+-----------------------------------------------------------------------+
Data Flow (single field):
1. User fills profile in sidebar -> saved to chrome.storage.local
2. User hovers the bolt icon next to a field -> selects fill mode
3. content_main.js sends { fieldContext, profile, fillType } to BG SW
4. BG SW builds prompt -> calls Gemini API or local Ollama
5. Answer returned -> modal.js shows editable preview
6. User confirms -> field filled via native event dispatch
- Google Chrome or any Chromium-based browser
- One of the following AI backends:
- Gemini API (free tier available) — get a key at Google AI Studio
- Ollama running locally with any pulled model (e.g.
llama3.2:1b)
- Node.js (only needed if regenerating icons)
-
Clone or download this repository:
git clone https://github.com/PranavBarthwal/phil.git cd phil -
Icons are pre-generated. To regenerate them:
node scripts/generate_icons_svg.js -
Load the extension in Chrome — see Loading the Extension below.
- Get a free API key at Google AI Studio.
- Open the PhilAI sidebar (click the extension icon).
- Go to the Settings tab.
- Make sure Gemini is selected in the AI Provider toggle.
- Paste your API key into the Gemini API Key field.
- Choose a model. Gemini 2.5 Flash is recommended for the free tier.
- Click Save.
Your key is stored only in chrome.storage.local and sent exclusively to Google's API.
- Install Ollama from ollama.com.
- Pull a model:
ollama pull llama3.2:1b - Start Ollama with browser CORS allowed:
To set this permanently:
# Windows PowerShell $env:OLLAMA_ORIGINS="*" ollama serveThen restart Ollama.[System.Environment]::SetEnvironmentVariable("OLLAMA_ORIGINS", "*", "User") - Open the PhilAI sidebar, go to Settings, select Ollama (Local).
- Set the URL to
http://localhost:11434/api/chatand model name tollama3.2:1b(or whichever model you pulled). - Click Save.
- Open Chrome and navigate to
chrome://extensions. - Enable Developer Mode (toggle in the top-right corner).
- Click Load unpacked.
- Select the root folder of this project (the folder containing
manifest.json). - The PhilAI extension will appear in your extensions list.
- Pin it to your toolbar: click the puzzle-piece icon in the Chrome toolbar, then pin PhilAI.
After any code change, go to chrome://extensions and click the refresh button on the PhilAI card.
Click the extension icon to open the sidebar. Fill in your details across the four tabs:
| Tab | What to add |
|---|---|
| Profile | Name, email, phone, location, short bio, long bio, skills, experience, education |
| Links | LinkedIn, GitHub, portfolio, other links |
| Resume | Paste your full resume as plain text |
| Settings | AI provider, API key or Ollama config, model preference |
The sidebar auto-saves as you type, or click Save manually.
The header of the sidebar has an ON / OFF toggle. When set to OFF, all bolt trigger icons are removed from the page and no new ones are injected. Flip it back ON to re-enable injection. The state persists across page loads.
Each detected form field gets a small bolt icon on the right edge.
- Hover the bolt icon to reveal the fill mode popout.
- Choose a mode:
| Mode | Output |
|---|---|
| Crisp | Exact raw value — name, email, URL, single word |
| Short | 1–2 sentence answer |
| Medium | 3–4 sentence answer |
| Long | Detailed 5–7 sentence paragraph |
| Add Context | Opens a modal where you can type or speak additional context, then choose a length |
- A preview modal appears with the generated answer.
- Edit if needed, then click Insert Answer to fill the field.
Click Fill All in the sidebar footer. The extension detects every fillable field on the page and fills them in sequence using medium-length answers. A toast notification reports how many fields were filled.
When you select Add Context, a modal opens with:
- A textarea to type extra context (e.g. "focus on my leadership experience")
- A mic button for voice input via Web Speech API
- A length picker (Crisp / Short / Medium / Long) defaulting to Medium
Press Generate or Ctrl+Enter to submit. Press Escape to cancel.
- All profile data is stored in
chrome.storage.local— accessible only by the extension, never synced to Google servers. - Gemini API calls are made directly from your browser to Google. No proxy, no third-party server.
- Ollama calls are made entirely on your local machine. Nothing leaves your device.
- Form data is never persisted — answers are generated in real time and discarded.
- No analytics, no telemetry, no external tracking of any kind.
phil/
├── manifest.json # Chrome Extension Manifest V3
├── background/
│ └── service_worker.js # AI API proxy, prompt builder, Gemini + Ollama routing
├── content/
│ ├── detector.js # Form field detection engine
│ ├── ui_injector.js # Bolt trigger icon and hover popout injection
│ ├── modal.js # Preview modal, error modal, context input modal
│ ├── content_main.js # Orchestrator and entry point
│ ├── content_styles.css # Injected UI styles (triggers, popout, modals, toast)
│ ├── sidebar.js # In-page sidebar (profile editor, settings, fill all)
│ └── sidebar.css # Sidebar styles
├── icons/
│ ├── icon16.png
│ ├── icon48.png
│ └── icon128.png
├── scripts/
│ └── generate_icons_svg.js # Icon generator (Node.js, no external dependencies)
└── README.md
MIT License — free to use, modify, and distribute.
Fill job application forms intelligently using your personal professional data and OpenAI. Works on any website – Google Forms, Lever, Greenhouse, Workday, custom career pages, and more.
- Features
- Architecture
- Setup & Installation
- How to Add Your OpenAI API Key
- How to Load the Unpacked Extension
- Usage Guide
- Privacy & Security
- File Structure
- Future Roadmap
| Feature | Status |
|---|---|
| Personal data store (local, browser) | ✅ |
| Detect text inputs, textareas, selects, radio buttons | ✅ |
| Google Forms support | ✅ |
| "✨ AI Fill" button per field | ✅ |
| Editable preview modal before inserting | ✅ |
| "⚡ Fill All Fields" button in popup | ✅ |
| OpenAI GPT integration | ✅ |
| Works with React/Vue/Angular controlled inputs | ✅ |
| Dynamic form re-scan (SPA support) | ✅ |
| Export / Import profile as JSON | ✅ |
| API key stored securely in local storage | ✅ |
┌────────────────────────────────────────────────────────────────────┐
│ PhilAI Extension │
│ │
│ ┌──────────────────────┐ messages ┌──────────────────────┐ │
│ │ Popup UI │ ◄────────────► │ Background SW │ │
│ │ popup/popup.html │ │ background/ │ │
│ │ popup/popup.js │ │ service_worker.js │ │
│ │ popup/popup_ │ │ │ │
│ │ styles.css │ │ - Gemini API proxy │ │
│ │ │ │ - Prompt builder │ │
│ │ Tabs: │ │ - Storage helper │ │
│ │ • Profile │ └──────────┬───────────┘ │
│ │ • Links │ │ messages │
│ │ • Resume │ ┌──────────▼───────────┐ │
│ │ • Settings │ │ Content Scripts │ │
│ └──────────────────────┘ │ (injected on page) │ │
│ │ │ │
│ chrome.storage.local │ detector.js │ │
│ ┌──────────────────┐ │ → finds all fields │ │
│ │ profile {} │ │ │ │
│ │ apiKey │ │ ui_injector.js │ │
│ │ aiModel │ │ → ✨ buttons │ │
│ └──────────────────┘ │ │ │
│ │ modal.js │ │
│ │ → preview & edit │ │
│ │ │ │
│ │ content_main.js │ │
│ │ → orchestrates all │ │
│ └──────────────────────┘ │
└────────────────────────────────────────────────────────────────────┘
Data Flow:
1. User fills profile in Popup → saved to chrome.storage.local
2. User clicks "✨ AI Fill" on a form field
3. content_main.js sends { fieldContext, profile } to Background SW
4. Background SW builds prompt → calls OpenAI API
5. Answer returned → modal.js shows editable preview
6. User confirms → field filled with native event dispatch
- Google Chrome (or Chromium-based browser)
- A Google Gemini API key (get one free at Google AI Studio)
- Node.js (only needed if you want to regenerate icons)
-
Download / clone this repository
git clone https://github.com/yourname/philai-extension.git cd philai-extension -
Generate icons (already done – skip if
icons/folder has PNG files)node scripts/generate_icons_svg.js -
Load the extension in Chrome → see next section ↓
- Click the PhilAI extension icon in your Chrome toolbar.
- Go to the ⚙️ Settings tab.
- Paste your Gemini API key into the "Gemini API Key" field (starts with
AIza…). - It's saved automatically (only in your browser's local storage).
Get a free Gemini API key at Google AI Studio — no credit card required for the free tier.
Your API key is never sent to any server other than Google's Gemini API directly.
It is stored inchrome.storage.local— not in cookies, not in any database.
- Open Chrome and navigate to:
chrome://extensions - Enable Developer Mode (toggle in the top-right corner).
- Click "Load unpacked".
- Select the root folder of this project (the folder containing
manifest.json). - The PhilAI extension will appear in your extensions list.
- Pin it to your toolbar by clicking the puzzle icon 🧩 → pin PhilAI.
After any code change, go to
chrome://extensionsand click the 🔄 refresh button on the PhilAI card.
Click the extension icon → fill in your details across the tabs:
| Tab | What to add |
|---|---|
| 👤 Profile | Name, email, phone, short bio, long bio, skills, experience, education |
| 🔗 Links | LinkedIn, GitHub, portfolio, other links |
| 📄 Resume | Paste your full resume as plain text |
| ⚙️ Settings | OpenAI API key, model preference |
Click 💾 Save Profile (or it auto-saves as you type).
Navigate to any job application page – Google Forms, Lever, Greenhouse, company careers page, etc.
- Look for the ✨ AI Fill button next to each form field.
- Click it → the extension reads the field's label and context, generates an AI answer using your profile data.
- A preview modal appears with the generated answer.
- Edit it if needed, then click ✓ Insert Answer.
- Click the extension icon → ⚡ Fill All Fields.
- The extension automatically fills every detected field on the page.
- Each field gets a short highlight animation when filled.
- All profile data is stored in
chrome.storage.local— only accessible by the extension, never synced to Google's servers (unlikechrome.storage.sync). - OpenAI API calls are made directly from your browser to OpenAI. No proxy, no logging.
- Form data is never stored — answers are generated and inserted in real time.
- No analytics, no telemetry of any kind.
philai-extension/
├── manifest.json # Chrome Extension Manifest V3
├── background/
│ └── service_worker.js # OpenAI API calls, prompt builder
├── content/
│ ├── detector.js # Form field detection engine
│ ├── ui_injector.js # ✨ AI Fill button injection
│ ├── modal.js # Editable preview modal
│ ├── content_main.js # Orchestrator / entry point
│ └── content_styles.css # All injected UI styles
├── popup/
│ ├── popup.html # Extension popup UI
│ ├── popup.js # Popup logic
│ └── popup_styles.css # Popup styles
├── icons/
│ ├── icon16.png
│ ├── icon48.png
│ └── icon128.png
├── scripts/
│ └── generate_icons_svg.js # Icon generator (Node.js, no deps)
└── README.md
These are designed for but not yet implemented:
- 💾 Saved Answers – Cache past AI answers per domain for reuse.
- 📚 Learn from Edits – When you manually edit an AI answer, save the correction to improve future prompts.
- 📊 Application Tracker – Log which jobs you've applied to (URL, date, company, role).
- 📧 Cold Email Generator – Use your profile + LinkedIn URL to draft outreach emails.
- 🎨 Custom Personas – Switch between profiles (e.g., "Engineering role" vs. "Product role").
PRs welcome! Please open an issue first for major changes.
MIT License – free to use, modify, and distribute.