thomasandClaude Opus 4.8 ffaaafed7e Uploads: abgewiesene Dateien melden statt still zu verwerfen, Anlagen bis 30 MB
Eine zu große oder nicht erlaubte Datei wurde von multer abgewiesen, der Fehler
nur auf die Server-Konsole geloggt und der Browser kommentarlos auf /vorlagen
zurückgeleitet. Für den Benutzer sah das aus, als sei der Upload durchgelaufen,
die Anlage tauchte nur nirgends auf ("Upload error: File too large" im Log, die
Teildatei räumt multer selbst wieder weg). Betroffen waren alle drei Uploads der
Vorlagen-Seite: Anlagen, Unterschrift und Bewerbungsfoto.

Die Routen leiten jetzt mit ?fehler=… um – dasselbe Muster wie auf der Jobsuche –
und die Seite zeigt den Grund als Banner: zu groß (mit Limit), Dateityp nicht
erlaubt, oder keine Datei gewählt. Das Limit steht zusätzlich am Datei-Feld,
bevor jemand eine zu große Datei auswählt.

Limit für Anlagen von 15 auf 30 MB angehoben; gescannte Zeugnisse liegen
regelmäßig darüber. Die Größen sind Konstanten (ANHANG_MAX_MB / BILD_MAX_MB),
aus denen sowohl multer als auch die Meldung und der Hinweis im Formular lesen –
eine Meldung, die ein anderes Limit nennt als das durchgesetzte, wäre schlimmer
als gar keine. Der Bild-Filter für Unterschrift/Foto lehnt jetzt ebenfalls mit
einem Fehler ab statt die Datei still zu verwerfen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 17:47:24 +02:00

NextJobs

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:

  1. 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.
  2. Stelle importieren Mit der Browser-Erweiterung (extension/) auf Indeed den Button „An NextJobs senden" klicken.
  3. 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

  1. Projekt klonen
cd bewerbungs-tracker
  1. Abhängigkeiten installieren
npm install
  1. Datenbank-Verzeichnis erstellen
mkdir -p data

Die SQLite-Datenbank wird automatisch beim ersten Start erstellt.

  1. Server starten
npm start

Für Entwicklung mit automatischem Neuladen:

npm run dev
  1. 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

  • E-Mail
  • Online-Portal
  • Indeed
  • StepStone
  • Firmenwebsite
  • Post
  • Initiativbewerbung
  • Arbeitsagentur
  • Sonstiges

Status

  • Entwurf
  • Gesendet
  • Eingangsbestätigung
  • In Bearbeitung
  • Interessiert
  • Warten auf Rückmeldung
  • Warten auf meine Antwort
  • Vorstellungsgespräch
  • Vertragsverhandlung
  • Absage
  • Absage von meiner Seite
  • 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

NextJobs 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.

S
Description
Jobbi Bewerbung App
Readme
4.6 MiB
Languages
JavaScript 57.3%
EJS 38.9%
Shell 1.7%
CSS 1.5%
HTML 0.3%
Other 0.3%