Ein schlankes, agentenbasiertes System zur automatischen Erstellung maßgeschneiderter Lebensläufe (CV) und Anschreiben direkt aus deinem persönlichen Obsidian-Vault, gerendert mit Typst zu erstklassigen PDFs.
Inspiriert von der modularen Pack- und Workflow-Architektur des exxfer-agent.
career-agent/
├── .env # Lokale Pfade (Obsidian Vault, Akzentfarbe, etc.)
├── .env.example # Vorlage für Umgebungsvariablen
├── CHANGELOG.md # Änderungen am Repository und Setup-Hinweise
├── career-agent.code-workspace # VS-Code-Arbeitsbereich
├── templates/
│ ├── cv_modern.typ # Modernes, visuelles Typst-Template für CVs (Badges, Pills, Cards)
│ └── cover_letter_modern.typ # Passendes Anschreiben-Template (Header, DIN-Absätze)
│ ├── neat_cv.typ # Adapter für @preview/neat-cv
│ ├── neat_letter.typ # Kompakter Letter-Adapter im neat-cv-Stil
│ ├── clean_print_cv.typ # Adapter für @preview/clean-print-cv
│ ├── clean_print_letter.typ # Kompakter Clean-Print-Letter-Adapter
│ ├── nabcv.typ # Adapter für @preview/nabcv
│ └── nabcv_letter.typ # Passender nabcv-Anschreiben-Adapter
├── packs/ # Modulare Instruktionen für den KI-Agenten
│ ├── shared/ # Fact-Checking (Anti-Halluzination), STAR-Methode, ATS-Optimierung
│ ├── cv-tailored/ # Workflow & Schema für maßgeschneiderte Lebensläufe
│ └── cover-letter/ # Workflow & Schema für zielgerichtete Anschreiben
├── scripts/
│ ├── render.sh # Wrapper für Typst-Kompilierung (JSON -> PDF)
│ └── vault_helper.py # CLI-Tool zum Inspizieren und Durchsuchen des Vaults
├── sample-data/ # Beispieldaten & Obsidian-Notizvorlagen
└── output/ # Generierte PDFs und Zwischendateien
- Python 3: Für
vault_helper.py; es werden ausschließlich Module aus der Python-Standardbibliothek verwendet - Typst:
brew install typstfür die PDF-Erzeugung - Font Awesome 7:
brew install --cask font-fontawesomefür die Icon-Ausgabe vonneat-cvundnabcv - uv ist nicht erforderlich: Das Repository hat derzeit keine Python-Abhängigkeiten, kein virtuelles Environment und keinen Lockfile-Bedarf. uv kann optional für einen eigenen Python-Workflow verwendet werden, ist aber nicht Teil des Projekt-Setups.
Erstelle die lokale Konfiguration aus der Vorlage und passe sie an:
cp .env.example .envIn .env:
# Pfad zu deinem Obsidian Vault (dynamisch & nicht gehardcoded)
OBSIDIAN_VAULT_PATH="/path/to/your/obsidian-vault"
# Optionaler Unterordner im Vault
OBSIDIAN_CAREER_SUBDIR="02 Areas/Career"
# Akzentfarbe für Überschriften und Badges (z.B. #1a5fb4, #0f4c81, #0d5c75)
CV_ACCENT_COLOR="#1a5fb4"
# Optionaler lokaler Pfad zu einer PNG-Unterschrift für Anschreiben
SIGNATURE_PATH="/path/to/signature.png"# 1. Prüfen, ob Obsidian-Notizen gefunden werden
make status
# 2. Vault nach bestimmten Skills/Begriffen durchsuchen
make search q=Databricks
# 3. Test-Lebenslauf als PDF kompilieren
make test-cv
# 4. Test-Anschreiben als PDF kompilieren
make test-letter
# 5. Alle alternativen CV-/Anschreiben-Varianten testen
make test-variantsDer konfigurierte Karriere-Unterordner wird automatisch bevorzugt durchsucht. Persönliche Obsidian-Notizen, .env und generierte PDFs bleiben außerhalb des Git-Repositories beziehungsweise werden von Git ignoriert.
Wenn du eine neue Bewerbung erstellen willst, übergibst du dem Agenten (z.B. im Copilot-Chat) einfach die Stellenausschreibung:
- Job-Analyse (
packs/shared/job-analysis.md):- Der Agent extrahiert Kernanforderungen (Must-Haves, Nice-to-Haves) und ATS-Keywords.
- Vault-Matching:
- Der Agent durchsucht deine Obsidian-Notizen nach den passenden Projekten und Stationen.
- Drafting (
cv_data.json):- Der Agent formuliert Projekt-Bullets nach der STAR-Methode (Situation, Task, Action, Result) um, ohne Fakten zu erfinden (
packs/shared/conventions.md).
- Der Agent formuliert Projekt-Bullets nach der STAR-Methode (Situation, Task, Action, Result) um, ohne Fakten zu erfinden (
- PDF-Kompilierung:
- Der Agent ruft
./scripts/render.shauf – in Millisekunden entsteht ein PDF inoutput/.
- Der Agent ruft
Die JSON-Datenquelle bleibt für alle Renderer identisch. Die vierte Argumentposition von render.sh wählt die Darstellung:
./scripts/render.sh cv <cv_data.json> <output.pdf> modern
./scripts/render.sh cv <cv_data.json> <output.pdf> neat-cv
./scripts/render.sh cv <cv_data.json> <output.pdf> clean-print-cv
./scripts/render.sh cv <cv_data.json> <output.pdf> nabcvFür Anschreiben stehen modern, neat-cv, clean-print-cv und nabcv zur Verfügung. clean-print-cv erhält dabei einen lokalen, zum Print-CV passenden Letter-Adapter.
Die Pakete werden von Typst beim ersten Lauf aus Typst Universe geladen und sind in den Adaptern versionsgebunden. Die Adapter halten die Karriere-Datenquelle unabhängig vom jeweiligen Layout.
Eine Unterschrift wird nur für Letter-Renderings temporär unter das Typst-Root kopiert und nie ins Repository übernommen. Ist die Datei wegen macOS-Datenschutzrechten nicht lesbar, rendert der Prozess mit einer Warnung ohne Unterschrift.
Dieses Projekt benötigt aktuell kein pyproject.toml, keine requirements.txt und keine uv.lock, weil scripts/vault_helper.py keine externen Python-Pakete verwendet. Die zentrale Render-Abhängigkeit ist Typst; die alternativen Layouts laden ihre versionsgebundenen Typst-Universe-Pakete beim ersten Lauf. scripts/render.sh prüft die Typst-Installation vor dem Kompilieren.