A Chrome extension that eliminates form fatigue. Store your profile once — Fillr fills any web form instantly, from job applications and event RSVPs to startup accelerator applications and conference signups. Five progressive fill passes go from fast keyword matching all the way to AI vision analysis, so even the most unconventional forms get filled correctly. When Fillr can't find an answer in your profile, it generates one — writing compelling, context-aware answers to open-ended questions on your behalf.
Fillr runs five independent passes on every form. Each pass hands off only what the previous one couldn't handle.
Normalizes a field's name, id, and autocomplete attribute and looks them up in a keyword map that covers hundreds of real-world field naming patterns. No API call. Instantaneous.
Searches the field's visible label, placeholder, aria-label, associated <legend>, and surrounding DOM text using pre-compiled word-boundary regular expressions. Labels over 80 characters are excluded from fuzzy matching to prevent false positives (e.g. "…please state your company" matching the state profile key). No API call.
Sends all unmatched fields to the configured AI provider together with your profile and page context (title, meta description, headings, nearby text). Fields are classified as structured (→ Haiku) or generative (→ Sonnet) and routed to the cheaper model when possible. Prompt caching reduces token costs on repeated fills of similar forms. For "What have you built?" or "What do you plan to work on?", the AI reads the event or program context and writes a compelling, specific answer tailored to the form.
Captures a screenshot of the visible tab and sends it alongside the remaining unmatched fields. Adds spatial context — useful when label text lives far from the input or is embedded in images. Skipped automatically if there are no unmatched fields or if the provider doesn't support vision. Always uses Anthropic Claude (Llama has no vision support).
Detects non-native dropdown components (role="combobox", aria-haspopup="listbox", class-based selectors). Opens each dropdown with an adaptive MutationObserver wait instead of a fixed delay, reads its options, asks the AI to pick the best match, then programmatically clicks the right option. Handles React Select, MUI Autocomplete, Headless UI, and most other custom dropdown libraries.
After all five passes, if required fields are still empty, Fillr makes one more attempt before submitting. Open-ended question fields (textareas, essay prompts) are sent to the AI to generate a relevant answer. Simple missing fields (like a Twitter handle you haven't set) are filled with "N/A". Fields about teammates, referrals, collaborators, or co-founders are left blank — those require real answers.
- Fills standard personal, address, professional, and social fields with no AI call
- Handles native
<select>, custom dropdown components, radio groups, checkboxes, andcontenteditablerich text editors - React / React Hook Form compatible — uses native input setters and plain
Event('input')(notInputEventwithinsertText) to avoid double-write bugs in React's reconciler - MUI and other component library compatible — MUI wrapper elements are cached during field collection and reused during fill instead of querying the DOM per-field
- Shadow DOM support — recursively traverses shadow roots up to 4 levels deep (Salesforce, ServiceNow, Web Components)
- Same-origin iframe support — collects fields from embedded frames; cross-origin frames are detected and reported in a toast
- Date field parsing — converts natural language dates ("January 2024") to
YYYY-MM-DD; highlights fields red on failure - Phone number formatting — reads the field's
placeholderto detect the expected format ((555) 555-5555,+1 555 555 5555) and formats accordingly - Bio/summary truncation — word-boundary truncates long text at a field's
maxLengthlimit - Typeahead support — simulates character-by-character typing for autocomplete inputs (company names, schools, locations)
Undo— reverts all fills via a toast button; snapshots pre-filled values; gracefully handles stale DOM references after SPA navigation viael.isConnectedguard- Fill summary — collects per-field outcomes (skipped, truncated, error) and surfaces them to the popup
- Multiple named profiles — create, rename inline (no dialog), switch, and delete
- 17 tracked core fields with a completeness indicator showing how many are filled; click it to jump to the first empty field
- Per-field overrides — right-click any label in the Details tab to set a site-specific override for that field (stored as
hostname::fieldKey) - Override badges show which fields have active overrides for the current site
- Additional Context field — free-form text the AI always reads, ideal for startup descriptions, research interests, or goals
- Auto-saves 800ms after typing stops — no manual save required
Cmd/Ctrl+Ssaves the active tab immediately- Site assignments re-index automatically when a profile is deleted
- Paste any event or form URL — Fillr opens it in a background tab, fills every field, and submits
- Multi-step wizard support — up to 8 steps, with
MutationObserver-based detection of newly appearing fields between steps - Post-submit failure detection — checks whether the form is still visible after submission (catches
noValidateReact forms that use custom JS validation, not just:invalid) - If submission fails, the tab stays open and comes to the foreground; the popup shows which fields blocked submission
- 30-second timeout — if the form hangs, the tab is closed and the popup shows a specific timeout message
- Auto-detects event URLs — Luma, Eventbrite, Partiful, Typeform, Tally, Airtable, and
/register,/signup,/rsvp,/applypaths pre-fill the URL input Enterkey in the URL input triggers the signup- CAPTCHA detection — reports it rather than attempting to bypass it
- Signup history — date, URL, status (confirmed / submitted / failed / captcha), and fill count
- AI provider toggle: Anthropic Claude Sonnet or Replicate Llama 3.1 70B
- API key test buttons with live feedback (spinner → ✓ Valid / ✗ Invalid key)
- Site blacklist — domains where Fillr never runs
- Site assignments — pin a profile to a domain so switching happens automatically
- JSON export/import — full profile and settings backup; API keys are excluded from export; import validates per-profile structure before merging
- Export filenames include the date (
fillr-backup-2026-04-29.json) - Record mode — captures form values when you manually submit, and replays them on future visits
- Resume fill — after a fill that didn't complete everything, a Resume button appears to retry with AI-only passes
- Tracks every fill: timestamp, hostname, total fields, filled fields, pass breakdown, API calls made, duration
- Stats section in Settings: total fills, average fields per fill, top 5 domains, composited bar chart
- AI usage dashboard — input/output tokens, estimated cost, per-pass call counts
- Capped at 100 entries; oldest entries drop automatically
- Dark theme with gold accent, full light mode support
- Toast notification queue — collapses rapid notifications (3+) into a single count badge; preserves undo callbacks
- Floating button on form pages — toggled in Settings; SPA-aware via
MutationObserver - Extension badge shows fill count for 4 seconds after each fill
- Keyboard shortcut
Alt+Shift+Ftriggers fill without opening the popup; shows an in-page toast with the fill count - Right-click context menu — "Fill this form with Fillr" on any page or editable field (HTTP/HTTPS only)
- Status icons in Quick Signup: ✓ for success, ⚠ for warnings, ✕ for errors
- Keyboard-accessible popup with ARIA roles and
focus-visibleoutline ring - Lazy-loaded settings — profile data renders immediately; API keys and settings load asynchronously
- Message allowlist — the background service worker only processes explicitly whitelisted action names via a
HANDLERSmap - Origin validation — AI fill actions are rejected from non-
http(s)origins - Private/local URL blocking — Quick Signup rejects
localhost,127.x,10.x,192.168.x, and172.16–31.xranges - URL length limit (2048 chars) on Quick Signup
- All API calls time out via
AbortController - Profile data and API keys stored in
chrome.storage.localonly — never transmitted except to the configured AI provider - XSS-safe DOM construction — fill stats and preview tables use
textContentand DOM API instead ofinnerHTMLwith user-provided data - Error objects from Claude are never cached as valid field mappings
- LRU fill cache (150 entries, 10-minute TTL) — repeated fills on the same form skip AI calls entirely
- Prompt caching — system block uses
cache_control: ephemeralfor Anthropic, reducing input token costs on repeated fills - Haiku/Sonnet routing — structured fields (job title, company, etc.) go to Haiku; generative fields go to Sonnet; both calls run in parallel
- Adaptive dropdown waits —
MutationObserverwith 200ms timeout instead of hardcoded 550ms sleep per dropdown - Field descriptors omit duplicate placeholder/label to save tokens (~20% reduction per field)
- Compressed system prompt — concise rules instead of verbose examples (~25% token savings per call)
- Vision pass early-exit — skips screenshot capture when no unmatched fields remain
- In-memory AI usage tracking — updates cache instantly, flushes to storage every 2s
- Radio group and MUI wrapper caching — pre-computed during field collection instead of per-field DOM queries
- Page context computed once and reused across all AI passes
- Isolated retry backoff per API call — concurrent Haiku/Sonnet calls don't bleed
retry-afterdelays into each other - Composited stat bar animations —
transform: scaleX()instead ofwidthfor GPU compositing
- Clone or download this repository.
- Open
chrome://extensionsin Chrome. - Enable Developer mode (top right toggle).
- Click Load unpacked and select the extension folder.
- Open the Fillr popup, go to Settings, choose your AI provider, paste your API key, and click Save.
- Fill in your profile on the Details tab — fields save automatically as you type.
| Field | Description |
|---|---|
| First Name / Last Name | Used individually or combined as full name |
| Phone | Formatted to match the target field's pattern |
| Address Line 1 / 2 | |
| City / State / ZIP / Country | |
| Job Title | |
| Company | |
| Years Experience | |
| LinkedIn / GitHub / Website | Full URLs |
| Twitter / Instagram | Social handles (@jane) |
| Bio / Summary | Long-form text for cover letters, bios, and summary fields |
| Additional Context | Free-form text the AI always reads — startup pitch, research focus, goals |
| Permission | Reason |
|---|---|
storage |
Stores profile data and settings locally |
activeTab |
Injects content script and captures screenshots on the active tab only |
scripting |
Dynamic content script injection for keyboard shortcut fill |
tabs |
Creates background tabs for Quick Signup; queries active tab for hostname |
contextMenus |
Right-click "Fill this form with Fillr" menu item |
alarms |
Keeps the service worker alive during Quick Signup fills |
host_permissions: <all_urls> |
Required to inject the content script on arbitrary pages |
| Provider | Model | Vision | Notes |
|---|---|---|---|
| Anthropic | claude-sonnet-4-6 (fill) / claude-haiku-4-5-20251001 (structured + essays) | Yes | Default. Structured fields route to Haiku for cost savings; generative fields go to Sonnet. |
| Replicate | meta-llama-3.1-70b-instruct | No | Vision pass is skipped automatically. Essay generation falls back to N/A. |
fillr/
manifest.json Extension manifest (MV3)
background.js Service worker — AI API calls, essay generation, badge, shortcuts, analytics
content.js Content script — field detection, all fill passes, shadow DOM, iframes, Quick Signup logic
popup.html Extension popup UI
popup.js Popup logic — profiles, settings, Quick Signup, fill trigger, analytics, overrides
styles.css Popup styles (dark theme, gold accent, light mode)
icons/ Extension icons at 16, 48, and 128px
make_icons.py Regenerates PNG icons from source
No build step required. Edit source files directly and reload on chrome://extensions.
To regenerate icons (requires Python 3):
python3 make_icons.py
node --check *.js validates syntax across all files before loading.