Somewhere between the 40th job application and the 60th, I started to hate my own name.
Not the name itself — the typing of it. Name. Email. Phone. Address. Current employer. LinkedIn. "How did you hear about this role?" Then the next tab: same fields, different recruiter portal, different layout, different labels ("Contact email" instead of "Email address"). Then the next one. And the next.
Browser autofill covers maybe a third of it — it dies the moment a form is rendered by JavaScript. Form-filling extensions with templates break the moment a website redesigns. Recording-based tools break the moment the DOM changes. Every approach is fighting a losing battle against one fact: every form is different, and you can't pre-record your way out of that.
The idea: stop matching fields, start understanding them
What if the extension didn't try to recognize fields by selector or template at all? What if it just read the form — labels, placeholders, structure — and let an LLM figure out what each field wants?
That's the bet I made. Instead of "this input has name=email so fill it with email," the flow became:
- Extract — walk the DOM, collect every input, select, radio group, checkbox, and its context (label, placeholder, aria-label, nearby text).
- Send — send that structure plus your profile to DeepSeek (you bring your own API key).
- Understand — the model returns a suggested value for each field, with a confidence score.
- Confirm — you review the suggestions, tweak what you want, and click "Fill Selected". Nothing is filled without your explicit approval.
The result: a form on a React SPA I've never seen before gets filled correctly on the first try, because the extension understands what the field means, not where it lives.
What I learned building it
Semantic understanding beats selector matching — until it doesn't. The first version worked great on static forms and died on the edge cases: radio groups where the options are images, selects with opaque option text ("Choose One —"), hidden honeypot fields, multi-step wizards that validate field-by-field. The fix was a confidence score per field. Low-confidence suggestions get highlighted in yellow instead of silently filled — the model is allowed to say "I'm not sure" without blocking the whole form.
Caching is what makes this affordable. A raw LLM call per form is fine at ~$0.001 per form, but it's slow (2–5s) and wasteful when you fill the same form twice. So confirmed mappings are cached per form — the second fill of the same page is a millisecond local lookup, marked "⚡ cached", no API call, no latency.
Dynamic frameworks are actually easier than they look. Because the extraction runs at fill-time (not at install-time like recorders), React/Vue/Angular forms work fine — the extension reads the live DOM after render, not a snapshot from a recording session.
"Fill only empty" is a safety feature, not a convenience. It's on by default. If a field already has content, the extension won't touch it. Combined with confirm-before-fill, it means the extension can't destroy data — the worst case is a suggestion you ignore.
Privacy, the boring-but-important way
This is a personal tool first, so the defaults are: no accounts, no tracking, no servers of mine. Your profile lives in chrome.storage.local in your browser. Nothing is uploaded except the form structure plus your profile, and only when you click fill — through your own API key, on your own billing. If you uninstall, the data goes with you (there's an export).
What's next
It's live now on the Chrome Web Store — free, bring your own DeepSeek key. I'm collecting weird-form reports (government portals, vendor registration systems, the 14-page vendor onboarding forms) to harden the field-extraction. If you've got a form that defeats it, I want to hear about it — that's how this gets better.
Smart Form Fill — AI Assistant: upload your profile once, AI fills the rest. No templates, no recording, nothing filled without your confirmation.
Built after the 60th job application. Smart Form Fill — free, no account, your data stays in your browser.
Top comments (0)