The big picture

A local‑first desktop app in three layers

AI Job Hunter is a Tauri desktop app: a React UI runs in a webview, talks to a Rust core over Tauri's IPC, and the Rust core does the real work — calling AI models, scraping job boards, ranking and tailoring matches, and storing everything on your machine. Click any box to see what it does and where it lives.

User clicks in UIService hook → AppClientinvoke('command')#[tauri::command]AI / board / diskemit('event') streamUI updates live

Renderer — React + TanStack Router

main.tsx (bootstrap)
Routes / Pages
Features & components
Service hooks (React Query)
Zustand stores
State machines

IPC bridge — AppClient

createTauriInvokeClient()
invoke('cmd', args)
listen('channel') events
Contracts + Zod (shared)

Rust core — Tauri

#[tauri::command] handlers
AI provider layer
Scraper engine + boards
Autopilot engine
JobTracker
Pipeline (cover letter)
Stores (SQLite/JSON/keyring)

External services

Ollama (local LLM)
Cloud APIs
CLI agents
Job boards
Disk & OS keyring

Click a box above

Each box shows its responsibility, the real files it maps to, and the key types or functions an interviewer might ask about.

What happens at launch

From double‑click to a ready window

Two things start in parallel: the webview mounts the React provider tree, and the Rust setup() wires up all shared state and background tasks. Step through it.

Click‑by‑click

Flow simulator — UI → IPC → Rust → result

Pick a journey and step through every hop. The strip at the top lights up the layer that is currently doing the work, so you can see exactly where control sits at each moment.

Autopilot ties them together. A background scheduler ticks every 60s (autopilot_scheduler.rs). For each due autopilot it runs the whole loop: scraperank (embed each posting, cosine‑compare to your resume) → generate a cover letter through the validated pipeline → apply record the run. Every sub‑step reuses the exact same commands you stepped through above.
Every door between the two worlds

IPC reference

Every method on AppClient, the exact Tauri command it calls (or event channel it subscribes to), and the namespace it belongs to. This is the complete contract surface between the renderer and Rust. Type to filter.

AppClient IPC endpoint reference — all invoke commands and event channels
NamespaceMethodKindTauri command / event channel
Under the hood

Subsystem deep‑dives

The Rust core is built around a few registry‑driven subsystems. Each one is designed so a new provider or board is one new module + one registry line — no edits anywhere else.

Be ready for anything

Interview cheat‑sheet

Tight, codebase‑grounded answers to the questions most likely to come up. Each cites the file you can point to.


30‑second elevator pitch

“It's a local‑first Tauri desktop app that automates job hunting. A React/TanStack renderer talks to a Rust core over Tauri IPC. The Rust side has a strictly‑typed AI‑provider layer (Ollama, the cloud APIs, and headless CLI agents like Claude Code), a scraping engine driven by a board registry, and an autopilot engine that scrapes, ranks and notifies you about new matches. Long jobs return a jobId immediately and stream progress back as Tauri events, so the UI stays live. Data — resumes, embeddings, history — lives in local SQLite/JSON, and secrets go in the OS keyring. Adding a new model provider or job board is a single module plus one registry entry.”