← back to writing
Engineering deep dive

ApplyWise: the AI never gets to say something I didn't tell it

Join the beta ↗

Every job-application tool has to answer one question honestly: what happens when it doesn't know the answer? Most guess, confidently enough that people submit it. ApplyWise fails loudly instead — flags the field, asks you, moves on. "No fake AI answers" isn't a tagline; it's the constraint the JSON schema and the exclusion list are both built around.

Local-first is the whole architecture

It's a Chrome MV3 extension. chrome.storage.local holds your résumé, profile, tracker, and Answer Memory — none of it leaves the browser during the beta. No server needs to hold your résumé for the extension to analyze the page you're on. Resume parsing runs client-side too, on PDF.js compiled for the browser — no upload, no round trip to extract your own text from your own file.

Answer Memory only learns what you taught it

Not "AI fills your form" — you fill a field once by hand, reopen the popup, press Remember answers. Only then does it enter memory, and every reuse afterward is a suggestion you review, never something silently submitted.

A hard exclusion list applies regardless of what you approve: passwords, CAPTCHA, government IDs, birth dates, demographic and disability/veteran questions, salary. Those never enter memory, because those are exactly the fields where a wrong autofill does real damage.

The multi-stage problem

ATS forms reveal new fields as you move through a flow — education after experience, references after that — and a one-shot fill pass misses fields that don't exist in the DOM yet. The content script keeps watching for newly-rendered recognized fields for fifteen minutes after you press Fill. You still click Continue, Save, or Submit yourself, every time.

Job matching shows its work

Not a hidden score. It reads the job and your profile, and produces explicit strengths and explicit gaps, so you decide why before spending twenty minutes on an application — not framed as a hiring prediction, because it isn't one.

Where the AI sits, and the schema that boxes it in

A small server behind the paid tier generates a fuller kit — cover letter, resume summary, screening answers — calling OpenAI with a strict JSON schema. The instructions are the actual guardrail: use only facts in the profile, never invent skills or dates, and mark any answer needs_user_input whenever the profile lacks the fact. That field is schema-required, not just prompted for — the model has to output it explicitly for anything it can't back up.

Account data on the server is encrypted at rest — AES-256-GCM, scrypt password hashes with timing-safe comparison — because a small side project holding résumés is still worth protecting properly.

What "never clicks Submit" buys

Three permissions: storage, activeTab, scripting. No host permissions beyond the tab you're on, and it does not click Submit, ever, under any setting. Every fill is reviewable before a human commits to it — the difference between a copilot and an autopilot, even though "auto-apply" is the easier thing to market.

It's in private beta now, distribution paused while early access gets set up properly — not because the tech doesn't work, but because the guardrails deserve a small group first.