An application assistant that links every claim to verified profile evidence, then prepares a reviewable, human-supervised application pack.
Key metric
121/121
supported claims · frozen 50-case benchmark
An application workflow
1Human-verified profile
2Relevant evidence retrieval
3Matching & evidence ledger
4Draft reviewed before action
Facts come from the profile. The model selects the evidence.
Architecture
JobCopilot
Components, data flows and trust boundaries of the system.
Scroll the diagram →
Technologies
Python
LangGraph
Pydantic
FAISS
Hugging Face
OpenAI · Anthropic
Streamlit
Supabase
Gmail API
Google Calendar
Docker
GitHub Actions
Design decisions
01
The LLM does not write facts: it only selects one to three verified memory IDs, and deterministic code writes the matching sentences.
02
Every claim is recorded in an evidence ledger; unknown IDs and amplification (“built” → “designed”) are rejected.
03
Per-user isolation: identity is injected server-side through closures, the model cannot pass a user_id; FAISS indexes are rebuilt from Supabase.
04
No external action without confirmation: a Gmail draft is never recorded as a sent application.
What I built
Profile import and human verification, tenant-isolated semantic memory, structured offer extraction, matching, an evidence ledger, deterministic email composition, tracking and Gmail drafts.
Scope and limitations
The grounding benchmark measures a fixed set of cases, not guaranteed performance on every new offer. External actions remain human-supervised. Real-user validation is a separate stage.