A Chrome extension for managing autofill profiles and filling web forms with a single click. Create reusable profiles for addresses, logins, and more — then fill any form instantly from the popup.
Built for QA workflows, form testing, and anyone tired of typing the same data over and over.
- Profile management — Create and organize multiple profiles by type (Address, Login)
- Smart field detection — Heuristic scoring engine that matches form fields using autocomplete attributes, names, IDs, labels, placeholders, and ARIA labels
- One-click autofill — Fill matched fields from the popup, with framework-aware event dispatching (works with React, Vue, Angular, and vanilla forms)
- Form submission listening — Optionally detect form submissions and prompt to save the data as a new profile or update an existing one
- Profile matching — Automatically suggests existing profiles to update based on field similarity
- Sensitive data masking — Passwords and sensitive fields are masked in the save prompt preview
- Extensible form types — Adding a new form type is a single declarative configuration
- TypeScript (strict mode, ES2022)
- Vite 8 (build & watch)
- Chrome Extension Manifest V3
- Chrome Storage API for local persistence
- No external UI frameworks — pure CSS
- Node.js (v18+)
- A Chromium-based browser (Chrome, Edge, Brave, Arc, etc.)
git clone https://github.com/coldiary/filler.git
cd filler
npm install
npm run build- Open
chrome://extensionsin your browser - Enable Developer mode (top-right toggle)
- Click Load unpacked and select the
dist/folder - Pin the Filler extension to your toolbar
npm run devThis starts Vite in watch mode. After each rebuild, go to chrome://extensions and click the reload button on the Filler card (or press the refresh icon).
src/
background/
service-worker.ts # MV3 service worker — message routing & storage
content/
content.ts # Content script entry point
autofill.ts # Field filling logic (input, select, framework compat)
field-matchers.ts # Heuristic field detection & scoring engine
form-listener.ts # Form submission detection & data extraction
popup/
popup.html / .css / .ts # Main popup — profile list, filtering, quick actions
profiles/
profile-editor.html / .css / .ts # Profile create/edit UI
save-prompt/
save-prompt.ts / .css # Injected save dialog (shadow DOM)
settings/
settings.html / .css / .ts # Settings modal
lib/
constants.ts # Form type registry & field definitions
storage.ts # Chrome storage wrapper
utils.ts # Shared helpers
types/
index.ts # TypeScript types & message contracts
manifest.json # Extension manifest (MV3)
icons/ # Extension icons (16, 48, 128)
tests/
test-form.html # 7 test forms for manual validation
Filler scores each visible form element against known field definitions using weighted heuristics:
| Signal | Weight |
|---|---|
autocomplete attr |
100 |
name attr |
60 |
id attr |
50 |
type attr |
40 |
<label> text |
30 |
placeholder |
20 |
| ARIA labels | 15 |
Fields are assigned greedily — each element maps to at most one profile field, and vice versa.
When filling, Filler sets values using native property descriptors and dispatches input, change, and blur events. This ensures compatibility with controlled components in React, Vue, and other frameworks.
For <select> elements, matching tries exact value, text content, country code/name mapping, and partial matches as fallbacks.
When enabled in settings, Filler listens for form submissions on the page. It extracts field data using the same matching engine, auto-detects the form type based on field presence thresholds, and shows an injected save prompt (rendered in a shadow DOM to avoid style conflicts).
Communication between extension contexts uses typed discriminated unions:
AUTOFILL— Popup to Content: fill form fields with a profileFORM_SUBMITTED— Content to Background: extracted form dataSHOW_SAVE_PROMPT— Background to Content: trigger save dialogSAVE_PROFILE— Save Prompt to Background: persist profileGET_PROFILES/GET_SETTINGS— Data fetch requests
Form types are fully declarative. Add a new entry to FORM_TYPES in src/lib/constants.ts:
{
key: 'payment',
label: 'Payment',
icon: '<svg>...</svg>',
badgeColor: '#10b981',
fields: [
{ key: 'cardNumber', label: 'Card Number', autocomplete: 'cc-number', ... },
// ...
],
editorSections: [...],
editorFieldRows: [...],
detectionKeys: ['cardNumber', 'cardHolder', 'expiry', 'cvv'],
detectionThreshold: 3,
buildSummary: (p) => `${p.cardNumber || 'Card'}`,
}Then add keyword matchers for the new fields in src/content/field-matchers.ts.
Open tests/test-form.html in your browser with the extension loaded. The page includes 7 form variants:
- Standard Form — common field names and IDs
- Autocomplete Form — relies on
autocompleteattributes with unusual names - Label-Only Form — generic names, detection via labels
- Placeholder-Only Form — detection via placeholders
- Login Form — username, password, email
- Login Form (Placeholder Only) — login fields without labels
- Minimal Form — email + name only, tests detection thresholds
| Permission | Purpose |
|---|---|
storage |
Read/write profiles and settings locally |
activeTab |
Access the active tab for message passing |
scripting |
Inject the save prompt script and styles |
Content scripts run on all URLs (<all_urls>) to enable autofill on any page.