/work
/work · bewerbungshelfer

AI Job Application Tool

Tauri desktop app, five Flask microservices, three-tier LLM fallback

roleArchitecture, AI orchestrationyear2025-26typeOwn project
Tauri 2.0 + React 19Desktop shell, local-first// PYTHON / FLASK SERVICESProfile APIFlaskJob APIFlaskCareer ProfileFlaskDraft APIFlaskJob-ScanFlask// LLM FALLBACK CHAINKimi K2primaryGPT-4o-minisecondaryStatic Templateemergencyon failon fail// EXTERNAL DATA SOURCESJSearch APIAdzuna APIGoogle Places

Desktop application that pulls job listings, scores them against a stored profile, and generates tailored cover letters. Local-first, cross-platform via Tauri. Built as a single-developer exercise in microservice orchestration and LLM fallback.

// goal

The brief

Manual applications take weeks. I wanted a tool that finds matching roles, scores them against a stored career profile, and writes a tailored cover letter quickly enough that I'd actually use it instead of writing one from scratch.

// approach

What I built

Tauri 2.0 desktop app with a React 19 frontend on top of five separate Python/Flask services (Profile API, Job API, Career Profile, Draft API, Job-Scan). The LLM step runs a three-tier fallback chain: Kimi K2 first, GPT-4o-mini second, static template if both fail. Job sourcing pulls from JSearch and Adzuna. Matching is scored, not keyword-based.

// features

Inside the build

Multi-LLM fallback chain

Three tiers in order: Kimi K2 first (cheap and fast), GPT-4o-mini if it fails, static template if both are down. Per-tier metrics so I can see which provider actually served each request.

Five Flask services

Profile API, Job API, Career Profile, Draft API, and Job-Scan run as separate services. Each owns its own data and contract, so I can upgrade or rewrite one without touching the others.

Scored matching

Job descriptions are scored against the stored career profile rather than keyword-matched, which surfaces relevant roles even when wording differs.

Tauri desktop shell

Native cross-platform app via Tauri 2.0. CV, profile, and generated drafts stay on the local machine; the app only calls out for job listings and LLM completions.

// tech stack

Stack used

// App

Tauri 2.0React 19ViteTypeScript

// Services

PythonFlaskJob-ScanProfile API

// AI

Kimi K2 (Moonshot)OpenAIStatic Template Fallback

// Data Sources

JSearch APIAdzuna APIGoogle Places

// outcome

Multi-profile desktop app. Generates a tailored cover letter from a job description plus a career profile in around 30 seconds. The fallback chain keeps the app usable when one of the LLM providers is down.