# Jobhunt Platform An AI-assisted job-hunt platform where **you stay in control**. The system discovers jobs, scores them against your profile, drafts application material and prepares sends — but nothing external ever happens without your explicit approval. Open source. Self-hosted. Single-user first, multi-user later. ## Core ideas 1. **Approval gate, architecturally enforced.** Every external action (send email, submit application) requires a server-side confirmed `Approval` referencing the exact artifact hash. No approval row, no send. This is a hard constraint, not a style guide. 2. **State machine owns the flow, LLM answers questions inside it.** Pipeline transitions live in a table. The LLM scores, extracts, critiques and suggests — it never picks the next step. Deterministic orchestration, probabilistic judgment. 3. **Per-task model routing with token budgets.** Cheap model for extraction/scoring, strong model for prose review, budgets enforced per task so the bill stays boring. 4. **The user drafts, the system reviews.** Measured reality: human-drafted prose outperforms full AI drafts. Default cover-letter flow is user-writes, AI-reviews with tracked suggestions. ## Architecture ``` apps/web Vue 3 + Vite + Tailwind — tabs: CV editor, Research, Applications (kanban), Application detail apps/api FastAPI + PostgreSQL — REST API, state machine, scheduler, approval enforcement packages/ llm-gateway/ Model routing, per-task budgets, structured JSON IO, retry/fallback policy connectors/ Job source adapters -> normalized JobPosting (LinkedIn read-focused, jobindex, paste-a-URL) artifacts/ CV + cover-letter generation: Jinja templates -> PDF (fpdf2), versioning, hashing docs/ ADRs, data model, API contract, worker task cards ``` ## Pipeline ``` discovered -> scored -> approved -> drafting -> sent -> interviewing -> offer -> closed \-> rejected (by user) \-> expired ``` External comms are only possible from `approved`/`drafting` states, and only with a matching confirmed `Approval`. ## Quick start (POC) ```bash cp .env.example .env # add LLM provider keys docker compose up -d postgres cd apps/api && uv venv .venv && . .venv/bin/activate && uv pip install -e . pytest # backend tests uvicorn app.main:app --reload cd apps/web && npm install && npm run dev ``` ## Status POC scaffolding in progress. See `docs/` for the design.