KI-Bewerbungsoptimierung: Lebenslauf & Anschreiben automatisch an jede Stelle anpassen
Von generischen Standard-Unterlagen zur maßgeschneiderten Bewerbung — in Sekunden
🚀 Ihre Bewerbung. Für JEDE Stelle optimiert. In Sekunden.
💰 Warum sich KI-Bewerbungsoptimierung rechnet
Eine einzige Bewerbung manuell auf eine Stellenausschreibung anzupassen dauert 60–90 Minuten. Bei 10 Bewerbungen pro Monat sind das 10–15 Stunden — pro Monat. Die KI-gestützte Optimierung reduziert das auf unter 2 Minuten pro Bewerbung. Zusätzlich steigt die Qualität, weil das LLM systematisch alle Keywords der Stellenbeschreibung in Ihren Lebenslauf einarbeitet.
⚙️ So funktioniert's
Drei Schritte von der Stellenausschreibung zum fertigen Lebenslauf + Anschreiben.
💻 Technische Umsetzung
Die Webanwendung basiert auf Node.js mit Express. Der Lebenslauf wird als JSON gespeichert. Die KI-Optimierung erfolgt über Ollama (lokal) — kein Cloud-Dienst, keine API-Kosten, volle Datenkontrolle.
🏗️ Architektur
🚀 Express-Server mit CORS und JSON-Parsing
Der Server-Stack: Express mit CORS, JSON-Body-Parser (50MB Limit) und statischem File-Serving:
const express = require('express');
const axios = require('axios');
const cors = require('cors');
const fs = require('fs').promises;
const path = require('path');
const app = express();
const PORT = process.env.PORT || 3000;
const OLLAMA_URL = process.env.OLLAMA_URL || 'http://localhost:11434';
// Middleware
app.use(cors());
app.use(express.json({ limit: '50mb' }));
app.use(express.static('public'));
📂 Lebenslauf aus JSON laden & speichern
Async/Await-basierte Dateioperationen mit Fehlerbehandlung:
let lebenslauf = null;
async function ladeLebenslauf() {
try {
const data = await fs.readFile(
path.join(__dirname, 'lebenslauf.json'), 'utf8'
);
lebenslauf = JSON.parse(data);
console.log('✓ Lebenslauf erfolgreich geladen');
} catch (error) {
console.error('Fehler beim Laden des Lebenslaufs:', error.message);
lebenslauf = null;
}
}
// Lebenslauf beim Start laden
ladeLebenslauf();
// API-Endpunkt: Lebenslauf abrufen und speichern
app.get('/api/lebenslauf', (req, res) => {
if (!lebenslauf) {
return res.status(404).json({ error: 'Lebenslauf nicht gefunden' });
}
res.json(lebenslauf);
});
app.post('/api/lebenslauf', async (req, res) => {
lebenslauf = req.body;
await fs.writeFile(
path.join(__dirname, 'lebenslauf.json'),
JSON.stringify(lebenslauf, null, 2),
'utf8'
);
res.json({ success: true, message: 'Lebenslauf aktualisiert' });
});
🐍 Ollama-API-Integration
Generische Ollama-Wrapper-Funktion mit konfigurierbaren Parametern:
async function ollamaAnfrage(prompt, model = 'gemma3:12b') {
try {
const response = await axios.post(`${OLLAMA_URL}/api/generate`, {
model: model,
prompt: prompt,
stream: false,
options: {
temperature: 0.7,
top_p: 0.9
}
});
return response.data.response;
} catch (error) {
console.error('Ollama API Fehler:', error.message);
throw new Error('Fehler bei der Kommunikation mit Ollama API');
}
}
🎯 Lebenslauf-Generierung mit strukturiertem Output
Der Prompt definiert präzise, wie der optimierte Lebenslauf strukturiert sein soll:
app.post('/api/generiere-lebenslauf', async (req, res) => {
const { stellenbeschreibung, jobtitel, model } = req.body;
const prompt = `Du bist ein Experte für Bewerbungsoptimierung.
Analysiere die folgende Stellenbeschreibung und erstelle einen
optimal angepassten Lebenslauf.
STELLENBESCHREIBUNG:
Jobtitel: ${jobtitel}
${stellenbeschreibung}
MEIN AKTUELLER LEBENSLAUF:
${JSON.stringify(lebenslauf, null, 2)}
AUFGABE:
1. Analysiere die Stellenanforderungen
2. Passe meinen Lebenslauf optimal an:
- Hebe relevante Erfahrungen hervor
- Formuliere Aufgaben passend zur Stelle
- Nutze Keywords aus der Beschreibung
Gib den optimierten Lebenslauf strukturiert zurück:
PERSÖNLICHE DATEN | BERUFSERFAHRUNG | AUSBILDUNG |
FÄHIGKEITEN | SPRACHEN | PROJEKTE | ZERTIFIKATE`;
const result = await ollamaAnfrage(prompt, model || 'llama3.2');
res.json({ success: true, lebenslauf: result });
});
✉️ Anschreiben-Generator
Separater Endpunkt für das Anschreiben mit eigener Prompt-Strategie:
app.post('/api/generiere-anschreiben', async (req, res) => {
const { stellenbeschreibung, jobtitel, unternehmen, model } = req.body;
const prompt = `Du bist ein Experte für Bewerbungsschreiben.
Erstelle ein überzeugendes Anschreiben.
STELLENBESCHREIBUNG:
Jobtitel: ${jobtitel}
${unternehmen ? `Unternehmen: ${unternehmen}` : ''}
${stellenbeschreibung}
MEIN HINTERGRUND:
${JSON.stringify(lebenslauf, null, 2)}
Erstelle ein Anschreiben mit:
1. Motivation für die Stelle
2. Relevanteste Qualifikationen
3. Konkrete Beispiele aus meiner Erfahrung
4. Warum ich perfekt für die Position bin
5. Professionell und authentisch, ~1 Seite`;
const result = await ollamaAnfrage(prompt, model || 'llama3.2');
res.json({ success: true, anschreiben: result });
});
📊 Dynamische Modell-Liste von Ollama
Verfügbare Modelle direkt von der Ollama-API abfragen — live, kein Hardcoding:
app.get('/api/modelle', async (req, res) => {
try {
const response = await axios.get(`${OLLAMA_URL}/api/tags`);
const modelle = response.data.models || [];
res.json({
success: true,
modelle: modelle.map(m => m.name)
});
} catch (error) {
console.error('Fehler beim Abrufen der Modelle:', error.message);
// Fallback: Bekannte Modelle zurückgeben
res.json({
success: true,
modelle: ['llama3.2', 'llama3.1', 'mistral', 'gemma2']
});
}
});
🗂️ Lebenslauf als JSON-Struktur
Die zugrunde liegende Datenstruktur — flexibel erweiterbar:
{
"persoenlicheDaten": {
"name": "Marcel Verkooyen",
"adresse": "Herzogenrath",
"telefon": "02406 8037603",
"email": "info@computerkumpel.de"
},
"berufserfahrung": [
{
"titel": "CEO CTO",
"unternehmen": "Verkooyen Informatics & Media",
"zeitraum": "seit 2020",
"aufgaben": ["KI-Beratung", "Software-Entwicklung"]
}
],
"faehigkeiten": ["Python", "Node.js", "Ollama", "KI/LLM"],
"sprachen": ["Deutsch (Muttersprache)", "Englisch (fließend)"]
}
⚡ In 5–7 Tagen zum MVP — nicht in 8–13 Wochen.
🚀 Gebaut mit Vibecoding — in 5–7 Tagen statt 8–13 Wochen
- 📋 2–3 Wochen Requirements Engineering
- 🏗️ 2–3 Wochen Architektur & Design
- 💻 3–4 Wochen Implementierung
- 🧪 1–2 Wochen Testing
- 🚢 1 Woche Deployment
- ⏱️ Gesamt: 8–13 Wochen
- 🗣️ 0.5 Tage Prompt-Engineering
- ⚡ 2–3 Tage iterative Generierung
- 🔧 1–2 Tage Refinement & Debugging
- ✅ 1 Tag Integration & Testing
- 🚀 0.5 Tage Deployment
- ⏱️ Gesamt: 5–7 Tage
🗣️ Der System-Prompt hinter diesem Projekt
Mit diesem Prompt entstand die komplette Webanwendung in wenigen Iterationen:
Du bist ein Full-Stack-Experte für Node.js und Ollama-Integration. Aufgabe: Erstelle eine Webanwendung zur KI-gestützten Optimierung von Bewerbungsunterlagen mit lokalen LLMs via Ollama. Technische Anforderungen: - Node.js mit Express.js als Backend - Statisches Frontend (HTML/CSS/JS) mit Formular und Ergebnis-Anzeige - Lebenslauf als JSON-Datei gespeichert (lebenslauf.json) - REST-API-Endpunkte: * GET /api/lebenslauf — aktuellen Lebenslauf abrufen * POST /api/lebenslauf — Lebenslauf aktualisieren * POST /api/generiere-lebenslauf — optimierten Lebenslauf generieren * POST /api/generiere-anschreiben — Anschreiben generieren * GET /api/modelle — verfügbare Ollama-Modelle abrufen - Ollama-Integration via /api/generate mit stream: false - Prompt-Engineering: Detaillierter System-Prompt für die Generierung - Fehlerbehandlung und aussagekräftige Logs Wichtig: - Deutsche Oberfläche und Prompts - Datenschutz: Alles läuft lokal, keine Cloud-APIs - Temperatur 0.7 für natürliche, nicht zu kreative Outputs - Strukturiertes Output-Format: PERSÖNLICHE DATEN | BERUFSERFAHRUNG | AUSBILDUNG | FÄHIGKEITEN | SPRACHEN | PROJEKTE | ZERTIFIKATE
🎯 Strategische Erkenntnisse aus diesem Projekt
Die Bewerbungsoptimierung ist ein Paradebeispiel für „KI als persönlicher Assistent" — nicht als Ersatz, sondern als Booster für eine ohnehin nötige Aufgabe.
Ihr persönlicher KI-Bewerbungsassistent — maßgeschneidert für Sie
Standard-Lebensläufe landen im Papierkorb. Maßgeschneiderte Bewerbungen führen zu Einladungen. Lassen Sie uns Ihr eigenes Optimierungs-Tool bauen — lokal, sicher, effektiv.