An autonomous CLI agent that scrapes job boards, ranks matches to your profile, and generates tailored CVs & cover letters — fully local, no cloud required.
Every step of the job search workflow — scraping, evaluating, tailoring, tracking — is a task an autonomous agent can own with better consistency and zero fatigue.
Jobs scattered across LinkedIn, Indeed, and government portals. No unified view, no ranking — just noise across browser tabs.
Each application demands a customised CV and cover letter. Same structure, different emphasis. Exactly what LLMs do best.
Which skills got interviews? Which phrasing landed offers? Without a data pipeline, candidates can't learn from outcomes.
run commandA central orchestrator coordinates 7 stages in sequence from a single command. Each stage is independent — it can fail without blocking the rest.
Each agentic capability maps to a concrete module. Tool abstraction, structured LLM output, persistent state, and feedback collection.
3 sources run in parallel, each as an independent tool with its own failure handling. Two strategies: REST API for Arbeitsagentur (official public API, no auth needed), and browser automation via Playwright for Indeed (embeds data in JS and blocks HTTP) and LinkedIn (tries the guest API first, falls back to Playwright if blocked).
The agent instructs the LLM to return a strict JSON structure — not free text. It reorders your experience, rewrites bullet points, and generates a company-specific cover letter. Responses are cached to avoid redundant calls. Supports Ollama, OpenRouter, and KISSKI.
The agent maintains a persistent record of every application: status (Wishlist → Applied → Interview → Offer), key dates, recruiter contacts, and generated documents. This is the agent's long-term memory across sessions.
After each application, the user rates the generated documents and records the outcome. Over time this builds a dataset of what worked — the foundation for prompt refinement and re-ranking tuned in Sprint 4.
The agent runs entirely from the terminal. The web UI is an optional dashboard. All state is local. LLM calls go through OpenRouter, KISSKI (academic API), or a local Ollama instance.
Usable after Sprint 1. Each sprint adds agentic capabilities — from basic tool use to closed-loop learning.
Honest trade-offs and active design decisions — not blockers.
Current orchestrator follows a fixed 7-step plan. Should the agent dynamically decide which steps to run? E.g. skip generation if no high-match jobs. Trade-off: predictability vs. autonomy.
Indeed and LinkedIn actively block bots. Mitigation: Arbeitsagentur uses the official REST API and is fully stable. LinkedIn tries the public guest API first and falls back to Playwright. Indeed uses browser automation only. All failures are isolated — partial results always returned.
LLM-as-judge is circular. Human eval is slow. Application-to-interview conversion is the real metric but needs weeks of data. Should we use rubric-based scoring as an interim proxy?
Llama 3.1 8B (via OpenRouter or KISSKI) produces adequate but not excellent documents. Architecture is provider-agnostic — users can switch between Ollama, OpenRouter, or KISSKI with a config change.
Feedback is collected but doesn't yet influence ranking or generation. Sprint 4 is dedicated to closing this loop — the open question is whether prompt refinement based on past outcomes is more effective than re-ranking.
Candidate profiles contain name, email, salary. LLM API calls send this to third parties. Mitigation: local-only mode (Ollama), clear consent flow, no provider-side persistence.