Der X-API-Key identifiziert den Benutzer; alle Endpunkte waren bereits auf dessen user_id gescoped (27 Operationen geprueft). Zwei Luecken blieben: - Die Aufloesung Token -> Benutzer nahm bei mehrdeutigem Token per LIMIT 1 einfach den ersten Treffer. Haetten zwei Benutzer denselben Token, saehe der eine die Daten des anderen. Jetzt: fail closed (401 + Logeintrag), und /einstellungen weist einen bereits vergebenen Token mit 409 ab. - Ein leerer Token galt als Wert: wer seine Einstellungen einmal gespeichert hatte, besass eine API_TOKEN-Zeile mit ''. Leere Werte matchen jetzt nie. Neu in den Einstellungen (Abschnitt REST-API): - "Neu generieren" erzeugt einen zufaelligen Token (32 Byte, crypto.get- RandomValues); er wird nur ins Feld gefuellt und erst beim Speichern aktiv, ein Fehlklick laesst sich also verwerfen. - "Kopieren" legt den Token in die Zwischenablage; das Auge blendet ihn ein (bestand bereits fuer Secret-Felder). API aktualisiert: - PUT /settings kannte nur name/adresse/kundennummer, GET lieferte aber alle acht Felder. Jetzt schreibt PUT alle (email, telefon, ort, webseite, geburtsdatum) und aendert nur die im Body uebergebenen Felder; die Antwort enthaelt den neuen Stand. Swagger: - Beschreibung sagte "konfiguriert via Umgebungsvariable API_TOKEN" - das gilt seit der Multi-User-Umstellung nicht mehr. Jetzt dokumentiert: Token pro Benutzer aus den Einstellungen, Zugriff nur auf eigene Daten, fremde id -> 404, unbekannter/leerer/mehrdeutiger Token -> 401. - Settings-Schema um die fehlenden fuenf Felder ergaenzt. Verifiziert mit zwei Benutzern und je eigenem Key: Lesen, Aendern, Loeschen, Timeline, Anhaenge, E-Mails, Generierung, Jobangebote und Blacklist des jeweils anderen liefern durchgaengig 404; Listen, Export und Statistik zeigen nur eigene Daten; kollidierender Token -> 409; mehrdeutiger Token in der DB -> 401 fuer beide. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bewerbungs-Tracker
Ein professioneller Job Application Tracker für Jobcenter Grundsicherung Monatsberichte.
Features
- Benutzerprofile: Speichern Sie Name, Adresse und Jobcenter Kundennummer
- Dunkler Modus: Vollständige Dark Mode Unterstützung mit lokaler Speicherung
- CRUD-Operationen: Komplette Verwaltung von Bewerbungen (Hinzufügen, Bearbeiten, Löschen)
- Filterfunktion: Filterung nach Monat und Jahr
- Statistiken: Übersicht über Gesamtbewerbungen, nach Art und Status
- PDF-Export: Professionelle PDF-Generierung für Jobcenter-Berichte
- KI-Bewerbungsassistent: Indeed-Stellen per Browser-Erweiterung importieren, Status „Entwurf", und automatisch zugeschnittene Bewerbungsunterlagen (Anschreiben & Lebenslauf als PDF) auf Basis eigener Vorlagen erstellen lassen
- Responsive Design: Optimiert für Desktop und Mobile Geräte
KI-Bewerbungsassistent (Indeed → Entwurf mit Unterlagen)
Ablauf:
- Vorlagen hinterlegen – Unter Vorlagen (Kopfzeile) das eigene Standard-Anschreiben und den Lebenslauf als Text einfügen. Diese Basis-Unterlagen sind die Faktengrundlage; die KI erfindet nichts hinzu.
- Stelle importieren – Mit der Browser-Erweiterung (
extension/) auf Indeed den Button „An Bewerbungs-Tracker senden" klicken. - Automatische Verarbeitung – Der Tracker legt die Bewerbung mit Status Entwurf an und generiert im Hintergrund über die Ollama Cloud API zugeschnittene Bewerbungsunterlagen, die als PDF-Anhänge an der Bewerbung hängen.
Konfiguration
Alle Einstellungen (Ollama, E-Mail, Kalender, REST-API) werden in der Weboberfläche
unter „Einstellungen“ (/einstellungen, Zahnrad-Symbol im Header) gepflegt und
in der Datenbank gespeichert. Änderungen wirken sofort, ein Neustart ist nicht nötig.
Für die KI-Generierung wird ein Ollama-Cloud-API-Schlüssel benötigt (ollama.com/settings/keys) – trage ihn nach dem ersten Start unter Einstellungen → Ollama Cloud ein.
npm start
# dann im Browser http://localhost:3000/einstellungen öffnen
Bestehende Installationen, die bisher eine .env-Datei nutzen, werden beim ersten
Start einmalig in die Datenbank migriert; danach wird .env nicht mehr benötigt.
Ohne Schlüssel wird die Bewerbung trotzdem als Entwurf angelegt; die Generierung schlägt dann kontrolliert mit einem Hinweis fehl und kann später per „Neu generieren" wiederholt werden.
Details zur Erweiterung: siehe extension/README.md.
Technologien
- Backend: Node.js + Express.js
- Datenbank: SQLite
- Frontend: EJS Template Engine, Tailwind CSS (CDN)
- PDF-Generierung: jsPDF + jspdf-autotable (CDN)
Installation
Voraussetzungen
- Node.js (Version 14 oder höher)
- npm oder yarn
Schritte
- Projekt klonen
cd bewerbungs-tracker
- Abhängigkeiten installieren
npm install
- Datenbank-Verzeichnis erstellen
mkdir -p data
Die SQLite-Datenbank wird automatisch beim ersten Start erstellt.
- Server starten
npm start
Für Entwicklung mit automatischem Neuladen:
npm run dev
- Anwendung öffnen
Öffnen Sie Ihren Browser und navigieren Sie zu:
http://localhost:3000
Projektstruktur
bewerbungs-tracker/
├── server.js # Express Server mit API-Routen
├── package.json # Projektabhängigkeiten und Skripte
├── views/
│ ├── index.ejs # Hauptseite
│ └── partials/
│ ├── header.ejs # Kopfzeile mit Dark Mode Toggle
│ └── footer.ejs # Fußzeile
├── public/
│ ├── css/
│ │ └── styles.css # Benutzerdefinierte Styles
│ └── js/
│ └── main.js # Client-seitige Logik
├── data/
│ └── bewerbungen.db # SQLite Datenbank (wird automatisch erstellt)
└── README.md # Dokumentation
Datenbank-Schema
Bewerbungen
| Feld | Typ | Beschreibung |
|---|---|---|
| id | INTEGER PRIMARY KEY | Eindeutige ID |
| datum | DATE | Bewerbungsdatum |
| firma | TEXT | Firmenname |
| stelle | TEXT | Stellenbezeichnung |
| art | TEXT | Art der Bewerbung |
| status | TEXT | Status der Bewerbung |
| notizen | TEXT | Zusätzliche Notizen |
| created_at | DATETIME | Erstellungsdatum |
| updated_at | DATETIME | Letztes Update |
Einstellungen
| Feld | Typ | Beschreibung |
|---|---|---|
| id | INTEGER | Immer 1 (Single Row) |
| name | TEXT | Benutzername |
| adresse | TEXT | Benutzeradresse |
| kundennummer | TEXT | Jobcenter Kundennummer |
Verwendbare Optionen
Art der Bewerbung
- Online-Portal
- Indeed
- StepStone
- Firmenwebsite
- Post
- Initiativbewerbung
- Arbeitsagentur
- Sonstiges
Status
- Gesendet
- Eingangsbestätigung
- Vorstellungsgespräch
- Absage
- Einstellung
- Keine Rückmeldung
API-Endpunkte
GET /
Hauptseite mit allen Bewerbungen
GET /api/settings
Benutzereinstellungen abrufen
POST /api/settings
Benutzereinstellungen speichern
GET /api/bewerbungen
Alle Bewerbungen abrufen (mit Filter: ?month=MM&year=YYYY)
POST /api/bewerbungen
Neue Bewerbung erstellen
PUT /api/bewerbungen/:id
Bewerbung aktualisieren
DELETE /api/bewerbungen/:id
Bewerbung löschen
POST /api/indeed-import
Stelle importieren (von der Browser-Erweiterung genutzt): legt einen Entwurf an und startet die KI-Generierung der Unterlagen. CORS ist für diesen Endpunkt aktiviert.
GET /api/bewerbungen/:id/generierung
Generierungsstatus und aktuelle Anhänge einer Bewerbung abfragen (Polling).
GET /api/basis-dokumente
Hinterlegte Basis-Unterlagen (Vorlagen) abrufen
GET /anhaenge/:id/download
Generierten Anhang (PDF) herunterladen
GET /api/bewerbungen/filter
Bewerbungen mit Filter abrufen
REST-API für Drittanbietersoftware (/api/v1)
Zusätzlich zu den internen Endpunkten gibt es eine eigenständige, versionierte
REST-API unter /api/v1 für externe Software. Sie ist vollständig mit
OpenAPI 3.0 dokumentiert; eine interaktive Swagger-UI läuft unter /swagger,
das Rohdokument unter /swagger.json.
Authentifizierung
Jeder Endpunkt (außer GET /api/v1/health) erfordert einen API-Key im Header
X-API-Key. Der Schlüssel wird unter Einstellungen → REST-API (API_TOKEN)
konfiguriert. Ist API_TOKEN nicht gesetzt, antwortet die API mit 503 – sie gibt
nie ungeschützt Daten heraus. Swagger/UI sind auch ohne Token erreichbar (die
Dokumentation enthält keine sensiblen Daten).
curl -H "X-API-Key: $API_TOKEN" http://localhost:3000/api/v1/applications
Endpunkte
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/v1/health |
Verfügbarkeit (ohne Auth) |
| GET | /api/v1/applications |
Bewerbungen auflisten (Filter: month, year, status, art, search, limit, offset) |
| POST | /api/v1/applications |
Bewerbung anlegen (Duplicate-Guard via force) |
| GET | /api/v1/applications/{id} |
Einzelne Bewerbung |
| PUT | /api/v1/applications/{id} |
Bewerbung aktualisieren |
| DELETE | /api/v1/applications/{id} |
Bewerbung löschen |
| GET | /api/v1/applications/{id}/timeline |
Statusverlauf |
| POST | /api/v1/applications/{id}/timeline |
Status-Eintrag hinzufügen |
| DELETE | /api/v1/applications/{id}/timeline/{eintragId} |
Status-Eintrag löschen |
| GET | /api/v1/applications/{id}/attachments |
Generierte Anhänge auflisten |
| GET | /api/v1/applications/{id}/attachments/{attachmentId} |
Anhang (PDF) herunterladen |
| GET | /api/v1/applications/{id}/emails |
E-Mail-Korrespondenz |
| GET | /api/v1/emails/{emailId}/attachments/{attachmentId} |
E-Mail-Anhang herunterladen |
| POST | /api/v1/applications/{id}/generate |
KI-Generierung anstoßen (async, 202) |
| GET | /api/v1/applications/{id}/generation-status |
Generierungsstatus abfragen |
| GET | /api/v1/settings |
Einstellungen abrufen |
| PUT | /api/v1/settings |
Einstellungen speichern |
| GET | /api/v1/statistics |
Statistiken (Gesamt, nach Art/Status) |
| GET | /api/v1/export |
Bewerbungen exportieren (ohne interne Notizen) |
| GET | /api/v1/templates |
Basis-Unterlagen (Vorlagen) |
Die vollständige, maschinenlesbare Dokumentation (Parameter, Schemas,
Fehlerantworten) liegt unter /swagger.json und ist in der Swagger-UI unter
/swagger interaktiv bedienbar (inkl. „Authorize“ zum Eintragen des API-Keys
für Test-Requests).
PDF-Export
Der PDF-Export generiert ein professionelles Dokument mit:
- Benutzerdaten (Name, Adresse, Kundennummer)
- Überschrift mit Monat und Jahr
- Zusammenfassung der Bewerbungsaktivitäten
- Tabelle mit allen Bewerbungen
- Bestätigungstext und Datum
Browser-Unterstützung
- Chrome (empfohlen)
- Firefox
- Safari
- Edge
Dark Mode
Der Dark Mode kann manuell über den Toggle-Button in der Kopfzeile aktiviert werden. Die Einstellung wird in localStorage gespeichert und bleibt beim nächsten Besuch erhalten.
Sicherheit
- Eingabefelder werden gegen XSS geschützt
- SQL-Injection wird durch parametrisierte Abfragen verhindert
- Formulare validieren Pflichtfelder
Lizenz
MIT
Autor
Bewerbungs-Tracker für Jobcenter Grundsicherung
Hinweis: Diese Anwendung ist speziell für die Anforderungen des deutschen Jobcenters (Grundsicherung) entwickelt worden. Sie hilft bei der Dokumentation von Bewerbungsaktivitäten für die monatlichen Berichte.