Save your profile once. Open almost any form. Detect → fill → verify → review.
In one line: a Manifest V3 Chrome extension that pairs a deterministic form-understanding engine with an AI judgment layer — it reads field intent across difficult DOM structures, fills framework-controlled inputs safely, verifies its own selections, attaches documents, and uses AI only for the questions that actually need it. Your profile, résumé, and answers stay on your device; only a form's questions are used to understand it — and nothing is ever submitted without you.
Job applications ask candidates to re-type information that already lives in their résumé — contact details, work history, education, links, eligibility, salary, and long-form questions. Basic autofill handles predictable fields. Modern ATS platforms don't: they use custom widgets, dynamic sections, framework-controlled inputs, ARIA components, iframes, and inconsistent labels.
Fillo AI Pro treats form filling as a systems problem, not a text-pasting problem.
The deterministic engine does the high-confidence work first — instantly and for free. AI is used only where judgment is genuinely useful. You stay responsible for review and submission.
| Profile & Documents | Job Tracker | AI & Settings |
![]() |
![]() |
|
| Your AI Co-Pilot | Get Started in 3 Steps | Smarter Answers |
![]() |
![]() |
![]() |
| Capability | Status |
|---|---|
| Field-intent detection across poorly labeled forms | ✅ |
| React / Vue / Angular controlled inputs | ✅ |
| Custom JS dropdowns (Workday, Greenhouse, React-Select, MUI, …) | ✅ |
Google Forms & ARIA widgets (role=radio/checkbox/listbox) |
✅ |
| Open Shadow DOM + iframes | ✅ |
| Résumé / cover-letter upload into file fields | ✅ |
| Résumé → profile extraction (PDF) | ✅ |
| Multi-entry Experience / Education (repeaters) | ✅ |
| Custom Q&A with AI Enhance | ✅ |
| Answer memory + past-response learning | ✅ |
| AI answers for open-ended questions | ✅ |
| LLM-for-choices — dropdowns the matcher can't map | ✅ |
| Application Tracker (Applied → Interviewing → Offer) | ✅ |
| Right-click single-field fill + keyboard shortcuts | ✅ |
| Auto-submit | 🚫 intentionally excluded |
| CAPTCHA bypass | 🚫 never read, never touched |
The extension is Manifest V3, vanilla JavaScript, no build step (the only bundled library is pdf.js, used offline for résumé parsing). The engine ships as an <all_urls> content script but is inert until you invoke it — it never fills, and detection is passive.
The intelligence is split into a local shell and a cloud brain, in the pattern Grammarly and similar tools use — the page's structure is understood in the cloud; your data never leaves your machine:
- On your device: the UI, your profile / résumé / Q&A (
chrome.storage.local), DOM scanning, the fill executor, and the join of field → your value. - In the cloud (Fillo API): field classification — given a form's questions, which profile key does each field want? It receives descriptors (label text, attributes, section, option labels), never your values.
- A frozen local engine (
engine-lite.js) classifies in-page whenever the server is slow, offline, or switched off — so filling always works.
flowchart TB
U["User"]
subgraph EXT["Chrome Extension · Manifest V3 (your device)"]
UI["Side Panel / Options UI"]
SCAN["DOM Scanner + Fill Executor"]
LITE["engine-lite · offline fallback brain"]
end
STORE[("chrome.storage.local<br/>profile · résumé · Q&A · memory · tracker")]
PAGE["Target Web Form<br/>DOM · Shadow DOM · Iframes · ARIA"]
API[("Fillo API · Cloudflare Worker<br/>classification brain + usage meter")]
CLOUDAI[("Fillo Cloud AI<br/>hosted model · opt-in")]
OLLAMA[("Ollama · localhost<br/>your machine")]
U --> UI
UI -->|"on-demand injection"| SCAN
SCAN <--> PAGE
UI <--> STORE
SCAN <--> STORE
SCAN -->|"field descriptors only<br/>(questions, never answers)"| API
SCAN <-->|"fallback"| LITE
UI -->|"open-ended answers"| CLOUDAI
UI -->|"or, fully local"| OLLAMA
The pipeline, at a glance:
Discover → Understand → Classify → Resolve → Fill → Verify → Escalate → Report
Detection and mutation are kept separate. AI is additive, never foundational. Every write is verified. And when confidence runs out, the system reports or skips — it never fakes success.
Reading a field's intent is the hard part — and it's where naive fillers die. Fillo AI Pro reconstructs each field's true question through a 9-layer resolution hierarchy, ranging from explicit accessibility metadata down to structural and positional inference of the surrounding DOM. That's why it can read a field like this — no for, no useful name, no placeholder — that most tools see as an anonymous text box:
<label>Full Name</label>
<input type="text">Intent alone isn't enough, so each field is also enriched with section context (Personal / Experience / Education / …) reconstructed from the page's structure — so an Experience → Company never gets confused with a Reference → Company, and an ambiguous "Email" lands in the right place. Those descriptors — and only those — are what the classification brain sees.
Filling is verified, not assumed. Standard inputs are written through the element's native setter with the events modern frameworks expect, so React/Vue/Angular state actually updates. Custom dropdowns follow a verify-then-escalate strategy: the widget is driven, then checked to confirm it accepted the value — with fallbacks, and an honest empty result rather than forcing invalid text into a closed-choice control. Multi-entry Experience/Education blocks are filled per entry (with "Add another" repeaters clicked as needed), and conditional fields revealed by earlier answers are picked up automatically.
AI is deterministic-first. Everything the engine can answer from your profile, Custom Q&A, and memory is resolved instantly and for free. Only the leftover, open-ended questions go to a model — grounded in your profile, instructed never to invent employers, dates, or credentials, and always drafted for you to review. You choose where that model runs (see The AI layer).
Answer priority is intentional:
Profile → Custom Q&A → Answer memory → Past responses → AI → Honest skip
Factual data stays deterministic; generation is reserved for the tasks where generation is actually useful.
Profile mapping can't write a cover letter or answer "why do you want this role?" — that's what the AI layer is for. You pick the provider, per your privacy and convenience preference:
- Fillo Cloud AI — the zero-setup default. One-click opt-in, hosted model, generous daily beta quota. This is the one feature that sends profile content off your device: your question plus the profile details needed to answer it go to Fillo's server, which drafts the answer and returns it. Nothing is stored beyond usage counts.
- Local Ollama — unlimited and fully private. Point the extension at your own Ollama at
localhost; your profile, résumé text, and questions never leave your machine. AI calls route through the extension's service worker, so there's no CORS/OLLAMA_ORIGINSsetup.
Either way the rules are the same: only leftover open-ended fields are sent, one focused prompt per field, an explicit "do not invent employers/dates/credentials" grounding rule, a SKIP escape hatch, and every AI draft visibly marked (★) and reviewable before you submit. AI never touches a field the deterministic engine already answered.
The same layer also powers Resume Auto-Fill (upload a PDF → your profile is extracted for you), AI Enhance (polish Custom Q&A drafts in your voice), and LLM-for-choices (when the dropdown matcher is unsure, the model picks by index into the real option list — so a closed-choice control only ever receives one of its own options).
Every fill already knows the company, role, URL, and date — so Fillo keeps a local pipeline of your applications in the panel's Jobs tab:
- Auto-detects job forms (JSON-LD
JobPosting, ATS host patterns — Workday, Greenhouse, Lever, Ashby, iCIMS, …, page metadata) and extracts company and role. - Tracks each application through Applied → Interviewing → Offer → Rejected, with notes.
- Duplicate-apply warning — "you already applied to this role at this company."
It's an isolated, optional feature that writes only to chrome.storage.local — nothing about your applications is ever sent to the Fillo server.
- Deterministic first, AI second — lower latency, lower hallucination risk, predictable and offline-resilient.
- Verify writes, don't trust actions — a click or an assignment is not proof the widget accepted it.
- Honest skip over fake completion — for a job application, a silently wrong answer is worse than a visibly empty one.
- Your data is yours — profile, résumé, and answers live on your device and are never uploaded; the brain classifies questions, never answers.
- No auto-submit — you see and approve everything before it reaches an employer.
- On-demand injection — the engine stays inert until you invoke it; detection is passive.
| Layer | Technology |
|---|---|
| Browser platform | Chrome Extension, Manifest V3 |
| Language | Vanilla JavaScript (ES2020) — no framework, no build step |
| Background runtime | MV3 Service Worker (Ollama + Fillo API proxy) |
| Page access | chrome.scripting + activeTab (on-demand injection) |
| On-device storage | chrome.storage.local (profile, résumé, Q&A, memory, tracker) |
| Classification brain | Cloudflare Worker + Hono + D1 (field descriptors → profile keys) |
| Offline fallback | engine-lite.js — frozen in-page classifier |
| AI | Fillo Cloud AI (hosted, opt-in) or local Ollama |
| Résumé parsing | pdf.js (offline, on device) |
| DOM intelligence | Accessibility metadata, structural context, Shadow DOM traversal |
| File injection | DataTransfer API |
| Dynamic forms | MutationObserver |
Your data stays yours. Really.
- Your profile, résumé, Custom Q&A, and answers are stored only on your device (
chrome.storage.local). They are never uploaded to Fillo servers. - When the engine understands a form, it sends the form's questions (field labels like "Current employer", attributes, section names, option labels) to the Fillo classification brain to work out what each field wants. It never sends your values — matching your data to fields happens on your computer.
- No sign-up, no login, no password. An anonymous random device ID is used to count usage; there is no PII and no hardware fingerprinting.
- We don't know which sites you visit. Usage is metered as a one-way HMAC of the hostname that we can't reverse — never the hostname itself.
- AI is your choice: run it fully local with Ollama (nothing leaves your machine), or use opt-in Fillo Cloud AI, where only your question and the profile details needed to answer it are sent, and nothing is retained beyond usage counts.
- The Application Tracker and all profile data never touch the network.
- Prefer zero server calls? The extension runs on the built-in offline engine when the cloud brain is disabled — classification then happens entirely in-page.
Permanent non-goals: no auto-submit · no CAPTCHA bypass · no fabricated qualifications · no ads · no selling or sharing of data.
Install from the Chrome Web Store. A short onboarding wizard opens on first run — upload your résumé and let the AI build your profile, or fill it in by hand, then pick your AI provider.
-
Fillo Cloud AI (recommended to start) — nothing to install. In the wizard or Settings → AI, choose Cloud AI and click Enable once.
-
Local Ollama (unlimited, fully private) — install Ollama, pull a model, then point the extension at it:
ollama pull llama3.1 # or llama3.2:3b / gemma3:1b on lower-end hardwareKeep Ollama running, open Settings → AI, select Ollama, fetch the model, and test the connection. Calls route through the extension's service worker, so no browser CORS configuration is needed.
Without any AI, deterministic field filling still works — you just won't get AI-written answers.
- Full form — open the side panel and hit Auto Fill, then optionally AI Fill for open-ended leftovers. Review the highlighted changes and submit manually.
- Keyboard —
Alt+Shift+Gfills the whole form (press twice to run AI Fill on the leftovers) ·Alt+Shift+Ffills the focused field ·Alt+Shift+Copens a custom-answer prompt. - Right-click any editable field for Smart Fill, a direct AI answer, a custom instruction, or length presets.
flowchart LR
V2["v2.1 · Today<br/>Detection + verified fill +<br/>résumé parsing + Q&A +<br/>cloud brain + tracker"] --> P1["Next<br/>Richer AI tailoring<br/>(JD-aware answers)"]
P1 --> P2["Profile v2<br/>Multiple profiles · import/export"]
P2 --> P3["Application copilot<br/>JD match reports · pre-submit review"]
P3 --> P4["Reach<br/>ATS packs · more browsers · i18n"]
- Custom calendar / date-picker widgets may need a manual touch.
- Custom JS repeaters with unusual "Add another" wording may still need a manual click.
- Cross-origin iframe reporting can differ from top-frame counts.
- Remote (non-localhost) Ollama endpoints may need server-side CORS configuration.
- If the cloud brain is unreachable, detection falls back to the built-in offline engine (basic mode).
- CAPTCHA is intentionally unsupported.
Anurag Singh — AI & Data Engineer · Python / ML / NLP / LLM Systems
Website · Chrome Web Store · Demo · LinkedIn · GitHub
Automate repetition. Verify uncertainty. Keep the human in control.
Keywords: job application autofill · ATS automation · Chrome extension · Manifest V3 · local-first · cloud classification · Cloud AI · local LLM · Ollama · résumé parser · form understanding · field-intent detection · React-safe inputs · Shadow DOM · ARIA · application tracker · human-in-the-loop





