Warum ein eigenes Modell
Resume Matcher bringt kein KI-Modell mit. Du verbindest selbst eines: einen Cloud-Anbieter, für den du schon einen Schlüssel hast, ein kostenloses Modell auf deiner eigenen Hardware oder ein ChatGPT- oder Claude-Abo, das du ohnehin bezahlst. Du wählst Anbieter und Modell und damit auch die Kosten und wohin dein Lebenslauftext geht.
Unterstützte Anbieter
| Anbieter | Art | Standardmodell in den Einstellungen |
|---|---|---|
| OpenAI | Cloud | gpt-5-nano-2025-08-07 |
| Anthropic (Claude) | Cloud | claude-haiku-4-5-20251001 |
| Google Gemini | Cloud | gemini-3-flash-preview |
| DeepSeek | Cloud | deepseek-chat |
| OpenRouter | Cloud | deepseek/deepseek-chat |
| Groq | Cloud | llama-3.3-70b-versatile |
| Azure AI Foundry | Cloud | mistral-large-latest |
| Ollama | Lokal | gemma3:4b |
| OpenAI-kompatibler Server (llama.cpp, vLLM, LM Studio) | Lokal | Platzhalter custom-model unter http://localhost:8080/v1; ersetze beides durch die Werte deines Servers |
| ChatGPT-Abo (Sign in with ChatGPT) | Dein ChatGPT-Abo | Nach der Anmeldung aus den Modellen deines Kontos gewählt |
| Claude-Abo (über Claude Code) | Dein Claude-Abo | Das Standardmodell von Claude Code |
Der Standard ist nur ein Ausgangspunkt. Das Modellfeld ist Freitext, du kannst also jeden Modellnamen eintragen, den dein Anbieter anbietet. Die beiden Abo-Optionen brauchen keinen API-Schlüssel und haben ein paar Einschränkungen; siehe Option C.
Die App-Oberfläche gibt es nicht auf Deutsch, deshalb stehen Schaltflächen und Felder hier mit ihrem englischen Namen, zum Beispiel Save und Test Connection.
Option A: Die Einstellungsseite
- Öffne
http://localhost:3000/settings. - Wähle deinen Anbieter.
- Füge deinen API-Schlüssel ein. Bei Ollama oder einem OpenAI-kompatiblen Server trägst du stattdessen die Server-URL ein. Für ein ChatGPT- oder Claude-Abo siehe Option C.
- Ändere den Modellnamen, wenn du ein anderes Modell willst.
- Wenn du über einen Proxy oder einen Aggregator-Endpunkt gehen willst, fülle Base URL aus. Lass das Feld leer, um den Standard des Anbieters zu nutzen.
- Klicke auf Save und dann auf Test Connection.

Test Connection schickt das einzelne Wort „Hi“ an deinen Anbieter und meldet, ob eine Antwort kam. Das Feld System Status oben auf der Seite zeigt, ob das LLM funktioniert und die Datenbank verbunden ist. Was du hier speicherst, hat Vorrang vor Umgebungsvariablen.
Jeder Anbieter behält seinen eigenen gespeicherten Schlüssel, ein Wechsel des Anbieters löscht den anderen also nicht.
Reasoning Effort. Diese Einstellung wirkt nur bei Modellen, die „nachdenken“ können (die gpt-5-Familie, Claude 3.7+, DeepSeek R1, OpenAI o1/o3). Auto schickt nichts mit und ist die verträglichste Wahl.
Option B: Umgebungsvariablen
Vier Variablen konfigurieren das Backend:
| Variable | Was sie festlegt |
|---|---|
LLM_PROVIDER |
Einer von openai, anthropic, gemini, deepseek, openrouter, groq, azure_foundry, ollama, openai_compatible, chatgpt, claude_cli |
LLM_MODEL |
Der Modellname |
LLM_API_KEY |
Dein Anbieterschlüssel |
LLM_API_BASE |
Server-URL, für Ollama und OpenAI-kompatible Server |
Bei einer lokalen Installation gehören sie in apps/backend/.env. Bei Docker übergibst du sie als Umgebungsvariablen des Containers. Das Docker-Image liest auch Docker Secrets: Hänge _FILE an eine der vier Variablen an, um ihren Wert aus einer Datei zu laden, zum Beispiel LLM_API_KEY_FILE=/run/secrets/llm_api_key.
Anthropic, lokale Installation (apps/backend/.env):
LLM_PROVIDER=anthropic
LLM_MODEL=claude-haiku-4-5-20251001
LLM_API_KEY=your-api-key
OpenAI, lokale Installation (apps/backend/.env):
LLM_PROVIDER=openai
LLM_MODEL=gpt-5-nano-2025-08-07
LLM_API_KEY=your-api-key
Ollama auf dem Host, Resume Matcher in Docker:
docker run --name resume-matcher -p 3000:3000 \
-v resume-data:/app/backend/data \
-e LLM_PROVIDER=ollama \
-e LLM_MODEL=gemma3:4b \
-e LLM_API_BASE=http://host.docker.internal:11434 \
ghcr.io/srbhr/resume-matcher:latest
Option C: Dein ChatGPT- oder Claude-Abo
Wenn du schon für ChatGPT oder Claude bezahlst, kann Resume Matcher dieses Abo statt eines API-Schlüssels nutzen. Beide Optionen stammen aus der Community, und keine ist ein garantierter Zugang: Wenn du dich darauf verlassen musst, nimm einen API-Schlüssel von OpenAI oder Anthropic.
ChatGPT-Abo

Das nutzt das offizielle Sign in with ChatGPT von OpenAI für Open-Source-Apps. Es funktioniert mit ChatGPT Plus und Pro.
- Starte Resume Matcher und öffne dann die Einstellungen in einem Browser auf demselben Rechner, unter
http://localhost:3000. - Wähle ChatGPT plan und klicke auf Continue with ChatGPT.
- Melde dich bei OpenAI an und erlaube Resume Matcher, dein Abo zu nutzen.
- Zurück in den Einstellungen wählst du eines der Modelle deines Kontos und klickst auf Save.
Bevor du dich darauf verlässt:
- Es ist eine Vorschau. Sign in with ChatGPT für Open-Source-Apps ist eine Preview von OpenAI und kann sich ändern.
- Anfragen gehen direkt an OpenAI. Sie gehen von deinem Rechner direkt an die API von OpenAI, und die Anmelde-Tokens werden verschlüsselt auf deinem Rechner gespeichert.
- Es zählt gegen die Limits deines ChatGPT-Abos. Bei Plus teilst du dir das Fünf-Stunden-Limit mit deinen anderen Apps, die dein Abo nutzen. Pro hat kein Fünf-Stunden-Limit.
- Melde dich auf demselben Rechner an. OpenAI leitet den Browser nur an
127.0.0.1zurück, die Anmeldung muss also in einem Browser auf dem Rechner passieren, auf dem Resume Matcher läuft. Das klappt mit dem Standard-Docker-Setup, geöffnet unterhttp://localhost:3000, aber nicht von einem anderen Computer aus oder über die Domain eines Reverse Proxys.
Disconnect beendet die Sitzung und löscht die Tokens; Manage usage öffnet deine ChatGPT-Nutzungseinstellungen. Mit Umgebungsvariablen setzt du LLM_PROVIDER=chatgpt und LLM_MODEL auf ein Modell deines Kontos; anmelden musst du dich trotzdem in den Einstellungen.
Claude-Abo (über Claude Code)

Das führt deine eigene Claude Code CLI aus, installiert auf demselben Rechner, bei der du dich selbst anmeldest:
claude auth login
Wähle dann Claude plan in den Einstellungen und klicke auf Save. Mit Umgebungsvariablen setzt du LLM_PROVIDER=claude_cli; LLM_MODEL wird nicht verwendet.
Bevor du dich darauf verlässt:
- Es wird nicht offiziell unterstützt. Anthropic unterstützt Apps von Drittanbietern, die Abos wie Claude Pro oder Max nutzen, nicht offiziell. Wenn Anthropic seine Richtlinien ändert, kann das also aufhören zu funktionieren.
- Resume Matcher sieht deine Claude-Zugangsdaten nie. Es führt die CLI aus, bei der du angemeldet bist, und speichert nichts von deinem Claude-Konto.
- Deine Prompts gehen trotzdem an Anthropic. Claude Code schickt sie über dein Konto, mit seinem eigenen Standardmodell.
- Es zählt gegen die Nutzungslimits deines Claude-Abos, und Anthropic kann es stattdessen auch von Nutzungsguthaben abziehen.
- Es braucht eine lokale Installation. Die Claude Code CLI ist nicht im Docker-Image enthalten, diese Option funktioniert in Docker also nicht.
Resume Matcher finanziert sich über Spenden.
Mehr als 200.000 Jobsuchende haben es genutzt, kostenlos, ohne Werbung und ohne Bezahlschranke. Wenn es dir Zeit gespart oder zu einem Vorstellungsgespräch verholfen hat, sorgt ein Sponsoring oder ein spendierter Kaffee dafür, dass es so bleibt.
Lokale Modelle
Ollama. Installiere es von ollama.com, lade ein Modell herunter und wähle dann Ollama in den Einstellungen:
ollama pull gemma3:4b
Die Standard-URL ist http://localhost:11434. Aus Docker heraus verwendest du http://host.docker.internal:11434. Unter Linux nimmst du die IP-Adresse des Hosts oder startest den Container mit --network=host.
OpenAI-kompatible Server. llama.cpp, vLLM, LM Studio und jeder andere Server, der die Chat Completions API von OpenAI spricht, funktionieren über den Anbieter openai_compatible. Setze LLM_API_BASE auf die Server-URL und LLM_MODEL auf das Modell, das der Server bereitstellt.
Langsame Modelle. Jede KI-Anfrage läuft unter einer einzigen Frist, REQUEST_TIMEOUT_SECONDS (Standard 240, Bereich 30 bis 1800). Ein großes Modell auf bescheidener Hardware kann darüber hinauslaufen. Erhöhe REQUEST_TIMEOUT_SECONDS in der Backend-Umgebung und NEXT_PUBLIC_REQUEST_TIMEOUT_MS in der Frontend-Umgebung (siehe apps/frontend/.env.sample). Das Frontend liest seinen Wert beim Build, deshalb bleibt das vorgefertigte Docker-Image bei 240 Sekunden. Um den Wert dort zu erhöhen, baue das Image selbst mit gesetztem NEXT_PUBLIC_REQUEST_TIMEOUT_MS.
Schlüssel und lokale Server. Das Backend schickt LLM_API_KEY nie an Ollama oder an einen OpenAI-kompatiblen Server, ein bezahlter Cloud-Schlüssel in deiner .env kann also nicht an einen lokalen Server durchsickern.
Kleine Modelle. Die Designnotizen des Projekts warnen, dass kleinere Modelle mit dem strukturierten Bearbeitungsformat Mühe haben, das der Anpassungsschritt verwendet.
Die vollständige Docker-Anleitung findest du unter Docker + Ollama (auf Englisch).
Wo dein Schlüssel gespeichert wird
Schlüssel, die du in den Einstellungen speicherst, landen in der lokalen SQLite-Datenbank, verschlüsselt mit Fernet. Der Verschlüsselungsschlüssel liegt in .secret_key im Datenordner (apps/backend/data/ bei einer lokalen Installation, sonst das Docker-Volume) und wird mit den Rechten 0600 angelegt, sodass nur dein Benutzerkonto ihn lesen kann. Das Backend entfernt die Schlüssel, bevor es config.json im selben Ordner schreibt, die Einstellungsdatei enthält also nie einen.
Um alle gespeicherten Schlüssel zu entfernen, nutze Clear API keys im Gefahrenbereich (danger zone) der Einstellungsseite. Das lässt sich nicht rückgängig machen.
Die Anmelde-Tokens des ChatGPT-Abos werden mit demselben Schlüssel verschlüsselt, in chatgpt_credentials.enc im Datenordner. Das Claude-Abo speichert nichts: Deine Claude-Zugangsdaten bleiben bei Claude Code.
LOG_LLM=DEBUG schreibt Schlüssel im Klartext ins Log. Aktiviere das nicht auf einem gemeinsam genutzten Rechner.
Was an deinen Anbieter geht
Die App schickt nichts an die Autoren von Resume Matcher und enthält keine Telemetrie. Dein Lebenslauftext, einschließlich Name und Kontaktdaten, und die Stellenbeschreibung gehen an den Anbieter, den du gewählt hast, und an niemanden sonst: beim ChatGPT-Abo an OpenAI, beim Claude-Abo über Claude Code an Anthropic. Vor dem Senden wird nichts geschwärzt. Mit einem lokalen Modell verlässt nichts deinen Rechner.
| Funktion | An den Anbieter gesendet |
|---|---|
| Lebenslauf hochladen (Parsing) | Der vollständige Lebenslauftext, einschließlich Name, E-Mail, Telefonnummer und Links |
| Analyse der Stellenbeschreibung, Titel des Lebenslaufs | Die Stellenbeschreibung |
| Anpassung (Skill-Plan, Diff-Änderungen) | Stellenbeschreibung plus vollständiges Lebenslauf-JSON |
| Keyword-Durchgang nach der Anpassung | JSON des angepassten und des Master-Lebenslaufs plus die ersten 2.000 Zeichen der Stellenbeschreibung |
| Anschreiben, Kontaktnachricht | Vollständiges Lebenslauf-JSON plus Stellenbeschreibung |
| Vorbereitung aufs Vorstellungsgespräch | Lebenslauf-JSON (bis zu 30.000 Zeichen) plus Stellenbeschreibung (bis zu 12.000 Zeichen) |
| Bewertung der Stichpunkte | Text der Stichpunkte, Stellenbeschreibung und extrahierte Keywords |
| Anreicherung, Neugenerierung, Resume Wizard | Der Lebenslauf oder Eintrag plus deine Antworten und Anweisungen |
| Test Connection | Das Wort „Hi“ |
Deine anderen API-Schlüssel, die Datenbankdatei, das Tracker-Board, die Einstellungen und die PDFs bleiben lokal. Die einzige andere Netzwerkanfrage stellt die KI-Bibliothek (LiteLLM), die beim Start eine öffentliche Preisliste der Modelle abruft; sie enthält keine deiner Daten und greift offline auf eine mitgelieferte Kopie zurück.
Kosten
Resume Matcher ist kostenlos und Open Source. Ein Cloud-Anbieter rechnet jede Anfrage der App zu seinen eigenen Preisen über dein eigenes Konto ab. Die App erfasst diese Ausgaben nicht, sieh also im Dashboard deines Anbieters nach. Mit dem ChatGPT- oder Claude-Abo zählen die Anfragen stattdessen gegen die Limits deines Abos. Ein lokales Modell kostet pro Anfrage nichts.
Fehlerbehebung
Test Connection schlägt fehl
Prüfe den API-Schlüssel, bei Ollama und OpenAI-kompatiblen Servern die Server-URL. Speichere und teste erneut.
„Claude Code CLI not found“
Installiere Claude Code auf dem Rechner, auf dem das Backend läuft, und führe claude auth login aus. Im Docker-Image ist es nicht verfügbar.
„Not signed in with ChatGPT“ oder „isn’t available for this account“
Wähle ChatGPT plan in den Einstellungen und klicke in einem Browser auf demselben Rechner auf Continue with ChatGPT. Die Abo-Option braucht ChatGPT Plus oder Pro; sonst nimm einen API-Schlüssel von OpenAI.
Docker erreicht Ollama nicht
Verwende http://host.docker.internal:11434 als Ollama-URL, nicht localhost. Unter Linux nimmst du die IP-Adresse des Hosts oder startest den Container mit --network=host.
Timeouts mit einem lokalen Modell
Erhöhe REQUEST_TIMEOUT_SECONDS (bis 1800) im Backend und NEXT_PUBLIC_REQUEST_TIMEOUT_MS im Frontend. Beim vorgefertigten Docker-Image ist der Frontend-Wert beim Build festgelegt; siehe Langsame Modelle oben.
Eine Änderung in .env wirkt nicht
In der Oberfläche gespeicherte Einstellungen haben Vorrang vor Umgebungsvariablen. Öffne die Einstellungen und ändere den Wert dort.
Nächste Schritte
- Was ist Resume Matcher? für den Überblick
- Funktionen für alles, was die KI erzeugen kann, sobald sie verbunden ist