A local, human-in-the-loop job application assistant. It attaches to a user-selected Chrome tab (no pasted job URLs), scores tailored resume versions against the JD, then autofills ATS forms from a private resume hub — never submitting for you.
Demo
Replace the src below with your YouTube, Loom, Vimeo, or /public video URL.
Problem
Applications repeat the same profile data across portals with different schemas. Manual filling is slow; fully unsupervised autofill risks incorrect or overconfident submissions. Opaque “match scores” from platforms also hide why a resume fits or fails.
Pipeline
Active Job Tab ──> JD Extractor ──> Semantic Matcher ──> Structured Gap Analysis
^
|
Resume Data Hub
|
v
Active ATS Tab ──> ATS Detection ──> Selector Strategy ──> Reviewed Form Fill
Flow in the Streamlit UI: Analyze → Apply → Autofill. Matching gates resume recommendations on applyability first. Autofill uses soft ATS detection plus a shared field catalog across hosts such as Workday, Greenhouse, SuccessFactors, Dayforce, Phenom, and Oracle CX.
Zero-URL contract
Playwright attaches over CDP to a user-managed Chrome instance and operates only on an explicitly selected tab. The UI never accepts a pasted job URL or JD text — the applicant stays in control of navigation, auth, and final submit.
Human-supervised constraints
Non-negotiable gates before any apply step:
- No silent submit — drafts are never posted without explicit approval
- Diff visibility — reviewer sees mapped fields and unmatched ones for manual entry
- Preserve curated fields — hub profile values are not overwritten by stale import prose
- Fail closed — ambiguous ATS pages or mappings stop safely rather than guessing
Tech stack
Python · Streamlit · Playwright (CDP) · Pydantic · BeautifulSoup · pypdf / python-docx · Gemini / Anthropic / OpenAI
Design notes
- Separate durable applicant data from platform-specific selectors and model reasoning
- Validate LLM gap analysis with Pydantic (
APPLY/APPLY_WITH_CAUTION/DO_NOT_APPLY/NEEDS_REVIEW) - Prefer importer-based refreshes over hardcoding resume prose that goes stale
- Detect ATS from local DOM signatures, not paid URL classifiers