Tagline
Open-source Chrome extension that auto-fills job forms with Gemini.
Tech Stack
React, TypeScript, Vite, TailwindCSS, Chrome Extension, Web Crypto API, Gemini API

Open-source Chrome extension that auto-fills job forms with Gemini.
React, TypeScript, Vite, TailwindCSS, Chrome Extension, Web Crypto API, Gemini API
Phasely fills job application forms across Workday, Greenhouse, Lever and a dozen more ATS platforms, all from one encrypted markdown profile you write once. Field detection runs ten scoring heuristics per input and resolves against hundreds of profile aliases, with platform adapters layered on top for the edge cases. Profile, resume and API keys sit behind AES-GCM on device, keyed by PBKDF2. No servers, no accounts.
A single YAML front-matter markdown file is parsed and validated. Three required fields (firstName, lastName, email); everything else improves fill accuracy.
src/lib/profile.ts
tap a step to explore →
Applying for engineering roles at any volume means re-typing the same profile into dozens of applicant tracking systems — Workday, Greenhouse, Lever and a dozen others — each of which names its fields differently. It's slow, repetitive, and easy to get wrong. I had the problem myself while job hunting.
A Chrome extension that fills application forms from a single markdown profile you write once. Field detection scores every input across ten heuristic signals (label, name, id, placeholder, aria-label, autocomplete and more) and resolves it against hundreds of profile aliases, with platform-specific adapters layered on top for the edge cases. Profile, resume and API key are AES-GCM encrypted on-device behind a PBKDF2-derived key. Optionally, Gemini generates a tailored cover letter from the live job posting.
The core choice was how to identify fields: hand it to an LLM on every page, or build a deterministic heuristic-plus-adapter engine. An LLM would have been far less code, but it meant sending page DOM to a model on every load, unpredictable latency and cost, and non-reproducible fills. I chose the deterministic path — scoring heuristics, alias tables, and per-ATS adapters (including recursively traversing Workday's shadow DOM) — so the extension stays fast, private, and repeatable, keeping the LLM scoped to the one task it's genuinely good at: writing prose.
The deterministic engine fills reliably offline and never sends form data off-device, which was the point. The cost is maintenance: adapters break when an ATS changes its markup. If I took it further, I'd build a test harness that snapshots real ATS forms so adapter regressions get caught automatically instead of in the field.
Phasely is a zero-backend Chrome extension — every piece of user data (profile, resume, Gemini API key) is AES-GCM encrypted on-device using a PBKDF2-derived key (310,000 iterations) with a random device-bound salt. Content scripts make no outbound calls; all external requests go through the service worker. Profile text is sanitised against prompt-injection patterns before any AI call. Field detection is heuristic — each form field is scored across ten signals (label, name, id, placeholder, aria-label, autocomplete, and more) and matched against hundreds of profile key aliases, with ATS-specific adapters (Greenhouse, Lever, Workday) layered on top. Workday's shadow DOM is traversed recursively.



