diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 9e221ec..6d8c141 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,6 +1,182 @@
TASKMATE - CHANGELOG
====================
+================================================================================
+30.12.2025 - BUGFIX: Login-Problem behoben (Sofort-Logout nach Login)
+================================================================================
+
+PROBLEM
+--------------------------------------------------------------------------------
+Nach erfolgreichem Login wurde der Benutzer sofort wieder zum Login-Screen
+zurückgeleitet. Dies war ein Race-Condition-Problem mit mehrfachen WebSocket-
+Verbindungen und fehlenden Token-Prüfungen.
+
+URSACHE
+--------------------------------------------------------------------------------
+1. syncManager.connect() wurde doppelt aufgerufen (einmal in sync.js Event-
+ Listener und einmal in app.js initializeApp())
+2. Der Socket-Error-Handler in sync.js löste auth:logout aus OHNE zu prüfen,
+ ob sich der Token in der Zwischenzeit geändert hatte
+
+LÖSUNG
+--------------------------------------------------------------------------------
+1. Doppelten syncManager.connect() Aufruf entfernt (nur noch in app.js)
+2. Socket-Error-Handler prüft nun, ob ein gültiger Token existiert, bevor
+ logout ausgelöst wird
+3. syncManager.connect() prüft jetzt ob Socket bereits existiert (nicht nur
+ ob er verbunden ist), um Race Conditions während des Verbindungsaufbaus
+ zu verhindern
+
+BETROFFENE DATEIEN
+--------------------------------------------------------------------------------
+- frontend/js/sync.js: Doppelten Connect-Aufruf entfernt, Token-Check hinzugefügt,
+ verbesserte Socket-Existenz-Prüfung
+- frontend/sw.js: Cache-Version auf 151 erhöht
+
+
+================================================================================
+30.12.2025 - UI-REDESIGN: Wissensmanagement-Tab komplett überarbeitet
+================================================================================
+
+NEUES LAYOUT: SIDEBAR + HAUPTBEREICH
+--------------------------------------------------------------------------------
+Der Wissensmanagement-Tab wurde komplett überarbeitet mit einem neuen
+2-Spalten-Layout für bessere Übersicht und Bedienbarkeit.
+
+NEUE FEATURES
+--------------------------------------------------------------------------------
+- Sidebar-Layout: Kategorien links, Einträge rechts - beide gleichzeitig sichtbar
+- Drag & Drop Sortierung: Kategorien UND Einträge per Drag & Drop sortierbar
+- Kompakte Ansicht: Einträge zeigen nur Titel, Details per Klick aufklappbar
+- Aktive Kategorie: Farbiger linker Rand zeigt die ausgewählte Kategorie
+- Indikatoren: Icons zeigen auf einen Blick ob Link, Notizen oder Anhänge vorhanden
+- Responsive Design: Auf Mobile werden Kategorien als horizontale Chips angezeigt
+
+UI-VERBESSERUNGEN
+--------------------------------------------------------------------------------
+- Aufklappbare Einträge (▶/▼) für bessere Platznutzung
+- Drag-Handles (⋮⋮) für intuitive Sortierung
+- Hover-Aktionen (Bearbeiten, Löschen) erscheinen bei Mausbewegung
+- Sanfte Animationen für Expand/Collapse
+
+BETROFFENE DATEIEN
+--------------------------------------------------------------------------------
+- frontend/index.html: Komplette Neustrukturierung des Knowledge-Views
+ (Sidebar + Main Layout, Mobile Chips)
+- frontend/css/knowledge.css: Komplett neu geschrieben für das neue Layout
+ (Grid-System, Sidebar, kompakte Einträge, Drag & Drop Styles)
+- frontend/js/knowledge.js: Komplett überarbeitet mit neuem Rendering,
+ Drag & Drop Handlers, Expand/Collapse Logik
+- frontend/sw.js: Cache-Version auf 149 erhöht
+
+
+================================================================================
+30.12.2025 - VERBESSERUNG: Globale Suche für Wissensmanagement
+================================================================================
+
+ÄNDERUNG: SUCHFELD IN HEADER INTEGRIERT
+--------------------------------------------------------------------------------
+Die Suchfunktion für den Wissensmanagement-Tab wurde vom Tab selbst in das
+globale Suchfeld im Header verschoben. Wenn der Benutzer auf dem "Wissen"-Tab
+ist, durchsucht das Header-Suchfeld automatisch die Wissensdatenbank.
+
+DETAILS
+--------------------------------------------------------------------------------
+- Suchfeld aus dem Wissen-Tab entfernt
+- "Neue Kategorie"-Button zentral positioniert
+- Globales Suchfeld erkennt aktiven Tab und leitet Suchanfragen entsprechend weiter
+- Suchfeld wird automatisch geleert beim Wechsel zwischen Tabs
+- Konsistentes Suchverhalten über alle Bereiche (Board, Vorschläge, Wissen)
+
+BETROFFENE DATEIEN
+--------------------------------------------------------------------------------
+- frontend/js/knowledge.js: Öffentliche setSearchQuery() Methode hinzugefügt,
+ alte Suchfeld-Referenzen entfernt
+- frontend/js/app.js: setupSearch() und switchView() erweitert für
+ Knowledge-Suche Integration
+- frontend/css/knowledge.css: Suchfeld-Styles entfernt, zentrierten Header
+ hinzugefügt
+- frontend/index.html: Suchfeld aus Knowledge-Tab entfernt
+- frontend/sw.js: Cache-Version auf 148 erhöht
+
+
+================================================================================
+30.12.2025 - NEUES FEATURE: Wissensmanagement-Tab
+================================================================================
+
+FEATURE: WISSENSMANAGEMENT-TAB
+--------------------------------------------------------------------------------
+Neuer Tab "Wissen" in der Hauptnavigation für projektunabhängiges
+Wissensmanagement mit 2-Ebenen-Hierarchie.
+
+KATEGORIEN
+--------------------------------------------------------------------------------
+- Kategorien mit Namen, Beschreibung, Farbe und Icon (Emoji)
+- Kategorien-Grid mit Eintrags-Anzahl
+- Erstellen, Bearbeiten und Löschen von Kategorien
+- Farbcodierung für visuelle Unterscheidung
+
+EINTRÄGE
+--------------------------------------------------------------------------------
+- Einträge innerhalb von Kategorien
+- Jeder Eintrag kann enthalten:
+ - Titel (Pflichtfeld)
+ - Link/URL (optional, klickbar)
+ - Notizen (optional, Markdown-fähig)
+ - Dateianhänge (mehrere pro Eintrag möglich)
+- Erstellen, Bearbeiten und Löschen von Einträgen
+
+SUCHFUNKTION
+--------------------------------------------------------------------------------
+- Dedizierte Suche nur für den Wissensmanagement-Bereich
+- Durchsucht Titel, Notizen und URLs
+- Debounce für Performance-Optimierung
+- Ergebnisse zeigen Kategorie-Zugehörigkeit
+
+BETROFFENE DATEIEN
+--------------------------------------------------------------------------------
+Backend:
+- backend/database.js: 3 neue Tabellen (knowledge_categories, knowledge_entries,
+ knowledge_attachments) mit Indizes
+- backend/routes/knowledge.js: NEU - CRUD-Operationen für Kategorien, Einträge,
+ Anhänge und Suche
+- backend/server.js: Route-Registrierung hinzugefügt
+
+Frontend:
+- frontend/js/api.js: 15+ neue API-Methoden für Wissensmanagement
+- frontend/js/knowledge.js: NEU - KnowledgeManager-Klasse
+- frontend/css/knowledge.css: NEU - Styles für Kategorien, Einträge, Suche
+- frontend/index.html: Tab, View und Modals hinzugefügt
+- frontend/js/app.js: Import und Integration des KnowledgeManager
+- frontend/sw.js: Cache-Version auf 144 erhöht, neue Dateien hinzugefügt
+
+
+================================================================================
+30.12.2025 - KRITISCHER BUGFIX: Login-Problem behoben
+================================================================================
+
+BUGFIX: SOFORTIGER LOGOUT NACH ERFOLGREICHEM LOGIN
+--------------------------------------------------------------------------------
+Problem: Nach erfolgreichem Login wurde der Benutzer sofort wieder ausgeloggt.
+
+Ursache: Race-Condition zwischen Session-Refresh und Login:
+1. Beim Seitenaufruf mit altem Token startete refreshSession() einen async Request
+2. Benutzer logt sich erfolgreich ein (neuer Token wird gesetzt)
+3. Der alte Refresh-Request kehrt mit 401 zurück
+4. Der 401-Fehler löste logout() aus, obwohl neuer gültiger Token existierte
+
+Lösung:
+- Vor dem Logout wird geprüft ob der aktuelle Token noch der gleiche ist
+- Wenn ein neuer Login stattfand (Token unterschiedlich), wird 401 ignoriert
+- Prüfung in auth.js (refreshSession) und api.js (request) hinzugefügt
+
+BETROFFENE DATEIEN
+--------------------------------------------------------------------------------
+- frontend/js/auth.js: refreshSession() prüft Token vor Logout
+- frontend/js/api.js: request() prüft Token vor Logout bei 401
+- frontend/sw.js: Cache-Version auf 143 erhöht
+
+
================================================================================
30.12.2025 - Checklisten-Unteraufgaben: Drag & Drop und Bearbeiten
================================================================================
diff --git a/backend/database.js b/backend/database.js
index 58289dd..b7d1c4d 100644
--- a/backend/database.js
+++ b/backend/database.js
@@ -409,6 +409,54 @@ function createTables() {
)
`);
+ // Wissensmanagement - Kategorien
+ db.exec(`
+ CREATE TABLE IF NOT EXISTS knowledge_categories (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ name TEXT NOT NULL,
+ description TEXT,
+ color TEXT DEFAULT '#3B82F6',
+ icon TEXT,
+ position INTEGER NOT NULL DEFAULT 0,
+ created_by INTEGER,
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ FOREIGN KEY (created_by) REFERENCES users(id)
+ )
+ `);
+
+ // Wissensmanagement - Einträge
+ db.exec(`
+ CREATE TABLE IF NOT EXISTS knowledge_entries (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ category_id INTEGER NOT NULL,
+ title TEXT NOT NULL,
+ url TEXT,
+ notes TEXT,
+ position INTEGER NOT NULL DEFAULT 0,
+ created_by INTEGER,
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ FOREIGN KEY (category_id) REFERENCES knowledge_categories(id) ON DELETE CASCADE,
+ FOREIGN KEY (created_by) REFERENCES users(id)
+ )
+ `);
+
+ // Wissensmanagement - Anhänge
+ db.exec(`
+ CREATE TABLE IF NOT EXISTS knowledge_attachments (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ entry_id INTEGER NOT NULL,
+ filename TEXT NOT NULL,
+ original_name TEXT NOT NULL,
+ mime_type TEXT NOT NULL,
+ size_bytes INTEGER NOT NULL,
+ uploaded_by INTEGER,
+ uploaded_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ FOREIGN KEY (entry_id) REFERENCES knowledge_entries(id) ON DELETE CASCADE,
+ FOREIGN KEY (uploaded_by) REFERENCES users(id)
+ )
+ `);
+
// Indizes für Performance
db.exec(`
CREATE INDEX IF NOT EXISTS idx_tasks_project ON tasks(project_id);
@@ -426,6 +474,8 @@ function createTables() {
CREATE INDEX IF NOT EXISTS idx_notifications_user_read ON notifications(user_id, is_read);
CREATE INDEX IF NOT EXISTS idx_notifications_created ON notifications(created_at);
CREATE INDEX IF NOT EXISTS idx_applications_project ON applications(project_id);
+ CREATE INDEX IF NOT EXISTS idx_knowledge_entries_category ON knowledge_entries(category_id);
+ CREATE INDEX IF NOT EXISTS idx_knowledge_attachments_entry ON knowledge_attachments(entry_id);
`);
logger.info('Datenbank-Tabellen erstellt');
diff --git a/backend/middleware/auth.js b/backend/middleware/auth.js
index 94cdf33..62efcaa 100644
--- a/backend/middleware/auth.js
+++ b/backend/middleware/auth.js
@@ -45,6 +45,10 @@ function verifyToken(token) {
try {
return jwt.verify(token, JWT_SECRET);
} catch (error) {
+ // Nur bei unerwarteten Fehlern loggen (nicht bei normalen Ablauf/Ungültig-Fällen)
+ if (error.name !== 'TokenExpiredError' && error.name !== 'JsonWebTokenError') {
+ logger.error(`[AUTH] Unerwarteter Token-Fehler: ${error.name} - ${error.message}`);
+ }
return null;
}
}
diff --git a/backend/routes/knowledge.js b/backend/routes/knowledge.js
new file mode 100644
index 0000000..15c5b57
--- /dev/null
+++ b/backend/routes/knowledge.js
@@ -0,0 +1,944 @@
+/**
+ * TASKMATE - Knowledge Management Routes
+ * ======================================
+ * CRUD für Wissensmanagement: Kategorien, Einträge, Anhänge
+ */
+
+const express = require('express');
+const router = express.Router();
+const path = require('path');
+const fs = require('fs');
+const multer = require('multer');
+const { getDb } = require('../database');
+const logger = require('../utils/logger');
+const { validators, stripHtml } = require('../middleware/validation');
+
+// Upload-Konfiguration für Knowledge-Anhänge
+const UPLOAD_DIR = path.join(__dirname, '..', 'uploads', 'knowledge');
+
+// Sicherstellen, dass das Upload-Verzeichnis existiert
+if (!fs.existsSync(UPLOAD_DIR)) {
+ fs.mkdirSync(UPLOAD_DIR, { recursive: true });
+}
+
+const storage = multer.diskStorage({
+ destination: (req, file, cb) => {
+ cb(null, UPLOAD_DIR);
+ },
+ filename: (req, file, cb) => {
+ const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
+ const ext = path.extname(file.originalname);
+ cb(null, `knowledge-${uniqueSuffix}${ext}`);
+ }
+});
+
+const upload = multer({
+ storage,
+ limits: {
+ fileSize: 50 * 1024 * 1024 // 50MB max
+ }
+});
+
+// =====================
+// KATEGORIEN
+// =====================
+
+/**
+ * GET /api/knowledge/categories
+ * Alle Kategorien abrufen
+ */
+router.get('/categories', (req, res) => {
+ try {
+ const db = getDb();
+ const categories = db.prepare(`
+ SELECT kc.*,
+ (SELECT COUNT(*) FROM knowledge_entries WHERE category_id = kc.id) as entry_count,
+ u.display_name as creator_name
+ FROM knowledge_categories kc
+ LEFT JOIN users u ON kc.created_by = u.id
+ ORDER BY kc.position, kc.created_at
+ `).all();
+
+ res.json(categories.map(c => ({
+ id: c.id,
+ name: c.name,
+ description: c.description,
+ color: c.color,
+ icon: c.icon,
+ position: c.position,
+ entryCount: c.entry_count,
+ createdBy: c.created_by,
+ creatorName: c.creator_name,
+ createdAt: c.created_at
+ })));
+ } catch (error) {
+ logger.error('Fehler beim Abrufen der Knowledge-Kategorien:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+/**
+ * POST /api/knowledge/categories
+ * Neue Kategorie erstellen
+ */
+router.post('/categories', (req, res) => {
+ try {
+ const { name, description, color, icon } = req.body;
+
+ // Validierung
+ const nameError = validators.required(name, 'Name') ||
+ validators.maxLength(name, 50, 'Name');
+ if (nameError) {
+ return res.status(400).json({ error: nameError });
+ }
+
+ if (color) {
+ const colorError = validators.hexColor(color, 'Farbe');
+ if (colorError) {
+ return res.status(400).json({ error: colorError });
+ }
+ }
+
+ const db = getDb();
+
+ // Duplikat-Prüfung
+ const existing = db.prepare(
+ 'SELECT id FROM knowledge_categories WHERE LOWER(name) = LOWER(?)'
+ ).get(name);
+
+ if (existing) {
+ return res.status(400).json({ error: 'Eine Kategorie mit diesem Namen existiert bereits' });
+ }
+
+ // Position ermitteln
+ const lastPosition = db.prepare(
+ 'SELECT MAX(position) as max_pos FROM knowledge_categories'
+ ).get();
+ const position = (lastPosition.max_pos ?? -1) + 1;
+
+ // Einfügen
+ const result = db.prepare(`
+ INSERT INTO knowledge_categories (name, description, color, icon, position, created_by)
+ VALUES (?, ?, ?, ?, ?, ?)
+ `).run(
+ stripHtml(name),
+ description ? stripHtml(description) : null,
+ color || '#3B82F6',
+ icon || null,
+ position,
+ req.user.id
+ );
+
+ const category = db.prepare('SELECT * FROM knowledge_categories WHERE id = ?')
+ .get(result.lastInsertRowid);
+
+ logger.info(`Knowledge-Kategorie erstellt: ${name}`);
+
+ res.status(201).json({
+ id: category.id,
+ name: category.name,
+ description: category.description,
+ color: category.color,
+ icon: category.icon,
+ position: category.position,
+ entryCount: 0,
+ createdBy: category.created_by,
+ createdAt: category.created_at
+ });
+ } catch (error) {
+ logger.error('Fehler beim Erstellen der Knowledge-Kategorie:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+/**
+ * PUT /api/knowledge/categories/:id
+ * Kategorie aktualisieren
+ */
+router.put('/categories/:id', (req, res) => {
+ try {
+ const categoryId = req.params.id;
+ const { name, description, color, icon } = req.body;
+
+ const db = getDb();
+
+ const existing = db.prepare('SELECT * FROM knowledge_categories WHERE id = ?').get(categoryId);
+ if (!existing) {
+ return res.status(404).json({ error: 'Kategorie nicht gefunden' });
+ }
+
+ // Validierung
+ if (name) {
+ const nameError = validators.maxLength(name, 50, 'Name');
+ if (nameError) {
+ return res.status(400).json({ error: nameError });
+ }
+
+ // Duplikat-Prüfung (ausser eigene)
+ const duplicate = db.prepare(
+ 'SELECT id FROM knowledge_categories WHERE LOWER(name) = LOWER(?) AND id != ?'
+ ).get(name, categoryId);
+
+ if (duplicate) {
+ return res.status(400).json({ error: 'Eine Kategorie mit diesem Namen existiert bereits' });
+ }
+ }
+
+ if (color) {
+ const colorError = validators.hexColor(color, 'Farbe');
+ if (colorError) {
+ return res.status(400).json({ error: colorError });
+ }
+ }
+
+ db.prepare(`
+ UPDATE knowledge_categories SET
+ name = COALESCE(?, name),
+ description = COALESCE(?, description),
+ color = COALESCE(?, color),
+ icon = COALESCE(?, icon)
+ WHERE id = ?
+ `).run(
+ name ? stripHtml(name) : null,
+ description !== undefined ? (description ? stripHtml(description) : '') : null,
+ color || null,
+ icon !== undefined ? icon : null,
+ categoryId
+ );
+
+ const category = db.prepare('SELECT * FROM knowledge_categories WHERE id = ?').get(categoryId);
+
+ logger.info(`Knowledge-Kategorie aktualisiert: ${category.name}`);
+
+ res.json({
+ id: category.id,
+ name: category.name,
+ description: category.description,
+ color: category.color,
+ icon: category.icon,
+ position: category.position,
+ createdBy: category.created_by,
+ createdAt: category.created_at
+ });
+ } catch (error) {
+ logger.error('Fehler beim Aktualisieren der Knowledge-Kategorie:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+/**
+ * PUT /api/knowledge/categories/:id/position
+ * Kategorie-Position ändern
+ */
+router.put('/categories/:id/position', (req, res) => {
+ try {
+ const categoryId = req.params.id;
+ const { newPosition } = req.body;
+
+ const db = getDb();
+
+ const category = db.prepare('SELECT * FROM knowledge_categories WHERE id = ?').get(categoryId);
+ if (!category) {
+ return res.status(404).json({ error: 'Kategorie nicht gefunden' });
+ }
+
+ const oldPosition = category.position;
+
+ if (newPosition > oldPosition) {
+ db.prepare(`
+ UPDATE knowledge_categories SET position = position - 1
+ WHERE position > ? AND position <= ?
+ `).run(oldPosition, newPosition);
+ } else if (newPosition < oldPosition) {
+ db.prepare(`
+ UPDATE knowledge_categories SET position = position + 1
+ WHERE position >= ? AND position < ?
+ `).run(newPosition, oldPosition);
+ }
+
+ db.prepare('UPDATE knowledge_categories SET position = ? WHERE id = ?').run(newPosition, categoryId);
+
+ const categories = db.prepare(
+ 'SELECT * FROM knowledge_categories ORDER BY position'
+ ).all();
+
+ res.json({
+ categories: categories.map(c => ({
+ id: c.id,
+ name: c.name,
+ position: c.position
+ }))
+ });
+ } catch (error) {
+ logger.error('Fehler beim Verschieben der Knowledge-Kategorie:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+/**
+ * DELETE /api/knowledge/categories/:id
+ * Kategorie löschen (inkl. aller Einträge und Anhänge)
+ */
+router.delete('/categories/:id', (req, res) => {
+ try {
+ const categoryId = req.params.id;
+ const db = getDb();
+
+ const category = db.prepare('SELECT * FROM knowledge_categories WHERE id = ?').get(categoryId);
+ if (!category) {
+ return res.status(404).json({ error: 'Kategorie nicht gefunden' });
+ }
+
+ // Anhänge von allen Einträgen dieser Kategorie löschen
+ const entries = db.prepare('SELECT id FROM knowledge_entries WHERE category_id = ?').all(categoryId);
+ for (const entry of entries) {
+ const attachments = db.prepare('SELECT * FROM knowledge_attachments WHERE entry_id = ?').all(entry.id);
+ for (const attachment of attachments) {
+ const filePath = path.join(UPLOAD_DIR, attachment.filename);
+ if (fs.existsSync(filePath)) {
+ fs.unlinkSync(filePath);
+ }
+ }
+ }
+
+ // Kategorie löschen (CASCADE löscht Einträge und Anhänge aus DB)
+ db.prepare('DELETE FROM knowledge_categories WHERE id = ?').run(categoryId);
+
+ // Positionen neu nummerieren
+ const remaining = db.prepare(
+ 'SELECT id FROM knowledge_categories ORDER BY position'
+ ).all();
+ remaining.forEach((c, idx) => {
+ db.prepare('UPDATE knowledge_categories SET position = ? WHERE id = ?').run(idx, c.id);
+ });
+
+ logger.info(`Knowledge-Kategorie gelöscht: ${category.name}`);
+
+ res.json({ message: 'Kategorie gelöscht' });
+ } catch (error) {
+ logger.error('Fehler beim Löschen der Knowledge-Kategorie:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+// =====================
+// EINTRÄGE
+// =====================
+
+/**
+ * GET /api/knowledge/entries
+ * Einträge abrufen (optional gefiltert nach Kategorie)
+ */
+router.get('/entries', (req, res) => {
+ try {
+ const { categoryId } = req.query;
+ const db = getDb();
+
+ let query = `
+ SELECT ke.*,
+ kc.name as category_name,
+ kc.color as category_color,
+ u.display_name as creator_name,
+ (SELECT COUNT(*) FROM knowledge_attachments WHERE entry_id = ke.id) as attachment_count
+ FROM knowledge_entries ke
+ LEFT JOIN knowledge_categories kc ON ke.category_id = kc.id
+ LEFT JOIN users u ON ke.created_by = u.id
+ `;
+
+ const params = [];
+ if (categoryId) {
+ query += ' WHERE ke.category_id = ?';
+ params.push(categoryId);
+ }
+
+ query += ' ORDER BY ke.position, ke.created_at DESC';
+
+ const entries = db.prepare(query).all(...params);
+
+ res.json(entries.map(e => ({
+ id: e.id,
+ categoryId: e.category_id,
+ categoryName: e.category_name,
+ categoryColor: e.category_color,
+ title: e.title,
+ url: e.url,
+ notes: e.notes,
+ position: e.position,
+ attachmentCount: e.attachment_count,
+ createdBy: e.created_by,
+ creatorName: e.creator_name,
+ createdAt: e.created_at,
+ updatedAt: e.updated_at
+ })));
+ } catch (error) {
+ logger.error('Fehler beim Abrufen der Knowledge-Einträge:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+/**
+ * GET /api/knowledge/entries/:id
+ * Einzelnen Eintrag abrufen (mit Anhängen)
+ */
+router.get('/entries/:id', (req, res) => {
+ try {
+ const entryId = req.params.id;
+ const db = getDb();
+
+ const entry = db.prepare(`
+ SELECT ke.*,
+ kc.name as category_name,
+ kc.color as category_color,
+ u.display_name as creator_name
+ FROM knowledge_entries ke
+ LEFT JOIN knowledge_categories kc ON ke.category_id = kc.id
+ LEFT JOIN users u ON ke.created_by = u.id
+ WHERE ke.id = ?
+ `).get(entryId);
+
+ if (!entry) {
+ return res.status(404).json({ error: 'Eintrag nicht gefunden' });
+ }
+
+ const attachments = db.prepare(`
+ SELECT ka.*, u.display_name as uploader_name
+ FROM knowledge_attachments ka
+ LEFT JOIN users u ON ka.uploaded_by = u.id
+ WHERE ka.entry_id = ?
+ ORDER BY ka.uploaded_at DESC
+ `).all(entryId);
+
+ res.json({
+ id: entry.id,
+ categoryId: entry.category_id,
+ categoryName: entry.category_name,
+ categoryColor: entry.category_color,
+ title: entry.title,
+ url: entry.url,
+ notes: entry.notes,
+ position: entry.position,
+ createdBy: entry.created_by,
+ creatorName: entry.creator_name,
+ createdAt: entry.created_at,
+ updatedAt: entry.updated_at,
+ attachments: attachments.map(a => ({
+ id: a.id,
+ filename: a.filename,
+ originalName: a.original_name,
+ mimeType: a.mime_type,
+ sizeBytes: a.size_bytes,
+ uploadedBy: a.uploaded_by,
+ uploaderName: a.uploader_name,
+ uploadedAt: a.uploaded_at
+ }))
+ });
+ } catch (error) {
+ logger.error('Fehler beim Abrufen des Knowledge-Eintrags:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+/**
+ * POST /api/knowledge/entries
+ * Neuen Eintrag erstellen
+ */
+router.post('/entries', (req, res) => {
+ try {
+ const { categoryId, title, url, notes } = req.body;
+
+ // Validierung
+ const categoryError = validators.required(categoryId, 'Kategorie');
+ if (categoryError) {
+ return res.status(400).json({ error: categoryError });
+ }
+
+ const titleError = validators.required(title, 'Titel') ||
+ validators.maxLength(title, 200, 'Titel');
+ if (titleError) {
+ return res.status(400).json({ error: titleError });
+ }
+
+ if (url) {
+ const urlError = validators.url(url, 'URL');
+ if (urlError) {
+ return res.status(400).json({ error: urlError });
+ }
+ }
+
+ const db = getDb();
+
+ // Kategorie prüfen
+ const category = db.prepare('SELECT * FROM knowledge_categories WHERE id = ?').get(categoryId);
+ if (!category) {
+ return res.status(404).json({ error: 'Kategorie nicht gefunden' });
+ }
+
+ // Position ermitteln
+ const lastPosition = db.prepare(
+ 'SELECT MAX(position) as max_pos FROM knowledge_entries WHERE category_id = ?'
+ ).get(categoryId);
+ const position = (lastPosition.max_pos ?? -1) + 1;
+
+ // Einfügen
+ const result = db.prepare(`
+ INSERT INTO knowledge_entries (category_id, title, url, notes, position, created_by)
+ VALUES (?, ?, ?, ?, ?, ?)
+ `).run(
+ categoryId,
+ stripHtml(title),
+ url || null,
+ notes || null,
+ position,
+ req.user.id
+ );
+
+ const entry = db.prepare('SELECT * FROM knowledge_entries WHERE id = ?')
+ .get(result.lastInsertRowid);
+
+ logger.info(`Knowledge-Eintrag erstellt: ${title}`);
+
+ res.status(201).json({
+ id: entry.id,
+ categoryId: entry.category_id,
+ title: entry.title,
+ url: entry.url,
+ notes: entry.notes,
+ position: entry.position,
+ attachmentCount: 0,
+ createdBy: entry.created_by,
+ createdAt: entry.created_at,
+ updatedAt: entry.updated_at
+ });
+ } catch (error) {
+ logger.error('Fehler beim Erstellen des Knowledge-Eintrags:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+/**
+ * PUT /api/knowledge/entries/:id
+ * Eintrag aktualisieren
+ */
+router.put('/entries/:id', (req, res) => {
+ try {
+ const entryId = req.params.id;
+ const { categoryId, title, url, notes } = req.body;
+
+ const db = getDb();
+
+ const existing = db.prepare('SELECT * FROM knowledge_entries WHERE id = ?').get(entryId);
+ if (!existing) {
+ return res.status(404).json({ error: 'Eintrag nicht gefunden' });
+ }
+
+ // Validierung
+ if (title) {
+ const titleError = validators.maxLength(title, 200, 'Titel');
+ if (titleError) {
+ return res.status(400).json({ error: titleError });
+ }
+ }
+
+ if (url) {
+ const urlError = validators.url(url, 'URL');
+ if (urlError) {
+ return res.status(400).json({ error: urlError });
+ }
+ }
+
+ if (categoryId) {
+ const category = db.prepare('SELECT * FROM knowledge_categories WHERE id = ?').get(categoryId);
+ if (!category) {
+ return res.status(404).json({ error: 'Kategorie nicht gefunden' });
+ }
+ }
+
+ db.prepare(`
+ UPDATE knowledge_entries SET
+ category_id = COALESCE(?, category_id),
+ title = COALESCE(?, title),
+ url = ?,
+ notes = ?,
+ updated_at = CURRENT_TIMESTAMP
+ WHERE id = ?
+ `).run(
+ categoryId || null,
+ title ? stripHtml(title) : null,
+ url !== undefined ? url : existing.url,
+ notes !== undefined ? notes : existing.notes,
+ entryId
+ );
+
+ const entry = db.prepare(`
+ SELECT ke.*, kc.name as category_name, kc.color as category_color
+ FROM knowledge_entries ke
+ LEFT JOIN knowledge_categories kc ON ke.category_id = kc.id
+ WHERE ke.id = ?
+ `).get(entryId);
+
+ logger.info(`Knowledge-Eintrag aktualisiert: ${entry.title}`);
+
+ res.json({
+ id: entry.id,
+ categoryId: entry.category_id,
+ categoryName: entry.category_name,
+ categoryColor: entry.category_color,
+ title: entry.title,
+ url: entry.url,
+ notes: entry.notes,
+ position: entry.position,
+ createdBy: entry.created_by,
+ createdAt: entry.created_at,
+ updatedAt: entry.updated_at
+ });
+ } catch (error) {
+ logger.error('Fehler beim Aktualisieren des Knowledge-Eintrags:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+/**
+ * PUT /api/knowledge/entries/:id/position
+ * Eintrag-Position ändern (oder in andere Kategorie verschieben)
+ */
+router.put('/entries/:id/position', (req, res) => {
+ try {
+ const entryId = req.params.id;
+ const { newPosition, newCategoryId } = req.body;
+
+ const db = getDb();
+
+ const entry = db.prepare('SELECT * FROM knowledge_entries WHERE id = ?').get(entryId);
+ if (!entry) {
+ return res.status(404).json({ error: 'Eintrag nicht gefunden' });
+ }
+
+ const oldPosition = entry.position;
+ const oldCategoryId = entry.category_id;
+ const targetCategoryId = newCategoryId || oldCategoryId;
+
+ // Wenn Kategorie wechselt
+ if (targetCategoryId !== oldCategoryId) {
+ // Alte Kategorie: Positionen nach dem entfernten Eintrag reduzieren
+ db.prepare(`
+ UPDATE knowledge_entries SET position = position - 1
+ WHERE category_id = ? AND position > ?
+ `).run(oldCategoryId, oldPosition);
+
+ // Neue Kategorie: Platz für neuen Eintrag schaffen
+ db.prepare(`
+ UPDATE knowledge_entries SET position = position + 1
+ WHERE category_id = ? AND position >= ?
+ `).run(targetCategoryId, newPosition);
+
+ // Eintrag verschieben
+ db.prepare(`
+ UPDATE knowledge_entries SET category_id = ?, position = ?
+ WHERE id = ?
+ `).run(targetCategoryId, newPosition, entryId);
+ } else {
+ // Innerhalb der gleichen Kategorie
+ if (newPosition > oldPosition) {
+ db.prepare(`
+ UPDATE knowledge_entries SET position = position - 1
+ WHERE category_id = ? AND position > ? AND position <= ?
+ `).run(oldCategoryId, oldPosition, newPosition);
+ } else if (newPosition < oldPosition) {
+ db.prepare(`
+ UPDATE knowledge_entries SET position = position + 1
+ WHERE category_id = ? AND position >= ? AND position < ?
+ `).run(oldCategoryId, newPosition, oldPosition);
+ }
+
+ db.prepare('UPDATE knowledge_entries SET position = ? WHERE id = ?').run(newPosition, entryId);
+ }
+
+ res.json({ message: 'Position aktualisiert' });
+ } catch (error) {
+ logger.error('Fehler beim Verschieben des Knowledge-Eintrags:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+/**
+ * DELETE /api/knowledge/entries/:id
+ * Eintrag löschen
+ */
+router.delete('/entries/:id', (req, res) => {
+ try {
+ const entryId = req.params.id;
+ const db = getDb();
+
+ const entry = db.prepare('SELECT * FROM knowledge_entries WHERE id = ?').get(entryId);
+ if (!entry) {
+ return res.status(404).json({ error: 'Eintrag nicht gefunden' });
+ }
+
+ // Anhänge vom Dateisystem löschen
+ const attachments = db.prepare('SELECT * FROM knowledge_attachments WHERE entry_id = ?').all(entryId);
+ for (const attachment of attachments) {
+ const filePath = path.join(UPLOAD_DIR, attachment.filename);
+ if (fs.existsSync(filePath)) {
+ fs.unlinkSync(filePath);
+ }
+ }
+
+ const categoryId = entry.category_id;
+
+ // Eintrag löschen
+ db.prepare('DELETE FROM knowledge_entries WHERE id = ?').run(entryId);
+
+ // Positionen neu nummerieren
+ const remaining = db.prepare(
+ 'SELECT id FROM knowledge_entries WHERE category_id = ? ORDER BY position'
+ ).all(categoryId);
+ remaining.forEach((e, idx) => {
+ db.prepare('UPDATE knowledge_entries SET position = ? WHERE id = ?').run(idx, e.id);
+ });
+
+ logger.info(`Knowledge-Eintrag gelöscht: ${entry.title}`);
+
+ res.json({ message: 'Eintrag gelöscht' });
+ } catch (error) {
+ logger.error('Fehler beim Löschen des Knowledge-Eintrags:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+// =====================
+// ANHÄNGE
+// =====================
+
+/**
+ * GET /api/knowledge/attachments/:entryId
+ * Anhänge eines Eintrags abrufen
+ */
+router.get('/attachments/:entryId', (req, res) => {
+ try {
+ const entryId = req.params.entryId;
+ const db = getDb();
+
+ const entry = db.prepare('SELECT * FROM knowledge_entries WHERE id = ?').get(entryId);
+ if (!entry) {
+ return res.status(404).json({ error: 'Eintrag nicht gefunden' });
+ }
+
+ const attachments = db.prepare(`
+ SELECT ka.*, u.display_name as uploader_name
+ FROM knowledge_attachments ka
+ LEFT JOIN users u ON ka.uploaded_by = u.id
+ WHERE ka.entry_id = ?
+ ORDER BY ka.uploaded_at DESC
+ `).all(entryId);
+
+ res.json(attachments.map(a => ({
+ id: a.id,
+ entryId: a.entry_id,
+ filename: a.filename,
+ originalName: a.original_name,
+ mimeType: a.mime_type,
+ sizeBytes: a.size_bytes,
+ uploadedBy: a.uploaded_by,
+ uploaderName: a.uploader_name,
+ uploadedAt: a.uploaded_at
+ })));
+ } catch (error) {
+ logger.error('Fehler beim Abrufen der Knowledge-Anhänge:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+/**
+ * POST /api/knowledge/attachments/:entryId
+ * Anhang hochladen
+ */
+router.post('/attachments/:entryId', upload.single('file'), (req, res) => {
+ try {
+ const entryId = req.params.entryId;
+ const db = getDb();
+
+ const entry = db.prepare('SELECT * FROM knowledge_entries WHERE id = ?').get(entryId);
+ if (!entry) {
+ // Hochgeladene Datei löschen
+ if (req.file) {
+ fs.unlinkSync(req.file.path);
+ }
+ return res.status(404).json({ error: 'Eintrag nicht gefunden' });
+ }
+
+ if (!req.file) {
+ return res.status(400).json({ error: 'Keine Datei hochgeladen' });
+ }
+
+ const result = db.prepare(`
+ INSERT INTO knowledge_attachments (entry_id, filename, original_name, mime_type, size_bytes, uploaded_by)
+ VALUES (?, ?, ?, ?, ?, ?)
+ `).run(
+ entryId,
+ req.file.filename,
+ req.file.originalname,
+ req.file.mimetype,
+ req.file.size,
+ req.user.id
+ );
+
+ // Eintrag updated_at aktualisieren
+ db.prepare('UPDATE knowledge_entries SET updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(entryId);
+
+ const attachment = db.prepare('SELECT * FROM knowledge_attachments WHERE id = ?')
+ .get(result.lastInsertRowid);
+
+ logger.info(`Knowledge-Anhang hochgeladen: ${req.file.originalname} für Eintrag ${entry.title}`);
+
+ res.status(201).json({
+ id: attachment.id,
+ entryId: attachment.entry_id,
+ filename: attachment.filename,
+ originalName: attachment.original_name,
+ mimeType: attachment.mime_type,
+ sizeBytes: attachment.size_bytes,
+ uploadedBy: attachment.uploaded_by,
+ uploadedAt: attachment.uploaded_at
+ });
+ } catch (error) {
+ logger.error('Fehler beim Hochladen des Knowledge-Anhangs:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+/**
+ * GET /api/knowledge/attachments/download/:id
+ * Anhang herunterladen
+ */
+router.get('/attachments/download/:id', (req, res) => {
+ try {
+ const attachmentId = req.params.id;
+ const db = getDb();
+
+ const attachment = db.prepare('SELECT * FROM knowledge_attachments WHERE id = ?').get(attachmentId);
+ if (!attachment) {
+ return res.status(404).json({ error: 'Anhang nicht gefunden' });
+ }
+
+ const filePath = path.join(UPLOAD_DIR, attachment.filename);
+ if (!fs.existsSync(filePath)) {
+ return res.status(404).json({ error: 'Datei nicht gefunden' });
+ }
+
+ res.download(filePath, attachment.original_name);
+ } catch (error) {
+ logger.error('Fehler beim Herunterladen des Knowledge-Anhangs:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+/**
+ * DELETE /api/knowledge/attachments/:id
+ * Anhang löschen
+ */
+router.delete('/attachments/:id', (req, res) => {
+ try {
+ const attachmentId = req.params.id;
+ const db = getDb();
+
+ const attachment = db.prepare('SELECT * FROM knowledge_attachments WHERE id = ?').get(attachmentId);
+ if (!attachment) {
+ return res.status(404).json({ error: 'Anhang nicht gefunden' });
+ }
+
+ // Datei vom Dateisystem löschen
+ const filePath = path.join(UPLOAD_DIR, attachment.filename);
+ if (fs.existsSync(filePath)) {
+ fs.unlinkSync(filePath);
+ }
+
+ // Aus Datenbank löschen
+ db.prepare('DELETE FROM knowledge_attachments WHERE id = ?').run(attachmentId);
+
+ // Eintrag updated_at aktualisieren
+ db.prepare('UPDATE knowledge_entries SET updated_at = CURRENT_TIMESTAMP WHERE id = ?')
+ .run(attachment.entry_id);
+
+ logger.info(`Knowledge-Anhang gelöscht: ${attachment.original_name}`);
+
+ res.json({ message: 'Anhang gelöscht' });
+ } catch (error) {
+ logger.error('Fehler beim Löschen des Knowledge-Anhangs:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+// =====================
+// SUCHE
+// =====================
+
+/**
+ * GET /api/knowledge/search
+ * Wissensmanagement durchsuchen
+ */
+router.get('/search', (req, res) => {
+ try {
+ const { q } = req.query;
+
+ if (!q || q.trim().length < 2) {
+ return res.json({ categories: [], entries: [] });
+ }
+
+ const searchTerm = `%${q.toLowerCase()}%`;
+ const db = getDb();
+
+ // Kategorien durchsuchen
+ const categories = db.prepare(`
+ SELECT kc.*,
+ (SELECT COUNT(*) FROM knowledge_entries WHERE category_id = kc.id) as entry_count
+ FROM knowledge_categories kc
+ WHERE LOWER(kc.name) LIKE ? OR LOWER(kc.description) LIKE ?
+ ORDER BY kc.position
+ `).all(searchTerm, searchTerm);
+
+ // Einträge durchsuchen
+ const entries = db.prepare(`
+ SELECT ke.*,
+ kc.name as category_name,
+ kc.color as category_color,
+ (SELECT COUNT(*) FROM knowledge_attachments WHERE entry_id = ke.id) as attachment_count
+ FROM knowledge_entries ke
+ LEFT JOIN knowledge_categories kc ON ke.category_id = kc.id
+ WHERE LOWER(ke.title) LIKE ? OR LOWER(ke.notes) LIKE ? OR LOWER(ke.url) LIKE ?
+ ORDER BY
+ CASE
+ WHEN LOWER(ke.title) LIKE ? THEN 1
+ ELSE 2
+ END,
+ ke.created_at DESC
+ LIMIT 50
+ `).all(searchTerm, searchTerm, searchTerm, searchTerm);
+
+ res.json({
+ categories: categories.map(c => ({
+ id: c.id,
+ name: c.name,
+ description: c.description,
+ color: c.color,
+ icon: c.icon,
+ entryCount: c.entry_count
+ })),
+ entries: entries.map(e => ({
+ id: e.id,
+ categoryId: e.category_id,
+ categoryName: e.category_name,
+ categoryColor: e.category_color,
+ title: e.title,
+ url: e.url,
+ notes: e.notes,
+ attachmentCount: e.attachment_count,
+ createdAt: e.created_at
+ }))
+ });
+ } catch (error) {
+ logger.error('Fehler bei der Knowledge-Suche:', { error: error.message });
+ res.status(500).json({ error: 'Interner Serverfehler' });
+ }
+});
+
+module.exports = router;
diff --git a/backend/routes/subtasks.js b/backend/routes/subtasks.js
index aa4540d..020bcd1 100644
--- a/backend/routes/subtasks.js
+++ b/backend/routes/subtasks.js
@@ -57,16 +57,16 @@ router.post('/', (req, res) => {
return res.status(404).json({ error: 'Aufgabe nicht gefunden' });
}
- // Höchste Position ermitteln
- const maxPos = db.prepare(
- 'SELECT COALESCE(MAX(position), -1) as max FROM subtasks WHERE task_id = ?'
- ).get(taskId).max;
+ // Alle bestehenden Subtasks um eine Position nach unten verschieben
+ db.prepare(`
+ UPDATE subtasks SET position = position + 1 WHERE task_id = ?
+ `).run(taskId);
- // Subtask erstellen
+ // Neue Subtask an Position 0 erstellen (immer an erster Stelle)
const result = db.prepare(`
INSERT INTO subtasks (task_id, title, position)
- VALUES (?, ?, ?)
- `).run(taskId, title, maxPos + 1);
+ VALUES (?, ?, 0)
+ `).run(taskId, title);
// Task updated_at aktualisieren
db.prepare('UPDATE tasks SET updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(taskId);
diff --git a/backend/server.js b/backend/server.js
index 9240bb2..11e77fb 100644
--- a/backend/server.js
+++ b/backend/server.js
@@ -41,6 +41,7 @@ const notificationService = require('./services/notificationService');
const gitRoutes = require('./routes/git');
const applicationsRoutes = require('./routes/applications');
const giteaRoutes = require('./routes/gitea');
+const knowledgeRoutes = require('./routes/knowledge');
// Express App erstellen
const app = express();
@@ -144,6 +145,9 @@ app.use('/api/applications', authenticateToken, csrfProtection, applicationsRout
// Gitea-Routes (Gitea API Integration)
app.use('/api/gitea', authenticateToken, csrfProtection, giteaRoutes);
+// Knowledge-Routes (Wissensmanagement)
+app.use('/api/knowledge', authenticateToken, csrfProtection, knowledgeRoutes);
+
// =============================================================================
// SOCKET.IO
// =============================================================================
diff --git a/backups/backup_2025-12-28T20-59-42-468Z.db b/backups/backup_2025-12-28T20-59-42-468Z.db
deleted file mode 100644
index ecad564..0000000
Binary files a/backups/backup_2025-12-28T20-59-42-468Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-28T20-59-42-468Z.db-wal b/backups/backup_2025-12-28T20-59-42-468Z.db-wal
deleted file mode 100644
index cdd777f..0000000
Binary files a/backups/backup_2025-12-28T20-59-42-468Z.db-wal and /dev/null differ
diff --git a/backups/backup_2025-12-28T21-11-36-076Z.db b/backups/backup_2025-12-28T21-11-36-076Z.db
deleted file mode 100644
index ecad564..0000000
Binary files a/backups/backup_2025-12-28T21-11-36-076Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-28T21-11-36-076Z.db-wal b/backups/backup_2025-12-28T21-11-36-076Z.db-wal
deleted file mode 100644
index 65b1853..0000000
Binary files a/backups/backup_2025-12-28T21-11-36-076Z.db-wal and /dev/null differ
diff --git a/backups/backup_2025-12-28T21-13-56-595Z.db b/backups/backup_2025-12-28T21-13-56-595Z.db
deleted file mode 100644
index ecad564..0000000
Binary files a/backups/backup_2025-12-28T21-13-56-595Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-28T21-13-56-595Z.db-wal b/backups/backup_2025-12-28T21-13-56-595Z.db-wal
deleted file mode 100644
index 65b1853..0000000
Binary files a/backups/backup_2025-12-28T21-13-56-595Z.db-wal and /dev/null differ
diff --git a/backups/backup_2025-12-28T21-20-30-328Z.db b/backups/backup_2025-12-28T21-20-30-328Z.db
deleted file mode 100644
index ecad564..0000000
Binary files a/backups/backup_2025-12-28T21-20-30-328Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-28T21-20-30-328Z.db-wal b/backups/backup_2025-12-28T21-20-30-328Z.db-wal
deleted file mode 100644
index 65b1853..0000000
Binary files a/backups/backup_2025-12-28T21-20-30-328Z.db-wal and /dev/null differ
diff --git a/backups/backup_2025-12-28T21-37-16-598Z.db b/backups/backup_2025-12-28T21-37-16-598Z.db
deleted file mode 100644
index ecad564..0000000
Binary files a/backups/backup_2025-12-28T21-37-16-598Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-28T21-37-16-598Z.db-wal b/backups/backup_2025-12-28T21-37-16-598Z.db-wal
deleted file mode 100644
index 65b1853..0000000
Binary files a/backups/backup_2025-12-28T21-37-16-598Z.db-wal and /dev/null differ
diff --git a/backups/backup_2025-12-28T21-51-26-664Z.db b/backups/backup_2025-12-28T21-51-26-664Z.db
deleted file mode 100644
index 7bef75d..0000000
Binary files a/backups/backup_2025-12-28T21-51-26-664Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-28T21-51-26-664Z.db-wal b/backups/backup_2025-12-28T21-51-26-664Z.db-wal
deleted file mode 100644
index e69de29..0000000
diff --git a/backups/backup_2025-12-29T18-03-28-634Z.db b/backups/backup_2025-12-29T18-03-28-634Z.db
deleted file mode 100644
index b8c4b1f..0000000
Binary files a/backups/backup_2025-12-29T18-03-28-634Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-29T18-03-28-634Z.db-wal b/backups/backup_2025-12-29T18-03-28-634Z.db-wal
deleted file mode 100644
index e69de29..0000000
diff --git a/backups/backup_2025-12-29T18-30-58-187Z.db b/backups/backup_2025-12-29T18-30-58-187Z.db
deleted file mode 100644
index 7dd48cc..0000000
Binary files a/backups/backup_2025-12-29T18-30-58-187Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-29T18-30-58-187Z.db-wal b/backups/backup_2025-12-29T18-30-58-187Z.db-wal
deleted file mode 100644
index e69de29..0000000
diff --git a/backups/backup_2025-12-29T18-36-12-724Z.db b/backups/backup_2025-12-29T18-36-12-724Z.db
deleted file mode 100644
index 08ea730..0000000
Binary files a/backups/backup_2025-12-29T18-36-12-724Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-29T18-36-12-724Z.db-wal b/backups/backup_2025-12-29T18-36-12-724Z.db-wal
deleted file mode 100644
index e69de29..0000000
diff --git a/backups/backup_2025-12-29T18-46-49-826Z.db b/backups/backup_2025-12-29T18-46-49-826Z.db
deleted file mode 100644
index 08ea730..0000000
Binary files a/backups/backup_2025-12-29T18-46-49-826Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-29T18-46-49-826Z.db-wal b/backups/backup_2025-12-29T18-46-49-826Z.db-wal
deleted file mode 100644
index e69de29..0000000
diff --git a/backups/backup_2025-12-29T19-01-37-753Z.db b/backups/backup_2025-12-29T19-01-37-753Z.db
deleted file mode 100644
index 08ea730..0000000
Binary files a/backups/backup_2025-12-29T19-01-37-753Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-29T19-01-37-753Z.db-wal b/backups/backup_2025-12-29T19-01-37-753Z.db-wal
deleted file mode 100644
index 52406ee..0000000
Binary files a/backups/backup_2025-12-29T19-01-37-753Z.db-wal and /dev/null differ
diff --git a/backups/backup_2025-12-29T19-15-04-246Z.db b/backups/backup_2025-12-29T19-15-04-246Z.db
deleted file mode 100644
index dfdeb0e..0000000
Binary files a/backups/backup_2025-12-29T19-15-04-246Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-29T19-15-04-246Z.db-wal b/backups/backup_2025-12-29T19-15-04-246Z.db-wal
deleted file mode 100644
index e69de29..0000000
diff --git a/backups/backup_2025-12-29T19-30-20-564Z.db b/backups/backup_2025-12-29T19-30-20-564Z.db
deleted file mode 100644
index dfdeb0e..0000000
Binary files a/backups/backup_2025-12-29T19-30-20-564Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-29T19-30-20-564Z.db-wal b/backups/backup_2025-12-29T19-30-20-564Z.db-wal
deleted file mode 100644
index 4f0f992..0000000
Binary files a/backups/backup_2025-12-29T19-30-20-564Z.db-wal and /dev/null differ
diff --git a/backups/backup_2025-12-29T19-59-53-354Z.db b/backups/backup_2025-12-29T19-59-53-354Z.db
deleted file mode 100644
index dfdeb0e..0000000
Binary files a/backups/backup_2025-12-29T19-59-53-354Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-29T19-59-53-354Z.db-wal b/backups/backup_2025-12-29T19-59-53-354Z.db-wal
deleted file mode 100644
index c81d695..0000000
Binary files a/backups/backup_2025-12-29T19-59-53-354Z.db-wal and /dev/null differ
diff --git a/backups/backup_2025-12-29T20-11-37-153Z.db b/backups/backup_2025-12-29T20-11-37-153Z.db
deleted file mode 100644
index 37ebbb6..0000000
Binary files a/backups/backup_2025-12-29T20-11-37-153Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-29T20-11-37-153Z.db-wal b/backups/backup_2025-12-29T20-11-37-153Z.db-wal
deleted file mode 100644
index c33befa..0000000
Binary files a/backups/backup_2025-12-29T20-11-37-153Z.db-wal and /dev/null differ
diff --git a/backups/backup_2025-12-29T20-14-06-429Z.db b/backups/backup_2025-12-29T20-14-06-429Z.db
deleted file mode 100644
index 2f7292d..0000000
Binary files a/backups/backup_2025-12-29T20-14-06-429Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-29T20-14-06-429Z.db-wal b/backups/backup_2025-12-29T20-14-06-429Z.db-wal
deleted file mode 100644
index 6d67d05..0000000
Binary files a/backups/backup_2025-12-29T20-14-06-429Z.db-wal and /dev/null differ
diff --git a/data/taskmate.db b/data/taskmate.db
index 2cfcc23..9a05d3e 100644
Binary files a/data/taskmate.db and b/data/taskmate.db differ
diff --git a/data/taskmate.db-shm b/data/taskmate.db-shm
index b0c032b..7cc860a 100644
Binary files a/data/taskmate.db-shm and b/data/taskmate.db-shm differ
diff --git a/data/taskmate.db-wal b/data/taskmate.db-wal
index c2c28f3..185ffd4 100644
Binary files a/data/taskmate.db-wal and b/data/taskmate.db-wal differ
diff --git a/frontend/css/knowledge.css b/frontend/css/knowledge.css
new file mode 100644
index 0000000..b6e8a2e
--- /dev/null
+++ b/frontend/css/knowledge.css
@@ -0,0 +1,853 @@
+/**
+ * TASKMATE - Knowledge Management Styles
+ * ======================================
+ * Sidebar + Main Layout mit Drag & Drop
+ */
+
+/* ============================================
+ VIEW CONTAINER
+ ============================================ */
+
+.view-knowledge {
+ padding: var(--spacing-md);
+ height: calc(100vh - 120px);
+ display: flex;
+ flex-direction: column;
+}
+
+/* ============================================
+ MAIN LAYOUT (Sidebar + Main)
+ ============================================ */
+
+.knowledge-layout {
+ display: grid;
+ grid-template-columns: 280px 1fr;
+ gap: var(--spacing-lg);
+ flex: 1;
+ min-height: 0;
+ overflow: hidden;
+}
+
+/* ============================================
+ SIDEBAR (Kategorien)
+ ============================================ */
+
+.knowledge-sidebar {
+ background: var(--bg-secondary);
+ border: 1px solid var(--border-color);
+ border-radius: var(--radius-lg);
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+}
+
+.knowledge-sidebar-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: var(--spacing-md);
+ border-bottom: 1px solid var(--border-color);
+ flex-shrink: 0;
+}
+
+.knowledge-sidebar-title {
+ font-size: 1rem;
+ font-weight: 600;
+ color: var(--text-primary);
+ margin: 0;
+}
+
+.knowledge-category-list {
+ flex: 1;
+ overflow-y: auto;
+ padding: var(--spacing-xs) 0;
+}
+
+.knowledge-sidebar-empty {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: var(--spacing-xl);
+ color: var(--text-muted);
+ text-align: center;
+}
+
+.knowledge-sidebar-empty svg {
+ opacity: 0.4;
+ margin-bottom: var(--spacing-sm);
+}
+
+.knowledge-sidebar-empty p {
+ margin: 0;
+ font-size: 0.9rem;
+}
+
+/* ============================================
+ KATEGORIE-ITEMS (Sidebar)
+ ============================================ */
+
+.knowledge-category-item {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-sm);
+ padding: var(--spacing-sm) var(--spacing-md);
+ cursor: pointer;
+ border-left: 3px solid transparent;
+ transition: all 0.15s ease;
+ user-select: none;
+}
+
+.knowledge-category-item:hover {
+ background: var(--bg-hover);
+}
+
+.knowledge-category-item.active {
+ border-left-color: var(--category-color, var(--primary));
+ background: var(--bg-hover);
+}
+
+.knowledge-category-item.dragging {
+ opacity: 0.5;
+ background: var(--primary-light);
+}
+
+.knowledge-category-item.drag-over {
+ border-top: 2px solid var(--primary);
+}
+
+.knowledge-category-icon {
+ font-size: 1.2rem;
+ flex-shrink: 0;
+ width: 28px;
+ text-align: center;
+}
+
+.knowledge-category-info {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+}
+
+.knowledge-category-name {
+ font-size: 0.9rem;
+ font-weight: 500;
+ color: var(--text-primary);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.knowledge-category-count {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.knowledge-category-actions {
+ display: flex;
+ gap: 2px;
+ opacity: 0;
+ transition: opacity 0.15s;
+}
+
+.knowledge-category-item:hover .knowledge-category-actions {
+ opacity: 1;
+}
+
+.knowledge-category-actions .btn-icon {
+ width: 24px;
+ height: 24px;
+ padding: 0;
+ background: transparent;
+ border: none;
+ border-radius: var(--radius-sm);
+ cursor: pointer;
+ color: var(--text-muted);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: all 0.15s;
+}
+
+.knowledge-category-actions .btn-icon:hover {
+ background: var(--bg-secondary);
+ color: var(--text-primary);
+}
+
+.knowledge-category-actions .btn-icon.btn-danger-hover:hover {
+ background: var(--danger-bg);
+ color: var(--danger);
+}
+
+.knowledge-drag-handle {
+ cursor: grab;
+ opacity: 0;
+ color: var(--text-muted);
+ font-size: 1rem;
+ padding: 0 var(--spacing-xs);
+ transition: opacity 0.15s;
+}
+
+.knowledge-category-item:hover .knowledge-drag-handle {
+ opacity: 0.5;
+}
+
+.knowledge-drag-handle:hover {
+ opacity: 1 !important;
+}
+
+.knowledge-drag-handle:active {
+ cursor: grabbing;
+}
+
+/* ============================================
+ HAUPTBEREICH (Einträge)
+ ============================================ */
+
+.knowledge-main {
+ display: flex;
+ flex-direction: column;
+ min-height: 0;
+ overflow: hidden;
+}
+
+.knowledge-main-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding-bottom: var(--spacing-md);
+ border-bottom: 1px solid var(--border-color);
+ margin-bottom: var(--spacing-md);
+ flex-shrink: 0;
+}
+
+.knowledge-main-title {
+ font-size: 1.25rem;
+ font-weight: 600;
+ color: var(--text-primary);
+ margin: 0;
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-sm);
+}
+
+.knowledge-main-title .category-icon {
+ font-size: 1.3rem;
+}
+
+/* ============================================
+ EINTRÄGE-LISTE
+ ============================================ */
+
+.knowledge-entry-list {
+ flex: 1;
+ overflow-y: auto;
+ display: flex;
+ flex-direction: column;
+ gap: var(--spacing-xs);
+}
+
+/* ============================================
+ EINTRAG-ITEMS (Kompakt + Expand)
+ ============================================ */
+
+.knowledge-entry-item {
+ background: var(--bg-primary);
+ border: 1px solid var(--border-color);
+ border-radius: var(--radius-md);
+ transition: all 0.15s ease;
+ user-select: none;
+}
+
+.knowledge-entry-item:hover {
+ border-color: var(--primary);
+ box-shadow: var(--shadow-sm);
+}
+
+.knowledge-entry-item.dragging {
+ opacity: 0.5;
+ box-shadow: var(--shadow-lg);
+}
+
+.knowledge-entry-item.drag-over {
+ border-top: 2px solid var(--primary);
+ margin-top: -2px;
+}
+
+/* Header (immer sichtbar) */
+.knowledge-entry-header {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-sm);
+ padding: var(--spacing-sm) var(--spacing-md);
+ cursor: pointer;
+}
+
+.knowledge-entry-expand {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 20px;
+ height: 20px;
+ flex-shrink: 0;
+ color: var(--text-muted);
+ transition: transform 0.2s ease;
+}
+
+.knowledge-entry-item.expanded .knowledge-entry-expand {
+ transform: rotate(90deg);
+}
+
+.knowledge-entry-title {
+ flex: 1;
+ font-size: 0.95rem;
+ font-weight: 500;
+ color: var(--text-primary);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.knowledge-entry-indicators {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-xs);
+ color: var(--text-muted);
+ font-size: 0.8rem;
+}
+
+.knowledge-entry-indicator {
+ display: flex;
+ align-items: center;
+ gap: 2px;
+}
+
+.knowledge-entry-actions {
+ display: flex;
+ gap: 2px;
+ opacity: 0;
+ transition: opacity 0.15s;
+}
+
+.knowledge-entry-item:hover .knowledge-entry-actions {
+ opacity: 1;
+}
+
+.knowledge-entry-actions .btn-icon {
+ width: 28px;
+ height: 28px;
+ padding: 0;
+ background: var(--bg-secondary);
+ border: 1px solid var(--border-color);
+ border-radius: var(--radius-sm);
+ cursor: pointer;
+ color: var(--text-secondary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: all 0.15s;
+}
+
+.knowledge-entry-actions .btn-icon:hover {
+ background: var(--bg-hover);
+ color: var(--text-primary);
+}
+
+.knowledge-entry-actions .btn-icon.btn-danger-hover:hover {
+ background: var(--danger-bg);
+ color: var(--danger);
+ border-color: var(--danger);
+}
+
+.knowledge-entry-drag-handle {
+ cursor: grab;
+ opacity: 0;
+ color: var(--text-muted);
+ padding: 0 var(--spacing-xs);
+ transition: opacity 0.15s;
+}
+
+.knowledge-entry-item:hover .knowledge-entry-drag-handle {
+ opacity: 0.5;
+}
+
+.knowledge-entry-drag-handle:hover {
+ opacity: 1 !important;
+}
+
+.knowledge-entry-drag-handle:active {
+ cursor: grabbing;
+}
+
+/* Details (aufklappbar) */
+.knowledge-entry-details {
+ display: none;
+ padding: var(--spacing-md);
+ padding-top: 0;
+ border-top: 1px solid var(--border-light);
+ margin-top: var(--spacing-xs);
+ animation: fadeIn 0.15s ease;
+}
+
+.knowledge-entry-item.expanded .knowledge-entry-details {
+ display: block;
+}
+
+.knowledge-entry-url {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-xs);
+ font-size: 0.9rem;
+ color: var(--primary);
+ text-decoration: none;
+ margin-bottom: var(--spacing-sm);
+ word-break: break-all;
+}
+
+.knowledge-entry-url:hover {
+ text-decoration: underline;
+}
+
+.knowledge-entry-url svg {
+ flex-shrink: 0;
+ color: var(--text-muted);
+}
+
+.knowledge-entry-notes {
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ line-height: 1.5;
+ margin-bottom: var(--spacing-sm);
+ white-space: pre-wrap;
+}
+
+.knowledge-entry-attachments-info {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-xs);
+ font-size: 0.85rem;
+ color: var(--text-muted);
+}
+
+/* ============================================
+ EMPTY STATES
+ ============================================ */
+
+.knowledge-empty {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: var(--spacing-xxl) var(--spacing-lg);
+ text-align: center;
+ color: var(--text-muted);
+ flex: 1;
+}
+
+.knowledge-empty svg {
+ margin-bottom: var(--spacing-md);
+ opacity: 0.4;
+}
+
+.knowledge-empty h3 {
+ font-size: 1.1rem;
+ font-weight: 600;
+ color: var(--text-secondary);
+ margin: 0 0 var(--spacing-xs) 0;
+}
+
+.knowledge-empty p {
+ font-size: 0.95rem;
+ margin: 0;
+}
+
+/* ============================================
+ SUCHERGEBNISSE
+ ============================================ */
+
+.knowledge-search-results {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+}
+
+.knowledge-search-header {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-md);
+ padding-bottom: var(--spacing-md);
+ border-bottom: 1px solid var(--border-color);
+ margin-bottom: var(--spacing-md);
+}
+
+.knowledge-search-info {
+ font-size: 0.95rem;
+ color: var(--text-secondary);
+}
+
+.knowledge-search-info span {
+ font-weight: 500;
+ color: var(--text-primary);
+}
+
+/* Kategorie-Badge in Suchergebnissen */
+.knowledge-entry-category-badge {
+ font-size: 0.7rem;
+ padding: 2px 8px;
+ border-radius: var(--radius-full);
+ background: var(--category-color, var(--primary));
+ color: white;
+ font-weight: 500;
+}
+
+/* ============================================
+ MOBILE KATEGORIEN (Chips)
+ ============================================ */
+
+.knowledge-mobile-categories {
+ display: none;
+ gap: var(--spacing-sm);
+ padding: var(--spacing-sm) 0;
+ overflow-x: auto;
+ flex-shrink: 0;
+ -webkit-overflow-scrolling: touch;
+ scrollbar-width: none;
+}
+
+.knowledge-mobile-categories::-webkit-scrollbar {
+ display: none;
+}
+
+.knowledge-mobile-chip {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-xs);
+ padding: var(--spacing-xs) var(--spacing-md);
+ background: var(--bg-secondary);
+ border: 1px solid var(--border-color);
+ border-radius: var(--radius-full);
+ cursor: pointer;
+ white-space: nowrap;
+ font-size: 0.85rem;
+ color: var(--text-secondary);
+ transition: all 0.15s;
+ flex-shrink: 0;
+}
+
+.knowledge-mobile-chip:hover {
+ background: var(--bg-hover);
+ border-color: var(--primary);
+}
+
+.knowledge-mobile-chip.active {
+ background: var(--primary);
+ border-color: var(--primary);
+ color: white;
+}
+
+.knowledge-mobile-chip .chip-icon {
+ font-size: 1rem;
+}
+
+.knowledge-mobile-chip .chip-count {
+ font-size: 0.75rem;
+ opacity: 0.8;
+}
+
+.knowledge-mobile-add {
+ background: var(--primary);
+ border-color: var(--primary);
+ color: white;
+}
+
+/* ============================================
+ ATTACHMENTS (Modal)
+ ============================================ */
+
+.knowledge-attachments-container {
+ display: flex;
+ flex-direction: column;
+ gap: var(--spacing-xs);
+ margin-bottom: var(--spacing-sm);
+}
+
+.knowledge-attachment-item {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-sm);
+ padding: var(--spacing-xs) var(--spacing-sm);
+ background: var(--bg-secondary);
+ border: 1px solid var(--border-color);
+ border-radius: var(--radius-sm);
+}
+
+.knowledge-attachment-item svg {
+ flex-shrink: 0;
+ color: var(--text-muted);
+}
+
+.knowledge-attachment-info {
+ flex: 1;
+ min-width: 0;
+}
+
+.knowledge-attachment-name {
+ font-size: 0.9rem;
+ color: var(--text-primary);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.knowledge-attachment-size {
+ font-size: 0.8rem;
+ color: var(--text-muted);
+}
+
+.knowledge-attachment-actions {
+ display: flex;
+ gap: var(--spacing-xs);
+}
+
+.knowledge-attachment-actions .btn-icon {
+ width: 24px;
+ height: 24px;
+ padding: 0;
+ background: transparent;
+ border: none;
+ cursor: pointer;
+ color: var(--text-muted);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: var(--radius-sm);
+ transition: all 0.15s;
+}
+
+.knowledge-attachment-actions .btn-icon:hover {
+ background: var(--bg-hover);
+ color: var(--text-primary);
+}
+
+.knowledge-attachment-actions .btn-icon.btn-danger-hover:hover {
+ background: var(--danger-bg);
+ color: var(--danger);
+}
+
+/* ============================================
+ DRAG & DROP INDICATOR
+ ============================================ */
+
+.knowledge-drop-indicator {
+ height: 2px;
+ background: var(--primary);
+ border-radius: 1px;
+ margin: var(--spacing-xs) 0;
+}
+
+/* ============================================
+ ANIMATIONS
+ ============================================ */
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+/* ============================================
+ RESPONSIVE
+ ============================================ */
+
+@media (max-width: 900px) {
+ .knowledge-layout {
+ grid-template-columns: 220px 1fr;
+ }
+}
+
+@media (max-width: 768px) {
+ .view-knowledge {
+ padding: var(--spacing-sm);
+ }
+
+ .knowledge-layout {
+ grid-template-columns: 1fr;
+ }
+
+ .knowledge-sidebar {
+ display: none;
+ }
+
+ .knowledge-mobile-categories {
+ display: flex;
+ }
+
+ .knowledge-main-header {
+ flex-wrap: wrap;
+ gap: var(--spacing-sm);
+ }
+
+ .knowledge-main-title {
+ font-size: 1.1rem;
+ }
+
+ /* Aktionen immer sichtbar auf Mobile */
+ .knowledge-entry-actions,
+ .knowledge-category-actions {
+ opacity: 1;
+ }
+
+ .knowledge-entry-drag-handle,
+ .knowledge-drag-handle {
+ opacity: 0.5;
+ }
+}
+
+@media (max-width: 480px) {
+ .knowledge-entry-header {
+ padding: var(--spacing-xs) var(--spacing-sm);
+ }
+
+ .knowledge-entry-details {
+ padding: var(--spacing-sm);
+ }
+
+ .knowledge-main-header {
+ padding-bottom: var(--spacing-sm);
+ margin-bottom: var(--spacing-sm);
+ }
+}
+
+/* ==========================================
+ ICON PICKER STYLES
+ ========================================== */
+
+.icon-picker-container {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-sm);
+}
+
+.icon-picker-preview {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-sm);
+ padding: var(--spacing-sm) var(--spacing-md);
+ background: var(--bg-secondary);
+ border: 2px solid var(--border-color);
+ border-radius: var(--radius-md);
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.icon-picker-preview:hover {
+ border-color: var(--primary);
+ background: var(--bg-hover);
+}
+
+.icon-preview-emoji {
+ font-size: 1.75rem;
+ line-height: 1;
+}
+
+.icon-preview-label {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+}
+
+.icon-picker-section {
+ margin-top: var(--spacing-md);
+ padding-top: var(--spacing-md);
+ border-top: 1px solid var(--border-color);
+}
+
+.icon-picker-tabs {
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--spacing-xs);
+ margin-bottom: var(--spacing-md);
+}
+
+.icon-tab {
+ padding: var(--spacing-xs) var(--spacing-sm);
+ background: var(--bg-secondary);
+ border: 1px solid var(--border-color);
+ border-radius: var(--radius-sm);
+ font-size: 0.8rem;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ white-space: nowrap;
+}
+
+.icon-tab:hover {
+ background: var(--bg-hover);
+ border-color: var(--primary);
+}
+
+.icon-tab.active {
+ background: var(--primary);
+ color: white;
+ border-color: var(--primary);
+}
+
+.icon-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(40px, 1fr));
+ gap: var(--spacing-xs);
+ max-height: 200px;
+ overflow-y: auto;
+ padding: var(--spacing-xs);
+ background: var(--bg-tertiary);
+ border-radius: var(--radius-md);
+}
+
+.icon-btn {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 40px;
+ height: 40px;
+ background: var(--bg-primary);
+ border: 1px solid transparent;
+ border-radius: var(--radius-sm);
+ font-size: 1.25rem;
+ cursor: pointer;
+ transition: all 0.15s ease;
+}
+
+.icon-btn:hover {
+ background: var(--bg-hover);
+ border-color: var(--primary);
+ transform: scale(1.1);
+}
+
+.icon-btn.selected {
+ background: var(--primary-light);
+ border-color: var(--primary);
+ box-shadow: 0 0 0 2px var(--primary-light);
+}
+
+/* Scrollbar für Icon Grid */
+.icon-grid::-webkit-scrollbar {
+ width: 6px;
+}
+
+.icon-grid::-webkit-scrollbar-track {
+ background: var(--bg-tertiary);
+ border-radius: 3px;
+}
+
+.icon-grid::-webkit-scrollbar-thumb {
+ background: var(--border-color);
+ border-radius: 3px;
+}
+
+.icon-grid::-webkit-scrollbar-thumb:hover {
+ background: var(--text-secondary);
+}
diff --git a/frontend/index.html b/frontend/index.html
index 0d08213..794209b 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -25,6 +25,7 @@
+
@@ -235,6 +236,7 @@
+
@@ -886,6 +888,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Kategorie wählen
+
+
+
+
+
+
+
+
+
+
+
+
Kategorie auswählen
+
Wählen Sie links eine Kategorie aus, um Einträge anzuzeigen.
+
+
+
+
+
+
Keine Einträge
+
Erstellen Sie den ersten Eintrag in dieser Kategorie.
+
+
+
+
+
+
+
+
+
+
+
Keine Ergebnisse
+
Keine Einträge gefunden.
+
+
+
+
+
+
+
+
@@ -1479,6 +1575,339 @@
+
+
+
+
+
+
diff --git a/frontend/js/api.js b/frontend/js/api.js
index 9ed2449..6488d66 100644
--- a/frontend/js/api.js
+++ b/frontend/js/api.js
@@ -14,19 +14,23 @@ class ApiClient {
// Token Management
setToken(token) {
+ console.log('[API] setToken:', token ? token.substring(0, 20) + '...' : 'NULL');
this.token = token;
if (token) {
localStorage.setItem('auth_token', token);
} else {
+ this.token = null;
localStorage.removeItem('auth_token');
+ localStorage.removeItem('current_user');
}
}
getToken() {
- if (!this.token) {
- this.token = localStorage.getItem('auth_token');
- }
- return this.token;
+ // IMMER aus localStorage lesen um Synchronisationsprobleme zu vermeiden
+ // (z.B. wenn Token nach Login gesetzt wird während andere Requests laufen)
+ const token = localStorage.getItem('auth_token');
+ this.token = token; // Cache aktualisieren
+ return token;
}
setCsrfToken(token) {
@@ -39,10 +43,10 @@ class ApiClient {
}
getCsrfToken() {
- if (!this.csrfToken) {
- this.csrfToken = sessionStorage.getItem('csrf_token');
- }
- return this.csrfToken;
+ // IMMER aus sessionStorage lesen um Synchronisationsprobleme zu vermeiden
+ const token = sessionStorage.getItem('csrf_token');
+ this.csrfToken = token; // Cache aktualisieren
+ return token;
}
// Base Request Method
@@ -56,6 +60,7 @@ class ApiClient {
// Add auth token
const token = this.getToken();
+ console.log('[API] Request:', endpoint, 'Token:', token ? token.substring(0, 20) + '...' : 'NULL');
if (token) {
headers['Authorization'] = `Bearer ${token}`;
}
@@ -98,8 +103,22 @@ class ApiClient {
// Handle 401 Unauthorized
if (response.status === 401) {
- this.setToken(null);
- window.dispatchEvent(new CustomEvent('auth:logout'));
+ // Token der für diesen Request verwendet wurde
+ const requestToken = token;
+ const currentToken = localStorage.getItem('auth_token');
+
+ console.log('[API] 401 received for:', endpoint);
+ console.log('[API] Request token:', requestToken ? requestToken.substring(0, 20) + '...' : 'NULL');
+ console.log('[API] Current token:', currentToken ? currentToken.substring(0, 20) + '...' : 'NULL');
+
+ // Nur ausloggen wenn der Token der gleiche ist (kein neuer Login in der Zwischenzeit)
+ if (!currentToken || currentToken === requestToken) {
+ console.log('[API] Token invalid, triggering logout');
+ this.setToken(null);
+ window.dispatchEvent(new CustomEvent('auth:logout'));
+ } else {
+ console.log('[API] 401 ignored - new login occurred while request was in flight');
+ }
throw new ApiError('Sitzung abgelaufen', 401);
}
@@ -274,7 +293,9 @@ class ApiClient {
// =====================
async login(username, password) {
+ console.log('[API] login() called');
const response = await this.post('/auth/login', { username, password });
+ console.log('[API] login() response:', response ? 'OK' : 'NULL', 'token:', response?.token ? 'EXISTS' : 'MISSING');
this.setToken(response.token);
// Store CSRF token from login response
if (response.csrfToken) {
@@ -977,6 +998,79 @@ class ApiClient {
xhr.send(formData);
});
}
+
+ // =====================
+ // KNOWLEDGE ENDPOINTS (Wissensmanagement)
+ // =====================
+
+ // Kategorien
+ async getKnowledgeCategories() {
+ return this.get('/knowledge/categories');
+ }
+
+ async createKnowledgeCategory(data) {
+ return this.post('/knowledge/categories', data);
+ }
+
+ async updateKnowledgeCategory(id, data) {
+ return this.put(`/knowledge/categories/${id}`, data);
+ }
+
+ async deleteKnowledgeCategory(id) {
+ return this.delete(`/knowledge/categories/${id}`);
+ }
+
+ async updateKnowledgeCategoryPosition(id, newPosition) {
+ return this.put(`/knowledge/categories/${id}/position`, { newPosition });
+ }
+
+ // Einträge
+ async getKnowledgeEntries(categoryId = null) {
+ const params = categoryId ? `?categoryId=${categoryId}` : '';
+ return this.get(`/knowledge/entries${params}`);
+ }
+
+ async getKnowledgeEntry(id) {
+ return this.get(`/knowledge/entries/${id}`);
+ }
+
+ async createKnowledgeEntry(data) {
+ return this.post('/knowledge/entries', data);
+ }
+
+ async updateKnowledgeEntry(id, data) {
+ return this.put(`/knowledge/entries/${id}`, data);
+ }
+
+ async deleteKnowledgeEntry(id) {
+ return this.delete(`/knowledge/entries/${id}`);
+ }
+
+ async updateKnowledgeEntryPosition(id, newPosition, newCategoryId = null) {
+ return this.put(`/knowledge/entries/${id}/position`, { newPosition, newCategoryId });
+ }
+
+ // Anhänge
+ async getKnowledgeAttachments(entryId) {
+ return this.get(`/knowledge/attachments/${entryId}`);
+ }
+
+ async uploadKnowledgeAttachment(entryId, file, onProgress) {
+ return this.uploadFile(`/knowledge/attachments/${entryId}`, file, onProgress);
+ }
+
+ async deleteKnowledgeAttachment(id) {
+ return this.delete(`/knowledge/attachments/${id}`);
+ }
+
+ getKnowledgeAttachmentDownloadUrl(id) {
+ return `${this.baseUrl}/knowledge/attachments/download/${id}`;
+ }
+
+ // Suche
+ async searchKnowledge(query) {
+ return this.get(`/knowledge/search?q=${encodeURIComponent(query)}`);
+ }
}
// Custom API Error Class
diff --git a/frontend/js/app.js b/frontend/js/app.js
index f70ecfa..8057768 100644
--- a/frontend/js/app.js
+++ b/frontend/js/app.js
@@ -20,6 +20,7 @@ import adminManager from './admin.js';
import proposalsManager from './proposals.js';
import notificationManager from './notifications.js';
import giteaManager from './gitea.js';
+import knowledgeManager from './knowledge.js';
import { $, $$, debounce, getFromStorage, setToStorage } from './utils.js';
class App {
@@ -79,6 +80,9 @@ class App {
// Initialize gitea manager
await giteaManager.init();
+ // Initialize knowledge manager
+ await knowledgeManager.init();
+
// Update UI
this.updateUserMenu();
}
@@ -596,6 +600,18 @@ class App {
v.classList.toggle('hidden', !isActive);
});
+ // Clear search field when switching views
+ const searchInput = $('#search-input');
+ if (searchInput && searchInput.value) {
+ searchInput.value = '';
+ store.setFilter('search', '');
+ store.setState({ searchResultIds: [] }, 'CLEAR_SEARCH_RESULTS');
+ proposalsManager.setSearchQuery('');
+ knowledgeManager.setSearchQuery('');
+ $('#search-clear')?.classList.add('hidden');
+ $('.search-container')?.classList.remove('has-search');
+ }
+
// Load proposals when switching to proposals view - reset to active (non-archived)
if (view === 'proposals') {
proposalsManager.resetToActiveView();
@@ -607,6 +623,13 @@ class App {
} else {
giteaManager.hide();
}
+
+ // Show/hide knowledge manager
+ if (view === 'knowledge') {
+ knowledgeManager.show();
+ } else {
+ knowledgeManager.hide();
+ }
}
// =====================
@@ -823,8 +846,9 @@ class App {
updateSearchUI('');
searchInput.focus();
- // Clear proposals search as well
+ // Clear view-specific search
proposalsManager.setSearchQuery('');
+ knowledgeManager.setSearchQuery('');
// Cancel any pending server search
if (searchAbortController) {
@@ -897,6 +921,9 @@ class App {
if (currentView === 'proposals') {
// Search proposals only
proposalsManager.setSearchQuery(value);
+ } else if (currentView === 'knowledge') {
+ // Search knowledge base
+ knowledgeManager.setSearchQuery(value);
} else {
// Immediate client-side filtering for tasks
store.setFilter('search', value);
diff --git a/frontend/js/auth.js b/frontend/js/auth.js
index 238d216..5bf92f3 100644
--- a/frontend/js/auth.js
+++ b/frontend/js/auth.js
@@ -19,11 +19,14 @@ class AuthManager {
// Initialize authentication state
async init() {
const token = api.getToken();
+ console.log('[Auth] init() - Token exists:', !!token);
if (token) {
try {
// Verify token by making a request
+ console.log('[Auth] Verifying token...');
const users = await api.getUsers();
+ console.log('[Auth] Token valid, users loaded');
this.isAuthenticated = true;
// Get current user from stored data
@@ -35,11 +38,13 @@ class AuthManager {
return true;
} catch (error) {
// Token invalid
+ console.log('[Auth] Token invalid, logging out');
this.logout();
return false;
}
}
+ console.log('[Auth] No token found');
return false;
}
@@ -471,8 +476,18 @@ class SessionTimerHandler {
}
}
} else if (response.status === 401) {
- // Token ungültig - ausloggen
- this.auth.logout();
+ // Token ungültig - aber nur ausloggen wenn kein neuer Login stattfand
+ // (Race-Condition: Alter Refresh-Request kann 401 zurückgeben nachdem
+ // ein neuer Login erfolgreich war)
+ const currentToken = localStorage.getItem('auth_token');
+ if (currentToken === token) {
+ // Gleicher Token, wirklich ungültig, ausloggen
+ console.log('[Auth] Refresh returned 401, logging out');
+ this.auth.logout();
+ } else {
+ // Token hat sich geändert (neuer Login oder bereits ausgeloggt)
+ console.log('[Auth] Refresh 401 ignored - token changed (new login occurred)');
+ }
}
} catch (error) {
console.error('Session refresh error:', error);
diff --git a/frontend/js/knowledge.js b/frontend/js/knowledge.js
new file mode 100644
index 0000000..f5a06c8
--- /dev/null
+++ b/frontend/js/knowledge.js
@@ -0,0 +1,1189 @@
+/**
+ * TASKMATE - Knowledge Manager
+ * ============================
+ * Wissensmanagement mit Sidebar-Layout, Drag & Drop und kompakten Einträgen
+ */
+
+import api from './api.js';
+import { $, $$ } from './utils.js';
+import store from './store.js';
+
+class KnowledgeManager {
+ constructor() {
+ this.categories = [];
+ this.entries = [];
+ this.selectedCategory = null;
+ this.searchQuery = '';
+ this.searchResults = [];
+ this.expandedEntries = new Set();
+ this.initialized = false;
+ this.searchDebounceTimer = null;
+
+ // Drag & Drop State
+ this.draggedCategoryId = null;
+ this.draggedEntryId = null;
+ }
+
+ async init() {
+ console.log('[Knowledge] init() called, initialized:', this.initialized);
+
+ if (this.initialized) {
+ await this.loadCategories();
+ return;
+ }
+
+ // DOM Elements - Layout
+ this.knowledgeView = $('#view-knowledge');
+ this.mobileCategories = $('#knowledge-mobile-categories');
+
+ // DOM Elements - Sidebar
+ this.categoriesList = $('#knowledge-categories');
+ this.categoriesEmpty = $('#knowledge-categories-empty');
+
+ // DOM Elements - Main
+ this.mainTitle = $('#knowledge-category-title');
+ this.entriesList = $('#knowledge-entries');
+ this.entriesEmpty = $('#knowledge-entries-empty');
+ this.noSelection = $('#knowledge-no-selection');
+
+ // DOM Elements - Search
+ this.searchResultsSection = $('#knowledge-search-results');
+ this.searchResultsList = $('#knowledge-search-list');
+ this.searchResultsEmpty = $('#knowledge-search-empty');
+ this.searchQuerySpan = $('#knowledge-search-query');
+
+ // Buttons
+ this.newCategoryBtn = $('#btn-new-category');
+ this.newEntryBtn = $('#btn-new-entry');
+ this.clearSearchBtn = $('#btn-clear-search');
+
+ // Category Modal Elements
+ this.categoryModal = $('#knowledge-category-modal');
+ this.categoryForm = $('#knowledge-category-form');
+ this.categoryModalTitle = $('#knowledge-category-modal-title');
+ this.categoryIdInput = $('#knowledge-category-id');
+ this.categoryNameInput = $('#knowledge-category-name');
+ this.categoryDescriptionInput = $('#knowledge-category-description');
+ this.categoryColorInput = $('#knowledge-category-color');
+ this.categoryIconInput = $('#knowledge-category-icon');
+
+ // Icon Picker Elements
+ this.iconPickerPreview = $('#icon-picker-preview');
+ this.iconPreviewEmoji = $('#icon-preview-emoji');
+ this.iconPickerSection = $('#icon-picker-section');
+
+ // Entry Modal Elements
+ this.entryModal = $('#knowledge-entry-modal');
+ this.entryForm = $('#knowledge-entry-form');
+ this.entryModalTitle = $('#knowledge-entry-modal-title');
+ this.entryIdInput = $('#knowledge-entry-id');
+ this.entryCategoryIdInput = $('#knowledge-entry-category-id');
+ this.entryTitleInput = $('#knowledge-entry-title');
+ this.entryUrlInput = $('#knowledge-entry-url');
+ this.entryNotesInput = $('#knowledge-entry-notes');
+ this.attachmentsSection = $('#knowledge-attachments-section');
+ this.attachmentsContainer = $('#knowledge-attachments-container');
+ this.fileUploadArea = $('#knowledge-file-upload-area');
+ this.fileInput = $('#knowledge-file-input');
+ this.deleteEntryBtn = $('#btn-delete-entry');
+
+ this.bindEvents();
+ this.initialized = true;
+ console.log('[Knowledge] Initialization complete');
+
+ await this.loadCategories();
+ }
+
+ bindEvents() {
+ console.log('[Knowledge] bindEvents() called');
+
+ // New Category Button
+ this.newCategoryBtn?.addEventListener('click', () => {
+ this.openCategoryModal();
+ });
+
+ // New Entry Button
+ this.newEntryBtn?.addEventListener('click', () => {
+ this.openEntryModal();
+ });
+
+ // Clear search
+ this.clearSearchBtn?.addEventListener('click', () => {
+ this.clearSearch();
+ });
+
+ // Category Form Submit
+ this.categoryForm?.addEventListener('submit', (e) => this.handleCategorySubmit(e));
+
+ // Entry Form Submit
+ this.entryForm?.addEventListener('submit', (e) => this.handleEntrySubmit(e));
+
+ // Delete Entry Button
+ this.deleteEntryBtn?.addEventListener('click', () => {
+ const entryId = parseInt(this.entryIdInput?.value);
+ if (entryId) {
+ this.handleDeleteEntry(entryId);
+ }
+ });
+
+ // Modal close buttons
+ this.categoryModal?.querySelectorAll('[data-close-modal]').forEach(btn => {
+ btn.addEventListener('click', () => this.closeCategoryModal());
+ });
+
+ this.entryModal?.querySelectorAll('[data-close-modal]').forEach(btn => {
+ btn.addEventListener('click', () => this.closeEntryModal());
+ });
+
+ // Icon Picker Events
+ this.bindIconPickerEvents();
+
+ // File Upload
+ this.fileInput?.addEventListener('change', (e) => this.handleFileSelect(e));
+
+ // Drag & Drop for file upload
+ if (this.fileUploadArea) {
+ this.fileUploadArea.addEventListener('dragover', (e) => {
+ e.preventDefault();
+ this.fileUploadArea.classList.add('drag-over');
+ });
+
+ this.fileUploadArea.addEventListener('dragleave', () => {
+ this.fileUploadArea.classList.remove('drag-over');
+ });
+
+ this.fileUploadArea.addEventListener('drop', (e) => {
+ e.preventDefault();
+ this.fileUploadArea.classList.remove('drag-over');
+ const files = e.dataTransfer.files;
+ if (files.length > 0) {
+ this.uploadFiles(files);
+ }
+ });
+ }
+
+ // Drag & Drop for categories
+ this.bindCategoryDragEvents();
+
+ // Drag & Drop for entries
+ this.bindEntryDragEvents();
+ }
+
+ // ==========================================
+ // DATA LOADING
+ // ==========================================
+
+ async loadCategories() {
+ try {
+ this.categories = await api.getKnowledgeCategories();
+ // Sort by position
+ this.categories.sort((a, b) => (a.position || 0) - (b.position || 0));
+ this.renderCategories();
+ this.renderMobileCategories();
+
+ // Update UI state
+ this.updateMainState();
+ } catch (error) {
+ console.error('Error loading categories:', error);
+ this.showToast('Fehler beim Laden der Kategorien', 'error');
+ }
+ }
+
+ async loadEntries(categoryId) {
+ try {
+ this.entries = await api.getKnowledgeEntries(categoryId);
+ // Sort by position
+ this.entries.sort((a, b) => (a.position || 0) - (b.position || 0));
+ this.renderEntries();
+ } catch (error) {
+ console.error('Error loading entries:', error);
+ this.showToast('Fehler beim Laden der Einträge', 'error');
+ }
+ }
+
+ async loadEntryWithAttachments(entryId) {
+ try {
+ return await api.getKnowledgeEntry(entryId);
+ } catch (error) {
+ console.error('Error loading entry:', error);
+ this.showToast('Fehler beim Laden des Eintrags', 'error');
+ return null;
+ }
+ }
+
+ // ==========================================
+ // RENDERING - CATEGORIES (Sidebar)
+ // ==========================================
+
+ renderCategories() {
+ if (!this.categoriesList) return;
+
+ if (this.categories.length === 0) {
+ this.categoriesList.innerHTML = '';
+ this.categoriesEmpty?.classList.remove('hidden');
+ return;
+ }
+
+ this.categoriesEmpty?.classList.add('hidden');
+
+ this.categoriesList.innerHTML = this.categories.map(cat => `
+
+
${cat.icon || '📁'}
+
+ ${this.escapeHtml(cat.name)}
+ ${cat.entryCount || 0} Einträge
+
+
+
⋮⋮
+
+ `).join('');
+
+ this.bindCategoryClickEvents();
+ }
+
+ renderMobileCategories() {
+ if (!this.mobileCategories) return;
+
+ const chips = this.categories.map(cat => `
+
+ ${cat.icon || '📁'}
+ ${this.escapeHtml(cat.name)}
+ (${cat.entryCount || 0})
+
+ `).join('');
+
+ const addChip = `
+
+ + Neu
+
+ `;
+
+ this.mobileCategories.innerHTML = chips + addChip;
+ this.bindMobileChipEvents();
+ }
+
+ // ==========================================
+ // RENDERING - ENTRIES (Main)
+ // ==========================================
+
+ renderEntries() {
+ if (!this.entriesList) return;
+
+ // Hide no-selection message
+ this.noSelection?.classList.add('hidden');
+
+ if (this.entries.length === 0) {
+ this.entriesList.innerHTML = '';
+ this.entriesEmpty?.classList.remove('hidden');
+ return;
+ }
+
+ this.entriesEmpty?.classList.add('hidden');
+
+ this.entriesList.innerHTML = this.entries.map(entry => this.renderEntryItem(entry)).join('');
+ this.bindEntryClickEvents();
+ }
+
+ renderEntryItem(entry, showCategory = false) {
+ const isExpanded = this.expandedEntries.has(entry.id);
+ const hasUrl = entry.url && entry.url.trim();
+ const hasNotes = entry.notes && entry.notes.trim();
+ const hasAttachments = entry.attachmentCount > 0;
+
+ return `
+
+
+
+ ${hasUrl ? `
+
+
+ ${this.escapeHtml(entry.url)}
+
+ ` : ''}
+ ${hasNotes ? `
+
${this.escapeHtml(entry.notes)}
+ ` : ''}
+ ${hasAttachments ? `
+
+
+ ${entry.attachmentCount} Anhang${entry.attachmentCount > 1 ? 'e' : ''}
+
+ ` : ''}
+
+
+ `;
+ }
+
+ renderSearchResults() {
+ if (!this.searchResultsList) return;
+
+ if (this.searchResults.length === 0) {
+ this.searchResultsList.innerHTML = '';
+ this.searchResultsEmpty?.classList.remove('hidden');
+ return;
+ }
+
+ this.searchResultsEmpty?.classList.add('hidden');
+
+ this.searchResultsList.innerHTML = this.searchResults.map(entry =>
+ this.renderEntryItem(entry, true)
+ ).join('');
+
+ this.bindSearchResultEvents();
+ }
+
+ renderAttachments(attachments) {
+ if (!this.attachmentsContainer) return;
+
+ if (!attachments || attachments.length === 0) {
+ this.attachmentsContainer.innerHTML = 'Keine Anhänge vorhanden
';
+ return;
+ }
+
+ this.attachmentsContainer.innerHTML = attachments.map(att => `
+
+
+
+ ${this.escapeHtml(att.original_name)}
+ ${this.formatFileSize(att.size_bytes)}
+
+
+
+ `).join('');
+
+ this.bindAttachmentEvents();
+ }
+
+ updateMainState() {
+ if (!this.selectedCategory) {
+ this.mainTitle.textContent = 'Kategorie wählen';
+ this.newEntryBtn.disabled = true;
+ this.entriesList.innerHTML = '';
+ this.entriesEmpty?.classList.add('hidden');
+ this.noSelection?.classList.remove('hidden');
+ } else {
+ const icon = this.selectedCategory.icon || '📁';
+ this.mainTitle.innerHTML = `${icon} ${this.escapeHtml(this.selectedCategory.name)}`;
+ this.newEntryBtn.disabled = false;
+ this.noSelection?.classList.add('hidden');
+ }
+ }
+
+ // ==========================================
+ // EVENT BINDING - CATEGORIES
+ // ==========================================
+
+ bindCategoryClickEvents() {
+ this.categoriesList?.querySelectorAll('.knowledge-category-item').forEach(item => {
+ const categoryId = parseInt(item.dataset.categoryId);
+
+ // Click on category (not on actions) - select category
+ item.addEventListener('click', (e) => {
+ if (!e.target.closest('.knowledge-category-actions') && !e.target.closest('.knowledge-drag-handle')) {
+ this.selectCategory(categoryId);
+ }
+ });
+
+ // Edit button
+ const editBtn = item.querySelector('[data-action="edit"]');
+ editBtn?.addEventListener('click', (e) => {
+ e.stopPropagation();
+ this.openCategoryModal(categoryId);
+ });
+
+ // Delete button
+ const deleteBtn = item.querySelector('[data-action="delete"]');
+ deleteBtn?.addEventListener('click', (e) => {
+ e.stopPropagation();
+ this.handleDeleteCategory(categoryId);
+ });
+ });
+ }
+
+ bindMobileChipEvents() {
+ this.mobileCategories?.querySelectorAll('.knowledge-mobile-chip').forEach(chip => {
+ if (chip.dataset.action === 'add-category') {
+ chip.addEventListener('click', () => this.openCategoryModal());
+ } else {
+ const categoryId = parseInt(chip.dataset.categoryId);
+ chip.addEventListener('click', () => this.selectCategory(categoryId));
+ }
+ });
+ }
+
+ bindCategoryDragEvents() {
+ if (!this.categoriesList) return;
+
+ this.categoriesList.addEventListener('dragstart', (e) => {
+ const item = e.target.closest('.knowledge-category-item');
+ if (!item) return;
+
+ this.draggedCategoryId = parseInt(item.dataset.categoryId);
+ item.classList.add('dragging');
+ e.dataTransfer.effectAllowed = 'move';
+ e.dataTransfer.setData('text/plain', this.draggedCategoryId);
+ });
+
+ this.categoriesList.addEventListener('dragend', (e) => {
+ const item = e.target.closest('.knowledge-category-item');
+ if (item) {
+ item.classList.remove('dragging');
+ }
+ this.draggedCategoryId = null;
+ this.categoriesList.querySelectorAll('.drag-over').forEach(el => el.classList.remove('drag-over'));
+ });
+
+ this.categoriesList.addEventListener('dragover', (e) => {
+ e.preventDefault();
+ const item = e.target.closest('.knowledge-category-item');
+ if (item && parseInt(item.dataset.categoryId) !== this.draggedCategoryId) {
+ this.categoriesList.querySelectorAll('.drag-over').forEach(el => el.classList.remove('drag-over'));
+ item.classList.add('drag-over');
+ }
+ });
+
+ this.categoriesList.addEventListener('dragleave', (e) => {
+ const item = e.target.closest('.knowledge-category-item');
+ if (item) {
+ item.classList.remove('drag-over');
+ }
+ });
+
+ this.categoriesList.addEventListener('drop', async (e) => {
+ e.preventDefault();
+ const targetItem = e.target.closest('.knowledge-category-item');
+ if (!targetItem || !this.draggedCategoryId) return;
+
+ const targetId = parseInt(targetItem.dataset.categoryId);
+ if (targetId === this.draggedCategoryId) return;
+
+ targetItem.classList.remove('drag-over');
+
+ // Calculate new position
+ const targetIndex = this.categories.findIndex(c => c.id === targetId);
+ const draggedIndex = this.categories.findIndex(c => c.id === this.draggedCategoryId);
+
+ if (targetIndex === -1 || draggedIndex === -1) return;
+
+ // Optimistic update
+ const [moved] = this.categories.splice(draggedIndex, 1);
+ this.categories.splice(targetIndex, 0, moved);
+
+ // Update positions in array
+ this.categories.forEach((cat, idx) => cat.position = idx);
+
+ this.renderCategories();
+ this.renderMobileCategories();
+
+ // Server update
+ try {
+ await api.updateKnowledgeCategoryPosition(this.draggedCategoryId, targetIndex);
+ } catch (error) {
+ console.error('Error updating category position:', error);
+ this.showToast('Fehler beim Speichern der Reihenfolge', 'error');
+ await this.loadCategories();
+ }
+ });
+ }
+
+ // ==========================================
+ // EVENT BINDING - ENTRIES
+ // ==========================================
+
+ bindEntryClickEvents() {
+ this.entriesList?.querySelectorAll('.knowledge-entry-item').forEach(item => {
+ const entryId = parseInt(item.dataset.entryId);
+
+ // Click on header to expand/collapse
+ const header = item.querySelector('.knowledge-entry-header');
+ header?.addEventListener('click', (e) => {
+ if (!e.target.closest('.knowledge-entry-actions') && !e.target.closest('.knowledge-entry-drag-handle')) {
+ this.toggleEntry(entryId);
+ }
+ });
+
+ // Edit button
+ const editBtn = item.querySelector('[data-action="edit"]');
+ editBtn?.addEventListener('click', (e) => {
+ e.stopPropagation();
+ this.openEntryModal(entryId);
+ });
+
+ // Delete button
+ const deleteBtn = item.querySelector('[data-action="delete"]');
+ deleteBtn?.addEventListener('click', (e) => {
+ e.stopPropagation();
+ this.handleDeleteEntry(entryId);
+ });
+ });
+ }
+
+ bindSearchResultEvents() {
+ this.searchResultsList?.querySelectorAll('.knowledge-entry-item').forEach(item => {
+ const entryId = parseInt(item.dataset.entryId);
+
+ // Click on header to expand/collapse
+ const header = item.querySelector('.knowledge-entry-header');
+ header?.addEventListener('click', (e) => {
+ if (!e.target.closest('.knowledge-entry-actions') && !e.target.closest('.knowledge-entry-drag-handle')) {
+ this.toggleEntry(entryId);
+ // Re-render to reflect change
+ this.renderSearchResults();
+ }
+ });
+
+ // Edit button
+ const editBtn = item.querySelector('[data-action="edit"]');
+ editBtn?.addEventListener('click', (e) => {
+ e.stopPropagation();
+ this.openEntryModal(entryId);
+ });
+
+ // Delete button
+ const deleteBtn = item.querySelector('[data-action="delete"]');
+ deleteBtn?.addEventListener('click', (e) => {
+ e.stopPropagation();
+ this.handleDeleteEntry(entryId);
+ });
+ });
+ }
+
+ bindEntryDragEvents() {
+ if (!this.entriesList) return;
+
+ this.entriesList.addEventListener('dragstart', (e) => {
+ const item = e.target.closest('.knowledge-entry-item');
+ if (!item) return;
+
+ this.draggedEntryId = parseInt(item.dataset.entryId);
+ item.classList.add('dragging');
+ e.dataTransfer.effectAllowed = 'move';
+ e.dataTransfer.setData('text/plain', this.draggedEntryId);
+ });
+
+ this.entriesList.addEventListener('dragend', (e) => {
+ const item = e.target.closest('.knowledge-entry-item');
+ if (item) {
+ item.classList.remove('dragging');
+ }
+ this.draggedEntryId = null;
+ this.entriesList.querySelectorAll('.drag-over').forEach(el => el.classList.remove('drag-over'));
+ });
+
+ this.entriesList.addEventListener('dragover', (e) => {
+ e.preventDefault();
+ const item = e.target.closest('.knowledge-entry-item');
+ if (item && parseInt(item.dataset.entryId) !== this.draggedEntryId) {
+ this.entriesList.querySelectorAll('.drag-over').forEach(el => el.classList.remove('drag-over'));
+ item.classList.add('drag-over');
+ }
+ });
+
+ this.entriesList.addEventListener('dragleave', (e) => {
+ const item = e.target.closest('.knowledge-entry-item');
+ if (item) {
+ item.classList.remove('drag-over');
+ }
+ });
+
+ this.entriesList.addEventListener('drop', async (e) => {
+ e.preventDefault();
+ const targetItem = e.target.closest('.knowledge-entry-item');
+ if (!targetItem || !this.draggedEntryId) return;
+
+ const targetId = parseInt(targetItem.dataset.entryId);
+ if (targetId === this.draggedEntryId) return;
+
+ targetItem.classList.remove('drag-over');
+
+ // Calculate new position
+ const targetIndex = this.entries.findIndex(en => en.id === targetId);
+ const draggedIndex = this.entries.findIndex(en => en.id === this.draggedEntryId);
+
+ if (targetIndex === -1 || draggedIndex === -1) return;
+
+ // Optimistic update
+ const [moved] = this.entries.splice(draggedIndex, 1);
+ this.entries.splice(targetIndex, 0, moved);
+
+ // Update positions in array
+ this.entries.forEach((entry, idx) => entry.position = idx);
+
+ this.renderEntries();
+
+ // Server update
+ try {
+ await api.updateKnowledgeEntryPosition(this.draggedEntryId, targetIndex);
+ } catch (error) {
+ console.error('Error updating entry position:', error);
+ this.showToast('Fehler beim Speichern der Reihenfolge', 'error');
+ if (this.selectedCategory) {
+ await this.loadEntries(this.selectedCategory.id);
+ }
+ }
+ });
+ }
+
+ bindAttachmentEvents() {
+ this.attachmentsContainer?.querySelectorAll('[data-action="delete-attachment"]').forEach(btn => {
+ btn.addEventListener('click', () => {
+ const item = btn.closest('.knowledge-attachment-item');
+ const attachmentId = parseInt(item?.dataset.attachmentId);
+ if (attachmentId) {
+ this.handleDeleteAttachment(attachmentId);
+ }
+ });
+ });
+ }
+
+ // ==========================================
+ // ICON PICKER
+ // ==========================================
+
+ bindIconPickerEvents() {
+ if (!this.iconPickerPreview || !this.iconPickerSection) return;
+
+ // Toggle icon picker visibility
+ this.iconPickerPreview.addEventListener('click', () => {
+ this.iconPickerSection.classList.toggle('hidden');
+ });
+
+ // Tab switching
+ const tabs = this.iconPickerSection.querySelectorAll('.icon-tab');
+ tabs.forEach(tab => {
+ tab.addEventListener('click', () => {
+ const tabName = tab.dataset.tab;
+ this.switchIconTab(tabName);
+ });
+ });
+
+ // Icon selection
+ const iconBtns = this.iconPickerSection.querySelectorAll('.icon-btn');
+ iconBtns.forEach(btn => {
+ btn.addEventListener('click', () => {
+ const icon = btn.dataset.icon;
+ this.selectIcon(icon);
+ });
+ });
+ }
+
+ switchIconTab(tabName) {
+ if (!this.iconPickerSection) return;
+
+ // Update tab buttons
+ const tabs = this.iconPickerSection.querySelectorAll('.icon-tab');
+ tabs.forEach(tab => {
+ tab.classList.toggle('active', tab.dataset.tab === tabName);
+ });
+
+ // Show/hide icon grids
+ const grids = this.iconPickerSection.querySelectorAll('.icon-grid');
+ grids.forEach(grid => {
+ grid.classList.toggle('hidden', grid.dataset.tabContent !== tabName);
+ });
+ }
+
+ selectIcon(icon) {
+ if (!icon) return;
+
+ // Update preview
+ if (this.iconPreviewEmoji) {
+ this.iconPreviewEmoji.textContent = icon;
+ }
+
+ // Update hidden input
+ if (this.categoryIconInput) {
+ this.categoryIconInput.value = icon;
+ }
+
+ // Hide the icon picker
+ if (this.iconPickerSection) {
+ this.iconPickerSection.classList.add('hidden');
+ }
+ }
+
+ // ==========================================
+ // CATEGORY SELECTION
+ // ==========================================
+
+ async selectCategory(categoryId) {
+ const category = this.categories.find(c => c.id === categoryId);
+ if (!category) return;
+
+ this.selectedCategory = category;
+
+ // Clear search if active
+ if (this.searchQuery) {
+ this.searchQuery = '';
+ this.searchResults = [];
+ this.searchResultsSection?.classList.add('hidden');
+ }
+
+ // Update sidebar selection
+ this.renderCategories();
+ this.renderMobileCategories();
+
+ // Update main header
+ this.updateMainState();
+
+ // Load entries
+ await this.loadEntries(categoryId);
+ }
+
+ toggleEntry(entryId) {
+ if (this.expandedEntries.has(entryId)) {
+ this.expandedEntries.delete(entryId);
+ } else {
+ this.expandedEntries.add(entryId);
+ }
+
+ // Update just the affected entry
+ const entryItem = this.entriesList?.querySelector(`[data-entry-id="${entryId}"]`);
+ if (entryItem) {
+ entryItem.classList.toggle('expanded', this.expandedEntries.has(entryId));
+ }
+ }
+
+ // ==========================================
+ // SEARCH
+ // ==========================================
+
+ async handleSearch(query) {
+ this.searchQuery = query.trim();
+
+ if (!this.searchQuery) {
+ this.clearSearch();
+ return;
+ }
+
+ try {
+ const results = await api.searchKnowledge(this.searchQuery);
+ this.searchResults = results.entries || [];
+ this.searchQuerySpan.textContent = this.searchQuery;
+
+ // Show search results, hide other content
+ this.noSelection?.classList.add('hidden');
+ this.entriesEmpty?.classList.add('hidden');
+ this.entriesList.innerHTML = '';
+ this.searchResultsSection?.classList.remove('hidden');
+
+ this.renderSearchResults();
+ } catch (error) {
+ console.error('Error searching:', error);
+ this.showToast('Fehler bei der Suche', 'error');
+ }
+ }
+
+ clearSearch() {
+ this.searchQuery = '';
+ this.searchResults = [];
+
+ // Hide search results
+ this.searchResultsSection?.classList.add('hidden');
+
+ // Show normal view
+ if (this.selectedCategory) {
+ this.loadEntries(this.selectedCategory.id);
+ } else {
+ this.updateMainState();
+ }
+ }
+
+ /**
+ * Public method for global search from header
+ */
+ setSearchQuery(query) {
+ clearTimeout(this.searchDebounceTimer);
+
+ if (!query || !query.trim()) {
+ this.clearSearch();
+ return;
+ }
+
+ this.searchDebounceTimer = setTimeout(() => {
+ this.handleSearch(query);
+ }, 300);
+ }
+
+ // ==========================================
+ // CATEGORY CRUD
+ // ==========================================
+
+ openCategoryModal(categoryId = null) {
+ const isEdit = !!categoryId;
+ this.categoryModalTitle.textContent = isEdit ? 'Kategorie bearbeiten' : 'Neue Kategorie';
+ this.categoryForm?.reset();
+
+ // Hide icon picker section
+ this.iconPickerSection?.classList.add('hidden');
+
+ if (isEdit) {
+ const category = this.categories.find(c => c.id === categoryId);
+ if (category) {
+ this.categoryIdInput.value = category.id;
+ this.categoryNameInput.value = category.name;
+ this.categoryDescriptionInput.value = category.description || '';
+ this.categoryColorInput.value = category.color || '#3B82F6';
+ const icon = category.icon || '📁';
+ this.categoryIconInput.value = icon;
+ if (this.iconPreviewEmoji) {
+ this.iconPreviewEmoji.textContent = icon;
+ }
+ }
+ } else {
+ this.categoryIdInput.value = '';
+ this.categoryColorInput.value = '#3B82F6';
+ this.categoryIconInput.value = '📁';
+ if (this.iconPreviewEmoji) {
+ this.iconPreviewEmoji.textContent = '📁';
+ }
+ }
+
+ this.openModal(this.categoryModal, 'knowledge-category-modal');
+ this.categoryNameInput?.focus();
+ }
+
+ closeCategoryModal() {
+ this.closeModal(this.categoryModal, 'knowledge-category-modal');
+ }
+
+ async handleCategorySubmit(e) {
+ e.preventDefault();
+
+ const categoryId = this.categoryIdInput?.value ? parseInt(this.categoryIdInput.value) : null;
+ const data = {
+ name: this.categoryNameInput?.value.trim(),
+ description: this.categoryDescriptionInput?.value.trim() || null,
+ color: this.categoryColorInput?.value || '#3B82F6',
+ icon: this.categoryIconInput?.value.trim() || null
+ };
+
+ if (!data.name) {
+ this.showToast('Bitte einen Namen eingeben', 'error');
+ return;
+ }
+
+ try {
+ if (categoryId) {
+ await api.updateKnowledgeCategory(categoryId, data);
+ this.showToast('Kategorie aktualisiert', 'success');
+ } else {
+ await api.createKnowledgeCategory(data);
+ this.showToast('Kategorie erstellt', 'success');
+ }
+
+ this.closeCategoryModal();
+ await this.loadCategories();
+ } catch (error) {
+ this.showToast(error.message || 'Fehler beim Speichern', 'error');
+ }
+ }
+
+ async handleDeleteCategory(categoryId) {
+ const category = this.categories.find(c => c.id === categoryId);
+ if (!category) return;
+
+ const confirmDelete = confirm(`Kategorie "${category.name}" und alle Einträge wirklich löschen?`);
+ if (!confirmDelete) return;
+
+ try {
+ await api.deleteKnowledgeCategory(categoryId);
+ this.showToast('Kategorie gelöscht', 'success');
+
+ // If deleted category was selected, clear selection
+ if (this.selectedCategory?.id === categoryId) {
+ this.selectedCategory = null;
+ this.entries = [];
+ this.updateMainState();
+ }
+
+ await this.loadCategories();
+ } catch (error) {
+ this.showToast(error.message || 'Fehler beim Löschen', 'error');
+ }
+ }
+
+ // ==========================================
+ // ENTRY CRUD
+ // ==========================================
+
+ async openEntryModal(entryId = null) {
+ const isEdit = !!entryId;
+ this.entryModalTitle.textContent = isEdit ? 'Eintrag bearbeiten' : 'Neuer Eintrag';
+ this.entryForm?.reset();
+ this.deleteEntryBtn?.classList.toggle('hidden', !isEdit);
+ this.attachmentsSection.style.display = isEdit ? 'block' : 'none';
+
+ if (isEdit) {
+ const entry = await this.loadEntryWithAttachments(entryId);
+ if (entry) {
+ this.entryIdInput.value = entry.id;
+ this.entryCategoryIdInput.value = entry.categoryId;
+ this.entryTitleInput.value = entry.title;
+ this.entryUrlInput.value = entry.url || '';
+ this.entryNotesInput.value = entry.notes || '';
+ this.renderAttachments(entry.attachments);
+ }
+ } else {
+ this.entryIdInput.value = '';
+ this.entryCategoryIdInput.value = this.selectedCategory?.id || '';
+ this.attachmentsContainer.innerHTML = '';
+ }
+
+ this.openModal(this.entryModal, 'knowledge-entry-modal');
+ this.entryTitleInput?.focus();
+ }
+
+ closeEntryModal() {
+ this.closeModal(this.entryModal, 'knowledge-entry-modal');
+ }
+
+ async handleEntrySubmit(e) {
+ e.preventDefault();
+
+ const entryId = this.entryIdInput?.value ? parseInt(this.entryIdInput.value) : null;
+ const categoryId = parseInt(this.entryCategoryIdInput?.value) || this.selectedCategory?.id;
+ const data = {
+ categoryId: categoryId,
+ title: this.entryTitleInput?.value.trim(),
+ url: this.entryUrlInput?.value.trim() || null,
+ notes: this.entryNotesInput?.value.trim() || null
+ };
+
+ if (!data.title) {
+ this.showToast('Bitte einen Titel eingeben', 'error');
+ return;
+ }
+
+ if (!data.categoryId) {
+ this.showToast('Keine Kategorie ausgewählt', 'error');
+ return;
+ }
+
+ try {
+ if (entryId) {
+ await api.updateKnowledgeEntry(entryId, data);
+ this.showToast('Eintrag aktualisiert', 'success');
+ } else {
+ await api.createKnowledgeEntry(data);
+ this.showToast('Eintrag erstellt', 'success');
+ }
+
+ this.closeEntryModal();
+
+ // Refresh view
+ if (this.searchQuery) {
+ await this.handleSearch(this.searchQuery);
+ } else if (this.selectedCategory) {
+ await this.loadEntries(this.selectedCategory.id);
+ }
+ await this.loadCategories(); // Update entry counts
+ } catch (error) {
+ this.showToast(error.message || 'Fehler beim Speichern', 'error');
+ }
+ }
+
+ async handleDeleteEntry(entryId) {
+ const entry = this.entries.find(e => e.id === entryId) ||
+ this.searchResults.find(e => e.id === entryId);
+ const title = entry?.title || 'Dieser Eintrag';
+
+ const confirmDelete = confirm(`${title} wirklich löschen?`);
+ if (!confirmDelete) return;
+
+ try {
+ await api.deleteKnowledgeEntry(entryId);
+ this.showToast('Eintrag gelöscht', 'success');
+ this.closeEntryModal();
+
+ // Remove from expanded set
+ this.expandedEntries.delete(entryId);
+
+ // Refresh view
+ if (this.searchQuery) {
+ await this.handleSearch(this.searchQuery);
+ } else if (this.selectedCategory) {
+ await this.loadEntries(this.selectedCategory.id);
+ }
+ await this.loadCategories(); // Update entry counts
+ } catch (error) {
+ this.showToast(error.message || 'Fehler beim Löschen', 'error');
+ }
+ }
+
+ // ==========================================
+ // ATTACHMENTS
+ // ==========================================
+
+ handleFileSelect(e) {
+ const files = e.target.files;
+ if (files.length > 0) {
+ this.uploadFiles(files);
+ }
+ e.target.value = '';
+ }
+
+ async uploadFiles(files) {
+ const entryId = parseInt(this.entryIdInput?.value);
+ if (!entryId) {
+ this.showToast('Bitte zuerst den Eintrag speichern', 'error');
+ return;
+ }
+
+ for (const file of files) {
+ try {
+ await api.uploadKnowledgeAttachment(entryId, file);
+ this.showToast(`${file.name} hochgeladen`, 'success');
+ } catch (error) {
+ this.showToast(`Fehler beim Hochladen von ${file.name}`, 'error');
+ }
+ }
+
+ // Reload entry to show new attachments
+ const entry = await this.loadEntryWithAttachments(entryId);
+ if (entry) {
+ this.renderAttachments(entry.attachments);
+ }
+ }
+
+ async handleDeleteAttachment(attachmentId) {
+ const confirmDelete = confirm('Anhang wirklich löschen?');
+ if (!confirmDelete) return;
+
+ try {
+ await api.deleteKnowledgeAttachment(attachmentId);
+ this.showToast('Anhang gelöscht', 'success');
+
+ // Reload entry to refresh attachments
+ const entryId = parseInt(this.entryIdInput?.value);
+ if (entryId) {
+ const entry = await this.loadEntryWithAttachments(entryId);
+ if (entry) {
+ this.renderAttachments(entry.attachments);
+ }
+ }
+ } catch (error) {
+ this.showToast(error.message || 'Fehler beim Löschen', 'error');
+ }
+ }
+
+ // ==========================================
+ // MODAL HELPERS
+ // ==========================================
+
+ openModal(modal, modalId) {
+ if (modal) {
+ modal.classList.remove('hidden');
+ modal.classList.add('visible');
+ }
+ const overlay = $('#modal-overlay');
+ if (overlay) {
+ overlay.classList.remove('hidden');
+ overlay.classList.add('visible');
+ }
+ store.openModal(modalId);
+ }
+
+ closeModal(modal, modalId) {
+ if (modal) {
+ modal.classList.remove('visible');
+ modal.classList.add('hidden');
+ }
+ // Only hide overlay if no other modals are open
+ const openModals = store.get('openModals').filter(id => id !== modalId);
+ if (openModals.length === 0) {
+ const overlay = $('#modal-overlay');
+ if (overlay) {
+ overlay.classList.remove('visible');
+ overlay.classList.add('hidden');
+ }
+ }
+ store.closeModal(modalId);
+ }
+
+ // ==========================================
+ // UTILITIES
+ // ==========================================
+
+ formatFileSize(bytes) {
+ if (!bytes) return '0 B';
+ const sizes = ['B', 'KB', 'MB', 'GB'];
+ const i = Math.floor(Math.log(bytes) / Math.log(1024));
+ return `${(bytes / Math.pow(1024, i)).toFixed(1)} ${sizes[i]}`;
+ }
+
+ escapeHtml(str) {
+ if (!str) return '';
+ const div = document.createElement('div');
+ div.textContent = str;
+ return div.innerHTML;
+ }
+
+ showToast(message, type = 'info') {
+ window.dispatchEvent(new CustomEvent('toast:show', {
+ detail: { message, type }
+ }));
+ }
+
+ // ==========================================
+ // SHOW/HIDE
+ // ==========================================
+
+ show() {
+ this.knowledgeView?.classList.remove('hidden');
+ this.knowledgeView?.classList.add('active');
+ }
+
+ hide() {
+ this.knowledgeView?.classList.add('hidden');
+ this.knowledgeView?.classList.remove('active');
+ }
+}
+
+// Create singleton instance
+const knowledgeManager = new KnowledgeManager();
+
+export { knowledgeManager };
+export default knowledgeManager;
diff --git a/frontend/js/sync.js b/frontend/js/sync.js
index c61897c..d476f64 100644
--- a/frontend/js/sync.js
+++ b/frontend/js/sync.js
@@ -21,7 +21,9 @@ class SyncManager {
// Initialize Socket.io connection
async connect() {
- if (this.socket?.connected) {
+ // Verhindere doppelte Verbindungen (auch während des Verbindungsaufbaus)
+ if (this.socket) {
+ console.log('[Sync] Socket already exists, skipping connect');
return;
}
@@ -102,8 +104,15 @@ class SyncManager {
console.error('[Sync] Socket error:', error);
if (error.type === 'auth') {
- // Auth failed, logout
- window.dispatchEvent(new CustomEvent('auth:logout'));
+ // Nur ausloggen wenn wir wirklich nicht eingeloggt sind
+ // (verhindert Logout durch alte Socket-Verbindungen nach neuem Login)
+ const currentToken = localStorage.getItem('auth_token');
+ if (!currentToken) {
+ console.log('[Sync] Auth error and no token, triggering logout');
+ window.dispatchEvent(new CustomEvent('auth:logout'));
+ } else {
+ console.log('[Sync] Auth error ignored - new login occurred');
+ }
}
});
@@ -546,9 +555,8 @@ class SyncManager {
const syncManager = new SyncManager();
// Listen for auth events
-window.addEventListener('auth:login', () => {
- syncManager.connect();
-});
+// Hinweis: syncManager.connect() wird NICHT hier aufgerufen,
+// sondern in app.js initializeApp() um doppelte Verbindungen zu vermeiden
window.addEventListener('auth:logout', () => {
syncManager.disconnect();
diff --git a/frontend/js/task-modal.js b/frontend/js/task-modal.js
index a3843f8..ee5c61d 100644
--- a/frontend/js/task-modal.js
+++ b/frontend/js/task-modal.js
@@ -1321,7 +1321,8 @@ class TaskModalManager {
try {
const projectId = store.get('currentProjectId');
const subtask = await api.createSubtask(projectId, this.taskId, { title });
- this.subtasks.push(subtask);
+ // Neue Subtask an erster Stelle einfügen
+ this.subtasks.unshift(subtask);
this.renderSubtasks();
input.value = '';
@@ -1331,8 +1332,8 @@ class TaskModalManager {
this.showError('Fehler beim Hinzufügen');
}
} else {
- // For new tasks, store locally
- this.subtasks.push({
+ // For new tasks, store locally - an erster Stelle
+ this.subtasks.unshift({
id: generateTempId(),
title,
completed: false
@@ -1346,6 +1347,7 @@ class TaskModalManager {
const subtask = this.subtasks.find(s => s.id === subtaskId);
if (!subtask) return;
+ const wasCompleted = subtask.completed;
subtask.completed = !subtask.completed;
if (this.mode === 'edit' && this.taskId) {
@@ -1355,10 +1357,26 @@ class TaskModalManager {
completed: subtask.completed
});
+ // Wenn abgehakt: ans Ende der Liste verschieben
+ if (subtask.completed && !wasCompleted) {
+ const currentIndex = this.subtasks.findIndex(s => s.id === subtaskId);
+ const lastPosition = this.subtasks.length - 1;
+
+ if (currentIndex < lastPosition) {
+ // Aus aktueller Position entfernen
+ const [moved] = this.subtasks.splice(currentIndex, 1);
+ // Ans Ende anfügen
+ this.subtasks.push(moved);
+
+ // API-Call für neue Position
+ await api.reorderSubtasks(projectId, this.taskId, subtaskId, lastPosition);
+ }
+ }
+
// Update subtask progress in store for immediate board update
this.updateSubtaskProgressInStore();
} catch (error) {
- subtask.completed = !subtask.completed;
+ subtask.completed = wasCompleted;
this.showError('Fehler beim Aktualisieren');
}
}
diff --git a/frontend/sw.js b/frontend/sw.js
index d4805a4..3a12914 100644
--- a/frontend/sw.js
+++ b/frontend/sw.js
@@ -4,7 +4,7 @@
* Offline support and caching
*/
-const CACHE_VERSION = '138';
+const CACHE_VERSION = '152';
const CACHE_NAME = 'taskmate-v' + CACHE_VERSION;
const STATIC_CACHE_NAME = 'taskmate-static-v' + CACHE_VERSION;
const DYNAMIC_CACHE_NAME = 'taskmate-dynamic-v' + CACHE_VERSION;
@@ -38,11 +38,13 @@ const STATIC_ASSETS = [
'/js/proposals.js',
'/js/notifications.js',
'/js/gitea.js',
+ '/js/knowledge.js',
'/css/list.css',
'/css/admin.css',
'/css/proposals.css',
'/css/notifications.css',
- '/css/gitea.css'
+ '/css/gitea.css',
+ '/css/knowledge.css'
];
// API routes to cache
diff --git a/logs/app.log b/logs/app.log
index 477ae1a..b836edc 100644
--- a/logs/app.log
+++ b/logs/app.log
@@ -46830,3 +46830,3756 @@ hint: See the 'Note about fast-forwards' in 'git push --help' for details.
[2025-12-30T19:55:23.041Z] [INFO] GET /api/health 200 2ms
[2025-12-30T19:55:26.554Z] [INFO] POST /api/auth/refresh 200 9ms
[2025-12-30T19:55:37.907Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T19:55:39.165Z] [INFO] Commit mit Autor: HG
+[2025-12-30T19:55:39.342Z] [INFO] POST /api/git/server/commit 200 340ms
+[2025-12-30T19:55:39.407Z] [INFO] GET /api/git/server/status 200 30ms
+[2025-12-30T19:55:39.418Z] [INFO] GET /api/git/server/branches 304 10ms
+[2025-12-30T19:55:39.433Z] [INFO] GET /api/git/server/commits?limit=10 200 13ms
+[2025-12-30T19:55:40.001Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T19:55:41.471Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T19:55:45.298Z] [INFO] POST /api/git/server/push 200 2241ms
+[2025-12-30T19:55:45.316Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T19:55:45.358Z] [INFO] GET /api/git/server/branches 304 24ms
+[2025-12-30T19:55:45.390Z] [INFO] GET /api/git/server/status 200 29ms
+[2025-12-30T19:55:45.403Z] [INFO] GET /api/git/server/commits?limit=10 304 11ms
+[2025-12-30T19:55:48.883Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T19:55:49.360Z] [INFO] Subtask erstellt: Kontakte einpflegen können in Task 6
+[2025-12-30T19:55:49.362Z] [INFO] POST /api/subtasks 201 14ms
+[2025-12-30T19:55:50.362Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T19:55:53.157Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T19:55:53.275Z] [INFO] PUT /api/subtasks/43/position 200 10ms
+[2025-12-30T19:56:01.402Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T19:56:01.408Z] [INFO] PUT /api/tasks/6 200 28ms
+[2025-12-30T19:56:02.394Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T19:56:02.604Z] [INFO] GET / 304 2ms
+[2025-12-30T19:56:02.624Z] [INFO] Socket disconnected: MH (AkN_8fCwOYNx8k5WAAAH)
+[2025-12-30T19:56:02.638Z] [INFO] GET /css/variables.css 304 1ms
+[2025-12-30T19:56:02.641Z] [INFO] GET /css/calendar.css 304 1ms
+[2025-12-30T19:56:02.643Z] [INFO] GET /css/base.css 304 2ms
+[2025-12-30T19:56:02.647Z] [INFO] GET /css/board.css 304 2ms
+[2025-12-30T19:56:02.648Z] [INFO] GET /css/modal.css 304 0ms
+[2025-12-30T19:56:02.651Z] [INFO] GET /css/components.css 304 1ms
+[2025-12-30T19:56:02.657Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T19:56:02.660Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T19:56:02.663Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T19:56:02.667Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T19:56:02.670Z] [INFO] GET /css/gitea.css 304 2ms
+[2025-12-30T19:56:02.672Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T19:56:02.682Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T19:56:02.722Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T19:56:02.723Z] [INFO] GET /js/store.js 304 2ms
+[2025-12-30T19:56:02.732Z] [INFO] GET /js/auth.js 304 1ms
+[2025-12-30T19:56:02.738Z] [INFO] GET /js/board.js 304 1ms
+[2025-12-30T19:56:02.742Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T19:56:02.745Z] [INFO] GET /js/offline.js 304 2ms
+[2025-12-30T19:56:02.746Z] [INFO] GET /js/task-modal.js 304 2ms
+[2025-12-30T19:56:02.749Z] [INFO] GET /js/calendar.js 304 2ms
+[2025-12-30T19:56:02.752Z] [INFO] GET /js/list.js 304 2ms
+[2025-12-30T19:56:02.756Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T19:56:02.759Z] [INFO] GET /js/undo.js 304 0ms
+[2025-12-30T19:56:02.762Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T19:56:02.764Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T19:56:02.766Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T19:56:02.770Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T19:56:02.773Z] [INFO] GET /js/utils.js 304 0ms
+[2025-12-30T19:56:02.802Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T19:56:02.968Z] [INFO] GET /api/auth/users 304 7ms
+[2025-12-30T19:56:03.045Z] [INFO] GET /api/auth/users 304 3ms
+[2025-12-30T19:56:03.057Z] [INFO] GET /assets/icons/task.svg 304 2ms
+[2025-12-30T19:56:03.075Z] [INFO] Socket connected: MH (N1bzTAZ_FsWCS3YkAAAJ)
+[2025-12-30T19:56:03.085Z] [INFO] GET /api/projects 304 6ms
+[2025-12-30T19:56:03.108Z] [INFO] MH joined project:[object Object]
+[2025-12-30T19:56:03.117Z] [INFO] GET /api/stats/dashboard?projectId=2 304 8ms
+[2025-12-30T19:56:03.120Z] [INFO] GET /api/columns/2 304 9ms
+[2025-12-30T19:56:03.125Z] [INFO] GET /api/labels/2 304 3ms
+[2025-12-30T19:56:03.134Z] [INFO] GET /api/tasks/project/2 200 9ms
+[2025-12-30T19:56:03.165Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 4ms
+[2025-12-30T19:56:03.190Z] [INFO] GET /api/notifications 304 4ms
+[2025-12-30T19:56:04.711Z] [INFO] GET /sw.js 304 1ms
+[2025-12-30T19:56:10.189Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T19:56:23.268Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T19:56:53.372Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T19:57:04.875Z] [INFO] SIGTERM empfangen, fahre herunter...
+[2025-12-30T19:57:16.678Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T19:57:16.776Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T19:57:16.780Z] [INFO] Datenbank initialisiert
+[2025-12-30T19:57:16.786Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T19:57:16.786Z] [INFO] Umgebung: production
+[2025-12-30T19:57:16.788Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T19:57:16.788Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T19:57:17.962Z] [INFO] Socket connected: MH (oEZIycxjJi8t2uEeAAAB)
+[2025-12-30T19:57:18.185Z] [INFO] MH joined project:[object Object]
+[2025-12-30T19:57:18.863Z] [INFO] Socket connected: HG (bCb9rpT6lsxfXTZyAAAD)
+[2025-12-30T19:57:18.983Z] [INFO] HG joined project:[object Object]
+[2025-12-30T19:57:20.861Z] [INFO] GET /api/health 200 12ms
+[2025-12-30T19:57:50.957Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T19:58:16.813Z] [INFO] Backup erstellt: backup_2025-12-30T19-58-16-797Z.db
+[2025-12-30T19:58:16.817Z] [INFO] Altes Backup gelöscht: backup_2025-12-28T20-59-42-468Z.db
+[2025-12-30T19:58:16.819Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T19:58:19.684Z] [INFO] SIGTERM empfangen, fahre herunter...
+[2025-12-30T19:58:24.785Z] [INFO] Socket disconnected: MH (oEZIycxjJi8t2uEeAAAB)
+[2025-12-30T19:58:31.236Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T19:58:31.311Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T19:58:31.317Z] [INFO] Datenbank initialisiert
+[2025-12-30T19:58:31.323Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T19:58:31.323Z] [INFO] Umgebung: production
+[2025-12-30T19:58:31.325Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T19:58:31.325Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T19:58:32.517Z] [INFO] Socket connected: HG (ra7gWNXKHTKDS69pAAAB)
+[2025-12-30T19:58:32.555Z] [INFO] HG joined project:[object Object]
+[2025-12-30T19:58:35.564Z] [INFO] GET /api/health 200 7ms
+[2025-12-30T19:59:05.657Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T19:59:30.251Z] [INFO] GET / 200 12ms
+[2025-12-30T19:59:30.314Z] [INFO] GET /css/variables.css 304 3ms
+[2025-12-30T19:59:30.318Z] [INFO] GET /css/base.css 304 2ms
+[2025-12-30T19:59:30.343Z] [INFO] GET /css/board.css 304 2ms
+[2025-12-30T19:59:30.345Z] [INFO] GET /css/components.css 304 3ms
+[2025-12-30T19:59:30.353Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T19:59:30.359Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T19:59:30.362Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T19:59:30.363Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T19:59:30.366Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T19:59:30.370Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T19:59:30.372Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T19:59:30.376Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T19:59:30.382Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T19:59:30.424Z] [INFO] GET /js/store.js 304 3ms
+[2025-12-30T19:59:30.428Z] [INFO] GET /js/auth.js 304 2ms
+[2025-12-30T19:59:30.430Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T19:59:30.433Z] [INFO] GET /js/board.js 304 1ms
+[2025-12-30T19:59:30.435Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T19:59:30.437Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T19:59:30.446Z] [INFO] GET /js/task-modal.js 200 3ms
+[2025-12-30T19:59:30.447Z] [INFO] GET /js/calendar.js 304 2ms
+[2025-12-30T19:59:30.452Z] [INFO] GET /js/list.js 304 2ms
+[2025-12-30T19:59:30.454Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T19:59:30.457Z] [INFO] GET /js/undo.js 304 1ms
+[2025-12-30T19:59:30.459Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T19:59:30.475Z] [INFO] GET /js/notifications.js 304 2ms
+[2025-12-30T19:59:30.482Z] [INFO] GET /js/gitea.js 304 3ms
+[2025-12-30T19:59:30.486Z] [INFO] GET /js/proposals.js 304 2ms
+[2025-12-30T19:59:30.489Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T19:59:30.586Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T19:59:30.742Z] [INFO] GET /api/auth/users 304 9ms
+[2025-12-30T19:59:30.822Z] [INFO] GET /api/auth/users 304 6ms
+[2025-12-30T19:59:30.859Z] [INFO] Socket connected: MH (LF-AW1wwa7cigUNeAAAD)
+[2025-12-30T19:59:30.871Z] [INFO] GET /assets/icons/task.svg 304 9ms
+[2025-12-30T19:59:30.877Z] [INFO] GET /api/projects 304 7ms
+[2025-12-30T19:59:30.900Z] [INFO] MH joined project:[object Object]
+[2025-12-30T19:59:30.910Z] [INFO] GET /api/stats/dashboard?projectId=2 304 6ms
+[2025-12-30T19:59:30.917Z] [INFO] GET /api/columns/2 200 5ms
+[2025-12-30T19:59:30.930Z] [INFO] GET /api/tasks/project/2 200 12ms
+[2025-12-30T19:59:30.936Z] [INFO] GET /api/labels/2 200 3ms
+[2025-12-30T19:59:30.981Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 12ms
+[2025-12-30T19:59:31.013Z] [INFO] GET /api/notifications 304 11ms
+[2025-12-30T19:59:31.345Z] [INFO] Backup erstellt: backup_2025-12-30T19-59-31-325Z.db
+[2025-12-30T19:59:31.347Z] [INFO] Altes Backup gelöscht: backup_2025-12-28T21-11-36-076Z.db
+[2025-12-30T19:59:31.348Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T19:59:32.506Z] [INFO] GET /sw.js 200 2ms
+[2025-12-30T19:59:32.539Z] [INFO] GET / 304 3ms
+[2025-12-30T19:59:32.540Z] [INFO] GET /css/variables.css 304 3ms
+[2025-12-30T19:59:32.542Z] [INFO] GET /index.html 304 1ms
+[2025-12-30T19:59:32.557Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T19:59:32.559Z] [INFO] GET /css/components.css 304 1ms
+[2025-12-30T19:59:32.561Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T19:59:32.580Z] [INFO] GET /css/modal.css 304 3ms
+[2025-12-30T19:59:32.581Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T19:59:32.583Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T19:59:32.600Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T19:59:32.601Z] [INFO] GET /js/utils.js 304 2ms
+[2025-12-30T19:59:32.603Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T19:59:32.622Z] [INFO] GET /js/auth.js 304 2ms
+[2025-12-30T19:59:32.624Z] [INFO] GET /js/sync.js 304 2ms
+[2025-12-30T19:59:32.623Z] [INFO] GET /js/store.js 304 2ms
+[2025-12-30T19:59:32.646Z] [INFO] GET /js/offline.js 304 3ms
+[2025-12-30T19:59:32.650Z] [INFO] GET /js/board.js 304 2ms
+[2025-12-30T19:59:32.653Z] [INFO] GET /js/task-modal.js 304 2ms
+[2025-12-30T19:59:32.665Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T19:59:32.669Z] [INFO] GET /js/list.js 304 2ms
+[2025-12-30T19:59:32.672Z] [INFO] GET /js/shortcuts.js 304 0ms
+[2025-12-30T19:59:32.684Z] [INFO] GET /js/undo.js 304 1ms
+[2025-12-30T19:59:32.690Z] [INFO] GET /js/tour.js 304 2ms
+[2025-12-30T19:59:32.694Z] [INFO] GET /js/admin.js 304 2ms
+[2025-12-30T19:59:32.706Z] [INFO] GET /js/proposals.js 304 2ms
+[2025-12-30T19:59:32.710Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T19:59:32.713Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T19:59:32.724Z] [INFO] GET /css/list.css 304 1ms
+[2025-12-30T19:59:32.729Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T19:59:32.732Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T19:59:32.743Z] [INFO] GET /css/notifications.css 304 0ms
+[2025-12-30T19:59:32.746Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T19:59:35.757Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T19:59:40.209Z] [INFO] Aufgabe verschoben: Bilanzbuchhaltung - Finanzamt -> In Arbeit
+[2025-12-30T19:59:40.212Z] [INFO] PUT /api/tasks/10/move 200 9ms
+[2025-12-30T19:59:41.975Z] [INFO] GET /api/tasks/10 200 15ms
+[2025-12-30T19:59:42.006Z] [INFO] GET /api/links/10 304 4ms
+[2025-12-30T19:59:42.010Z] [INFO] GET /api/subtasks/10 200 3ms
+[2025-12-30T19:59:42.014Z] [INFO] GET /api/files/10 304 3ms
+[2025-12-30T19:59:42.018Z] [INFO] GET /api/comments/10 304 3ms
+[2025-12-30T19:59:42.022Z] [INFO] GET /api/tasks/10/history 404 7ms
+[2025-12-30T19:59:42.964Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T19:59:49.446Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T19:59:51.145Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:00:01.401Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:00:02.508Z] [INFO] PUT /api/subtasks/39 200 12ms
+[2025-12-30T20:00:05.855Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:00:12.301Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:00:13.149Z] [INFO] PUT /api/subtasks/40 200 4ms
+[2025-12-30T20:00:35.310Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:00:35.317Z] [INFO] PUT /api/subtasks/41 200 5ms
+[2025-12-30T20:00:35.936Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:00:36.362Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:00:39.749Z] [INFO] Aufgabe aktualisiert: Bilanzbuchhaltung - Finanzamt (ID: 10)
+[2025-12-30T20:00:39.751Z] [INFO] PUT /api/tasks/10 200 8ms
+[2025-12-30T20:00:40.771Z] [INFO] POST /api/auth/refresh 200 15ms
+[2025-12-30T20:00:46.279Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:00:56.777Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:01:00.777Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T20:01:01.336Z] [INFO] Aufgabe erstellt: Gewerbeamt Langenfeld Namensänderung (ID: 14) von MH
+[2025-12-30T20:01:01.339Z] [INFO] POST /api/tasks 201 9ms
+[2025-12-30T20:01:03.252Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:01:06.029Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:01:23.084Z] [INFO] GET /api/tasks/14 200 6ms
+[2025-12-30T20:01:23.111Z] [INFO] GET /api/subtasks/14 200 4ms
+[2025-12-30T20:01:23.118Z] [INFO] GET /api/links/14 200 5ms
+[2025-12-30T20:01:23.141Z] [INFO] GET /api/files/14 200 5ms
+[2025-12-30T20:01:23.147Z] [INFO] GET /api/comments/14 200 4ms
+[2025-12-30T20:01:23.151Z] [INFO] GET /api/tasks/14/history 404 3ms
+[2025-12-30T20:01:24.101Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:01:27.035Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T20:01:28.085Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T20:01:28.092Z] [INFO] Aufgabe aktualisiert: Namensänderung (ID: 14)
+[2025-12-30T20:01:28.094Z] [INFO] PUT /api/tasks/14 200 7ms
+[2025-12-30T20:01:29.570Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T20:01:35.984Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:01:35.999Z] [INFO] Aufgabe aktualisiert: Namensänderung - Woghin alles eine E-Mail schicken? (ID: 14)
+[2025-12-30T20:01:36.003Z] [INFO] PUT /api/tasks/14 200 14ms
+[2025-12-30T20:01:36.133Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:01:37.139Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:01:41.086Z] [INFO] Aufgabe aktualisiert: Namensänderung - Woghin alles eine E-Mail schicken? (ID: 14)
+[2025-12-30T20:01:41.088Z] [INFO] PUT /api/tasks/14 200 12ms
+[2025-12-30T20:01:42.096Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T20:01:43.167Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:01:46.251Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:02:06.249Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:02:36.371Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:03:06.474Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T20:03:36.570Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:04:02.823Z] [INFO] Subtask erstellt: Website ändern in Task 14
+[2025-12-30T20:04:02.825Z] [INFO] POST /api/subtasks 201 7ms
+[2025-12-30T20:04:03.797Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:04:06.672Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:04:36.764Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T20:04:59.156Z] [INFO] Subtask erstellt: FYRST in Task 14
+[2025-12-30T20:04:59.158Z] [INFO] POST /api/subtasks 201 6ms
+[2025-12-30T20:05:00.164Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:05:06.901Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:05:08.450Z] [INFO] Subtask erstellt: Gewerbeamt Langenfeld in Task 14
+[2025-12-30T20:05:08.452Z] [INFO] POST /api/subtasks 201 7ms
+[2025-12-30T20:05:09.462Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:05:16.729Z] [INFO] Subtask erstellt: IHK Düsseldorf in Task 14
+[2025-12-30T20:05:16.732Z] [INFO] POST /api/subtasks 201 7ms
+[2025-12-30T20:05:17.744Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:05:23.298Z] [INFO] Subtask erstellt: Finanzamt Hilden in Task 14
+[2025-12-30T20:05:23.301Z] [INFO] POST /api/subtasks 201 9ms
+[2025-12-30T20:05:24.309Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:05:28.706Z] [INFO] Aufgabe aktualisiert: Namensänderung - Woghin alles eine E-Mail schicken? (ID: 14)
+[2025-12-30T20:05:28.707Z] [INFO] PUT /api/tasks/14 200 6ms
+[2025-12-30T20:05:29.725Z] [INFO] POST /api/auth/refresh 200 15ms
+[2025-12-30T20:05:29.833Z] [INFO] Aufgabe aktualisiert: Namensänderung - Woghin alles eine E-Mail schicken? (ID: 14)
+[2025-12-30T20:05:29.835Z] [INFO] PUT /api/tasks/14 200 20ms
+[2025-12-30T20:05:30.526Z] [INFO] Aufgabe aktualisiert: Namensänderung - Woghin alles eine E-Mail schicken? (ID: 14)
+[2025-12-30T20:05:30.528Z] [INFO] PUT /api/tasks/14 200 13ms
+[2025-12-30T20:05:31.530Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:05:31.689Z] [INFO] Aufgabe aktualisiert: Namensänderung - Woghin alles eine E-Mail schicken? (ID: 14)
+[2025-12-30T20:05:31.690Z] [INFO] PUT /api/tasks/14 200 7ms
+[2025-12-30T20:05:32.708Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T20:05:35.889Z] [INFO] Aufgabe verschoben: Namensänderung - Woghin alles eine E-Mail schicken? -> Offen
+[2025-12-30T20:05:35.892Z] [INFO] PUT /api/tasks/14/move 200 14ms
+[2025-12-30T20:05:36.554Z] [INFO] GET /api/tasks/14 200 6ms
+[2025-12-30T20:05:36.585Z] [INFO] GET /api/subtasks/14 200 7ms
+[2025-12-30T20:05:36.609Z] [INFO] GET /api/links/14 304 6ms
+[2025-12-30T20:05:36.628Z] [INFO] GET /api/comments/14 304 5ms
+[2025-12-30T20:05:36.633Z] [INFO] GET /api/files/14 304 10ms
+[2025-12-30T20:05:36.652Z] [INFO] GET /api/tasks/14/history 404 18ms
+[2025-12-30T20:05:37.029Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:05:37.563Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:06:07.144Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:06:09.337Z] [INFO] Logout: HG
+[2025-12-30T20:06:09.339Z] [INFO] POST /api/auth/logout 200 7ms
+[2025-12-30T20:06:09.370Z] [INFO] Socket disconnected: HG (ra7gWNXKHTKDS69pAAAB)
+[2025-12-30T20:06:37.225Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:07:07.318Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:07:07.802Z] [INFO] Aufgabe aktualisiert: Namensänderung - Woghin alles eine E-Mail schicken? (ID: 14)
+[2025-12-30T20:07:07.804Z] [INFO] PUT /api/tasks/14 200 10ms
+[2025-12-30T20:07:08.746Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T20:07:11.309Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T20:07:12.776Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:07:26.770Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T20:07:26.771Z] [INFO] POST /api/auth/login 200 520ms
+[2025-12-30T20:07:26.874Z] [INFO] GET /api/auth/users 304 8ms
+[2025-12-30T20:07:26.881Z] [INFO] Socket connected: HG (b0eW_2L_ZKBd4IxBAAAG)
+[2025-12-30T20:07:26.907Z] [INFO] Socket connected: HG (j117YGPEvCR8ntzYAAAH)
+[2025-12-30T20:07:26.919Z] [INFO] GET /api/projects 401 4ms
+[2025-12-30T20:07:26.923Z] [INFO] POST /api/auth/logout 401 2ms
+[2025-12-30T20:07:26.949Z] [INFO] Socket disconnected: HG (j117YGPEvCR8ntzYAAAH)
+[2025-12-30T20:07:26.955Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms
+[2025-12-30T20:07:29.360Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T20:07:29.361Z] [INFO] POST /api/auth/login 200 514ms
+[2025-12-30T20:07:29.407Z] [INFO] GET /api/auth/users 304 7ms
+[2025-12-30T20:07:29.432Z] [INFO] Socket connected: HG (VpE0T9ZaJhQftditAAAK)
+[2025-12-30T20:07:29.440Z] [INFO] Socket connected: HG (F3mrnXe5cOP-wcQXAAAL)
+[2025-12-30T20:07:29.458Z] [INFO] GET /api/projects 401 4ms
+[2025-12-30T20:07:29.486Z] [INFO] Socket disconnected: HG (VpE0T9ZaJhQftditAAAK)
+[2025-12-30T20:07:29.491Z] [INFO] GET /api/proposals?sort=date&archived=0 401 1ms
+[2025-12-30T20:07:30.511Z] [INFO] GET / 200 5ms
+[2025-12-30T20:07:30.571Z] [INFO] Socket disconnected: HG (F3mrnXe5cOP-wcQXAAAL)
+[2025-12-30T20:07:30.578Z] [INFO] Socket disconnected: HG (b0eW_2L_ZKBd4IxBAAAG)
+[2025-12-30T20:07:30.585Z] [INFO] GET /css/variables.css 200 4ms
+[2025-12-30T20:07:30.588Z] [INFO] GET /css/base.css 200 5ms
+[2025-12-30T20:07:30.590Z] [INFO] GET /css/components.css 200 6ms
+[2025-12-30T20:07:30.591Z] [INFO] GET /css/board.css 200 4ms
+[2025-12-30T20:07:30.594Z] [INFO] GET /css/modal.css 200 4ms
+[2025-12-30T20:07:30.595Z] [INFO] GET /css/calendar.css 200 3ms
+[2025-12-30T20:07:30.622Z] [INFO] GET /css/list.css 200 4ms
+[2025-12-30T20:07:30.624Z] [INFO] GET /css/admin.css 200 5ms
+[2025-12-30T20:07:30.650Z] [INFO] GET /css/notifications.css 200 6ms
+[2025-12-30T20:07:30.653Z] [INFO] GET /css/gitea.css 200 8ms
+[2025-12-30T20:07:30.656Z] [INFO] GET /css/proposals.css 200 10ms
+[2025-12-30T20:07:30.661Z] [INFO] GET /css/responsive.css 200 6ms
+[2025-12-30T20:07:30.677Z] [INFO] GET /js/app.js 200 18ms
+[2025-12-30T20:07:30.782Z] [INFO] GET /js/sync.js 200 7ms
+[2025-12-30T20:07:30.787Z] [INFO] GET /js/auth.js 200 9ms
+[2025-12-30T20:07:30.790Z] [INFO] GET /js/board.js 200 9ms
+[2025-12-30T20:07:30.793Z] [INFO] GET /js/offline.js 200 8ms
+[2025-12-30T20:07:30.796Z] [INFO] GET /js/api.js 200 7ms
+[2025-12-30T20:07:30.797Z] [INFO] GET /js/store.js 200 6ms
+[2025-12-30T20:07:30.806Z] [INFO] GET /js/task-modal.js 200 2ms
+[2025-12-30T20:07:30.818Z] [INFO] GET /js/calendar.js 200 2ms
+[2025-12-30T20:07:30.823Z] [INFO] GET /js/list.js 200 2ms
+[2025-12-30T20:07:30.829Z] [INFO] GET /js/shortcuts.js 200 3ms
+[2025-12-30T20:07:30.830Z] [INFO] GET /js/undo.js 200 2ms
+[2025-12-30T20:07:30.853Z] [INFO] GET /js/admin.js 200 5ms
+[2025-12-30T20:07:30.856Z] [INFO] GET /js/proposals.js 200 7ms
+[2025-12-30T20:07:30.861Z] [INFO] GET /js/notifications.js 200 5ms
+[2025-12-30T20:07:30.863Z] [INFO] GET /js/gitea.js 200 5ms
+[2025-12-30T20:07:30.865Z] [INFO] GET /js/utils.js 200 6ms
+[2025-12-30T20:07:30.927Z] [INFO] GET /assets/icons/task.svg 304 3ms
+[2025-12-30T20:07:31.399Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T20:07:33.556Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T20:07:33.559Z] [INFO] POST /api/auth/login 200 466ms
+[2025-12-30T20:07:33.600Z] [INFO] GET /api/auth/users 304 4ms
+[2025-12-30T20:07:33.625Z] [INFO] Socket connected: HG (g8gjr18xf99eyPizAAAO)
+[2025-12-30T20:07:33.631Z] [INFO] Socket connected: HG (GRADNCx-kLPVKMbxAAAP)
+[2025-12-30T20:07:33.638Z] [INFO] GET /api/projects 401 4ms
+[2025-12-30T20:07:33.671Z] [INFO] Socket disconnected: HG (GRADNCx-kLPVKMbxAAAP)
+[2025-12-30T20:07:33.679Z] [INFO] GET /api/proposals?sort=date&archived=0 401 3ms
+[2025-12-30T20:07:33.721Z] [INFO] GET /api/notifications 401 2ms
+[2025-12-30T20:07:35.794Z] [INFO] Socket disconnected: HG (g8gjr18xf99eyPizAAAO)
+[2025-12-30T20:07:37.419Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:07:38.412Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:07:40.373Z] [INFO] GET / 304 2ms
+[2025-12-30T20:07:40.419Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T20:07:40.423Z] [INFO] GET /css/board.css 304 2ms
+[2025-12-30T20:07:40.427Z] [INFO] GET /css/variables.css 304 3ms
+[2025-12-30T20:07:40.430Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T20:07:40.432Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T20:07:40.435Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T20:07:40.449Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T20:07:40.459Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T20:07:40.465Z] [INFO] GET /css/proposals.css 304 5ms
+[2025-12-30T20:07:40.468Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T20:07:40.471Z] [INFO] GET /css/gitea.css 304 2ms
+[2025-12-30T20:07:40.473Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T20:07:40.489Z] [INFO] GET /js/app.js 304 2ms
+[2025-12-30T20:07:40.535Z] [INFO] GET /js/sync.js 304 6ms
+[2025-12-30T20:07:40.537Z] [INFO] GET /js/store.js 304 6ms
+[2025-12-30T20:07:40.539Z] [INFO] GET /js/auth.js 304 7ms
+[2025-12-30T20:07:40.540Z] [INFO] GET /js/offline.js 304 7ms
+[2025-12-30T20:07:40.542Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T20:07:40.545Z] [INFO] GET /js/board.js 304 2ms
+[2025-12-30T20:07:40.562Z] [INFO] GET /js/task-modal.js 304 1ms
+[2025-12-30T20:07:40.567Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T20:07:40.571Z] [INFO] GET /js/undo.js 304 1ms
+[2025-12-30T20:07:40.574Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T20:07:40.577Z] [INFO] GET /js/shortcuts.js 304 2ms
+[2025-12-30T20:07:40.580Z] [INFO] GET /js/admin.js 304 2ms
+[2025-12-30T20:07:40.591Z] [INFO] GET /js/proposals.js 304 0ms
+[2025-12-30T20:07:40.601Z] [INFO] GET /js/notifications.js 304 2ms
+[2025-12-30T20:07:40.604Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T20:07:40.618Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T20:07:40.658Z] [INFO] GET /assets/icons/task.svg 304 1ms
+[2025-12-30T20:07:41.030Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:07:42.190Z] [INFO] GET /sw.js 200 3ms
+[2025-12-30T20:07:42.230Z] [INFO] GET /css/variables.css 304 1ms
+[2025-12-30T20:07:42.232Z] [INFO] GET / 304 1ms
+[2025-12-30T20:07:42.236Z] [INFO] GET /index.html 200 3ms
+[2025-12-30T20:07:42.261Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T20:07:42.265Z] [INFO] GET /css/components.css 304 1ms
+[2025-12-30T20:07:42.290Z] [INFO] GET /css/board.css 304 2ms
+[2025-12-30T20:07:42.294Z] [INFO] GET /css/modal.css 304 2ms
+[2025-12-30T20:07:42.302Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T20:07:42.319Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T20:07:42.326Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T20:07:42.332Z] [INFO] GET /js/utils.js 304 2ms
+[2025-12-30T20:07:42.359Z] [INFO] GET /js/api.js 304 2ms
+[2025-12-30T20:07:42.374Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T20:07:42.376Z] [INFO] GET /js/auth.js 304 1ms
+[2025-12-30T20:07:42.393Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T20:07:42.407Z] [INFO] GET /js/board.js 304 2ms
+[2025-12-30T20:07:42.411Z] [INFO] GET /js/offline.js 304 2ms
+[2025-12-30T20:07:42.423Z] [INFO] GET /js/task-modal.js 304 1ms
+[2025-12-30T20:07:42.440Z] [INFO] GET /js/calendar.js 304 2ms
+[2025-12-30T20:07:42.448Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T20:07:42.452Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T20:07:42.470Z] [INFO] GET /js/undo.js 304 1ms
+[2025-12-30T20:07:42.480Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T20:07:42.486Z] [INFO] GET /js/tour.js 200 2ms
+[2025-12-30T20:07:42.503Z] [INFO] GET /js/proposals.js 304 2ms
+[2025-12-30T20:07:42.512Z] [INFO] GET /js/notifications.js 304 2ms
+[2025-12-30T20:07:42.519Z] [INFO] GET /js/gitea.js 304 2ms
+[2025-12-30T20:07:42.537Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T20:07:42.551Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T20:07:42.559Z] [INFO] GET /css/proposals.css 304 2ms
+[2025-12-30T20:07:42.568Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T20:07:42.584Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T20:07:43.139Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T20:07:43.141Z] [INFO] POST /api/auth/login 200 504ms
+[2025-12-30T20:07:43.203Z] [INFO] GET /api/auth/users 304 6ms
+[2025-12-30T20:07:43.221Z] [INFO] Socket connected: HG (RRXGtbn32odtTbikAAAS)
+[2025-12-30T20:07:43.230Z] [INFO] Socket connected: HG (7bI9dRwnREgfkfJKAAAT)
+[2025-12-30T20:07:43.239Z] [INFO] GET /api/projects 401 5ms
+[2025-12-30T20:07:43.273Z] [INFO] Socket disconnected: HG (7bI9dRwnREgfkfJKAAAT)
+[2025-12-30T20:07:43.278Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms
+[2025-12-30T20:07:43.312Z] [INFO] GET /api/notifications 401 2ms
+[2025-12-30T20:08:07.522Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:08:37.609Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:09:07.698Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:09:37.822Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T20:09:54.630Z] [INFO] POST /api/columns 201 10ms
+[2025-12-30T20:09:54.628Z] [INFO] Spalte erstellt: Ausstehend in Projekt 2 (Filter: in_progress)
+[2025-12-30T20:09:54.645Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:09:55.581Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:09:59.791Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T20:10:07.097Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:10:07.938Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:10:08.167Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T20:10:09.509Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:10:17.143Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:10:17.857Z] [INFO] Aufgabe erstellt: Antwort von WERFT 4.0 - Namensänderung (ID: 15) von MH
+[2025-12-30T20:10:17.860Z] [INFO] POST /api/tasks 201 11ms
+[2025-12-30T20:10:18.858Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:10:22.293Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:10:24.433Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:10:25.492Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:10:26.438Z] [INFO] Spalte aktualisiert: Ausstehend (ID: 10)
+[2025-12-30T20:10:26.440Z] [INFO] PUT /api/columns/10 200 14ms
+[2025-12-30T20:10:27.445Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:10:38.050Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:10:44.601Z] [INFO] GET /api/tasks/6 200 11ms
+[2025-12-30T20:10:44.637Z] [INFO] GET /api/subtasks/6 200 9ms
+[2025-12-30T20:10:44.651Z] [INFO] GET /api/links/6 304 11ms
+[2025-12-30T20:10:44.661Z] [INFO] GET /api/files/6 304 6ms
+[2025-12-30T20:10:44.670Z] [INFO] GET /api/tasks/6/history 404 6ms
+[2025-12-30T20:10:44.674Z] [INFO] GET /api/comments/6 304 8ms
+[2025-12-30T20:10:44.687Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMjU0MjcsImV4cCI6MTc2NzEyNjAyN30.wzO67IRoiMIPUX1lkTZclbnzgHYvWcCDJzQT40hFYxI 200 6ms
+[2025-12-30T20:10:45.602Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T20:11:00.619Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T20:11:06.713Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:11:08.149Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:11:11.796Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:11:23.508Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:11:29.778Z] [INFO] POST /api/subtasks 400 3ms
+[2025-12-30T20:11:30.791Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T20:11:34.399Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:11:34.781Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T20:11:34.784Z] [INFO] PUT /api/tasks/6 200 13ms
+[2025-12-30T20:11:35.795Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:11:36.846Z] [INFO] GET / 200 7ms
+[2025-12-30T20:11:36.884Z] [INFO] Socket disconnected: MH (LF-AW1wwa7cigUNeAAAD)
+[2025-12-30T20:11:36.908Z] [INFO] GET /css/variables.css 200 8ms
+[2025-12-30T20:11:36.911Z] [INFO] GET /css/components.css 200 9ms
+[2025-12-30T20:11:36.914Z] [INFO] GET /css/board.css 200 10ms
+[2025-12-30T20:11:36.917Z] [INFO] GET /css/modal.css 200 11ms
+[2025-12-30T20:11:36.922Z] [INFO] GET /css/base.css 200 9ms
+[2025-12-30T20:11:36.934Z] [INFO] GET /css/calendar.css 200 2ms
+[2025-12-30T20:11:36.950Z] [INFO] GET /css/admin.css 200 5ms
+[2025-12-30T20:11:36.951Z] [INFO] GET /css/list.css 200 5ms
+[2025-12-30T20:11:36.953Z] [INFO] GET /css/proposals.css 200 4ms
+[2025-12-30T20:11:36.956Z] [INFO] GET /css/notifications.css 200 4ms
+[2025-12-30T20:11:36.969Z] [INFO] GET /css/gitea.css 200 2ms
+[2025-12-30T20:11:36.971Z] [INFO] GET /css/responsive.css 200 3ms
+[2025-12-30T20:11:36.979Z] [INFO] GET /js/app.js 200 3ms
+[2025-12-30T20:11:37.085Z] [INFO] GET /js/auth.js 200 11ms
+[2025-12-30T20:11:37.086Z] [INFO] GET /js/store.js 200 11ms
+[2025-12-30T20:11:37.089Z] [INFO] GET /js/offline.js 200 12ms
+[2025-12-30T20:11:37.090Z] [INFO] GET /js/api.js 200 11ms
+[2025-12-30T20:11:37.093Z] [INFO] GET /js/board.js 200 10ms
+[2025-12-30T20:11:37.094Z] [INFO] GET /js/app.js 304 2ms
+[2025-12-30T20:11:37.094Z] [INFO] GET /js/sync.js 200 4ms
+[2025-12-30T20:11:37.115Z] [INFO] GET /js/task-modal.js 200 6ms
+[2025-12-30T20:11:37.117Z] [INFO] GET /js/auth.js 304 3ms
+[2025-12-30T20:11:37.120Z] [INFO] GET /js/calendar.js 200 8ms
+[2025-12-30T20:11:37.123Z] [INFO] GET /js/list.js 200 5ms
+[2025-12-30T20:11:37.132Z] [INFO] GET /js/shortcuts.js 200 5ms
+[2025-12-30T20:11:37.133Z] [INFO] GET /js/undo.js 200 5ms
+[2025-12-30T20:11:37.147Z] [INFO] GET /js/admin.js 200 2ms
+[2025-12-30T20:11:37.156Z] [INFO] GET /js/proposals.js 200 5ms
+[2025-12-30T20:11:37.158Z] [INFO] GET /js/utils.js 200 5ms
+[2025-12-30T20:11:37.159Z] [INFO] GET /js/notifications.js 200 4ms
+[2025-12-30T20:11:37.161Z] [INFO] GET /js/gitea.js 200 5ms
+[2025-12-30T20:11:37.210Z] [INFO] POST /api/auth/refresh 200 16ms
+[2025-12-30T20:11:37.281Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T20:11:37.283Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T20:11:37.285Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T20:11:37.299Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T20:11:37.303Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T20:11:37.304Z] [INFO] GET /js/board.js 200 3ms
+[2025-12-30T20:11:37.318Z] [INFO] GET /js/list.js 304 2ms
+[2025-12-30T20:11:37.334Z] [INFO] GET /js/shortcuts.js 304 3ms
+[2025-12-30T20:11:37.336Z] [INFO] GET /js/task-modal.js 200 6ms
+[2025-12-30T20:11:37.338Z] [INFO] GET /js/undo.js 304 5ms
+[2025-12-30T20:11:37.339Z] [INFO] GET /js/admin.js 304 3ms
+[2025-12-30T20:11:37.341Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T20:11:37.370Z] [INFO] GET /api/auth/users 200 9ms
+[2025-12-30T20:11:37.446Z] [INFO] GET /api/auth/users 304 8ms
+[2025-12-30T20:11:37.449Z] [INFO] GET /assets/icons/task.svg 200 14ms
+[2025-12-30T20:11:37.465Z] [INFO] Socket connected: MH (Ev1DRio03xzQ4o2jAAAV)
+[2025-12-30T20:11:37.474Z] [INFO] GET /api/projects 200 6ms
+[2025-12-30T20:11:37.509Z] [INFO] MH joined project:[object Object]
+[2025-12-30T20:11:37.520Z] [INFO] GET /api/stats/dashboard?projectId=2 200 8ms
+[2025-12-30T20:11:37.533Z] [INFO] GET /api/tasks/project/2 200 12ms
+[2025-12-30T20:11:37.545Z] [INFO] GET /api/columns/2 200 7ms
+[2025-12-30T20:11:37.553Z] [INFO] GET /api/labels/2 304 6ms
+[2025-12-30T20:11:37.606Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 8ms
+[2025-12-30T20:11:37.640Z] [INFO] GET /api/notifications 304 12ms
+[2025-12-30T20:11:38.244Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:11:39.235Z] [INFO] GET /api/tasks/6 200 14ms
+[2025-12-30T20:11:39.265Z] [INFO] GET /api/subtasks/6 304 7ms
+[2025-12-30T20:11:39.271Z] [INFO] GET /api/links/6 304 5ms
+[2025-12-30T20:11:39.278Z] [INFO] GET /api/files/6 304 6ms
+[2025-12-30T20:11:39.287Z] [INFO] GET /api/tasks/6/history 404 9ms
+[2025-12-30T20:11:39.292Z] [INFO] GET /api/comments/6 304 10ms
+[2025-12-30T20:11:39.302Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMjU0OTcsImV4cCI6MTc2NzEyNjA5N30.YWXiReZJkLp6quTbByUGXCOeY4CEp8L7NHfXSI0iALU 200 4ms
+[2025-12-30T20:11:40.243Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T20:11:43.547Z] [INFO] POST /api/subtasks 400 6ms
+[2025-12-30T20:11:44.567Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T20:11:45.222Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T20:11:45.224Z] [INFO] PUT /api/tasks/6 200 12ms
+[2025-12-30T20:11:46.226Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T20:11:46.893Z] [INFO] GET /api/tasks/6 200 8ms
+[2025-12-30T20:11:46.926Z] [INFO] GET /api/subtasks/6 304 5ms
+[2025-12-30T20:11:46.935Z] [INFO] GET /api/comments/6 304 5ms
+[2025-12-30T20:11:46.942Z] [INFO] GET /api/files/6 304 6ms
+[2025-12-30T20:11:46.948Z] [INFO] GET /api/links/6 304 5ms
+[2025-12-30T20:11:46.953Z] [INFO] GET /api/tasks/6/history 404 4ms
+[2025-12-30T20:11:46.968Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMjU1MDYsImV4cCI6MTc2NzEyNjEwNn0.rhJ8QnvxBgb7vzWIPn0exejdy0iZ6PIeZ2UyXALo3LU 200 6ms
+[2025-12-30T20:11:47.895Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:11:51.312Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:11:59.832Z] [INFO] Subtask erstellt: "Statuskarte aktualisiert" solche Benachrichtigungen machen oben mehr Sinn, weil sie damit keine Buttons überlappen in Task 6
+[2025-12-30T20:11:59.834Z] [INFO] POST /api/subtasks 201 9ms
+[2025-12-30T20:12:00.845Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:12:08.366Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T20:12:08.373Z] [INFO] PUT /api/tasks/6 200 21ms
+[2025-12-30T20:12:08.377Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:12:09.359Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T20:12:09.950Z] [INFO] GET /api/tasks/6 200 10ms
+[2025-12-30T20:12:09.982Z] [INFO] GET /api/subtasks/6 200 7ms
+[2025-12-30T20:12:09.987Z] [INFO] GET /api/tasks/6/history 404 4ms
+[2025-12-30T20:12:09.993Z] [INFO] GET /api/files/6 304 5ms
+[2025-12-30T20:12:10.002Z] [INFO] GET /api/links/6 304 8ms
+[2025-12-30T20:12:10.012Z] [INFO] GET /api/comments/6 304 8ms
+[2025-12-30T20:12:10.020Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMjU1MjksImV4cCI6MTc2NzEyNjEyOX0.z8MQTCxZTkfB2eN9TK1YLpHws-AgJrWPnK0rSbPE2WI 200 5ms
+[2025-12-30T20:12:10.955Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T20:12:11.361Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T20:12:11.363Z] [INFO] PUT /api/tasks/6 200 9ms
+[2025-12-30T20:12:12.373Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:12:20.833Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:12:23.366Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:12:28.983Z] [INFO] GET /api/tasks/14 200 8ms
+[2025-12-30T20:12:29.013Z] [INFO] GET /api/links/14 304 7ms
+[2025-12-30T20:12:29.020Z] [INFO] GET /api/subtasks/14 304 6ms
+[2025-12-30T20:12:29.026Z] [INFO] GET /api/files/14 304 5ms
+[2025-12-30T20:12:29.033Z] [INFO] GET /api/comments/14 304 4ms
+[2025-12-30T20:12:29.038Z] [INFO] GET /api/tasks/14/history 404 4ms
+[2025-12-30T20:12:29.992Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T20:12:32.612Z] [INFO] Aufgabe aktualisiert: Namensänderung - Wohin alles eine E-Mail schicken? (ID: 14)
+[2025-12-30T20:12:32.614Z] [INFO] PUT /api/tasks/14 200 10ms
+[2025-12-30T20:12:38.509Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:12:39.046Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14)
+[2025-12-30T20:12:39.048Z] [INFO] PUT /api/tasks/14 200 12ms
+[2025-12-30T20:12:39.665Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:12:40.059Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14)
+[2025-12-30T20:12:40.061Z] [INFO] PUT /api/tasks/14 200 11ms
+[2025-12-30T20:12:41.058Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:13:08.618Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:13:38.733Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:14:08.854Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T20:14:38.948Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:15:09.066Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T20:15:17.500Z] [INFO] SIGTERM empfangen, fahre herunter...
+[2025-12-30T20:15:29.087Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T20:15:29.151Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T20:15:29.155Z] [INFO] Datenbank initialisiert
+[2025-12-30T20:15:29.159Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T20:15:29.159Z] [INFO] Umgebung: production
+[2025-12-30T20:15:29.161Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T20:15:29.161Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T20:15:29.322Z] [INFO] Socket connected: HG (qgKtn1deEBv1AvK_AAAB)
+[2025-12-30T20:15:29.408Z] [INFO] Socket connected: MH (lEFmiz6oENY5uR4OAAAD)
+[2025-12-30T20:15:29.454Z] [INFO] MH joined project:[object Object]
+[2025-12-30T20:15:33.415Z] [INFO] GET /api/health 200 10ms
+[2025-12-30T20:16:03.545Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T20:16:04.778Z] [INFO] GET / 200 7ms
+[2025-12-30T20:16:04.853Z] [INFO] Socket disconnected: HG (qgKtn1deEBv1AvK_AAAB)
+[2025-12-30T20:16:04.864Z] [INFO] GET /css/variables.css 200 6ms
+[2025-12-30T20:16:04.868Z] [INFO] GET /css/base.css 200 6ms
+[2025-12-30T20:16:04.893Z] [INFO] GET /css/components.css 200 5ms
+[2025-12-30T20:16:04.901Z] [INFO] GET /css/board.css 200 3ms
+[2025-12-30T20:16:04.929Z] [INFO] GET /css/modal.css 200 9ms
+[2025-12-30T20:16:04.937Z] [INFO] GET /css/list.css 200 13ms
+[2025-12-30T20:16:04.942Z] [INFO] GET /css/admin.css 200 15ms
+[2025-12-30T20:16:04.944Z] [INFO] GET /css/calendar.css 200 11ms
+[2025-12-30T20:16:04.946Z] [INFO] GET /css/proposals.css 200 5ms
+[2025-12-30T20:16:04.955Z] [INFO] GET /css/notifications.css 200 4ms
+[2025-12-30T20:16:04.968Z] [INFO] GET /css/gitea.css 200 3ms
+[2025-12-30T20:16:04.983Z] [INFO] GET /css/responsive.css 200 4ms
+[2025-12-30T20:16:05.001Z] [INFO] GET /js/app.js 200 5ms
+[2025-12-30T20:16:05.100Z] [INFO] GET /js/board.js 200 5ms
+[2025-12-30T20:16:05.101Z] [INFO] GET /js/sync.js 200 6ms
+[2025-12-30T20:16:05.103Z] [INFO] GET /js/store.js 200 6ms
+[2025-12-30T20:16:05.107Z] [INFO] GET /js/offline.js 200 9ms
+[2025-12-30T20:16:05.109Z] [INFO] GET /js/api.js 200 4ms
+[2025-12-30T20:16:05.111Z] [INFO] GET /js/auth.js 200 9ms
+[2025-12-30T20:16:05.137Z] [INFO] GET /js/task-modal.js 200 8ms
+[2025-12-30T20:16:05.138Z] [INFO] GET /js/calendar.js 200 7ms
+[2025-12-30T20:16:05.144Z] [INFO] GET /js/shortcuts.js 200 9ms
+[2025-12-30T20:16:05.146Z] [INFO] GET /js/list.js 200 4ms
+[2025-12-30T20:16:05.149Z] [INFO] GET /js/undo.js 200 4ms
+[2025-12-30T20:16:05.153Z] [INFO] GET /js/admin.js 200 2ms
+[2025-12-30T20:16:05.180Z] [INFO] GET /js/proposals.js 200 9ms
+[2025-12-30T20:16:05.185Z] [INFO] GET /js/notifications.js 200 10ms
+[2025-12-30T20:16:05.189Z] [INFO] GET /js/gitea.js 200 8ms
+[2025-12-30T20:16:05.192Z] [INFO] GET /js/utils.js 200 5ms
+[2025-12-30T20:16:05.267Z] [INFO] GET /assets/icons/task.svg 304 9ms
+[2025-12-30T20:16:10.097Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T20:16:10.099Z] [INFO] POST /api/auth/login 200 545ms
+[2025-12-30T20:16:10.140Z] [INFO] GET /api/auth/users 304 9ms
+[2025-12-30T20:16:10.166Z] [INFO] Socket connected: HG (EmoDiAXFj8WxN8mcAAAG)
+[2025-12-30T20:16:10.179Z] [INFO] GET /api/projects 401 7ms
+[2025-12-30T20:16:10.188Z] [INFO] Socket connected: HG (Rge3kBOED8O2fNukAAAH)
+[2025-12-30T20:16:10.210Z] [INFO] Socket disconnected: HG (EmoDiAXFj8WxN8mcAAAG)
+[2025-12-30T20:16:10.218Z] [INFO] GET /api/proposals?sort=date&archived=0 401 3ms
+[2025-12-30T20:16:10.253Z] [INFO] GET /api/notifications 401 1ms
+[2025-12-30T20:16:14.093Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T20:16:14.095Z] [INFO] GET /css/variables.css 304 1ms
+[2025-12-30T20:16:14.096Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T20:16:14.098Z] [INFO] GET /css/components.css 304 1ms
+[2025-12-30T20:16:14.100Z] [INFO] GET /css/calendar.css 304 1ms
+[2025-12-30T20:16:14.101Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T20:16:14.122Z] [INFO] GET /css/list.css 304 3ms
+[2025-12-30T20:16:14.128Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T20:16:14.132Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T20:16:14.136Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T20:16:14.140Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T20:16:14.143Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T20:16:29.199Z] [INFO] Backup erstellt: backup_2025-12-30T20-16-29-171Z.db
+[2025-12-30T20:16:29.201Z] [INFO] Altes Backup gelöscht: backup_2025-12-28T21-13-56-595Z.db
+[2025-12-30T20:16:29.202Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T20:16:33.644Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:17:03.770Z] [INFO] GET /api/health 200 6ms
+[2025-12-30T20:17:33.866Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:17:59.758Z] [INFO] SIGTERM empfangen, fahre herunter...
+[2025-12-30T20:18:11.223Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T20:18:11.273Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T20:18:11.275Z] [INFO] Datenbank initialisiert
+[2025-12-30T20:18:11.278Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T20:18:11.278Z] [INFO] Umgebung: production
+[2025-12-30T20:18:11.280Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T20:18:11.280Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T20:18:11.481Z] [INFO] Socket connected: HG (8HLUd19BRas_IYNNAAAB)
+[2025-12-30T20:18:12.363Z] [INFO] Socket connected: MH (xUbKBNYSbnkzcsY1AAAD)
+[2025-12-30T20:18:12.398Z] [INFO] MH joined project:[object Object]
+[2025-12-30T20:18:15.575Z] [INFO] GET /api/health 200 8ms
+[2025-12-30T20:18:45.670Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T20:19:11.303Z] [INFO] Backup erstellt: backup_2025-12-30T20-19-11-288Z.db
+[2025-12-30T20:19:11.305Z] [INFO] Altes Backup gelöscht: backup_2025-12-28T21-20-30-328Z.db
+[2025-12-30T20:19:11.307Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T20:19:15.774Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:19:30.280Z] [INFO] GET / 200 17ms
+[2025-12-30T20:19:30.341Z] [INFO] Socket disconnected: HG (8HLUd19BRas_IYNNAAAB)
+[2025-12-30T20:19:30.353Z] [INFO] GET /css/variables.css 200 3ms
+[2025-12-30T20:19:30.384Z] [INFO] GET /css/base.css 200 5ms
+[2025-12-30T20:19:30.420Z] [INFO] GET /css/components.css 200 7ms
+[2025-12-30T20:19:30.428Z] [INFO] GET /css/board.css 200 11ms
+[2025-12-30T20:19:30.433Z] [INFO] GET /css/calendar.css 200 10ms
+[2025-12-30T20:19:30.434Z] [INFO] GET /css/list.css 200 8ms
+[2025-12-30T20:19:30.437Z] [INFO] GET /css/modal.css 200 6ms
+[2025-12-30T20:19:30.439Z] [INFO] GET /css/admin.css 200 7ms
+[2025-12-30T20:19:30.447Z] [INFO] GET /css/proposals.css 200 3ms
+[2025-12-30T20:19:30.477Z] [INFO] GET /css/notifications.css 200 6ms
+[2025-12-30T20:19:30.490Z] [INFO] GET /css/gitea.css 200 6ms
+[2025-12-30T20:19:30.497Z] [INFO] GET /css/responsive.css 200 4ms
+[2025-12-30T20:19:30.531Z] [INFO] GET /js/app.js 200 4ms
+[2025-12-30T20:19:30.600Z] [INFO] GET /js/store.js 200 7ms
+[2025-12-30T20:19:30.606Z] [INFO] GET /js/api.js 200 11ms
+[2025-12-30T20:19:30.610Z] [INFO] GET /js/board.js 200 13ms
+[2025-12-30T20:19:30.614Z] [INFO] GET /js/auth.js 200 11ms
+[2025-12-30T20:19:30.616Z] [INFO] GET /js/offline.js 200 8ms
+[2025-12-30T20:19:30.618Z] [INFO] GET /js/sync.js 200 7ms
+[2025-12-30T20:19:30.636Z] [INFO] GET /js/task-modal.js 200 6ms
+[2025-12-30T20:19:30.640Z] [INFO] GET /js/calendar.js 200 2ms
+[2025-12-30T20:19:30.645Z] [INFO] GET /js/undo.js 200 2ms
+[2025-12-30T20:19:30.647Z] [INFO] GET /js/shortcuts.js 200 3ms
+[2025-12-30T20:19:30.650Z] [INFO] GET /js/list.js 200 2ms
+[2025-12-30T20:19:30.663Z] [INFO] GET /js/admin.js 200 1ms
+[2025-12-30T20:19:30.667Z] [INFO] GET /js/proposals.js 200 1ms
+[2025-12-30T20:19:30.671Z] [INFO] GET /js/notifications.js 200 2ms
+[2025-12-30T20:19:30.682Z] [INFO] GET /js/gitea.js 200 7ms
+[2025-12-30T20:19:30.688Z] [INFO] GET /js/utils.js 200 5ms
+[2025-12-30T20:19:30.760Z] [INFO] GET /assets/icons/task.svg 304 11ms
+[2025-12-30T20:19:35.536Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T20:19:35.538Z] [INFO] POST /api/auth/login 200 495ms
+[2025-12-30T20:19:35.580Z] [INFO] GET /api/auth/users 304 6ms
+[2025-12-30T20:19:35.615Z] [INFO] Socket connected: HG (7Zh8X7vAVWM8LhdAAAAG)
+[2025-12-30T20:19:35.625Z] [INFO] GET /api/projects 401 7ms
+[2025-12-30T20:19:35.630Z] [INFO] Socket connected: HG (SN_-zK-L9x4VIw3WAAAH)
+[2025-12-30T20:19:35.653Z] [INFO] Socket disconnected: HG (7Zh8X7vAVWM8LhdAAAAG)
+[2025-12-30T20:19:35.662Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms
+[2025-12-30T20:19:35.692Z] [INFO] GET /api/notifications 401 1ms
+[2025-12-30T20:19:40.576Z] [INFO] GET /css/base.css 304 3ms
+[2025-12-30T20:19:40.580Z] [INFO] GET /css/modal.css 304 2ms
+[2025-12-30T20:19:40.583Z] [INFO] GET /css/variables.css 304 2ms
+[2025-12-30T20:19:40.586Z] [INFO] GET /css/board.css 304 2ms
+[2025-12-30T20:19:40.588Z] [INFO] GET /css/calendar.css 304 1ms
+[2025-12-30T20:19:40.590Z] [INFO] GET /css/components.css 304 1ms
+[2025-12-30T20:19:40.604Z] [INFO] GET /css/list.css 304 0ms
+[2025-12-30T20:19:40.610Z] [INFO] GET /css/proposals.css 304 2ms
+[2025-12-30T20:19:40.617Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T20:19:40.621Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T20:19:40.624Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T20:19:40.626Z] [INFO] GET /css/gitea.css 304 3ms
+[2025-12-30T20:19:45.890Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T20:20:15.998Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T20:20:46.131Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T20:21:16.253Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:21:46.365Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T20:22:16.469Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:22:46.586Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T20:23:16.689Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:23:32.343Z] [INFO] POST /api/auth/logout 401 6ms
+[2025-12-30T20:23:32.362Z] [INFO] Socket disconnected: MH (xUbKBNYSbnkzcsY1AAAD)
+[2025-12-30T20:23:46.801Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T20:24:16.487Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T20:24:16.488Z] [INFO] POST /api/auth/login 200 497ms
+[2025-12-30T20:24:16.552Z] [INFO] Socket connected: MH (CXJPZxy3YyB1jw79AAAK)
+[2025-12-30T20:24:16.557Z] [INFO] GET /api/auth/users 304 10ms
+[2025-12-30T20:24:16.583Z] [INFO] Socket connected: MH (LaPq7mNfG3b2hx8WAAAL)
+[2025-12-30T20:24:16.600Z] [INFO] GET /api/projects 304 10ms
+[2025-12-30T20:24:16.630Z] [INFO] GET /api/stats/dashboard?projectId=2 304 7ms
+[2025-12-30T20:24:16.636Z] [INFO] GET /api/columns/2 304 5ms
+[2025-12-30T20:24:16.638Z] [INFO] MH joined project:[object Object]
+[2025-12-30T20:24:16.681Z] [INFO] GET /api/tasks/project/2 200 35ms
+[2025-12-30T20:24:16.687Z] [INFO] GET /api/labels/2 304 4ms
+[2025-12-30T20:24:16.717Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 6ms
+[2025-12-30T20:24:16.919Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:24:20.722Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:24:22.472Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:24:23.700Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:24:32.737Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T20:24:35.173Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:24:39.281Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:24:47.017Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:25:17.115Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:25:28.143Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:25:37.693Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:25:40.433Z] [INFO] Aufgabe erstellt: Mein Unternehmenskonto (ID: 16) von MH
+[2025-12-30T20:25:40.436Z] [INFO] POST /api/tasks 201 16ms
+[2025-12-30T20:25:41.440Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:25:42.959Z] [INFO] GET /api/tasks/16 200 14ms
+[2025-12-30T20:25:42.982Z] [INFO] GET /api/subtasks/16 200 4ms
+[2025-12-30T20:25:43.005Z] [INFO] GET /api/links/16 200 4ms
+[2025-12-30T20:25:43.023Z] [INFO] GET /api/files/16 200 7ms
+[2025-12-30T20:25:43.033Z] [INFO] GET /api/comments/16 200 7ms
+[2025-12-30T20:25:43.039Z] [INFO] GET /api/tasks/16/history 404 5ms
+[2025-12-30T20:25:43.963Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:25:47.219Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:25:51.013Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:25:53.821Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:25:59.490Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:25:59.880Z] [INFO] Link erstellt: https://info.mein-unternehmenskonto.de/ für Task 16
+[2025-12-30T20:25:59.883Z] [INFO] POST /api/links 201 17ms
+[2025-12-30T20:26:00.873Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:26:01.295Z] [INFO] Aufgabe aktualisiert: Mein Unternehmenskonto (ID: 16)
+[2025-12-30T20:26:01.298Z] [INFO] PUT /api/tasks/16 200 12ms
+[2025-12-30T20:26:02.314Z] [INFO] POST /api/auth/refresh 200 15ms
+[2025-12-30T20:26:17.298Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:26:40.335Z] [INFO] GET /api/tasks/1 200 8ms
+[2025-12-30T20:26:40.375Z] [INFO] GET /api/files/1 200 13ms
+[2025-12-30T20:26:40.381Z] [INFO] GET /api/subtasks/1 200 17ms
+[2025-12-30T20:26:40.386Z] [INFO] GET /api/tasks/1/history 404 20ms
+[2025-12-30T20:26:40.390Z] [INFO] GET /api/comments/1 200 3ms
+[2025-12-30T20:26:40.396Z] [INFO] GET /api/links/1 200 4ms
+[2025-12-30T20:26:41.340Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T20:26:41.458Z] [INFO] Aufgabe aktualisiert: Router (ID: 1)
+[2025-12-30T20:26:41.460Z] [INFO] PUT /api/tasks/1 200 9ms
+[2025-12-30T20:26:42.466Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:26:45.217Z] [INFO] GET /api/tasks/6 200 15ms
+[2025-12-30T20:26:45.252Z] [INFO] GET /api/subtasks/6 304 11ms
+[2025-12-30T20:26:45.262Z] [INFO] GET /api/tasks/6/history 404 9ms
+[2025-12-30T20:26:45.272Z] [INFO] GET /api/links/6 304 8ms
+[2025-12-30T20:26:45.287Z] [INFO] GET /api/files/6 304 13ms
+[2025-12-30T20:26:45.299Z] [INFO] GET /api/comments/6 304 10ms
+[2025-12-30T20:26:45.335Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMjY0MDIsImV4cCI6MTc2NzEyNzAwMn0.TuH-a9Z1eGfrAq4TmXkofWajKlCUcPvNwQpDwLi2Zf0 200 28ms
+[2025-12-30T20:26:46.211Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:26:47.423Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:26:50.386Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T20:27:01.479Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:27:17.531Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:27:21.875Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:27:25.994Z] [INFO] Subtask erstellt: Unteraufgaben Personen zuweisen können (oder wird es dann zu unübersichtlich?) in Task 6
+[2025-12-30T20:27:25.996Z] [INFO] POST /api/subtasks 201 12ms
+[2025-12-30T20:27:26.998Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:27:27.690Z] [INFO] SIGTERM empfangen, fahre herunter...
+[2025-12-30T20:27:48.774Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T20:27:48.896Z] [INFO] Umgebung: production
+[2025-12-30T20:27:48.898Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T20:27:48.898Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T20:27:48.885Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T20:27:48.890Z] [INFO] Datenbank initialisiert
+[2025-12-30T20:27:48.896Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T20:27:49.846Z] [INFO] CSRF: Token missing or not stored for user 4, generated new token
+[2025-12-30T20:27:49.854Z] [INFO] PUT /api/subtasks/50/position 403 18ms
+[2025-12-30T20:27:49.885Z] [INFO] PUT /api/subtasks/50/position 200 9ms
+[2025-12-30T20:27:50.713Z] [INFO] Socket connected: MH (dzTKALyMJSagyR3LAAAB)
+[2025-12-30T20:27:50.735Z] [INFO] MH joined project:[object Object]
+[2025-12-30T20:27:51.249Z] [INFO] Socket connected: MH (Yplg6doWhillx6riAAAD)
+[2025-12-30T20:27:51.273Z] [INFO] MH joined project:[object Object]
+[2025-12-30T20:27:52.967Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T20:27:53.203Z] [INFO] Socket connected: HG (5w29K0T8xu_5EruwAAAF)
+[2025-12-30T20:27:54.950Z] [INFO] POST /api/auth/refresh 200 17ms
+[2025-12-30T20:28:02.809Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:28:12.426Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:28:21.061Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:28:22.426Z] [INFO] Subtask erstellt: Das Verschieben von Unteraufgaben geht nur innerhalb des sichtbaren Fensters und nicht darüber hinaus in Task 6
+[2025-12-30T20:28:22.429Z] [INFO] POST /api/subtasks 201 9ms
+[2025-12-30T20:28:23.102Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T20:28:23.443Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:28:41.374Z] [INFO] PUT /api/subtasks/51/position 200 5ms
+[2025-12-30T20:28:45.279Z] [INFO] DELETE /api/subtasks/51 200 5ms
+[2025-12-30T20:28:46.296Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T20:28:46.801Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T20:28:46.806Z] [INFO] PUT /api/tasks/6 200 20ms
+[2025-12-30T20:28:47.802Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:28:48.914Z] [INFO] Backup erstellt: backup_2025-12-30T20-28-48-898Z.db
+[2025-12-30T20:28:48.918Z] [INFO] Altes Backup gelöscht: backup_2025-12-28T21-37-16-598Z.db
+[2025-12-30T20:28:48.919Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T20:28:51.631Z] [INFO] GET /api/tasks/14 200 9ms
+[2025-12-30T20:28:51.677Z] [INFO] GET /api/subtasks/14 304 24ms
+[2025-12-30T20:28:51.700Z] [INFO] GET /api/links/14 304 20ms
+[2025-12-30T20:28:51.710Z] [INFO] GET /api/comments/14 304 4ms
+[2025-12-30T20:28:51.715Z] [INFO] GET /api/files/14 304 4ms
+[2025-12-30T20:28:51.727Z] [INFO] GET /api/tasks/14/history 404 8ms
+[2025-12-30T20:28:52.642Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:28:53.207Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T20:29:23.327Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:29:53.455Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:30:00.677Z] [INFO] GET / 200 20ms
+[2025-12-30T20:30:00.740Z] [INFO] Socket disconnected: HG (5w29K0T8xu_5EruwAAAF)
+[2025-12-30T20:30:00.755Z] [INFO] GET /css/variables.css 200 6ms
+[2025-12-30T20:30:00.786Z] [INFO] GET /css/base.css 200 7ms
+[2025-12-30T20:30:00.822Z] [INFO] GET /css/components.css 200 11ms
+[2025-12-30T20:30:00.832Z] [INFO] GET /css/board.css 200 12ms
+[2025-12-30T20:30:00.835Z] [INFO] GET /css/modal.css 200 10ms
+[2025-12-30T20:30:00.837Z] [INFO] GET /css/list.css 200 10ms
+[2025-12-30T20:30:00.839Z] [INFO] GET /css/admin.css 200 9ms
+[2025-12-30T20:30:00.841Z] [INFO] GET /css/calendar.css 200 7ms
+[2025-12-30T20:30:00.873Z] [INFO] GET /css/proposals.css 200 8ms
+[2025-12-30T20:30:00.880Z] [INFO] GET /css/notifications.css 200 10ms
+[2025-12-30T20:30:00.887Z] [INFO] GET /css/gitea.css 200 10ms
+[2025-12-30T20:30:00.904Z] [INFO] GET /css/responsive.css 200 16ms
+[2025-12-30T20:30:00.908Z] [INFO] GET /js/app.js 200 17ms
+[2025-12-30T20:30:00.991Z] [INFO] GET /js/api.js 200 7ms
+[2025-12-30T20:30:00.994Z] [INFO] GET /js/store.js 200 11ms
+[2025-12-30T20:30:00.997Z] [INFO] GET /js/auth.js 200 12ms
+[2025-12-30T20:30:01.001Z] [INFO] GET /js/sync.js 200 15ms
+[2025-12-30T20:30:01.005Z] [INFO] GET /js/offline.js 200 17ms
+[2025-12-30T20:30:01.039Z] [INFO] GET /js/board.js 200 11ms
+[2025-12-30T20:30:01.040Z] [INFO] GET /js/task-modal.js 200 10ms
+[2025-12-30T20:30:01.044Z] [INFO] GET /js/calendar.js 200 7ms
+[2025-12-30T20:30:01.049Z] [INFO] GET /js/list.js 200 3ms
+[2025-12-30T20:30:01.063Z] [INFO] GET /js/shortcuts.js 200 2ms
+[2025-12-30T20:30:01.077Z] [INFO] GET /js/admin.js 200 7ms
+[2025-12-30T20:30:01.080Z] [INFO] GET /js/proposals.js 200 7ms
+[2025-12-30T20:30:01.084Z] [INFO] GET /js/notifications.js 200 8ms
+[2025-12-30T20:30:01.087Z] [INFO] GET /js/undo.js 200 5ms
+[2025-12-30T20:30:01.094Z] [INFO] GET /js/gitea.js 200 3ms
+[2025-12-30T20:30:01.103Z] [INFO] GET /js/utils.js 200 3ms
+[2025-12-30T20:30:01.153Z] [INFO] GET /assets/icons/task.svg 200 5ms
+[2025-12-30T20:30:07.505Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T20:30:07.506Z] [INFO] POST /api/auth/login 200 524ms
+[2025-12-30T20:30:07.555Z] [INFO] GET /api/auth/users 200 10ms
+[2025-12-30T20:30:07.582Z] [INFO] Socket connected: HG (QQTtl6gwGKN65DwHAAAI)
+[2025-12-30T20:30:07.594Z] [INFO] Socket connected: HG (ERDM9SnwIE1YS2KPAAAJ)
+[2025-12-30T20:30:07.604Z] [INFO] GET /api/projects 200 7ms
+[2025-12-30T20:30:07.640Z] [INFO] GET /api/stats/dashboard?projectId=2 200 4ms
+[2025-12-30T20:30:07.647Z] [INFO] GET /api/columns/2 200 6ms
+[2025-12-30T20:30:07.652Z] [INFO] GET /api/labels/2 200 4ms
+[2025-12-30T20:30:07.664Z] [INFO] GET /api/tasks/project/2 200 11ms
+[2025-12-30T20:30:07.666Z] [INFO] HG joined project:[object Object]
+[2025-12-30T20:30:07.713Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 200 5ms
+[2025-12-30T20:30:07.756Z] [INFO] GET /api/notifications 200 9ms
+[2025-12-30T20:30:10.316Z] [INFO] GET /api/tasks/6 200 9ms
+[2025-12-30T20:30:10.363Z] [INFO] GET /api/subtasks/6 200 12ms
+[2025-12-30T20:30:10.369Z] [INFO] GET /api/files/6 304 16ms
+[2025-12-30T20:30:10.376Z] [INFO] GET /api/links/6 304 22ms
+[2025-12-30T20:30:10.381Z] [INFO] GET /api/tasks/6/history 404 4ms
+[2025-12-30T20:30:10.391Z] [INFO] GET /api/comments/6 304 9ms
+[2025-12-30T20:30:10.419Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI2NjA3LCJleHAiOjE3NjcxMjcyMDd9.vIy0ZHDHMsvm-54mjkT5qIPJOZLj9Q_aXRUAqzasC8I 200 10ms
+[2025-12-30T20:30:11.322Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:30:23.560Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:30:23.706Z] [INFO] PUT /api/subtasks/49 200 8ms
+[2025-12-30T20:30:23.748Z] [INFO] PUT /api/subtasks/49/position 200 4ms
+[2025-12-30T20:30:24.703Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:30:28.198Z] [INFO] PUT /api/subtasks/49 200 9ms
+[2025-12-30T20:30:29.203Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T20:30:33.087Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:30:33.093Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T20:30:33.095Z] [INFO] PUT /api/tasks/6 200 6ms
+[2025-12-30T20:30:35.923Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:30:35.928Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T20:30:35.930Z] [INFO] PUT /api/tasks/6 200 5ms
+[2025-12-30T20:30:46.350Z] [INFO] PUT /api/subtasks/49/position 200 11ms
+[2025-12-30T20:30:51.182Z] [INFO] PUT /api/subtasks/49/position 200 10ms
+[2025-12-30T20:30:53.653Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:31:03.312Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:31:04.325Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T20:31:07.633Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:31:11.459Z] [INFO] PUT /api/subtasks/49 200 7ms
+[2025-12-30T20:31:12.460Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:31:16.023Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:31:17.242Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:31:23.751Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:31:26.849Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:31:26.856Z] [INFO] PUT /api/subtasks/49 200 5ms
+[2025-12-30T20:31:27.851Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:31:32.042Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T20:31:32.044Z] [INFO] PUT /api/tasks/6 200 9ms
+[2025-12-30T20:31:33.046Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:31:35.010Z] [INFO] GET /api/tasks/14 200 9ms
+[2025-12-30T20:31:35.053Z] [INFO] GET /api/subtasks/14 200 8ms
+[2025-12-30T20:31:35.061Z] [INFO] GET /api/links/14 200 5ms
+[2025-12-30T20:31:35.094Z] [INFO] GET /api/files/14 200 8ms
+[2025-12-30T20:31:35.101Z] [INFO] GET /api/comments/14 200 4ms
+[2025-12-30T20:31:35.119Z] [INFO] GET /api/tasks/14/history 404 8ms
+[2025-12-30T20:31:36.012Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:31:37.814Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14)
+[2025-12-30T20:31:37.817Z] [INFO] PUT /api/tasks/14 200 10ms
+[2025-12-30T20:31:38.815Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:31:40.590Z] [INFO] GET /api/tasks/6 200 15ms
+[2025-12-30T20:31:40.630Z] [INFO] GET /api/subtasks/6 200 6ms
+[2025-12-30T20:31:40.634Z] [INFO] GET /api/files/6 304 9ms
+[2025-12-30T20:31:40.639Z] [INFO] GET /api/comments/6 304 4ms
+[2025-12-30T20:31:40.644Z] [INFO] GET /api/tasks/6/history 404 8ms
+[2025-12-30T20:31:40.648Z] [INFO] GET /api/links/6 304 8ms
+[2025-12-30T20:31:40.674Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI2Njk4LCJleHAiOjE3NjcxMjcyOTh9.gTw8iM6iQLzKeTMLkhe1gfK75H4LQ7rTf9oVCma4_mY 200 8ms
+[2025-12-30T20:31:41.591Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T20:31:53.858Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:32:00.610Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:32:01.117Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI2NzIwLCJleHAiOjE3NjcxMjczMjB9.Oa1KmGqDkZWQKY9ne6Yl5ikxqupnmYkPq8IhqJI-BOA 200 6ms
+[2025-12-30T20:32:02.118Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T20:32:03.216Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T20:32:03.219Z] [INFO] PUT /api/tasks/6 200 12ms
+[2025-12-30T20:32:04.210Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:32:04.644Z] [INFO] GET /api/tasks/6 200 8ms
+[2025-12-30T20:32:04.689Z] [INFO] GET /api/subtasks/6 304 8ms
+[2025-12-30T20:32:04.699Z] [INFO] GET /api/links/6 304 5ms
+[2025-12-30T20:32:04.706Z] [INFO] GET /api/files/6 304 5ms
+[2025-12-30T20:32:04.714Z] [INFO] GET /api/comments/6 304 6ms
+[2025-12-30T20:32:04.718Z] [INFO] GET /api/tasks/6/history 404 9ms
+[2025-12-30T20:32:04.756Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI2NzI0LCJleHAiOjE3NjcxMjczMjR9.9akOrEBOKlTSPM0XsDvWDonZMYfRCP1eONc1TJjQweA 200 6ms
+[2025-12-30T20:32:05.658Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T20:32:05.893Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14)
+[2025-12-30T20:32:05.895Z] [INFO] PUT /api/tasks/14 200 7ms
+[2025-12-30T20:32:05.929Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14)
+[2025-12-30T20:32:05.931Z] [INFO] PUT /api/tasks/14 200 11ms
+[2025-12-30T20:32:07.500Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T20:32:09.658Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T20:32:09.660Z] [INFO] PUT /api/tasks/6 200 11ms
+[2025-12-30T20:32:10.660Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:32:18.758Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:32:20.561Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T20:32:21.505Z] [INFO] Aufgabe erstellt: test (ID: 17) von MH
+[2025-12-30T20:32:21.507Z] [INFO] POST /api/tasks 201 8ms
+[2025-12-30T20:32:22.530Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:32:23.963Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:32:25.822Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T20:32:26.446Z] [INFO] GET /api/tasks/17 200 11ms
+[2025-12-30T20:32:26.480Z] [INFO] GET /api/subtasks/17 200 10ms
+[2025-12-30T20:32:26.512Z] [INFO] GET /api/links/17 200 13ms
+[2025-12-30T20:32:26.524Z] [INFO] GET /api/files/17 200 9ms
+[2025-12-30T20:32:26.532Z] [INFO] GET /api/comments/17 200 6ms
+[2025-12-30T20:32:26.538Z] [INFO] GET /api/tasks/17/history 404 4ms
+[2025-12-30T20:32:27.453Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:32:29.291Z] [INFO] Aufgabe gelöscht: test (ID: 17)
+[2025-12-30T20:32:29.293Z] [INFO] DELETE /api/tasks/17 200 5ms
+[2025-12-30T20:32:29.318Z] [INFO] PUT /api/tasks/17 404 4ms
+[2025-12-30T20:32:30.308Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:32:41.821Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T20:32:43.279Z] [INFO] Spalte aktualisiert: Ausstehend (ID: 10)
+[2025-12-30T20:32:43.280Z] [INFO] PUT /api/columns/10 200 7ms
+[2025-12-30T20:32:44.293Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:32:54.089Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T20:33:23.857Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:33:24.193Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:33:24.542Z] [INFO] Spalte Ausstehend von Position 5 zu 4 verschoben
+[2025-12-30T20:33:24.545Z] [INFO] PUT /api/columns/10/position 200 14ms
+[2025-12-30T20:33:26.662Z] [INFO] Spalte Ausstehend von Position 4 zu 5 verschoben
+[2025-12-30T20:33:26.666Z] [INFO] PUT /api/columns/10/position 200 11ms
+[2025-12-30T20:33:33.176Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:33:35.468Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:33:37.409Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:33:37.762Z] [INFO] Spalte aktualisiert: Ausstehend + (ID: 10)
+[2025-12-30T20:33:37.764Z] [INFO] PUT /api/columns/10 200 6ms
+[2025-12-30T20:33:38.755Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T20:33:43.265Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:33:44.490Z] [INFO] Spalte aktualisiert: Ausstehend (ID: 10)
+[2025-12-30T20:33:44.492Z] [INFO] PUT /api/columns/10 200 7ms
+[2025-12-30T20:33:45.494Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:33:54.314Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:34:12.008Z] [INFO] GET /api/tasks/6 200 8ms
+[2025-12-30T20:34:12.058Z] [INFO] GET /api/subtasks/6 304 10ms
+[2025-12-30T20:34:12.096Z] [INFO] GET /api/links/6 304 10ms
+[2025-12-30T20:34:12.130Z] [INFO] GET /api/comments/6 304 8ms
+[2025-12-30T20:34:12.138Z] [INFO] GET /api/files/6 304 6ms
+[2025-12-30T20:34:12.144Z] [INFO] GET /api/tasks/6/history 404 4ms
+[2025-12-30T20:34:12.178Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI2ODI1LCJleHAiOjE3NjcxMjc0MjV9.W-ZvipW2H9JrHyw0X871exdLVzQ0PE4T7MhFujY8POE 200 7ms
+[2025-12-30T20:34:13.021Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T20:34:16.700Z] [INFO] 1 Datei(en) hochgeladen für Task 6
+[2025-12-30T20:34:16.702Z] [INFO] POST /api/files/6 201 25ms
+[2025-12-30T20:34:16.746Z] [INFO] GET /api/files/preview/7?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI2ODUzLCJleHAiOjE3NjcxMjc0NTN9.jQDcVPoaNC1Zj2KOL4F09HRpv4YYsGjt8Ij93Hjrn0Q 200 10ms
+[2025-12-30T20:34:16.756Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI2ODUzLCJleHAiOjE3NjcxMjc0NTN9.jQDcVPoaNC1Zj2KOL4F09HRpv4YYsGjt8Ij93Hjrn0Q 200 7ms
+[2025-12-30T20:34:24.405Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:34:50.055Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T20:34:50.058Z] [INFO] PUT /api/tasks/6 200 10ms
+[2025-12-30T20:34:51.062Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T20:34:54.499Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:34:56.211Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:34:58.259Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:34:59.599Z] [INFO] POST /api/auth/refresh 200 18ms
+[2025-12-30T20:35:00.736Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T20:35:05.223Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T20:35:05.627Z] [INFO] Aufgabe erstellt: Testaufgabe Statuskarte (ID: 18) von HG
+[2025-12-30T20:35:05.629Z] [INFO] POST /api/tasks 201 8ms
+[2025-12-30T20:35:06.629Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:35:12.410Z] [INFO] GET /api/tasks/18 200 6ms
+[2025-12-30T20:35:12.443Z] [INFO] GET /api/subtasks/18 200 4ms
+[2025-12-30T20:35:12.450Z] [INFO] GET /api/links/18 200 5ms
+[2025-12-30T20:35:12.457Z] [INFO] GET /api/files/18 200 5ms
+[2025-12-30T20:35:12.480Z] [INFO] GET /api/comments/18 200 6ms
+[2025-12-30T20:35:12.489Z] [INFO] GET /api/tasks/18/history 404 6ms
+[2025-12-30T20:35:13.421Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:35:15.607Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T20:35:15.997Z] [INFO] Aufgabe gelöscht: Testaufgabe Statuskarte (ID: 18)
+[2025-12-30T20:35:16.000Z] [INFO] DELETE /api/tasks/18 200 11ms
+[2025-12-30T20:35:16.037Z] [INFO] PUT /api/tasks/18 404 5ms
+[2025-12-30T20:35:17.017Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:35:24.604Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:35:50.947Z] [INFO] GET /api/tasks/16 200 6ms
+[2025-12-30T20:35:50.974Z] [INFO] GET /api/subtasks/16 304 6ms
+[2025-12-30T20:35:51.004Z] [INFO] GET /api/links/16 200 11ms
+[2025-12-30T20:35:51.012Z] [INFO] GET /api/comments/16 304 6ms
+[2025-12-30T20:35:51.017Z] [INFO] GET /api/files/16 304 4ms
+[2025-12-30T20:35:51.021Z] [INFO] GET /api/tasks/16/history 404 3ms
+[2025-12-30T20:35:51.885Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:35:52.885Z] [INFO] Aufgabe aktualisiert: Mein Unternehmenskonto (ID: 16)
+[2025-12-30T20:35:52.886Z] [INFO] PUT /api/tasks/16 200 7ms
+[2025-12-30T20:35:53.888Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:35:54.685Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:36:04.540Z] [INFO] GET /api/tasks/4 200 7ms
+[2025-12-30T20:36:04.571Z] [INFO] GET /api/subtasks/4 200 4ms
+[2025-12-30T20:36:04.576Z] [INFO] GET /api/links/4 200 4ms
+[2025-12-30T20:36:04.581Z] [INFO] GET /api/files/4 200 4ms
+[2025-12-30T20:36:04.585Z] [INFO] GET /api/tasks/4/history 404 4ms
+[2025-12-30T20:36:04.589Z] [INFO] GET /api/comments/4 200 7ms
+[2025-12-30T20:36:05.541Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T20:36:06.856Z] [INFO] PUT /api/subtasks/2 200 6ms
+[2025-12-30T20:36:06.879Z] [INFO] PUT /api/subtasks/2/position 200 4ms
+[2025-12-30T20:36:07.878Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:36:11.774Z] [INFO] Aufgabe aktualisiert: Corporated Design (ID: 4)
+[2025-12-30T20:36:11.777Z] [INFO] PUT /api/tasks/4 200 9ms
+[2025-12-30T20:36:12.793Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:36:17.143Z] [INFO] GET /api/tasks/3 200 7ms
+[2025-12-30T20:36:17.175Z] [INFO] GET /api/subtasks/3 200 6ms
+[2025-12-30T20:36:17.178Z] [INFO] GET /api/tasks/3/history 404 8ms
+[2025-12-30T20:36:17.181Z] [INFO] GET /api/files/3 200 11ms
+[2025-12-30T20:36:17.185Z] [INFO] GET /api/comments/3 200 14ms
+[2025-12-30T20:36:17.188Z] [INFO] GET /api/links/3 200 17ms
+[2025-12-30T20:36:18.161Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:36:24.260Z] [INFO] Aufgabe aktualisiert: Bilanzbuchhaltung - Bundesanzeiger (ID: 3)
+[2025-12-30T20:36:24.262Z] [INFO] PUT /api/tasks/3 200 7ms
+[2025-12-30T20:36:24.776Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T20:36:25.285Z] [INFO] POST /api/auth/refresh 200 15ms
+[2025-12-30T20:36:54.874Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T20:37:24.996Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T20:37:55.125Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:38:25.226Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:38:55.325Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:39:25.426Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:39:38.258Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:39:55.542Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:39:57.010Z] [INFO] GET /api/tasks/14 200 10ms
+[2025-12-30T20:39:57.052Z] [INFO] GET /api/subtasks/14 304 12ms
+[2025-12-30T20:39:57.076Z] [INFO] GET /api/links/14 304 5ms
+[2025-12-30T20:39:57.083Z] [INFO] GET /api/files/14 304 5ms
+[2025-12-30T20:39:57.088Z] [INFO] GET /api/comments/14 304 4ms
+[2025-12-30T20:39:57.093Z] [INFO] GET /api/tasks/14/history 404 3ms
+[2025-12-30T20:39:58.013Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:40:18.600Z] [INFO] PUT /api/subtasks/44 200 21ms
+[2025-12-30T20:40:19.596Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T20:40:20.427Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14)
+[2025-12-30T20:40:20.429Z] [INFO] PUT /api/tasks/14 200 8ms
+[2025-12-30T20:40:21.444Z] [INFO] POST /api/auth/refresh 200 15ms
+[2025-12-30T20:40:25.707Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T20:40:31.416Z] [INFO] GET /api/tasks/14 200 9ms
+[2025-12-30T20:40:31.456Z] [INFO] GET /api/links/14 304 8ms
+[2025-12-30T20:40:31.463Z] [INFO] GET /api/subtasks/14 200 6ms
+[2025-12-30T20:40:31.468Z] [INFO] GET /api/tasks/14/history 404 4ms
+[2025-12-30T20:40:31.473Z] [INFO] GET /api/files/14 304 4ms
+[2025-12-30T20:40:31.481Z] [INFO] GET /api/comments/14 304 4ms
+[2025-12-30T20:40:32.427Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:40:55.821Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:41:02.536Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T20:41:06.356Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14)
+[2025-12-30T20:41:06.362Z] [INFO] PUT /api/tasks/14 200 28ms
+[2025-12-30T20:41:07.353Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T20:41:25.917Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:41:56.030Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T20:42:09.299Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:42:21.326Z] [INFO] POST / 200 13ms
+[2025-12-30T20:42:21.424Z] [INFO] POST / 200 1ms
+[2025-12-30T20:42:26.137Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:42:56.246Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:42:57.918Z] [INFO] GET / 304 6ms
+[2025-12-30T20:42:57.958Z] [INFO] Socket disconnected: HG (QQTtl6gwGKN65DwHAAAI)
+[2025-12-30T20:42:57.963Z] [INFO] Socket disconnected: HG (ERDM9SnwIE1YS2KPAAAJ)
+[2025-12-30T20:42:57.965Z] [INFO] GET /css/variables.css 304 3ms
+[2025-12-30T20:42:57.992Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T20:42:58.020Z] [INFO] GET /css/components.css 304 1ms
+[2025-12-30T20:42:58.027Z] [INFO] GET /css/board.css 304 2ms
+[2025-12-30T20:42:58.034Z] [INFO] GET /css/modal.css 304 4ms
+[2025-12-30T20:42:58.039Z] [INFO] GET /css/calendar.css 304 3ms
+[2025-12-30T20:42:58.042Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T20:42:58.043Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T20:42:58.051Z] [INFO] GET /css/proposals.css 304 3ms
+[2025-12-30T20:42:58.061Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T20:42:58.063Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T20:42:58.066Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T20:42:58.074Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T20:42:58.130Z] [INFO] GET /js/board.js 304 3ms
+[2025-12-30T20:42:58.132Z] [INFO] GET /js/auth.js 304 3ms
+[2025-12-30T20:42:58.134Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T20:42:58.137Z] [INFO] GET /js/api.js 304 2ms
+[2025-12-30T20:42:58.138Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T20:42:58.140Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T20:42:58.162Z] [INFO] GET /js/task-modal.js 304 2ms
+[2025-12-30T20:42:58.168Z] [INFO] GET /js/calendar.js 304 5ms
+[2025-12-30T20:42:58.170Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T20:42:58.172Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T20:42:58.174Z] [INFO] GET /js/undo.js 304 2ms
+[2025-12-30T20:42:58.175Z] [INFO] GET /js/admin.js 304 2ms
+[2025-12-30T20:42:58.187Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T20:42:58.195Z] [INFO] GET /js/notifications.js 304 0ms
+[2025-12-30T20:42:58.199Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T20:42:58.203Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T20:42:58.244Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:42:58.247Z] [INFO] GET /assets/icons/task.svg 304 2ms
+[2025-12-30T20:42:58.255Z] [INFO] GET /api/auth/users 304 9ms
+[2025-12-30T20:42:58.291Z] [INFO] GET /api/auth/users 304 4ms
+[2025-12-30T20:42:58.326Z] [INFO] Socket connected: HG (8VNfH2tQTUDGNBCQAAAL)
+[2025-12-30T20:42:58.334Z] [INFO] GET /api/projects 304 6ms
+[2025-12-30T20:42:58.372Z] [INFO] GET /api/stats/dashboard?projectId=2 304 6ms
+[2025-12-30T20:42:58.376Z] [INFO] GET /api/columns/2 200 4ms
+[2025-12-30T20:42:58.382Z] [INFO] GET /api/labels/2 304 5ms
+[2025-12-30T20:42:58.384Z] [INFO] HG joined project:[object Object]
+[2025-12-30T20:42:58.399Z] [INFO] GET /api/tasks/project/2 200 16ms
+[2025-12-30T20:42:58.444Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 9ms
+[2025-12-30T20:42:58.485Z] [INFO] GET /api/notifications 304 11ms
+[2025-12-30T20:42:59.952Z] [INFO] GET /sw.js 200 3ms
+[2025-12-30T20:43:00.001Z] [INFO] GET / 304 14ms
+[2025-12-30T20:43:00.006Z] [INFO] GET /index.html 304 3ms
+[2025-12-30T20:43:00.009Z] [INFO] GET /css/variables.css 304 2ms
+[2025-12-30T20:43:00.040Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T20:43:00.045Z] [INFO] GET /css/board.css 304 2ms
+[2025-12-30T20:43:00.046Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T20:43:00.076Z] [INFO] GET /css/modal.css 304 2ms
+[2025-12-30T20:43:00.084Z] [INFO] GET /css/calendar.css 304 1ms
+[2025-12-30T20:43:00.086Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T20:43:00.118Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T20:43:00.119Z] [INFO] GET /js/utils.js 304 2ms
+[2025-12-30T20:43:00.123Z] [INFO] GET /js/api.js 304 0ms
+[2025-12-30T20:43:00.155Z] [INFO] GET /js/auth.js 304 2ms
+[2025-12-30T20:43:00.160Z] [INFO] GET /js/store.js 304 2ms
+[2025-12-30T20:43:00.166Z] [INFO] GET /js/sync.js 304 2ms
+[2025-12-30T20:43:00.191Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T20:43:00.194Z] [INFO] GET /js/board.js 304 0ms
+[2025-12-30T20:43:00.206Z] [INFO] GET /js/task-modal.js 304 2ms
+[2025-12-30T20:43:00.226Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T20:43:00.229Z] [INFO] GET /js/list.js 304 0ms
+[2025-12-30T20:43:00.241Z] [INFO] GET /js/shortcuts.js 304 2ms
+[2025-12-30T20:43:00.258Z] [INFO] GET /js/tour.js 304 1ms
+[2025-12-30T20:43:00.259Z] [INFO] GET /js/undo.js 304 2ms
+[2025-12-30T20:43:00.274Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T20:43:00.292Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T20:43:00.297Z] [INFO] GET /js/notifications.js 304 3ms
+[2025-12-30T20:43:00.332Z] [INFO] GET /js/gitea.js 304 2ms
+[2025-12-30T20:43:00.336Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T20:43:00.339Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T20:43:00.369Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T20:43:00.375Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T20:43:00.387Z] [INFO] GET /css/gitea.css 304 2ms
+[2025-12-30T20:43:04.637Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:43:26.368Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:43:56.462Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:44:26.575Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T20:44:56.677Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:45:10.821Z] [INFO] GET /api/tasks/14 200 15ms
+[2025-12-30T20:45:10.857Z] [INFO] GET /api/subtasks/14 304 7ms
+[2025-12-30T20:45:10.915Z] [INFO] GET /api/links/14 304 10ms
+[2025-12-30T20:45:10.922Z] [INFO] GET /api/files/14 304 5ms
+[2025-12-30T20:45:10.925Z] [INFO] GET /api/tasks/14/history 404 6ms
+[2025-12-30T20:45:10.928Z] [INFO] GET /api/comments/14 304 10ms
+[2025-12-30T20:45:11.754Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:45:22.949Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:45:26.793Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:45:34.941Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:45:37.316Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:45:38.998Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T20:45:41.024Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:45:42.576Z] [INFO] GET /api/tasks/15 200 5ms
+[2025-12-30T20:45:42.614Z] [INFO] GET /api/subtasks/15 200 6ms
+[2025-12-30T20:45:42.651Z] [INFO] GET /api/links/15 200 8ms
+[2025-12-30T20:45:42.687Z] [INFO] GET /api/files/15 200 4ms
+[2025-12-30T20:45:42.692Z] [INFO] GET /api/comments/15 200 4ms
+[2025-12-30T20:45:42.695Z] [INFO] GET /api/tasks/15/history 404 7ms
+[2025-12-30T20:45:43.583Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:45:45.154Z] [INFO] Aufgabe aktualisiert: Antwort von WERFT 4.0 - Namensänderung (ID: 15)
+[2025-12-30T20:45:45.156Z] [INFO] PUT /api/tasks/15 200 12ms
+[2025-12-30T20:45:46.153Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:45:46.725Z] [INFO] GET / 304 1ms
+[2025-12-30T20:45:46.762Z] [INFO] Socket disconnected: HG (8VNfH2tQTUDGNBCQAAAL)
+[2025-12-30T20:45:46.774Z] [INFO] GET /css/base.css 304 3ms
+[2025-12-30T20:45:46.776Z] [INFO] GET /css/board.css 304 4ms
+[2025-12-30T20:45:46.778Z] [INFO] GET /css/variables.css 304 6ms
+[2025-12-30T20:45:46.779Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T20:45:46.785Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T20:45:46.804Z] [INFO] GET /css/calendar.css 304 1ms
+[2025-12-30T20:45:46.805Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T20:45:46.808Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T20:45:46.810Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T20:45:46.812Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T20:45:46.834Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T20:45:46.839Z] [INFO] GET /css/responsive.css 304 2ms
+[2025-12-30T20:45:46.842Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T20:45:46.887Z] [INFO] GET /js/store.js 304 9ms
+[2025-12-30T20:45:46.892Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T20:45:46.894Z] [INFO] GET /js/auth.js 304 1ms
+[2025-12-30T20:45:46.896Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T20:45:46.897Z] [INFO] GET /js/board.js 304 0ms
+[2025-12-30T20:45:46.899Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T20:45:46.916Z] [INFO] GET /js/task-modal.js 304 1ms
+[2025-12-30T20:45:46.920Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T20:45:46.925Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T20:45:46.926Z] [INFO] GET /js/undo.js 304 1ms
+[2025-12-30T20:45:46.928Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T20:45:46.930Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T20:45:46.944Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T20:45:46.947Z] [INFO] GET /js/notifications.js 304 0ms
+[2025-12-30T20:45:46.951Z] [INFO] GET /js/gitea.js 304 0ms
+[2025-12-30T20:45:46.956Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T20:45:46.996Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:45:47.003Z] [INFO] GET /api/auth/users 304 5ms
+[2025-12-30T20:45:47.005Z] [INFO] GET /assets/icons/task.svg 304 6ms
+[2025-12-30T20:45:47.043Z] [INFO] GET /api/auth/users 304 8ms
+[2025-12-30T20:45:47.079Z] [INFO] GET /api/projects 304 5ms
+[2025-12-30T20:45:47.084Z] [INFO] Socket connected: HG (kKJ3x0Yq712agD3fAAAN)
+[2025-12-30T20:45:47.137Z] [INFO] GET /api/tasks/project/2 200 25ms
+[2025-12-30T20:45:47.149Z] [INFO] GET /api/labels/2 304 8ms
+[2025-12-30T20:45:47.154Z] [INFO] GET /api/columns/2 304 5ms
+[2025-12-30T20:45:47.160Z] [INFO] GET /api/stats/dashboard?projectId=2 304 10ms
+[2025-12-30T20:45:47.161Z] [INFO] HG joined project:[object Object]
+[2025-12-30T20:45:47.195Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 5ms
+[2025-12-30T20:45:47.229Z] [INFO] GET /api/notifications 304 5ms
+[2025-12-30T20:45:48.730Z] [INFO] GET /sw.js 304 1ms
+[2025-12-30T20:45:52.626Z] [INFO] GET /api/tasks/6 200 6ms
+[2025-12-30T20:45:52.670Z] [INFO] GET /api/files/6 200 9ms
+[2025-12-30T20:45:52.674Z] [INFO] GET /api/tasks/6/history 404 11ms
+[2025-12-30T20:45:52.682Z] [INFO] GET /api/links/6 304 5ms
+[2025-12-30T20:45:52.689Z] [INFO] GET /api/subtasks/6 304 6ms
+[2025-12-30T20:45:52.692Z] [INFO] GET /api/comments/6 304 7ms
+[2025-12-30T20:45:52.711Z] [INFO] GET /api/files/preview/7?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI3Mzc4LCJleHAiOjE3NjcxMjc5Nzh9.9wr_dPVScjZvvIT8-GU3_X6Y9Opdv7GBSor1dwrjMAo 200 9ms
+[2025-12-30T20:45:52.710Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI3Mzc4LCJleHAiOjE3NjcxMjc5Nzh9.9wr_dPVScjZvvIT8-GU3_X6Y9Opdv7GBSor1dwrjMAo 200 5ms
+[2025-12-30T20:45:53.638Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T20:45:56.880Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:46:00.308Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T20:46:00.310Z] [INFO] PUT /api/tasks/6 200 7ms
+[2025-12-30T20:46:01.316Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:46:17.447Z] [INFO] POST /api/auth/refresh 200 18ms
+[2025-12-30T20:46:23.249Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T20:46:26.977Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:46:57.083Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:47:27.208Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T20:47:57.357Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T20:48:27.456Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:48:35.807Z] [INFO] GET / 200 11ms
+[2025-12-30T20:48:39.179Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14)
+[2025-12-30T20:48:39.181Z] [INFO] PUT /api/tasks/14 200 9ms
+[2025-12-30T20:48:40.102Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T20:48:40.621Z] [INFO] GET /api/tasks/6 200 10ms
+[2025-12-30T20:48:40.651Z] [INFO] GET /api/subtasks/6 200 5ms
+[2025-12-30T20:48:40.677Z] [INFO] GET /api/links/6 304 5ms
+[2025-12-30T20:48:40.689Z] [INFO] GET /api/files/6 200 6ms
+[2025-12-30T20:48:40.692Z] [INFO] GET /api/comments/6 304 8ms
+[2025-12-30T20:48:40.698Z] [INFO] GET /api/tasks/6/history 404 3ms
+[2025-12-30T20:48:40.731Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMjc3MjAsImV4cCI6MTc2NzEyODMyMH0.JyNhpY_TtjuQZfoZOS0sAJyhSK0LIrZmuoPJETH6eE4 200 9ms
+[2025-12-30T20:48:40.729Z] [INFO] GET /api/files/preview/7?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMjc3MjAsImV4cCI6MTc2NzEyODMyMH0.JyNhpY_TtjuQZfoZOS0sAJyhSK0LIrZmuoPJETH6eE4 200 15ms
+[2025-12-30T20:48:41.627Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:48:57.573Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:48:59.880Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T20:49:19.754Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:49:20.764Z] [INFO] Subtask erstellt: Erinnerungsfunktion im Kalender (z.B. LexOffice mit dem L Paket Buchen, oder Vertrag X kündigen oder sowas) in Task 6
+[2025-12-30T20:49:20.767Z] [INFO] POST /api/subtasks 201 8ms
+[2025-12-30T20:49:21.765Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T20:49:22.246Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T20:49:22.249Z] [INFO] PUT /api/tasks/6 200 13ms
+[2025-12-30T20:49:23.248Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T20:49:27.667Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:49:57.773Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T20:50:27.859Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:50:41.841Z] [INFO] GET /api/tasks/14 200 12ms
+[2025-12-30T20:50:41.885Z] [INFO] GET /api/subtasks/14 304 6ms
+[2025-12-30T20:50:41.908Z] [INFO] GET /api/links/14 304 4ms
+[2025-12-30T20:50:41.918Z] [INFO] GET /api/files/14 304 5ms
+[2025-12-30T20:50:41.922Z] [INFO] GET /api/comments/14 304 9ms
+[2025-12-30T20:50:41.927Z] [INFO] GET /api/tasks/14/history 404 4ms
+[2025-12-30T20:50:42.802Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T20:50:58.002Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T20:51:28.104Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:51:58.212Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:52:28.298Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:52:58.453Z] [INFO] GET /api/health 200 11ms
+[2025-12-30T20:53:28.566Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T20:53:58.677Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T20:54:02.217Z] [INFO] Socket disconnected: MH (dzTKALyMJSagyR3LAAAB)
+[2025-12-30T20:54:02.484Z] [INFO] Socket disconnected: MH (Yplg6doWhillx6riAAAD)
+[2025-12-30T20:54:28.796Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:54:58.891Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:55:28.998Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T20:55:59.120Z] [INFO] GET /api/health 200 8ms
+[2025-12-30T20:56:22.233Z] [INFO] Logout: HG
+[2025-12-30T20:56:22.235Z] [INFO] POST /api/auth/logout 200 18ms
+[2025-12-30T20:56:22.268Z] [INFO] Socket disconnected: HG (kKJ3x0Yq712agD3fAAAN)
+[2025-12-30T20:56:29.232Z] [INFO] GET /api/health 200 6ms
+[2025-12-30T20:56:59.354Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:57:29.447Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:57:59.539Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:58:29.661Z] [INFO] GET /api/health 200 6ms
+[2025-12-30T20:58:59.757Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T20:59:29.887Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:00:00.013Z] [INFO] GET /api/health 200 8ms
+[2025-12-30T21:00:30.140Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:01:00.246Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:01:40.785Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T21:01:40.870Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T21:01:40.877Z] [INFO] Umgebung: production
+[2025-12-30T21:01:40.873Z] [INFO] Datenbank initialisiert
+[2025-12-30T21:01:40.876Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T21:01:40.878Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T21:01:40.878Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T21:01:44.724Z] [INFO] GET /api/health 200 14ms
+[2025-12-30T21:01:50.571Z] [INFO] HEAD / 200 7ms
+[2025-12-30T21:01:55.982Z] [INFO] GET /api/knowledge/categories 401 5ms
+[2025-12-30T21:02:14.828Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:02:40.903Z] [INFO] Backup erstellt: backup_2025-12-30T21-02-40-899Z.db
+[2025-12-30T21:02:40.907Z] [INFO] Altes Backup gelöscht: backup_2025-12-28T21-51-26-664Z.db
+[2025-12-30T21:02:40.910Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T21:02:44.933Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:03:15.073Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T21:03:45.183Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:04:15.294Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T21:04:25.340Z] [INFO] GET / 200 17ms
+[2025-12-30T21:04:25.418Z] [INFO] GET /css/variables.css 200 4ms
+[2025-12-30T21:04:25.457Z] [INFO] GET /css/base.css 200 7ms
+[2025-12-30T21:04:25.508Z] [INFO] GET /css/components.css 200 11ms
+[2025-12-30T21:04:25.514Z] [INFO] GET /css/calendar.css 200 11ms
+[2025-12-30T21:04:25.519Z] [INFO] GET /css/modal.css 200 9ms
+[2025-12-30T21:04:25.520Z] [INFO] GET /css/board.css 200 9ms
+[2025-12-30T21:04:25.521Z] [INFO] GET /css/list.css 200 9ms
+[2025-12-30T21:04:25.523Z] [INFO] GET /css/admin.css 200 7ms
+[2025-12-30T21:04:25.562Z] [INFO] GET /css/proposals.css 200 6ms
+[2025-12-30T21:04:25.563Z] [INFO] GET /css/notifications.css 200 5ms
+[2025-12-30T21:04:25.569Z] [INFO] GET /css/knowledge.css 200 4ms
+[2025-12-30T21:04:25.573Z] [INFO] GET /css/gitea.css 200 6ms
+[2025-12-30T21:04:25.587Z] [INFO] GET /css/responsive.css 200 16ms
+[2025-12-30T21:04:25.594Z] [INFO] GET /js/app.js 200 3ms
+[2025-12-30T21:04:25.656Z] [INFO] GET /js/api.js 200 5ms
+[2025-12-30T21:04:25.661Z] [INFO] GET /js/store.js 200 8ms
+[2025-12-30T21:04:25.666Z] [INFO] GET /js/board.js 200 7ms
+[2025-12-30T21:04:25.667Z] [INFO] GET /js/auth.js 200 7ms
+[2025-12-30T21:04:25.670Z] [INFO] GET /js/offline.js 200 5ms
+[2025-12-30T21:04:25.671Z] [INFO] GET /js/sync.js 200 3ms
+[2025-12-30T21:04:25.688Z] [INFO] GET /js/calendar.js 200 2ms
+[2025-12-30T21:04:25.689Z] [INFO] GET /js/task-modal.js 200 4ms
+[2025-12-30T21:04:25.698Z] [INFO] GET /js/list.js 200 3ms
+[2025-12-30T21:04:25.700Z] [INFO] GET /js/shortcuts.js 200 3ms
+[2025-12-30T21:04:25.701Z] [INFO] GET /js/undo.js 200 2ms
+[2025-12-30T21:04:25.726Z] [INFO] GET /js/proposals.js 200 7ms
+[2025-12-30T21:04:25.728Z] [INFO] GET /js/notifications.js 200 8ms
+[2025-12-30T21:04:25.735Z] [INFO] GET /js/gitea.js 200 4ms
+[2025-12-30T21:04:25.737Z] [INFO] GET /js/knowledge.js 200 4ms
+[2025-12-30T21:04:25.740Z] [INFO] GET /js/utils.js 200 6ms
+[2025-12-30T21:04:25.743Z] [INFO] GET /js/admin.js 200 4ms
+[2025-12-30T21:04:25.822Z] [INFO] GET /assets/icons/task.svg 200 10ms
+[2025-12-30T21:04:31.018Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T21:04:31.020Z] [INFO] POST /api/auth/login 200 491ms
+[2025-12-30T21:04:31.054Z] [INFO] GET /api/auth/users 304 8ms
+[2025-12-30T21:04:31.090Z] [INFO] GET /api/projects 401 8ms
+[2025-12-30T21:04:31.102Z] [INFO] Socket connected: HG (IUkPAgmQtZqH93PlAAAC)
+[2025-12-30T21:04:31.111Z] [INFO] Socket connected: HG (KXOy45I_OxDMIxauAAAD)
+[2025-12-30T21:04:31.123Z] [INFO] GET /api/proposals?sort=date&archived=0 401 1ms
+[2025-12-30T21:04:31.140Z] [INFO] Socket disconnected: HG (KXOy45I_OxDMIxauAAAD)
+[2025-12-30T21:04:31.155Z] [INFO] GET /api/notifications 401 4ms
+[2025-12-30T21:04:31.188Z] [INFO] GET /api/knowledge/categories 401 3ms
+[2025-12-30T21:04:45.440Z] [INFO] GET /api/health 200 7ms
+[2025-12-30T21:04:55.351Z] [INFO] Socket disconnected: HG (IUkPAgmQtZqH93PlAAAC)
+[2025-12-30T21:04:58.656Z] [INFO] GET / 304 4ms
+[2025-12-30T21:04:58.704Z] [INFO] GET /css/variables.css 304 1ms
+[2025-12-30T21:04:58.713Z] [INFO] GET /css/base.css 304 5ms
+[2025-12-30T21:04:58.716Z] [INFO] GET /css/components.css 304 1ms
+[2025-12-30T21:04:58.719Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T21:04:58.722Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T21:04:58.724Z] [INFO] GET /css/calendar.css 304 1ms
+[2025-12-30T21:04:58.759Z] [INFO] GET /css/list.css 304 10ms
+[2025-12-30T21:04:58.763Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T21:04:58.767Z] [INFO] GET /css/proposals.css 304 3ms
+[2025-12-30T21:04:58.771Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T21:04:58.774Z] [INFO] GET /css/gitea.css 304 2ms
+[2025-12-30T21:04:58.775Z] [INFO] GET /css/knowledge.css 304 2ms
+[2025-12-30T21:04:58.786Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T21:04:58.794Z] [INFO] GET /js/app.js 304 0ms
+[2025-12-30T21:04:58.841Z] [INFO] GET /js/api.js 304 2ms
+[2025-12-30T21:04:58.844Z] [INFO] GET /js/auth.js 304 2ms
+[2025-12-30T21:04:58.847Z] [INFO] GET /js/board.js 304 1ms
+[2025-12-30T21:04:58.851Z] [INFO] GET /js/offline.js 304 2ms
+[2025-12-30T21:04:58.853Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T21:04:58.854Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T21:04:58.878Z] [INFO] GET /js/calendar.js 304 4ms
+[2025-12-30T21:04:58.881Z] [INFO] GET /js/task-modal.js 304 5ms
+[2025-12-30T21:04:58.885Z] [INFO] GET /js/list.js 304 2ms
+[2025-12-30T21:04:58.888Z] [INFO] GET /js/shortcuts.js 304 2ms
+[2025-12-30T21:04:58.893Z] [INFO] GET /js/undo.js 304 2ms
+[2025-12-30T21:04:58.895Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T21:04:58.907Z] [INFO] GET /js/notifications.js 304 0ms
+[2025-12-30T21:04:58.910Z] [INFO] GET /js/proposals.js 304 2ms
+[2025-12-30T21:04:58.915Z] [INFO] GET /js/knowledge.js 304 0ms
+[2025-12-30T21:04:58.918Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T21:04:58.920Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T21:04:58.966Z] [INFO] GET /assets/icons/task.svg 304 2ms
+[2025-12-30T21:05:00.481Z] [INFO] GET /sw.js 200 4ms
+[2025-12-30T21:05:00.521Z] [INFO] GET / 304 5ms
+[2025-12-30T21:05:00.525Z] [INFO] GET /css/variables.css 304 3ms
+[2025-12-30T21:05:00.527Z] [INFO] GET /index.html 200 9ms
+[2025-12-30T21:05:00.552Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T21:05:00.555Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T21:05:00.579Z] [INFO] GET /css/board.css 304 2ms
+[2025-12-30T21:05:00.584Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T21:05:00.590Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T21:05:00.608Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T21:05:00.621Z] [INFO] GET /js/app.js 304 6ms
+[2025-12-30T21:05:00.626Z] [INFO] GET /js/utils.js 304 3ms
+[2025-12-30T21:05:00.638Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T21:05:00.652Z] [INFO] GET /js/auth.js 304 2ms
+[2025-12-30T21:05:00.655Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T21:05:00.668Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T21:05:00.681Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T21:05:00.685Z] [INFO] GET /js/board.js 304 1ms
+[2025-12-30T21:05:00.700Z] [INFO] GET /js/task-modal.js 304 2ms
+[2025-12-30T21:05:00.716Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T21:05:00.722Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T21:05:00.730Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T21:05:00.745Z] [INFO] GET /js/undo.js 304 3ms
+[2025-12-30T21:05:00.751Z] [INFO] GET /js/tour.js 304 1ms
+[2025-12-30T21:05:00.761Z] [INFO] GET /js/admin.js 304 2ms
+[2025-12-30T21:05:00.773Z] [INFO] GET /js/proposals.js 304 0ms
+[2025-12-30T21:05:00.784Z] [INFO] GET /js/notifications.js 304 2ms
+[2025-12-30T21:05:00.793Z] [INFO] GET /js/gitea.js 304 2ms
+[2025-12-30T21:05:00.805Z] [INFO] GET /js/knowledge.js 304 2ms
+[2025-12-30T21:05:00.815Z] [INFO] GET /css/list.css 304 3ms
+[2025-12-30T21:05:00.826Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T21:05:00.836Z] [INFO] GET /css/proposals.css 304 2ms
+[2025-12-30T21:05:00.844Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T21:05:00.860Z] [INFO] GET /css/gitea.css 304 2ms
+[2025-12-30T21:05:00.868Z] [INFO] GET /css/knowledge.css 304 1ms
+[2025-12-30T21:05:02.666Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T21:05:02.667Z] [INFO] POST /api/auth/login 200 489ms
+[2025-12-30T21:05:02.719Z] [INFO] GET /api/auth/users 304 7ms
+[2025-12-30T21:05:02.746Z] [INFO] Socket connected: HG (lomE46ZOLutTY811AAAG)
+[2025-12-30T21:05:02.754Z] [INFO] Socket connected: HG (S5rHyMMOmF8hjNSSAAAH)
+[2025-12-30T21:05:02.776Z] [INFO] GET /api/projects 401 6ms
+[2025-12-30T21:05:02.805Z] [INFO] Socket disconnected: HG (S5rHyMMOmF8hjNSSAAAH)
+[2025-12-30T21:05:02.808Z] [INFO] GET /api/proposals?sort=date&archived=0 401 5ms
+[2025-12-30T21:05:02.818Z] [INFO] POST /api/auth/logout 401 8ms
+[2025-12-30T21:05:02.841Z] [INFO] GET /api/notifications 401 2ms
+[2025-12-30T21:05:02.878Z] [INFO] GET /api/knowledge/categories 401 2ms
+[2025-12-30T21:05:04.509Z] [INFO] Socket disconnected: HG (lomE46ZOLutTY811AAAG)
+[2025-12-30T21:05:15.534Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T21:05:45.672Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T21:06:15.790Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:06:45.891Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:07:16.018Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T21:07:46.126Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:08:16.230Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T21:08:46.319Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:09:16.446Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:10:21.562Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T21:10:21.694Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T21:10:21.704Z] [INFO] Umgebung: production
+[2025-12-30T21:10:21.706Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T21:10:21.707Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T21:10:21.698Z] [INFO] Datenbank initialisiert
+[2025-12-30T21:10:21.703Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T21:10:25.241Z] [INFO] GET /api/health 200 14ms
+[2025-12-30T21:10:55.406Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T21:10:59.801Z] [INFO] GET / 304 8ms
+[2025-12-30T21:10:59.858Z] [INFO] GET /css/variables.css 304 2ms
+[2025-12-30T21:10:59.891Z] [INFO] GET /css/base.css 304 2ms
+[2025-12-30T21:10:59.930Z] [INFO] GET /css/components.css 304 3ms
+[2025-12-30T21:10:59.932Z] [INFO] GET /css/board.css 304 3ms
+[2025-12-30T21:10:59.953Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T21:10:59.957Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T21:10:59.972Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T21:10:59.977Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T21:10:59.987Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T21:10:59.995Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T21:11:00.006Z] [INFO] GET /css/gitea.css 304 2ms
+[2025-12-30T21:11:00.013Z] [INFO] GET /css/knowledge.css 304 3ms
+[2025-12-30T21:11:00.020Z] [INFO] GET /js/app.js 304 2ms
+[2025-12-30T21:11:00.034Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T21:11:00.089Z] [INFO] GET /js/store.js 304 6ms
+[2025-12-30T21:11:00.090Z] [INFO] GET /js/auth.js 304 3ms
+[2025-12-30T21:11:00.108Z] [INFO] GET /js/sync.js 304 5ms
+[2025-12-30T21:11:00.114Z] [INFO] GET /js/api.js 200 23ms
+[2025-12-30T21:11:00.117Z] [INFO] GET /js/board.js 304 7ms
+[2025-12-30T21:11:00.121Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T21:11:00.124Z] [INFO] GET /js/task-modal.js 304 1ms
+[2025-12-30T21:11:00.139Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T21:11:00.143Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T21:11:00.147Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T21:11:00.152Z] [INFO] GET /js/undo.js 304 1ms
+[2025-12-30T21:11:00.160Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T21:11:00.169Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T21:11:00.170Z] [INFO] GET /js/notifications.js 304 0ms
+[2025-12-30T21:11:00.174Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T21:11:00.177Z] [INFO] GET /js/knowledge.js 304 1ms
+[2025-12-30T21:11:00.179Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T21:11:00.232Z] [INFO] GET /assets/icons/task.svg 304 12ms
+[2025-12-30T21:11:01.753Z] [INFO] GET /sw.js 200 6ms
+[2025-12-30T21:11:01.791Z] [INFO] GET / 304 2ms
+[2025-12-30T21:11:01.794Z] [INFO] GET /css/variables.css 304 1ms
+[2025-12-30T21:11:01.798Z] [INFO] GET /index.html 304 2ms
+[2025-12-30T21:11:01.822Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T21:11:01.828Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T21:11:01.838Z] [INFO] GET /css/board.css 304 2ms
+[2025-12-30T21:11:01.854Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T21:11:01.861Z] [INFO] GET /css/calendar.css 304 1ms
+[2025-12-30T21:11:01.866Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T21:11:01.886Z] [INFO] GET /js/app.js 304 2ms
+[2025-12-30T21:11:01.892Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T21:11:01.906Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T21:11:01.917Z] [INFO] GET /js/auth.js 304 1ms
+[2025-12-30T21:11:01.921Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T21:11:01.931Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T21:11:01.949Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T21:11:01.963Z] [INFO] GET /js/board.js 304 2ms
+[2025-12-30T21:11:01.978Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T21:11:01.980Z] [INFO] GET /js/task-modal.js 304 1ms
+[2025-12-30T21:11:01.995Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T21:11:02.009Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T21:11:02.012Z] [INFO] GET /js/undo.js 304 1ms
+[2025-12-30T21:11:02.027Z] [INFO] GET /js/tour.js 304 1ms
+[2025-12-30T21:11:02.041Z] [INFO] GET /js/admin.js 304 2ms
+[2025-12-30T21:11:02.045Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T21:11:02.061Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T21:11:02.074Z] [INFO] GET /js/gitea.js 304 2ms
+[2025-12-30T21:11:02.075Z] [INFO] GET /js/knowledge.js 304 2ms
+[2025-12-30T21:11:02.091Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T21:11:02.104Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T21:11:02.108Z] [INFO] GET /css/proposals.css 304 2ms
+[2025-12-30T21:11:02.121Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T21:11:02.131Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T21:11:02.138Z] [INFO] GET /css/knowledge.css 304 1ms
+[2025-12-30T21:11:04.465Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T21:11:04.469Z] [INFO] POST /api/auth/login 200 542ms
+[2025-12-30T21:11:04.511Z] [INFO] GET /api/auth/users 304 5ms
+[2025-12-30T21:11:04.548Z] [INFO] Socket connected: HG (qoxUBLbbUbXh-FbfAAAC)
+[2025-12-30T21:11:04.561Z] [INFO] Socket connected: HG (dR0A4oIB_XXPHzuBAAAD)
+[2025-12-30T21:11:04.567Z] [INFO] GET /api/projects 401 5ms
+[2025-12-30T21:11:04.601Z] [INFO] Socket disconnected: HG (dR0A4oIB_XXPHzuBAAAD)
+[2025-12-30T21:11:04.613Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms
+[2025-12-30T21:11:04.643Z] [INFO] GET /api/notifications 401 1ms
+[2025-12-30T21:11:04.675Z] [INFO] GET /api/knowledge/categories 401 3ms
+[2025-12-30T21:11:12.905Z] [INFO] GET / 304 2ms
+[2025-12-30T21:11:12.906Z] [INFO] GET /css/variables.css 304 2ms
+[2025-12-30T21:11:12.908Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T21:11:12.913Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T21:11:12.917Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T21:11:12.918Z] [INFO] GET /css/board.css 304 2ms
+[2025-12-30T21:11:12.937Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T21:11:12.940Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T21:11:12.943Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T21:11:12.947Z] [INFO] GET /css/proposals.css 304 2ms
+[2025-12-30T21:11:12.950Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T21:11:12.951Z] [INFO] GET /css/gitea.css 304 0ms
+[2025-12-30T21:11:12.972Z] [INFO] GET /css/knowledge.css 304 3ms
+[2025-12-30T21:11:12.988Z] [INFO] GET /css/responsive.css 304 13ms
+[2025-12-30T21:11:14.492Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T21:11:14.493Z] [INFO] POST /api/auth/login 200 480ms
+[2025-12-30T21:11:14.531Z] [INFO] GET /api/auth/users 200 6ms
+[2025-12-30T21:11:14.571Z] [INFO] GET /api/projects 200 11ms
+[2025-12-30T21:11:14.576Z] [INFO] Socket connected: HG (840OAwmiaWVWz1JFAAAG)
+[2025-12-30T21:11:14.585Z] [INFO] Socket connected: HG (k_EZuy2fKM3rGHhvAAAH)
+[2025-12-30T21:11:14.622Z] [INFO] GET /api/tasks/project/2 200 19ms
+[2025-12-30T21:11:14.629Z] [INFO] GET /api/columns/2 200 6ms
+[2025-12-30T21:11:14.636Z] [INFO] GET /api/stats/dashboard?projectId=2 200 6ms
+[2025-12-30T21:11:14.644Z] [INFO] GET /api/labels/2 200 4ms
+[2025-12-30T21:11:14.660Z] [INFO] HG joined project:[object Object]
+[2025-12-30T21:11:14.700Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 200 9ms
+[2025-12-30T21:11:14.745Z] [INFO] GET /api/knowledge/categories 200 11ms
+[2025-12-30T21:11:18.351Z] [INFO] POST /api/auth/refresh 200 18ms
+[2025-12-30T21:11:21.715Z] [INFO] Backup erstellt: backup_2025-12-30T21-11-21-710Z.db
+[2025-12-30T21:11:21.719Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T18-03-28-634Z.db
+[2025-12-30T21:11:21.721Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T21:11:22.995Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:11:25.528Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:11:29.583Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:11:32.389Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T21:11:35.429Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:11:37.009Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T21:11:52.819Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T21:11:54.055Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:11:55.645Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:11:56.720Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:12:00.698Z] [INFO] Knowledge-Kategorie erstellt: Router
+[2025-12-30T21:12:00.700Z] [INFO] POST /api/knowledge/categories 201 12ms
+[2025-12-30T21:12:00.737Z] [INFO] GET /api/knowledge/categories 200 4ms
+[2025-12-30T21:12:01.707Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:12:06.370Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:12:12.553Z] [INFO] Knowledge-Kategorie erstellt: AccountForger
+[2025-12-30T21:12:12.555Z] [INFO] POST /api/knowledge/categories 201 7ms
+[2025-12-30T21:12:12.591Z] [INFO] GET /api/knowledge/categories 200 6ms
+[2025-12-30T21:12:13.559Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T21:12:17.300Z] [INFO] Knowledge-Kategorie aktualisiert: AccountForger
+[2025-12-30T21:12:17.301Z] [INFO] PUT /api/knowledge/categories/2 200 7ms
+[2025-12-30T21:12:17.344Z] [INFO] GET /api/knowledge/categories 200 11ms
+[2025-12-30T21:12:18.312Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T21:12:18.385Z] [INFO] GET /api/knowledge/entries?categoryId=2 200 4ms
+[2025-12-30T21:12:19.390Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T21:12:25.747Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:12:26.569Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:12:30.542Z] [INFO] POST /api/auth/refresh 200 16ms
+[2025-12-30T21:12:55.861Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:13:21.993Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T21:13:21.994Z] [INFO] POST /api/auth/login 200 515ms
+[2025-12-30T21:13:22.061Z] [INFO] GET /api/auth/users 304 6ms
+[2025-12-30T21:13:22.073Z] [INFO] Socket connected: MH (TTXdYPE1S8QInvKpAAAK)
+[2025-12-30T21:13:22.090Z] [INFO] Socket connected: MH (h83-5eHHTeKdc6e5AAAL)
+[2025-12-30T21:13:22.105Z] [INFO] GET /api/projects 200 9ms
+[2025-12-30T21:13:22.138Z] [INFO] GET /api/stats/dashboard?projectId=2 200 5ms
+[2025-12-30T21:13:22.140Z] [INFO] MH joined project:[object Object]
+[2025-12-30T21:13:22.151Z] [INFO] GET /api/tasks/project/2 200 10ms
+[2025-12-30T21:13:22.155Z] [INFO] GET /api/columns/2 200 3ms
+[2025-12-30T21:13:22.160Z] [INFO] GET /api/labels/2 304 4ms
+[2025-12-30T21:13:22.193Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 6ms
+[2025-12-30T21:13:23.154Z] [INFO] GET / 200 4ms
+[2025-12-30T21:13:23.566Z] [INFO] GET /api/tasks/14 304 7ms
+[2025-12-30T21:13:23.590Z] [INFO] GET /api/subtasks/14 304 4ms
+[2025-12-30T21:13:23.594Z] [INFO] GET /api/files/14 304 3ms
+[2025-12-30T21:13:23.601Z] [INFO] GET /api/links/14 304 5ms
+[2025-12-30T21:13:23.607Z] [INFO] GET /api/tasks/14/history 404 5ms
+[2025-12-30T21:13:23.610Z] [INFO] GET /api/comments/14 304 7ms
+[2025-12-30T21:13:23.817Z] [INFO] GET /favicon.ico 200 8ms
+[2025-12-30T21:13:24.147Z] [INFO] GET /assets/icons/task.svg 200 5ms
+[2025-12-30T21:13:24.574Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T21:13:25.956Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:13:29.133Z] [INFO] PUT /api/subtasks/47 200 7ms
+[2025-12-30T21:13:29.167Z] [INFO] PUT /api/subtasks/47/position 200 10ms
+[2025-12-30T21:13:30.138Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:13:31.328Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14)
+[2025-12-30T21:13:31.330Z] [INFO] PUT /api/tasks/14 200 16ms
+[2025-12-30T21:13:32.334Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T21:13:56.056Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:14:26.166Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:14:54.780Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T21:14:56.292Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:15:00.309Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T21:15:04.726Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T21:15:05.190Z] [INFO] Aufgabe erstellt: pCloud Unterlagen Ablage (ID: 19) von MH
+[2025-12-30T21:15:05.191Z] [INFO] POST /api/tasks 201 6ms
+[2025-12-30T21:15:06.195Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T21:15:06.973Z] [INFO] GET /api/tasks/19 200 10ms
+[2025-12-30T21:15:06.998Z] [INFO] GET /api/subtasks/19 200 5ms
+[2025-12-30T21:15:07.020Z] [INFO] GET /api/links/19 200 4ms
+[2025-12-30T21:15:07.032Z] [INFO] GET /api/files/19 200 4ms
+[2025-12-30T21:15:07.038Z] [INFO] GET /api/comments/19 200 4ms
+[2025-12-30T21:15:07.043Z] [INFO] GET /api/tasks/19/history 404 4ms
+[2025-12-30T21:15:07.974Z] [INFO] POST /api/auth/refresh 200 4ms
+[2025-12-30T21:15:10.046Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19)
+[2025-12-30T21:15:10.049Z] [INFO] PUT /api/tasks/19 200 8ms
+[2025-12-30T21:15:10.396Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19)
+[2025-12-30T21:15:10.398Z] [INFO] PUT /api/tasks/19 200 9ms
+[2025-12-30T21:15:10.998Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19)
+[2025-12-30T21:15:11.002Z] [INFO] PUT /api/tasks/19 200 9ms
+[2025-12-30T21:15:11.030Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19)
+[2025-12-30T21:15:11.032Z] [INFO] PUT /api/tasks/19 200 9ms
+[2025-12-30T21:15:12.010Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T21:15:26.406Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:15:56.510Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:16:16.202Z] [INFO] GET /api/tasks/19 200 8ms
+[2025-12-30T21:16:16.231Z] [INFO] GET /api/subtasks/19 304 7ms
+[2025-12-30T21:16:16.238Z] [INFO] GET /api/files/19 304 13ms
+[2025-12-30T21:16:16.245Z] [INFO] GET /api/links/19 304 12ms
+[2025-12-30T21:16:16.250Z] [INFO] GET /api/comments/19 304 10ms
+[2025-12-30T21:16:16.256Z] [INFO] GET /api/tasks/19/history 404 3ms
+[2025-12-30T21:16:17.218Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T21:16:21.550Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T21:16:23.014Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T21:16:26.609Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:16:27.648Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:16:34.402Z] [INFO] Subtask erstellt: FYRST - Unterlagen als das Konto eröffnet wurde in Task 19
+[2025-12-30T21:16:34.404Z] [INFO] POST /api/subtasks 201 8ms
+[2025-12-30T21:16:35.412Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T21:16:44.356Z] [INFO] Subtask erstellt: FYRST - monatliche Kontoauszüge in Task 19
+[2025-12-30T21:16:44.358Z] [INFO] POST /api/subtasks 201 8ms
+[2025-12-30T21:16:45.361Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T21:16:45.921Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19)
+[2025-12-30T21:16:45.924Z] [INFO] PUT /api/tasks/19 200 13ms
+[2025-12-30T21:16:46.933Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:16:56.705Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:17:03.836Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T21:17:04.921Z] [INFO] POST /api/knowledge/entries 400 9ms
+[2025-12-30T21:17:05.923Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T21:17:08.795Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T21:17:08.884Z] [INFO] POST /api/knowledge/entries 400 6ms
+[2025-12-30T21:17:10.863Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:17:18.094Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:17:20.819Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T21:17:21.851Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T21:17:23.436Z] [INFO] POST /api/knowledge/entries 400 6ms
+[2025-12-30T21:17:24.454Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T21:17:26.808Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:17:37.750Z] [INFO] POST /api/knowledge/entries 400 5ms
+[2025-12-30T21:17:38.746Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T21:17:39.486Z] [INFO] POST /api/knowledge/entries 400 5ms
+[2025-12-30T21:17:40.491Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T21:17:56.906Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T21:18:14.683Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T21:18:16.717Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T21:18:20.514Z] [INFO] POST /api/auth/refresh 200 16ms
+[2025-12-30T21:18:21.226Z] [INFO] Knowledge-Kategorie erstellt: WD
+[2025-12-30T21:18:21.227Z] [INFO] POST /api/knowledge/categories 201 5ms
+[2025-12-30T21:18:21.274Z] [INFO] GET /api/knowledge/categories 200 6ms
+[2025-12-30T21:18:22.233Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:18:24.068Z] [INFO] Knowledge-Kategorie erstellt: fewqFEWF
+[2025-12-30T21:18:24.070Z] [INFO] POST /api/knowledge/categories 201 9ms
+[2025-12-30T21:18:24.108Z] [INFO] GET /api/knowledge/categories 200 6ms
+[2025-12-30T21:18:25.074Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T21:18:26.139Z] [INFO] Knowledge-Kategorie erstellt: ewfewfewf
+[2025-12-30T21:18:26.140Z] [INFO] POST /api/knowledge/categories 201 7ms
+[2025-12-30T21:18:26.185Z] [INFO] GET /api/knowledge/categories 200 12ms
+[2025-12-30T21:18:27.005Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:18:27.143Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T21:18:29.463Z] [INFO] Knowledge-Kategorie erstellt: fewfewf
+[2025-12-30T21:18:29.465Z] [INFO] POST /api/knowledge/categories 201 8ms
+[2025-12-30T21:18:29.499Z] [INFO] GET /api/knowledge/categories 200 5ms
+[2025-12-30T21:18:31.141Z] [INFO] Knowledge-Kategorie erstellt: ewfewf32
+[2025-12-30T21:18:31.143Z] [INFO] POST /api/knowledge/categories 201 8ms
+[2025-12-30T21:18:31.183Z] [INFO] GET /api/knowledge/categories 200 9ms
+[2025-12-30T21:18:32.856Z] [INFO] Knowledge-Kategorie erstellt: 213
+[2025-12-30T21:18:32.858Z] [INFO] POST /api/knowledge/categories 201 5ms
+[2025-12-30T21:18:32.894Z] [INFO] GET /api/knowledge/categories 200 6ms
+[2025-12-30T21:18:34.744Z] [INFO] POST /api/knowledge/categories 400 9ms
+[2025-12-30T21:18:35.748Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T21:18:36.668Z] [INFO] Knowledge-Kategorie erstellt: WD2
+[2025-12-30T21:18:36.670Z] [INFO] POST /api/knowledge/categories 201 5ms
+[2025-12-30T21:18:36.704Z] [INFO] GET /api/knowledge/categories 200 6ms
+[2025-12-30T21:18:37.677Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T21:18:39.044Z] [INFO] Knowledge-Kategorie erstellt: 2312134
+[2025-12-30T21:18:39.046Z] [INFO] POST /api/knowledge/categories 201 5ms
+[2025-12-30T21:18:39.080Z] [INFO] GET /api/knowledge/categories 200 5ms
+[2025-12-30T21:18:40.053Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T21:18:52.343Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:18:53.500Z] [INFO] GET /api/knowledge/search?q=route 200 17ms
+[2025-12-30T21:18:54.192Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T21:18:54.884Z] [INFO] GET /api/knowledge/search?q=rout 200 10ms
+[2025-12-30T21:18:55.739Z] [INFO] GET /api/knowledge/search?q=rou 200 9ms
+[2025-12-30T21:18:57.121Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:18:57.741Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T21:18:57.961Z] [INFO] GET /api/knowledge/entries?categoryId=1 200 2ms
+[2025-12-30T21:18:58.980Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T21:19:01.022Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T21:19:13.323Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T21:19:17.473Z] [INFO] POST /api/auth/refresh 200 15ms
+[2025-12-30T21:19:19.110Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T21:19:21.211Z] [INFO] Socket disconnected: HG (qoxUBLbbUbXh-FbfAAAC)
+[2025-12-30T21:19:21.220Z] [INFO] Socket disconnected: HG (840OAwmiaWVWz1JFAAAG)
+[2025-12-30T21:19:21.221Z] [INFO] Socket disconnected: HG (k_EZuy2fKM3rGHhvAAAH)
+[2025-12-30T21:19:22.030Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T21:19:22.086Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T21:19:22.123Z] [INFO] GET /js/api.js 304 7ms
+[2025-12-30T21:19:22.148Z] [INFO] GET /js/auth.js 304 1ms
+[2025-12-30T21:19:22.167Z] [INFO] GET /js/sync.js 304 6ms
+[2025-12-30T21:19:22.171Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T21:19:22.185Z] [INFO] GET /js/list.js 304 4ms
+[2025-12-30T21:19:22.187Z] [INFO] GET /js/calendar.js 304 5ms
+[2025-12-30T21:19:22.188Z] [INFO] GET /js/task-modal.js 304 4ms
+[2025-12-30T21:19:22.191Z] [INFO] GET /js/board.js 304 2ms
+[2025-12-30T21:19:22.205Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T21:19:22.216Z] [INFO] GET /js/undo.js 304 3ms
+[2025-12-30T21:19:22.217Z] [INFO] GET /js/admin.js 304 3ms
+[2025-12-30T21:19:22.221Z] [INFO] GET /js/proposals.js 304 2ms
+[2025-12-30T21:19:22.224Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T21:19:22.226Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T21:19:22.239Z] [INFO] GET /js/knowledge.js 304 3ms
+[2025-12-30T21:19:22.244Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T21:19:22.293Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T21:19:22.301Z] [INFO] GET /api/auth/users 304 4ms
+[2025-12-30T21:19:22.303Z] [INFO] GET /assets/icons/task.svg 304 1ms
+[2025-12-30T21:19:22.343Z] [INFO] GET /api/auth/users 304 6ms
+[2025-12-30T21:19:22.375Z] [INFO] Socket connected: HG (60xy0PfzJiBxQbE1AAAN)
+[2025-12-30T21:19:22.386Z] [INFO] GET /api/projects 200 6ms
+[2025-12-30T21:19:22.442Z] [INFO] GET /api/tasks/project/2 200 22ms
+[2025-12-30T21:19:22.444Z] [INFO] HG joined project:[object Object]
+[2025-12-30T21:19:22.450Z] [INFO] GET /api/columns/2 304 5ms
+[2025-12-30T21:19:22.455Z] [INFO] GET /api/labels/2 304 4ms
+[2025-12-30T21:19:22.461Z] [INFO] GET /api/stats/dashboard?projectId=2 200 5ms
+[2025-12-30T21:19:22.498Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 4ms
+[2025-12-30T21:19:22.536Z] [INFO] GET /api/notifications 304 6ms
+[2025-12-30T21:19:22.574Z] [INFO] GET /api/knowledge/categories 304 5ms
+[2025-12-30T21:19:24.039Z] [INFO] GET /sw.js 304 1ms
+[2025-12-30T21:19:25.245Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T21:19:27.225Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:19:48.863Z] [INFO] SIGTERM empfangen, fahre herunter...
+[2025-12-30T21:20:34.636Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T21:20:34.747Z] [INFO] Umgebung: production
+[2025-12-30T21:20:34.749Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T21:20:34.749Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T21:20:34.738Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T21:20:34.742Z] [INFO] Datenbank initialisiert
+[2025-12-30T21:20:34.747Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T21:20:36.196Z] [INFO] Socket connected: HG (dCbkOC9luvI4DKLfAAAB)
+[2025-12-30T21:20:36.241Z] [INFO] HG joined project:[object Object]
+[2025-12-30T21:20:36.636Z] [INFO] Socket connected: MH (0kKAsWJPzxsTafS5AAAD)
+[2025-12-30T21:20:38.538Z] [INFO] GET /api/health 200 8ms
+[2025-12-30T21:20:42.361Z] [INFO] Socket connected: MH (jLcet5G4vlIdefYJAAAF)
+[2025-12-30T21:20:42.401Z] [INFO] MH joined project:[object Object]
+[2025-12-30T21:21:08.690Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T21:21:25.119Z] [INFO] GET / 200 11ms
+[2025-12-30T21:21:25.211Z] [INFO] Socket disconnected: HG (dCbkOC9luvI4DKLfAAAB)
+[2025-12-30T21:21:25.215Z] [INFO] GET /css/variables.css 200 13ms
+[2025-12-30T21:21:25.218Z] [INFO] GET /css/base.css 200 10ms
+[2025-12-30T21:21:25.244Z] [INFO] GET /css/components.css 200 2ms
+[2025-12-30T21:21:25.258Z] [INFO] GET /css/board.css 200 4ms
+[2025-12-30T21:21:25.275Z] [INFO] GET /css/modal.css 200 4ms
+[2025-12-30T21:21:25.313Z] [INFO] GET /css/calendar.css 200 6ms
+[2025-12-30T21:21:25.319Z] [INFO] GET /css/list.css 200 8ms
+[2025-12-30T21:21:25.328Z] [INFO] GET /css/admin.css 200 5ms
+[2025-12-30T21:21:25.341Z] [INFO] GET /css/proposals.css 200 7ms
+[2025-12-30T21:21:25.347Z] [INFO] GET /css/notifications.css 200 8ms
+[2025-12-30T21:21:25.353Z] [INFO] GET /css/gitea.css 200 8ms
+[2025-12-30T21:21:25.355Z] [INFO] GET /css/knowledge.css 200 6ms
+[2025-12-30T21:21:25.358Z] [INFO] GET /css/responsive.css 200 7ms
+[2025-12-30T21:21:25.376Z] [INFO] GET /js/app.js 200 5ms
+[2025-12-30T21:21:25.447Z] [INFO] GET /js/api.js 200 9ms
+[2025-12-30T21:21:25.450Z] [INFO] GET /js/board.js 200 15ms
+[2025-12-30T21:21:25.454Z] [INFO] GET /js/store.js 200 12ms
+[2025-12-30T21:21:25.459Z] [INFO] GET /js/sync.js 200 14ms
+[2025-12-30T21:21:25.461Z] [INFO] GET /js/auth.js 200 9ms
+[2025-12-30T21:21:25.463Z] [INFO] GET /js/offline.js 200 7ms
+[2025-12-30T21:21:25.479Z] [INFO] GET /js/task-modal.js 200 3ms
+[2025-12-30T21:21:25.490Z] [INFO] GET /js/calendar.js 200 6ms
+[2025-12-30T21:21:25.496Z] [INFO] GET /js/list.js 200 5ms
+[2025-12-30T21:21:25.498Z] [INFO] GET /js/shortcuts.js 200 6ms
+[2025-12-30T21:21:25.499Z] [INFO] GET /js/undo.js 200 5ms
+[2025-12-30T21:21:25.504Z] [INFO] GET /js/admin.js 200 3ms
+[2025-12-30T21:21:25.509Z] [INFO] GET /js/proposals.js 200 3ms
+[2025-12-30T21:21:25.524Z] [INFO] GET /js/notifications.js 200 3ms
+[2025-12-30T21:21:25.534Z] [INFO] GET /js/utils.js 200 7ms
+[2025-12-30T21:21:25.539Z] [INFO] GET /js/gitea.js 200 8ms
+[2025-12-30T21:21:25.542Z] [INFO] GET /js/knowledge.js 200 10ms
+[2025-12-30T21:21:25.648Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T21:21:25.655Z] [INFO] GET /api/auth/users 304 5ms
+[2025-12-30T21:21:25.662Z] [INFO] GET /assets/icons/task.svg 304 6ms
+[2025-12-30T21:21:25.691Z] [INFO] GET /api/auth/users 304 8ms
+[2025-12-30T21:21:25.733Z] [INFO] GET /api/projects 304 11ms
+[2025-12-30T21:21:25.741Z] [INFO] Socket connected: HG (vHz2c8ryg9X633w0AAAH)
+[2025-12-30T21:21:25.794Z] [INFO] GET /api/tasks/project/2 304 28ms
+[2025-12-30T21:21:25.799Z] [INFO] GET /api/columns/2 304 5ms
+[2025-12-30T21:21:25.805Z] [INFO] GET /api/labels/2 304 4ms
+[2025-12-30T21:21:25.816Z] [INFO] GET /api/stats/dashboard?projectId=2 304 5ms
+[2025-12-30T21:21:25.819Z] [INFO] HG joined project:[object Object]
+[2025-12-30T21:21:25.845Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 6ms
+[2025-12-30T21:21:25.887Z] [INFO] GET /api/notifications 304 9ms
+[2025-12-30T21:21:25.928Z] [INFO] GET /api/knowledge/categories 304 10ms
+[2025-12-30T21:21:28.138Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 8ms
+[2025-12-30T21:21:33.187Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:21:33.973Z] [INFO] Knowledge-Eintrag erstellt: Testeintrag
+[2025-12-30T21:21:33.975Z] [INFO] POST /api/knowledge/entries 201 13ms
+[2025-12-30T21:21:34.017Z] [INFO] GET /api/knowledge/entries?categoryId=1 200 9ms
+[2025-12-30T21:21:34.051Z] [INFO] GET /api/knowledge/categories 200 5ms
+[2025-12-30T21:21:34.755Z] [INFO] Backup erstellt: backup_2025-12-30T21-21-34-750Z.db
+[2025-12-30T21:21:34.757Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T18-30-58-187Z.db
+[2025-12-30T21:21:34.759Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T21:21:34.985Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T21:21:38.812Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:21:39.849Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:21:40.864Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 8ms
+[2025-12-30T21:21:41.877Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:21:44.274Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:21:46.185Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 10ms
+[2025-12-30T21:21:49.041Z] [INFO] GET /api/knowledge/search?q=test 200 13ms
+[2025-12-30T21:21:49.737Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:21:50.698Z] [INFO] GET /api/knowledge/search?q=test 304 12ms
+[2025-12-30T21:21:51.648Z] [INFO] GET /api/knowledge/search?q=tes 200 10ms
+[2025-12-30T21:21:53.126Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:22:08.915Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:22:10.207Z] [INFO] GET /api/tasks/19 200 16ms
+[2025-12-30T21:22:10.240Z] [INFO] GET /api/subtasks/19 200 10ms
+[2025-12-30T21:22:10.264Z] [INFO] GET /api/links/19 304 5ms
+[2025-12-30T21:22:10.270Z] [INFO] GET /api/tasks/19/history 404 4ms
+[2025-12-30T21:22:10.276Z] [INFO] GET /api/files/19 304 4ms
+[2025-12-30T21:22:10.283Z] [INFO] GET /api/comments/19 304 5ms
+[2025-12-30T21:22:11.059Z] [INFO] CSRF: Token missing or not stored for user 4, generated new token
+[2025-12-30T21:22:11.061Z] [INFO] PUT /api/tasks/19 403 8ms
+[2025-12-30T21:22:11.088Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19)
+[2025-12-30T21:22:11.090Z] [INFO] PUT /api/tasks/19 200 10ms
+[2025-12-30T21:22:11.643Z] [INFO] GET /api/tasks/14 200 13ms
+[2025-12-30T21:22:11.678Z] [INFO] GET /api/subtasks/14 200 9ms
+[2025-12-30T21:22:11.689Z] [INFO] GET /api/tasks/14/history 404 8ms
+[2025-12-30T21:22:11.698Z] [INFO] GET /api/links/14 304 8ms
+[2025-12-30T21:22:11.703Z] [INFO] GET /api/files/14 304 3ms
+[2025-12-30T21:22:11.708Z] [INFO] GET /api/comments/14 304 4ms
+[2025-12-30T21:22:12.631Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T21:22:14.725Z] [INFO] PUT /api/subtasks/45 200 11ms
+[2025-12-30T21:22:14.755Z] [INFO] PUT /api/subtasks/45/position 200 9ms
+[2025-12-30T21:22:15.728Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T21:22:20.743Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14)
+[2025-12-30T21:22:20.746Z] [INFO] PUT /api/tasks/14 200 8ms
+[2025-12-30T21:22:21.767Z] [INFO] POST /api/auth/refresh 200 15ms
+[2025-12-30T21:22:39.058Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T21:23:09.171Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:23:39.280Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:24:09.377Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:24:13.779Z] [INFO] SIGTERM empfangen, fahre herunter...
+[2025-12-30T21:24:58.697Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T21:24:58.803Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T21:24:58.813Z] [INFO] Umgebung: production
+[2025-12-30T21:24:58.816Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T21:24:58.816Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T21:24:58.807Z] [INFO] Datenbank initialisiert
+[2025-12-30T21:24:58.813Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T21:25:02.345Z] [INFO] GET /api/health 200 11ms
+[2025-12-30T21:25:03.127Z] [INFO] Socket connected: HG (AQAnKnv8DA1rpkxfAAAD)
+[2025-12-30T21:25:03.208Z] [INFO] HG joined project:[object Object]
+[2025-12-30T21:25:32.442Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:25:37.318Z] [INFO] GET / 200 19ms
+[2025-12-30T21:25:37.391Z] [INFO] Socket disconnected: HG (AQAnKnv8DA1rpkxfAAAD)
+[2025-12-30T21:25:37.407Z] [INFO] GET /css/variables.css 200 7ms
+[2025-12-30T21:25:37.419Z] [INFO] GET /css/base.css 200 6ms
+[2025-12-30T21:25:37.423Z] [INFO] GET /css/components.css 200 7ms
+[2025-12-30T21:25:37.437Z] [INFO] GET /css/board.css 200 4ms
+[2025-12-30T21:25:37.460Z] [INFO] GET /css/modal.css 200 5ms
+[2025-12-30T21:25:37.482Z] [INFO] GET /css/calendar.css 200 11ms
+[2025-12-30T21:25:37.484Z] [INFO] GET /css/list.css 200 11ms
+[2025-12-30T21:25:37.485Z] [INFO] GET /css/admin.css 200 10ms
+[2025-12-30T21:25:37.491Z] [INFO] GET /css/proposals.css 200 3ms
+[2025-12-30T21:25:37.525Z] [INFO] GET /css/notifications.css 200 9ms
+[2025-12-30T21:25:37.530Z] [INFO] GET /css/gitea.css 200 7ms
+[2025-12-30T21:25:37.532Z] [INFO] GET /css/knowledge.css 200 4ms
+[2025-12-30T21:25:37.543Z] [INFO] GET /css/responsive.css 200 12ms
+[2025-12-30T21:25:37.551Z] [INFO] GET /js/app.js 200 6ms
+[2025-12-30T21:25:37.640Z] [INFO] GET /js/auth.js 200 14ms
+[2025-12-30T21:25:37.641Z] [INFO] GET /js/api.js 200 13ms
+[2025-12-30T21:25:37.644Z] [INFO] GET /js/sync.js 200 15ms
+[2025-12-30T21:25:37.648Z] [INFO] GET /js/store.js 200 15ms
+[2025-12-30T21:25:37.649Z] [INFO] GET /js/offline.js 200 12ms
+[2025-12-30T21:25:37.651Z] [INFO] GET /js/board.js 200 8ms
+[2025-12-30T21:25:37.679Z] [INFO] GET /js/task-modal.js 200 7ms
+[2025-12-30T21:25:37.681Z] [INFO] GET /js/list.js 200 8ms
+[2025-12-30T21:25:37.683Z] [INFO] GET /js/calendar.js 200 8ms
+[2025-12-30T21:25:37.686Z] [INFO] GET /js/shortcuts.js 200 9ms
+[2025-12-30T21:25:37.688Z] [INFO] GET /js/undo.js 200 4ms
+[2025-12-30T21:25:37.690Z] [INFO] GET /js/admin.js 200 3ms
+[2025-12-30T21:25:37.714Z] [INFO] GET /js/proposals.js 200 3ms
+[2025-12-30T21:25:37.722Z] [INFO] GET /js/gitea.js 200 6ms
+[2025-12-30T21:25:37.723Z] [INFO] GET /js/notifications.js 200 5ms
+[2025-12-30T21:25:37.728Z] [INFO] GET /js/utils.js 200 8ms
+[2025-12-30T21:25:37.729Z] [INFO] GET /js/knowledge.js 200 5ms
+[2025-12-30T21:25:37.808Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T21:25:37.820Z] [INFO] GET /api/auth/users 304 6ms
+[2025-12-30T21:25:37.816Z] [INFO] GET /assets/icons/task.svg 304 6ms
+[2025-12-30T21:25:37.860Z] [INFO] GET /api/auth/users 304 7ms
+[2025-12-30T21:25:37.893Z] [INFO] Socket connected: HG (4yU22TU1kTzCtvA-AAAH)
+[2025-12-30T21:25:37.911Z] [INFO] GET /api/projects 304 9ms
+[2025-12-30T21:25:37.939Z] [INFO] HG joined project:[object Object]
+[2025-12-30T21:25:37.950Z] [INFO] GET /api/stats/dashboard?projectId=2 304 6ms
+[2025-12-30T21:25:37.958Z] [INFO] GET /api/columns/2 304 4ms
+[2025-12-30T21:25:37.963Z] [INFO] GET /api/labels/2 304 8ms
+[2025-12-30T21:25:37.981Z] [INFO] GET /api/tasks/project/2 200 17ms
+[2025-12-30T21:25:38.029Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 7ms
+[2025-12-30T21:25:38.069Z] [INFO] GET /api/notifications 304 9ms
+[2025-12-30T21:25:38.105Z] [INFO] GET /api/knowledge/categories 304 7ms
+[2025-12-30T21:25:41.039Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:25:42.774Z] [INFO] GET /api/knowledge/search?q=youtube 200 14ms
+[2025-12-30T21:25:43.471Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T21:25:44.288Z] [INFO] GET /api/knowledge/search?q=youtub 200 11ms
+[2025-12-30T21:25:45.769Z] [INFO] POST /api/auth/refresh 200 16ms
+[2025-12-30T21:25:58.832Z] [INFO] Backup erstellt: backup_2025-12-30T21-25-58-826Z.db
+[2025-12-30T21:25:58.836Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T18-36-12-724Z.db
+[2025-12-30T21:25:58.838Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T21:26:02.537Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T21:26:13.438Z] [INFO] Suche nach "testeintrag" in Projekt 2: 0 Treffer
+[2025-12-30T21:26:13.439Z] [INFO] GET /api/tasks/search?projectId=2&q=testeintrag 200 6ms
+[2025-12-30T21:26:14.447Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T21:26:15.507Z] [INFO] Suche nach "testeintra" in Projekt 2: 0 Treffer
+[2025-12-30T21:26:15.509Z] [INFO] GET /api/tasks/search?projectId=2&q=testeintra 200 6ms
+[2025-12-30T21:26:16.886Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T21:26:19.827Z] [INFO] Suche nach "af" in Projekt 2: 5 Treffer
+[2025-12-30T21:26:19.828Z] [INFO] GET /api/tasks/search?projectId=2&q=af 200 7ms
+[2025-12-30T21:26:21.622Z] [INFO] GET /api/tasks/search?projectId=2&q=aufgaben 200 10ms
+[2025-12-30T21:26:21.620Z] [INFO] Suche nach "aufgaben" in Projekt 2: 1 Treffer
+[2025-12-30T21:26:22.258Z] [INFO] Suche nach "aufgabe" in Projekt 2: 1 Treffer
+[2025-12-30T21:26:22.259Z] [INFO] GET /api/tasks/search?projectId=2&q=aufgabe 200 11ms
+[2025-12-30T21:26:23.469Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T21:26:32.638Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:27:02.750Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:27:32.855Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T21:28:02.959Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T21:28:33.063Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:29:03.171Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:29:33.264Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:30:03.400Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T21:30:33.502Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T21:31:03.612Z] [INFO] GET /api/health 200 6ms
+[2025-12-30T21:31:33.708Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:32:03.826Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T21:32:32.398Z] [INFO] POST /api/auth/logout 401 7ms
+[2025-12-30T21:32:33.939Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T21:33:04.042Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:33:27.515Z] [INFO] SIGTERM empfangen, fahre herunter...
+[2025-12-30T21:33:50.322Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T21:33:50.432Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T21:33:50.439Z] [INFO] Umgebung: production
+[2025-12-30T21:33:50.441Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T21:33:50.441Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T21:33:50.435Z] [INFO] Datenbank initialisiert
+[2025-12-30T21:33:50.439Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T21:33:54.378Z] [INFO] GET /api/health 200 16ms
+[2025-12-30T21:33:57.137Z] [INFO] Socket connected: HG (Kw_J1cufXX_AxH0BAAAB)
+[2025-12-30T21:33:57.188Z] [INFO] HG joined project:[object Object]
+[2025-12-30T21:34:04.426Z] [INFO] HEAD / 200 3ms
+[2025-12-30T21:34:11.652Z] [INFO] HEAD / 200 3ms
+[2025-12-30T21:34:24.544Z] [INFO] GET /api/health 200 6ms
+[2025-12-30T21:34:50.451Z] [INFO] Backup erstellt: backup_2025-12-30T21-34-50-446Z.db
+[2025-12-30T21:34:50.453Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T18-46-49-826Z.db
+[2025-12-30T21:34:50.454Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T21:34:54.673Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:35:06.568Z] [INFO] GET / 200 14ms
+[2025-12-30T21:35:06.641Z] [INFO] Socket disconnected: HG (Kw_J1cufXX_AxH0BAAAB)
+[2025-12-30T21:35:06.653Z] [INFO] GET /css/variables.css 200 6ms
+[2025-12-30T21:35:06.655Z] [INFO] GET /css/base.css 200 4ms
+[2025-12-30T21:35:06.694Z] [INFO] GET /css/board.css 200 9ms
+[2025-12-30T21:35:06.698Z] [INFO] GET /css/components.css 200 10ms
+[2025-12-30T21:35:06.723Z] [INFO] GET /css/modal.css 200 8ms
+[2025-12-30T21:35:06.729Z] [INFO] GET /css/list.css 200 9ms
+[2025-12-30T21:35:06.733Z] [INFO] GET /css/calendar.css 200 5ms
+[2025-12-30T21:35:06.735Z] [INFO] GET /css/proposals.css 200 4ms
+[2025-12-30T21:35:06.737Z] [INFO] GET /css/admin.css 200 5ms
+[2025-12-30T21:35:06.744Z] [INFO] GET /css/notifications.css 200 3ms
+[2025-12-30T21:35:06.762Z] [INFO] GET /css/gitea.css 200 3ms
+[2025-12-30T21:35:06.767Z] [INFO] GET /css/knowledge.css 200 4ms
+[2025-12-30T21:35:06.794Z] [INFO] GET /css/responsive.css 200 19ms
+[2025-12-30T21:35:06.799Z] [INFO] GET /js/app.js 200 6ms
+[2025-12-30T21:35:06.863Z] [INFO] GET /js/store.js 200 8ms
+[2025-12-30T21:35:06.865Z] [INFO] GET /js/auth.js 200 9ms
+[2025-12-30T21:35:06.867Z] [INFO] GET /js/api.js 200 11ms
+[2025-12-30T21:35:06.871Z] [INFO] GET /js/offline.js 200 12ms
+[2025-12-30T21:35:06.875Z] [INFO] GET /js/board.js 200 13ms
+[2025-12-30T21:35:06.876Z] [INFO] GET /js/sync.js 200 7ms
+[2025-12-30T21:35:06.900Z] [INFO] GET /js/task-modal.js 200 6ms
+[2025-12-30T21:35:06.902Z] [INFO] GET /js/calendar.js 200 7ms
+[2025-12-30T21:35:06.908Z] [INFO] GET /js/list.js 200 10ms
+[2025-12-30T21:35:06.913Z] [INFO] GET /js/shortcuts.js 200 7ms
+[2025-12-30T21:35:06.914Z] [INFO] GET /js/undo.js 200 4ms
+[2025-12-30T21:35:06.936Z] [INFO] GET /js/admin.js 200 7ms
+[2025-12-30T21:35:06.942Z] [INFO] GET /js/proposals.js 200 8ms
+[2025-12-30T21:35:06.945Z] [INFO] GET /js/notifications.js 200 7ms
+[2025-12-30T21:35:06.950Z] [INFO] GET /js/gitea.js 200 6ms
+[2025-12-30T21:35:06.955Z] [INFO] GET /js/knowledge.js 200 7ms
+[2025-12-30T21:35:06.957Z] [INFO] GET /js/utils.js 200 4ms
+[2025-12-30T21:35:07.011Z] [INFO] GET /api/auth/users 304 14ms
+[2025-12-30T21:35:07.044Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:35:07.056Z] [INFO] GET /api/auth/users 304 5ms
+[2025-12-30T21:35:07.063Z] [INFO] GET /assets/icons/task.svg 200 17ms
+[2025-12-30T21:35:07.092Z] [INFO] GET /api/projects 304 7ms
+[2025-12-30T21:35:07.099Z] [INFO] Socket connected: HG (A5kjXDn7-Eak3wi6AAAD)
+[2025-12-30T21:35:07.146Z] [INFO] GET /api/tasks/project/2 304 22ms
+[2025-12-30T21:35:07.154Z] [INFO] GET /api/columns/2 304 6ms
+[2025-12-30T21:35:07.169Z] [INFO] GET /api/stats/dashboard?projectId=2 304 7ms
+[2025-12-30T21:35:07.175Z] [INFO] GET /api/labels/2 304 5ms
+[2025-12-30T21:35:07.178Z] [INFO] HG joined project:[object Object]
+[2025-12-30T21:35:07.226Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 12ms
+[2025-12-30T21:35:07.265Z] [INFO] GET /api/notifications 304 9ms
+[2025-12-30T21:35:07.305Z] [INFO] GET /api/knowledge/categories 304 7ms
+[2025-12-30T21:35:10.453Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T21:35:11.706Z] [INFO] Suche nach "youtube" in Projekt 2: 0 Treffer
+[2025-12-30T21:35:11.710Z] [INFO] GET /api/tasks/search?projectId=2&q=youtube 200 14ms
+[2025-12-30T21:35:12.212Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T21:35:14.852Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T21:35:17.788Z] [INFO] GET /api/knowledge/search?q=youtube 304 12ms
+[2025-12-30T21:35:18.484Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T21:35:19.088Z] [INFO] GET /api/knowledge/search?q=youtub 304 7ms
+[2025-12-30T21:35:20.712Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T21:35:24.722Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 6ms
+[2025-12-30T21:35:24.793Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:35:25.706Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T21:35:27.030Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 7ms
+[2025-12-30T21:35:28.327Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 7ms
+[2025-12-30T21:35:29.864Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:35:36.345Z] [INFO] Knowledge-Kategorie gelöscht: fewqFEWF
+[2025-12-30T21:35:36.348Z] [INFO] DELETE /api/knowledge/categories/4 200 10ms
+[2025-12-30T21:35:36.388Z] [INFO] GET /api/knowledge/categories 200 7ms
+[2025-12-30T21:35:37.458Z] [INFO] Knowledge-Kategorie gelöscht: WD
+[2025-12-30T21:35:37.460Z] [INFO] DELETE /api/knowledge/categories/3 200 10ms
+[2025-12-30T21:35:37.499Z] [INFO] GET /api/knowledge/categories 200 9ms
+[2025-12-30T21:35:38.350Z] [INFO] Knowledge-Kategorie gelöscht: ewfewfewf
+[2025-12-30T21:35:38.352Z] [INFO] DELETE /api/knowledge/categories/5 200 5ms
+[2025-12-30T21:35:38.392Z] [INFO] GET /api/knowledge/categories 200 9ms
+[2025-12-30T21:35:38.950Z] [INFO] Knowledge-Kategorie gelöscht: fewfewf
+[2025-12-30T21:35:38.952Z] [INFO] DELETE /api/knowledge/categories/6 200 12ms
+[2025-12-30T21:35:38.991Z] [INFO] GET /api/knowledge/categories 200 10ms
+[2025-12-30T21:35:39.381Z] [INFO] Knowledge-Kategorie gelöscht: ewfewf32
+[2025-12-30T21:35:39.383Z] [INFO] DELETE /api/knowledge/categories/7 200 9ms
+[2025-12-30T21:35:39.416Z] [INFO] GET /api/knowledge/categories 200 5ms
+[2025-12-30T21:35:39.768Z] [INFO] Knowledge-Kategorie gelöscht: 213
+[2025-12-30T21:35:39.769Z] [INFO] DELETE /api/knowledge/categories/8 200 5ms
+[2025-12-30T21:35:39.804Z] [INFO] GET /api/knowledge/categories 200 5ms
+[2025-12-30T21:35:40.147Z] [INFO] Knowledge-Kategorie gelöscht: WD2
+[2025-12-30T21:35:40.148Z] [INFO] DELETE /api/knowledge/categories/9 200 5ms
+[2025-12-30T21:35:40.188Z] [INFO] GET /api/knowledge/categories 200 10ms
+[2025-12-30T21:35:40.621Z] [INFO] Knowledge-Kategorie gelöscht: 2312134
+[2025-12-30T21:35:40.622Z] [INFO] DELETE /api/knowledge/categories/10 200 6ms
+[2025-12-30T21:35:40.657Z] [INFO] GET /api/knowledge/categories 200 6ms
+[2025-12-30T21:35:54.911Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:36:25.015Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:36:55.130Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T21:37:25.229Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:37:55.326Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:38:08.465Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T21:38:14.503Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:38:25.429Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:38:55.547Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:39:25.655Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:39:55.764Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T21:40:25.873Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:40:55.985Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:41:26.073Z] [INFO] GET /api/health 200 7ms
+[2025-12-30T21:41:56.185Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:42:26.296Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:42:56.400Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:43:26.514Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T21:43:48.863Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T21:43:48.865Z] [INFO] POST /api/auth/login 200 563ms
+[2025-12-30T21:43:48.937Z] [INFO] GET /api/auth/users 304 5ms
+[2025-12-30T21:43:48.943Z] [INFO] Socket connected: MH (pWW1uSHtX_sLG3P2AAAG)
+[2025-12-30T21:43:48.969Z] [INFO] Socket connected: MH (1ccoM78xQZCp-LiGAAAH)
+[2025-12-30T21:43:48.982Z] [INFO] GET /api/projects 200 6ms
+[2025-12-30T21:43:49.016Z] [INFO] MH joined project:[object Object]
+[2025-12-30T21:43:49.027Z] [INFO] GET /api/stats/dashboard?projectId=2 200 8ms
+[2025-12-30T21:43:49.033Z] [INFO] GET /api/columns/2 304 5ms
+[2025-12-30T21:43:49.048Z] [INFO] GET /api/tasks/project/2 200 15ms
+[2025-12-30T21:43:49.057Z] [INFO] GET /api/labels/2 304 5ms
+[2025-12-30T21:43:49.086Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 4ms
+[2025-12-30T21:43:50.718Z] [INFO] GET /api/tasks/15 200 8ms
+[2025-12-30T21:43:50.750Z] [INFO] GET /api/subtasks/15 200 9ms
+[2025-12-30T21:43:50.746Z] [INFO] GET /api/links/15 200 6ms
+[2025-12-30T21:43:50.755Z] [INFO] GET /api/comments/15 200 4ms
+[2025-12-30T21:43:50.760Z] [INFO] GET /api/files/15 200 4ms
+[2025-12-30T21:43:50.765Z] [INFO] GET /api/tasks/15/history 404 4ms
+[2025-12-30T21:43:51.719Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T21:43:54.549Z] [INFO] Aufgabe aktualisiert: Antwort von WERFT 4.0 - Namensänderung (ID: 15)
+[2025-12-30T21:43:54.552Z] [INFO] PUT /api/tasks/15 200 16ms
+[2025-12-30T21:43:55.560Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T21:43:56.609Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:43:58.292Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:44:03.305Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T21:44:04.459Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T21:44:04.779Z] [INFO] Aufgabe erstellt: Antwort von FYRST - Namensänderung (ID: 20) von MH
+[2025-12-30T21:44:04.781Z] [INFO] POST /api/tasks 201 16ms
+[2025-12-30T21:44:05.788Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T21:44:08.885Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T21:44:14.558Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:44:15.342Z] [INFO] Aufgabe erstellt: Antwort von IHK - Namensänderung (ID: 21) von MH
+[2025-12-30T21:44:15.344Z] [INFO] POST /api/tasks 201 14ms
+[2025-12-30T21:44:16.334Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T21:44:17.460Z] [INFO] GET /api/tasks/19 200 6ms
+[2025-12-30T21:44:17.497Z] [INFO] GET /api/links/19 304 8ms
+[2025-12-30T21:44:17.505Z] [INFO] GET /api/tasks/19/history 404 6ms
+[2025-12-30T21:44:17.510Z] [INFO] GET /api/files/19 304 10ms
+[2025-12-30T21:44:17.516Z] [INFO] GET /api/comments/19 304 4ms
+[2025-12-30T21:44:17.525Z] [INFO] GET /api/subtasks/19 304 8ms
+[2025-12-30T21:44:18.481Z] [INFO] POST /api/auth/refresh 200 17ms
+[2025-12-30T21:44:21.463Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19)
+[2025-12-30T21:44:21.466Z] [INFO] PUT /api/tasks/19 200 13ms
+[2025-12-30T21:44:22.481Z] [INFO] POST /api/auth/refresh 200 16ms
+[2025-12-30T21:44:22.585Z] [INFO] GET /api/tasks/14 200 9ms
+[2025-12-30T21:44:22.614Z] [INFO] GET /api/subtasks/14 200 5ms
+[2025-12-30T21:44:22.621Z] [INFO] GET /api/files/14 304 6ms
+[2025-12-30T21:44:22.628Z] [INFO] GET /api/links/14 304 6ms
+[2025-12-30T21:44:22.633Z] [INFO] GET /api/tasks/14/history 404 4ms
+[2025-12-30T21:44:22.638Z] [INFO] GET /api/comments/14 304 4ms
+[2025-12-30T21:44:23.587Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T21:44:26.723Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:44:26.866Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14)
+[2025-12-30T21:44:26.869Z] [INFO] PUT /api/tasks/14 200 10ms
+[2025-12-30T21:44:27.875Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:44:56.831Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:45:26.957Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T21:45:57.075Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:46:27.169Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T21:46:29.861Z] [INFO] GET /api/tasks/14 200 10ms
+[2025-12-30T21:46:29.892Z] [INFO] GET /api/subtasks/14 304 7ms
+[2025-12-30T21:46:29.921Z] [INFO] GET /api/links/14 304 7ms
+[2025-12-30T21:46:29.928Z] [INFO] GET /api/files/14 304 3ms
+[2025-12-30T21:46:29.935Z] [INFO] GET /api/comments/14 304 4ms
+[2025-12-30T21:46:29.939Z] [INFO] GET /api/tasks/14/history 404 3ms
+[2025-12-30T21:46:30.825Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T21:46:44.425Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:46:44.920Z] [INFO] Link erstellt: https://service.wirtschaft.nrw/unternehmensfuehrung/gewerbe-ummelden-online/ für Task 14
+[2025-12-30T21:46:44.922Z] [INFO] POST /api/links 201 16ms
+[2025-12-30T21:46:45.922Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T21:46:45.997Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14)
+[2025-12-30T21:46:45.998Z] [INFO] PUT /api/tasks/14 200 6ms
+[2025-12-30T21:46:47.008Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:46:54.454Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T21:46:57.284Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:46:59.735Z] [INFO] POST /api/auth/refresh 200 4ms
+[2025-12-30T21:47:02.457Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:47:05.011Z] [INFO] POST /api/auth/refresh 200 15ms
+[2025-12-30T21:47:09.074Z] [INFO] Aufgabe erstellt: Gewerbeummeldung (ID: 22) von MH
+[2025-12-30T21:47:09.076Z] [INFO] POST /api/tasks 201 6ms
+[2025-12-30T21:47:10.083Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T21:47:27.389Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:47:55.824Z] [INFO] GET /api/tasks/22 200 6ms
+[2025-12-30T21:47:55.848Z] [INFO] GET /api/subtasks/22 200 3ms
+[2025-12-30T21:47:55.884Z] [INFO] GET /api/links/22 200 10ms
+[2025-12-30T21:47:55.893Z] [INFO] GET /api/files/22 200 6ms
+[2025-12-30T21:47:55.898Z] [INFO] GET /api/comments/22 200 3ms
+[2025-12-30T21:47:55.902Z] [INFO] GET /api/tasks/22/history 404 3ms
+[2025-12-30T21:47:56.845Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:47:57.521Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T21:48:00.350Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T21:48:00.356Z] [INFO] Aufgabe aktualisiert: Gewerbeummeldung (ID: 22)
+[2025-12-30T21:48:00.358Z] [INFO] PUT /api/tasks/22 200 6ms
+[2025-12-30T21:48:13.250Z] [INFO] Logout: HG
+[2025-12-30T21:48:13.252Z] [INFO] POST /api/auth/logout 200 7ms
+[2025-12-30T21:48:13.295Z] [INFO] Socket disconnected: HG (A5kjXDn7-Eak3wi6AAAD)
+[2025-12-30T21:48:14.437Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T21:48:14.446Z] [INFO] Aufgabe aktualisiert: Gewerbeummeldung (ID: 22)
+[2025-12-30T21:48:14.447Z] [INFO] PUT /api/tasks/22 200 6ms
+[2025-12-30T21:48:24.644Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T21:48:24.654Z] [INFO] Aufgabe aktualisiert: Gewerbeummeldung (ID: 22)
+[2025-12-30T21:48:24.656Z] [INFO] PUT /api/tasks/22 200 10ms
+[2025-12-30T21:48:26.738Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T21:48:26.747Z] [INFO] Aufgabe aktualisiert: Gewerbeummeldung (ID: 22)
+[2025-12-30T21:48:26.748Z] [INFO] PUT /api/tasks/22 200 7ms
+[2025-12-30T21:48:27.633Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:48:43.855Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T21:48:44.203Z] [INFO] Link erstellt: https://service.wirtschaft.nrw/unternehmensfuehrung/gewerbe-ummelden-online/ für Task 22
+[2025-12-30T21:48:44.204Z] [INFO] POST /api/links 201 10ms
+[2025-12-30T21:48:44.713Z] [INFO] Aufgabe aktualisiert: Gewerbeummeldung (ID: 22)
+[2025-12-30T21:48:44.715Z] [INFO] PUT /api/tasks/22 200 6ms
+[2025-12-30T21:48:45.714Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T21:48:51.684Z] [INFO] GET /api/tasks/14 200 10ms
+[2025-12-30T21:48:51.723Z] [INFO] GET /api/links/14 200 9ms
+[2025-12-30T21:48:51.731Z] [INFO] GET /api/subtasks/14 304 5ms
+[2025-12-30T21:48:51.735Z] [INFO] GET /api/comments/14 304 8ms
+[2025-12-30T21:48:51.739Z] [INFO] GET /api/tasks/14/history 404 3ms
+[2025-12-30T21:48:51.745Z] [INFO] GET /api/files/14 304 4ms
+[2025-12-30T21:48:52.694Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T21:48:57.735Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:49:27.839Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:49:57.950Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:50:28.061Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T21:50:58.188Z] [INFO] GET /api/health 200 8ms
+[2025-12-30T21:51:28.284Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:51:58.397Z] [INFO] GET /api/health 200 0ms
+[2025-12-30T21:52:28.506Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:52:58.641Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:53:28.753Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T21:53:58.855Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:54:28.967Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:54:59.048Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:55:29.171Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:55:49.600Z] [INFO] GET / 200 5ms
+[2025-12-30T21:55:49.687Z] [INFO] GET /css/knowledge.css 200 3ms
+[2025-12-30T21:55:49.735Z] [INFO] GET /css/support_parent.css 200 14ms
+[2025-12-30T21:55:49.760Z] [INFO] GET /css/board.css 200 2ms
+[2025-12-30T21:55:49.796Z] [INFO] GET /css/gitea.css 200 5ms
+[2025-12-30T21:55:49.830Z] [INFO] GET /css/responsive.css 200 4ms
+[2025-12-30T21:55:49.853Z] [INFO] GET /css/modal.css 200 4ms
+[2025-12-30T21:55:49.881Z] [INFO] GET /css/components.css 200 5ms
+[2025-12-30T21:55:49.907Z] [INFO] GET /css/calendar.css 200 2ms
+[2025-12-30T21:55:49.954Z] [INFO] GET /css/list.css 200 5ms
+[2025-12-30T21:55:49.997Z] [INFO] GET /css/variables.css 200 4ms
+[2025-12-30T21:55:50.154Z] [INFO] GET /css/proposals.css 200 2ms
+[2025-12-30T21:55:50.191Z] [INFO] GET /css/base.css 200 7ms
+[2025-12-30T21:55:50.216Z] [INFO] GET /js/twint_ch.js 200 5ms
+[2025-12-30T21:55:50.241Z] [INFO] GET /css/notifications.css 200 2ms
+[2025-12-30T21:55:50.265Z] [INFO] GET /js/lkk_ch.js 200 3ms
+[2025-12-30T21:55:50.303Z] [INFO] GET /js/app.js 200 3ms
+[2025-12-30T21:55:50.332Z] [INFO] GET /css/admin.css 200 2ms
+[2025-12-30T21:55:50.372Z] [INFO] GET /assets/icons/task.svg 200 5ms
+[2025-12-30T21:55:59.296Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T21:56:29.403Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:56:59.508Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T21:57:24.662Z] [INFO] SIGTERM empfangen, fahre herunter...
+[2025-12-30T21:57:47.605Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T21:57:47.719Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T21:57:47.721Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T21:57:47.722Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T21:57:47.710Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T21:57:47.713Z] [INFO] Datenbank initialisiert
+[2025-12-30T21:57:47.719Z] [INFO] Umgebung: production
+[2025-12-30T21:57:51.770Z] [INFO] CSRF: Token missing or not stored for user 4, generated new token
+[2025-12-30T21:57:51.774Z] [INFO] PUT /api/tasks/14 403 16ms
+[2025-12-30T21:57:51.782Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T21:57:51.812Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14)
+[2025-12-30T21:57:51.817Z] [INFO] PUT /api/tasks/14 200 21ms
+[2025-12-30T21:57:52.458Z] [INFO] HEAD / 200 7ms
+[2025-12-30T21:57:52.761Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T21:57:54.651Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T21:58:00.293Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T21:58:13.828Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T21:58:15.001Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T21:58:21.884Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T21:58:47.747Z] [INFO] Backup erstellt: backup_2025-12-30T21-58-47-741Z.db
+[2025-12-30T21:58:47.751Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T19-01-37-753Z.db
+[2025-12-30T21:58:47.752Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T21:58:51.134Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T21:58:51.988Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T21:58:54.256Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:59:00.491Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:59:02.323Z] [INFO] Aufgabe erstellt: Finzamt Hilden (ID: 23) von MH
+[2025-12-30T21:59:02.325Z] [INFO] POST /api/tasks 201 8ms
+[2025-12-30T21:59:03.340Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T21:59:15.262Z] [INFO] GET /api/tasks/14 200 13ms
+[2025-12-30T21:59:15.299Z] [INFO] GET /api/subtasks/14 304 10ms
+[2025-12-30T21:59:15.323Z] [INFO] GET /api/links/14 304 6ms
+[2025-12-30T21:59:15.348Z] [INFO] GET /api/tasks/14/history 404 10ms
+[2025-12-30T21:59:15.355Z] [INFO] GET /api/files/14 304 5ms
+[2025-12-30T21:59:15.361Z] [INFO] GET /api/comments/14 304 5ms
+[2025-12-30T21:59:16.265Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T21:59:21.749Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14)
+[2025-12-30T21:59:21.752Z] [INFO] PUT /api/tasks/14 200 9ms
+[2025-12-30T21:59:22.100Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T21:59:22.761Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T21:59:24.185Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T21:59:26.893Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T21:59:31.871Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T21:59:34.436Z] [INFO] Aufgabe erstellt: Allgemein Website anpassen (ID: 24) von MH
+[2025-12-30T21:59:34.438Z] [INFO] POST /api/tasks 201 6ms
+[2025-12-30T21:59:35.448Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T21:59:39.361Z] [INFO] Aufgabe verschoben: Allgemein Website anpassen -> zu Klären
+[2025-12-30T21:59:39.363Z] [INFO] PUT /api/tasks/24/move 200 11ms
+[2025-12-30T21:59:39.975Z] [INFO] GET /api/tasks/24 200 6ms
+[2025-12-30T21:59:39.999Z] [INFO] GET /api/subtasks/24 200 4ms
+[2025-12-30T21:59:40.004Z] [INFO] GET /api/links/24 200 4ms
+[2025-12-30T21:59:40.009Z] [INFO] GET /api/files/24 200 4ms
+[2025-12-30T21:59:40.014Z] [INFO] GET /api/comments/24 200 3ms
+[2025-12-30T21:59:40.019Z] [INFO] GET /api/tasks/24/history 404 3ms
+[2025-12-30T21:59:40.984Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T21:59:43.645Z] [INFO] Aufgabe aktualisiert: Allgemein Website anpassen (ID: 24)
+[2025-12-30T21:59:43.647Z] [INFO] PUT /api/tasks/24 200 10ms
+[2025-12-30T21:59:43.961Z] [INFO] Aufgabe aktualisiert: Allgemein Website anpassen (ID: 24)
+[2025-12-30T21:59:43.963Z] [INFO] PUT /api/tasks/24 200 14ms
+[2025-12-30T21:59:44.738Z] [INFO] Aufgabe aktualisiert: Allgemein Website anpassen (ID: 24)
+[2025-12-30T21:59:44.740Z] [INFO] PUT /api/tasks/24 200 15ms
+[2025-12-30T21:59:44.771Z] [INFO] Aufgabe aktualisiert: Allgemein Website anpassen (ID: 24)
+[2025-12-30T21:59:44.774Z] [INFO] PUT /api/tasks/24 200 12ms
+[2025-12-30T21:59:45.745Z] [INFO] POST /api/auth/refresh 200 15ms
+[2025-12-30T21:59:52.192Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T22:00:04.074Z] [INFO] GET /api/tasks/6 200 7ms
+[2025-12-30T22:00:04.102Z] [INFO] GET /api/links/6 304 3ms
+[2025-12-30T22:00:04.111Z] [INFO] GET /api/subtasks/6 200 5ms
+[2025-12-30T22:00:04.116Z] [INFO] GET /api/tasks/6/history 404 4ms
+[2025-12-30T22:00:04.122Z] [INFO] GET /api/comments/6 304 5ms
+[2025-12-30T22:00:04.128Z] [INFO] GET /api/files/6 304 5ms
+[2025-12-30T22:00:04.174Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMzE5ODUsImV4cCI6MTc2NzEzMjU4NX0.7Sd5_kimAmBup49JGn2n5sBBLJ3kvkAl1gHBVZpJDJU 200 22ms
+[2025-12-30T22:00:04.179Z] [INFO] GET /api/files/preview/7?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMzE5ODUsImV4cCI6MTc2NzEzMjU4NX0.7Sd5_kimAmBup49JGn2n5sBBLJ3kvkAl1gHBVZpJDJU 200 17ms
+[2025-12-30T22:00:05.081Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T22:00:08.063Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:00:17.121Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:00:18.710Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMzIwMTcsImV4cCI6MTc2NzEzMjYxN30.T5GEfCVcVBUBMu-9UnvV8b3ix42htnfdHvIGD2uq0R8 200 5ms
+[2025-12-30T22:00:19.723Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T22:00:21.752Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:00:22.291Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:00:25.180Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:00:42.554Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:00:47.602Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:00:52.235Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:00:52.391Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T22:00:59.730Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:01:04.602Z] [INFO] Subtask erstellt: Braucht man die Kategorie "Erledigt" eigentlich? Wenn ich so überlege, dann kann das ja direkt ins Archiv... in Task 6
+[2025-12-30T22:01:04.603Z] [INFO] POST /api/subtasks 201 8ms
+[2025-12-30T22:01:05.604Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T22:01:08.136Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T22:01:08.139Z] [INFO] PUT /api/tasks/6 200 15ms
+[2025-12-30T22:01:09.133Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:01:16.406Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T22:01:22.490Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:01:43.405Z] [INFO] GET / 200 7ms
+[2025-12-30T22:01:43.491Z] [INFO] GET /css/variables.css 304 3ms
+[2025-12-30T22:01:43.521Z] [INFO] GET /css/base.css 304 2ms
+[2025-12-30T22:01:43.554Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T22:01:43.558Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T22:01:43.569Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T22:01:43.572Z] [INFO] GET /css/modal.css 304 2ms
+[2025-12-30T22:01:43.580Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T22:01:43.582Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T22:01:43.593Z] [INFO] GET /css/proposals.css 304 2ms
+[2025-12-30T22:01:43.604Z] [INFO] GET /css/notifications.css 304 4ms
+[2025-12-30T22:01:43.607Z] [INFO] GET /css/gitea.css 304 5ms
+[2025-12-30T22:01:43.615Z] [INFO] GET /css/knowledge.css 200 5ms
+[2025-12-30T22:01:43.617Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T22:01:43.624Z] [INFO] GET /js/app.js 304 2ms
+[2025-12-30T22:01:43.691Z] [INFO] GET /js/store.js 304 2ms
+[2025-12-30T22:01:43.693Z] [INFO] GET /js/sync.js 304 3ms
+[2025-12-30T22:01:43.695Z] [INFO] GET /js/api.js 304 4ms
+[2025-12-30T22:01:43.696Z] [INFO] GET /js/auth.js 304 3ms
+[2025-12-30T22:01:43.700Z] [INFO] GET /js/board.js 304 3ms
+[2025-12-30T22:01:43.704Z] [INFO] GET /js/offline.js 304 2ms
+[2025-12-30T22:01:43.723Z] [INFO] GET /js/task-modal.js 304 3ms
+[2025-12-30T22:01:43.731Z] [INFO] GET /js/calendar.js 304 3ms
+[2025-12-30T22:01:43.738Z] [INFO] GET /js/list.js 304 3ms
+[2025-12-30T22:01:43.739Z] [INFO] GET /js/shortcuts.js 304 2ms
+[2025-12-30T22:01:43.745Z] [INFO] GET /js/undo.js 304 4ms
+[2025-12-30T22:01:43.746Z] [INFO] GET /js/admin.js 304 3ms
+[2025-12-30T22:01:43.754Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T22:01:43.763Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T22:01:43.767Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T22:01:43.777Z] [INFO] GET /js/knowledge.js 200 5ms
+[2025-12-30T22:01:43.790Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T22:01:43.844Z] [INFO] GET /assets/icons/task.svg 200 4ms
+[2025-12-30T22:01:45.363Z] [INFO] GET /sw.js 200 3ms
+[2025-12-30T22:01:45.400Z] [INFO] GET /css/variables.css 304 2ms
+[2025-12-30T22:01:45.401Z] [INFO] GET / 304 2ms
+[2025-12-30T22:01:45.405Z] [INFO] GET /index.html 200 4ms
+[2025-12-30T22:01:45.429Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T22:01:45.436Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T22:01:45.460Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T22:01:45.462Z] [INFO] GET /css/modal.css 304 0ms
+[2025-12-30T22:01:45.464Z] [INFO] GET /css/calendar.css 304 1ms
+[2025-12-30T22:01:45.490Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T22:01:45.493Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T22:01:45.494Z] [INFO] GET /js/app.js 304 0ms
+[2025-12-30T22:01:45.521Z] [INFO] GET /js/api.js 304 2ms
+[2025-12-30T22:01:45.535Z] [INFO] GET /js/store.js 304 2ms
+[2025-12-30T22:01:45.538Z] [INFO] GET /js/auth.js 304 1ms
+[2025-12-30T22:01:45.551Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T22:01:45.566Z] [INFO] GET /js/offline.js 304 2ms
+[2025-12-30T22:01:45.576Z] [INFO] GET /js/board.js 304 3ms
+[2025-12-30T22:01:45.580Z] [INFO] GET /js/task-modal.js 304 1ms
+[2025-12-30T22:01:45.598Z] [INFO] GET /js/calendar.js 304 2ms
+[2025-12-30T22:01:45.608Z] [INFO] GET /js/list.js 304 2ms
+[2025-12-30T22:01:45.612Z] [INFO] GET /js/shortcuts.js 304 2ms
+[2025-12-30T22:01:45.629Z] [INFO] GET /js/undo.js 304 1ms
+[2025-12-30T22:01:45.639Z] [INFO] GET /js/tour.js 304 2ms
+[2025-12-30T22:01:45.649Z] [INFO] GET /js/admin.js 304 3ms
+[2025-12-30T22:01:45.661Z] [INFO] GET /js/proposals.js 304 3ms
+[2025-12-30T22:01:45.673Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T22:01:45.681Z] [INFO] GET /js/gitea.js 304 2ms
+[2025-12-30T22:01:45.697Z] [INFO] GET /js/knowledge.js 304 2ms
+[2025-12-30T22:01:45.701Z] [INFO] GET /css/list.css 304 1ms
+[2025-12-30T22:01:45.710Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T22:01:45.729Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T22:01:45.732Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T22:01:45.741Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T22:01:45.759Z] [INFO] GET /css/knowledge.css 304 1ms
+[2025-12-30T22:01:47.989Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T22:01:47.990Z] [INFO] POST /api/auth/login 200 516ms
+[2025-12-30T22:01:48.043Z] [INFO] GET /api/auth/users 304 8ms
+[2025-12-30T22:01:48.068Z] [INFO] Socket connected: HG (XRFPPRNvrzVb8ZmlAAAG)
+[2025-12-30T22:01:48.076Z] [INFO] Socket connected: HG (_BE4CtFW7GDfJbuGAAAH)
+[2025-12-30T22:01:48.083Z] [INFO] GET /api/projects 401 3ms
+[2025-12-30T22:01:48.124Z] [INFO] Socket disconnected: HG (XRFPPRNvrzVb8ZmlAAAG)
+[2025-12-30T22:01:48.132Z] [INFO] GET /api/proposals?sort=date&archived=0 401 3ms
+[2025-12-30T22:01:48.163Z] [INFO] GET /api/notifications 401 1ms
+[2025-12-30T22:01:48.195Z] [INFO] GET /api/knowledge/categories 401 2ms
+[2025-12-30T22:01:51.485Z] [INFO] GET / 200 4ms
+[2025-12-30T22:01:51.542Z] [INFO] Socket disconnected: HG (_BE4CtFW7GDfJbuGAAAH)
+[2025-12-30T22:01:51.557Z] [INFO] GET /css/components.css 200 5ms
+[2025-12-30T22:01:51.558Z] [INFO] GET /css/calendar.css 200 5ms
+[2025-12-30T22:01:51.565Z] [INFO] GET /css/board.css 200 10ms
+[2025-12-30T22:01:51.568Z] [INFO] GET /css/modal.css 200 6ms
+[2025-12-30T22:01:51.570Z] [INFO] GET /css/variables.css 200 6ms
+[2025-12-30T22:01:51.575Z] [INFO] GET /css/base.css 200 8ms
+[2025-12-30T22:01:51.605Z] [INFO] GET /css/list.css 200 3ms
+[2025-12-30T22:01:51.612Z] [INFO] GET /css/notifications.css 200 5ms
+[2025-12-30T22:01:51.613Z] [INFO] GET /css/proposals.css 200 3ms
+[2025-12-30T22:01:51.626Z] [INFO] GET /css/admin.css 200 2ms
+[2025-12-30T22:01:51.632Z] [INFO] GET /css/knowledge.css 200 3ms
+[2025-12-30T22:01:51.634Z] [INFO] GET /css/gitea.css 200 1ms
+[2025-12-30T22:01:51.649Z] [INFO] GET /css/responsive.css 200 2ms
+[2025-12-30T22:01:51.655Z] [INFO] GET /js/app.js 200 4ms
+[2025-12-30T22:01:51.730Z] [INFO] GET /js/store.js 200 6ms
+[2025-12-30T22:01:51.737Z] [INFO] GET /js/offline.js 200 5ms
+[2025-12-30T22:01:51.741Z] [INFO] GET /js/auth.js 200 7ms
+[2025-12-30T22:01:51.745Z] [INFO] GET /js/api.js 200 9ms
+[2025-12-30T22:01:51.747Z] [INFO] GET /js/sync.js 200 8ms
+[2025-12-30T22:01:51.749Z] [INFO] GET /js/board.js 200 7ms
+[2025-12-30T22:01:51.760Z] [INFO] GET /js/task-modal.js 200 2ms
+[2025-12-30T22:01:51.768Z] [INFO] GET /js/list.js 200 2ms
+[2025-12-30T22:01:51.770Z] [INFO] GET /js/calendar.js 200 3ms
+[2025-12-30T22:01:51.773Z] [INFO] GET /js/shortcuts.js 200 1ms
+[2025-12-30T22:01:51.779Z] [INFO] GET /js/undo.js 200 2ms
+[2025-12-30T22:01:51.790Z] [INFO] GET /js/admin.js 200 1ms
+[2025-12-30T22:01:51.799Z] [INFO] GET /js/proposals.js 200 2ms
+[2025-12-30T22:01:51.804Z] [INFO] GET /js/notifications.js 200 1ms
+[2025-12-30T22:01:51.805Z] [INFO] GET /js/gitea.js 200 3ms
+[2025-12-30T22:01:51.809Z] [INFO] GET /js/knowledge.js 200 2ms
+[2025-12-30T22:01:51.824Z] [INFO] GET /js/utils.js 200 2ms
+[2025-12-30T22:01:51.863Z] [INFO] GET /assets/icons/task.svg 304 1ms
+[2025-12-30T22:01:52.591Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:01:54.739Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T22:01:54.741Z] [INFO] POST /api/auth/login 200 477ms
+[2025-12-30T22:01:54.785Z] [INFO] GET /api/auth/users 304 7ms
+[2025-12-30T22:01:54.811Z] [INFO] Socket connected: HG (todk8J8UUZcQCg8zAAAK)
+[2025-12-30T22:01:54.820Z] [INFO] Socket connected: HG (hLV2ErVRhSKM_xOvAAAL)
+[2025-12-30T22:01:54.823Z] [INFO] GET /api/projects 401 7ms
+[2025-12-30T22:01:54.855Z] [INFO] Socket disconnected: HG (hLV2ErVRhSKM_xOvAAAL)
+[2025-12-30T22:01:54.858Z] [INFO] GET /api/proposals?sort=date&archived=0 401 1ms
+[2025-12-30T22:01:54.896Z] [INFO] GET /api/notifications 401 2ms
+[2025-12-30T22:01:54.932Z] [INFO] GET /api/knowledge/categories 401 3ms
+[2025-12-30T22:02:07.099Z] [INFO] GET /api/tasks/23 200 8ms
+[2025-12-30T22:02:07.132Z] [INFO] GET /api/subtasks/23 200 9ms
+[2025-12-30T22:02:07.158Z] [INFO] GET /api/links/23 200 9ms
+[2025-12-30T22:02:07.168Z] [INFO] GET /api/files/23 200 7ms
+[2025-12-30T22:02:07.171Z] [INFO] GET /api/tasks/23/history 404 9ms
+[2025-12-30T22:02:07.177Z] [INFO] GET /api/comments/23 200 4ms
+[2025-12-30T22:02:08.100Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T22:02:08.738Z] [INFO] Aufgabe aktualisiert: Finzamt Hilden (ID: 23)
+[2025-12-30T22:02:08.740Z] [INFO] PUT /api/tasks/23 200 11ms
+[2025-12-30T22:02:09.742Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:02:22.681Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:02:43.349Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T22:02:48.821Z] [INFO] POST /api/auth/refresh 200 19ms
+[2025-12-30T22:02:50.682Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T22:02:51.132Z] [INFO] Spalte aktualisiert: Informationsaustausch (ID: 8)
+[2025-12-30T22:02:51.134Z] [INFO] PUT /api/columns/8 200 11ms
+[2025-12-30T22:02:52.137Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:02:52.792Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:03:18.958Z] [INFO] GET /api/tasks/6 200 18ms
+[2025-12-30T22:03:19.001Z] [INFO] GET /api/comments/6 304 11ms
+[2025-12-30T22:03:19.008Z] [INFO] GET /api/subtasks/6 200 6ms
+[2025-12-30T22:03:19.014Z] [INFO] GET /api/links/6 304 4ms
+[2025-12-30T22:03:19.019Z] [INFO] GET /api/files/6 304 4ms
+[2025-12-30T22:03:19.024Z] [INFO] GET /api/tasks/6/history 404 3ms
+[2025-12-30T22:03:19.048Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMzIxNzIsImV4cCI6MTc2NzEzMjc3Mn0.nDVlaR_z55AYERKUz5CIEnLyupAdtps7_4nZk2kJKbk 200 5ms
+[2025-12-30T22:03:19.049Z] [INFO] GET /api/files/preview/7?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMzIxNzIsImV4cCI6MTc2NzEzMjc3Mn0.nDVlaR_z55AYERKUz5CIEnLyupAdtps7_4nZk2kJKbk 200 10ms
+[2025-12-30T22:03:19.954Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:03:22.895Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:03:22.951Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:03:26.369Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:03:35.352Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:03:37.181Z] [INFO] Subtask erstellt: ich würde eher seitwärts scrollen als default setzen in Task 6
+[2025-12-30T22:03:37.183Z] [INFO] POST /api/subtasks 201 7ms
+[2025-12-30T22:03:38.183Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:03:38.607Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T22:03:38.609Z] [INFO] PUT /api/tasks/6 200 7ms
+[2025-12-30T22:03:39.616Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T22:03:53.000Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T22:03:56.744Z] [INFO] GET /api/tasks/10 200 17ms
+[2025-12-30T22:03:56.777Z] [INFO] GET /api/subtasks/10 200 6ms
+[2025-12-30T22:03:56.786Z] [INFO] GET /api/tasks/10/history 404 6ms
+[2025-12-30T22:03:56.790Z] [INFO] GET /api/comments/10 304 8ms
+[2025-12-30T22:03:56.795Z] [INFO] GET /api/files/10 304 4ms
+[2025-12-30T22:03:56.798Z] [INFO] GET /api/links/10 304 6ms
+[2025-12-30T22:03:57.736Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T22:04:14.393Z] [INFO] Aufgabe aktualisiert: Bilanzbuchhaltung - Finanzamt (ID: 10)
+[2025-12-30T22:04:14.396Z] [INFO] PUT /api/tasks/10 200 12ms
+[2025-12-30T22:04:15.385Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T22:04:23.105Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T22:04:24.456Z] [INFO] GET /api/tasks/19 200 9ms
+[2025-12-30T22:04:24.486Z] [INFO] GET /api/tasks/19/history 404 7ms
+[2025-12-30T22:04:24.492Z] [INFO] GET /api/subtasks/19 304 12ms
+[2025-12-30T22:04:24.497Z] [INFO] GET /api/links/19 304 4ms
+[2025-12-30T22:04:24.502Z] [INFO] GET /api/files/19 304 4ms
+[2025-12-30T22:04:24.506Z] [INFO] GET /api/comments/19 304 4ms
+[2025-12-30T22:04:25.472Z] [INFO] POST /api/auth/refresh 200 15ms
+[2025-12-30T22:04:29.773Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19)
+[2025-12-30T22:04:29.774Z] [INFO] PUT /api/tasks/19 200 5ms
+[2025-12-30T22:04:30.789Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T22:04:53.204Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T22:05:23.310Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:05:53.398Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T22:06:23.522Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T22:06:53.653Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T22:07:23.771Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:07:53.870Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T22:08:24.003Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T22:08:54.095Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:09:24.216Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:09:54.324Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:10:24.429Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:10:54.564Z] [INFO] GET /api/health 200 7ms
+[2025-12-30T22:11:24.673Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:11:54.769Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:12:24.895Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T22:12:36.080Z] [INFO] SIGTERM empfangen, fahre herunter...
+[2025-12-30T22:12:57.583Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T22:12:57.716Z] [INFO] Umgebung: production
+[2025-12-30T22:12:57.719Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T22:12:57.720Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T22:12:57.705Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T22:12:57.709Z] [INFO] Datenbank initialisiert
+[2025-12-30T22:12:57.715Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T22:13:01.492Z] [INFO] GET /api/health 200 11ms
+[2025-12-30T22:13:31.596Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T22:13:57.752Z] [INFO] Backup erstellt: backup_2025-12-30T22-13-57-741Z.db
+[2025-12-30T22:13:57.757Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T19-15-04-246Z.db
+[2025-12-30T22:13:57.760Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T22:14:01.709Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:14:08.751Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T22:14:08.754Z] [INFO] POST /api/auth/login 200 574ms
+[2025-12-30T22:14:08.872Z] [INFO] GET /api/auth/users 304 15ms
+[2025-12-30T22:14:08.880Z] [INFO] Socket connected: HG (-5b7T0W7UM1CkOTbAAAE)
+[2025-12-30T22:14:08.907Z] [INFO] Socket connected: HG (fIwuiQpVPsPv5fq4AAAF)
+[2025-12-30T22:14:08.931Z] [INFO] GET /api/projects 401 9ms
+[2025-12-30T22:14:08.970Z] [INFO] Socket disconnected: HG (fIwuiQpVPsPv5fq4AAAF)
+[2025-12-30T22:14:08.974Z] [INFO] GET /api/proposals?sort=date&archived=0 401 7ms
+[2025-12-30T22:14:09.004Z] [INFO] GET /api/knowledge/categories 401 3ms
+[2025-12-30T22:14:10.730Z] [INFO] GET / 200 14ms
+[2025-12-30T22:14:10.814Z] [INFO] Socket disconnected: HG (-5b7T0W7UM1CkOTbAAAE)
+[2025-12-30T22:14:10.824Z] [INFO] GET /css/variables.css 200 8ms
+[2025-12-30T22:14:10.827Z] [INFO] GET /css/board.css 200 8ms
+[2025-12-30T22:14:10.830Z] [INFO] GET /css/modal.css 200 8ms
+[2025-12-30T22:14:10.833Z] [INFO] GET /css/base.css 200 7ms
+[2025-12-30T22:14:10.836Z] [INFO] GET /css/calendar.css 200 7ms
+[2025-12-30T22:14:10.838Z] [INFO] GET /css/components.css 200 6ms
+[2025-12-30T22:14:10.859Z] [INFO] GET /css/list.css 200 4ms
+[2025-12-30T22:14:10.866Z] [INFO] GET /css/admin.css 200 3ms
+[2025-12-30T22:14:10.880Z] [INFO] GET /css/proposals.css 200 3ms
+[2025-12-30T22:14:10.896Z] [INFO] GET /css/notifications.css 200 9ms
+[2025-12-30T22:14:10.901Z] [INFO] GET /css/gitea.css 200 10ms
+[2025-12-30T22:14:10.910Z] [INFO] GET /css/responsive.css 200 16ms
+[2025-12-30T22:14:10.913Z] [INFO] GET /css/knowledge.css 200 14ms
+[2025-12-30T22:14:10.940Z] [INFO] GET /js/app.js 200 11ms
+[2025-12-30T22:14:11.007Z] [INFO] GET /js/store.js 200 4ms
+[2025-12-30T22:14:11.017Z] [INFO] GET /js/sync.js 200 5ms
+[2025-12-30T22:14:11.021Z] [INFO] GET /js/auth.js 200 7ms
+[2025-12-30T22:14:11.025Z] [INFO] GET /js/offline.js 200 7ms
+[2025-12-30T22:14:11.026Z] [INFO] GET /js/api.js 200 10ms
+[2025-12-30T22:14:11.027Z] [INFO] GET /js/board.js 200 8ms
+[2025-12-30T22:14:11.044Z] [INFO] GET /js/calendar.js 200 2ms
+[2025-12-30T22:14:11.054Z] [INFO] GET /js/task-modal.js 200 4ms
+[2025-12-30T22:14:11.058Z] [INFO] GET /js/shortcuts.js 200 2ms
+[2025-12-30T22:14:11.060Z] [INFO] GET /js/list.js 200 3ms
+[2025-12-30T22:14:11.077Z] [INFO] GET /js/undo.js 200 2ms
+[2025-12-30T22:14:11.084Z] [INFO] GET /js/admin.js 200 4ms
+[2025-12-30T22:14:11.085Z] [INFO] GET /js/notifications.js 200 4ms
+[2025-12-30T22:14:11.091Z] [INFO] GET /js/knowledge.js 200 3ms
+[2025-12-30T22:14:11.095Z] [INFO] GET /js/proposals.js 200 4ms
+[2025-12-30T22:14:11.112Z] [INFO] GET /js/gitea.js 200 4ms
+[2025-12-30T22:14:11.126Z] [INFO] GET /js/utils.js 200 3ms
+[2025-12-30T22:14:11.184Z] [INFO] GET /assets/icons/task.svg 304 4ms
+[2025-12-30T22:14:16.313Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T22:14:16.314Z] [INFO] POST /api/auth/login 200 459ms
+[2025-12-30T22:14:16.353Z] [INFO] GET /api/auth/users 304 7ms
+[2025-12-30T22:14:16.393Z] [INFO] Socket connected: HG (i_O1XvMVQQe4Y6LZAAAH)
+[2025-12-30T22:14:16.403Z] [INFO] GET /api/projects 401 6ms
+[2025-12-30T22:14:16.437Z] [INFO] Socket disconnected: HG (i_O1XvMVQQe4Y6LZAAAH)
+[2025-12-30T22:14:16.441Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms
+[2025-12-30T22:14:16.472Z] [INFO] GET /api/notifications 401 1ms
+[2025-12-30T22:14:16.504Z] [INFO] GET /api/knowledge/categories 401 1ms
+[2025-12-30T22:14:22.684Z] [INFO] GET / 304 2ms
+[2025-12-30T22:14:22.730Z] [INFO] GET /css/variables.css 304 1ms
+[2025-12-30T22:14:22.734Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T22:14:22.737Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T22:14:22.739Z] [INFO] GET /css/board.css 304 0ms
+[2025-12-30T22:14:22.741Z] [INFO] GET /css/calendar.css 304 1ms
+[2025-12-30T22:14:22.744Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T22:14:22.759Z] [INFO] GET /css/list.css 304 1ms
+[2025-12-30T22:14:22.766Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T22:14:22.769Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T22:14:22.776Z] [INFO] GET /css/knowledge.css 304 3ms
+[2025-12-30T22:14:22.776Z] [INFO] GET /css/gitea.css 304 2ms
+[2025-12-30T22:14:22.785Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T22:14:22.795Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T22:14:22.798Z] [INFO] GET /js/app.js 304 2ms
+[2025-12-30T22:14:22.844Z] [INFO] GET /js/api.js 304 2ms
+[2025-12-30T22:14:22.851Z] [INFO] GET /js/board.js 304 4ms
+[2025-12-30T22:14:22.852Z] [INFO] GET /js/offline.js 304 3ms
+[2025-12-30T22:14:22.859Z] [INFO] GET /js/auth.js 304 5ms
+[2025-12-30T22:14:22.860Z] [INFO] GET /js/store.js 304 3ms
+[2025-12-30T22:14:22.864Z] [INFO] GET /js/sync.js 304 3ms
+[2025-12-30T22:14:22.875Z] [INFO] GET /js/task-modal.js 304 2ms
+[2025-12-30T22:14:22.882Z] [INFO] GET /js/calendar.js 304 2ms
+[2025-12-30T22:14:22.890Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T22:14:22.897Z] [INFO] GET /js/shortcuts.js 304 2ms
+[2025-12-30T22:14:22.903Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T22:14:22.912Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T22:14:22.920Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T22:14:22.925Z] [INFO] GET /js/undo.js 304 0ms
+[2025-12-30T22:14:22.933Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T22:14:22.952Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T22:14:22.953Z] [INFO] GET /js/knowledge.js 304 2ms
+[2025-12-30T22:14:23.008Z] [INFO] GET /assets/icons/task.svg 304 2ms
+[2025-12-30T22:14:24.542Z] [INFO] GET /sw.js 200 5ms
+[2025-12-30T22:14:24.595Z] [INFO] GET /index.html 304 1ms
+[2025-12-30T22:14:24.597Z] [INFO] GET /css/variables.css 304 0ms
+[2025-12-30T22:14:24.599Z] [INFO] GET / 304 1ms
+[2025-12-30T22:14:24.630Z] [INFO] GET /css/components.css 304 1ms
+[2025-12-30T22:14:24.650Z] [INFO] GET /css/base.css 304 5ms
+[2025-12-30T22:14:24.654Z] [INFO] GET /css/board.css 304 7ms
+[2025-12-30T22:14:24.665Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T22:14:24.698Z] [INFO] GET /js/app.js 304 0ms
+[2025-12-30T22:14:24.711Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T22:14:24.712Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T22:14:24.730Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T22:14:24.761Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T22:14:24.774Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T22:14:24.777Z] [INFO] GET /js/auth.js 304 1ms
+[2025-12-30T22:14:24.795Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T22:14:24.803Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T22:14:24.808Z] [INFO] GET /js/board.js 304 1ms
+[2025-12-30T22:14:24.828Z] [INFO] GET /js/task-modal.js 304 2ms
+[2025-12-30T22:14:24.837Z] [INFO] GET /js/calendar.js 304 3ms
+[2025-12-30T22:14:24.841Z] [INFO] GET /js/list.js 304 2ms
+[2025-12-30T22:14:24.863Z] [INFO] GET /js/shortcuts.js 304 2ms
+[2025-12-30T22:14:24.869Z] [INFO] GET /js/undo.js 304 2ms
+[2025-12-30T22:14:24.873Z] [INFO] GET /js/tour.js 304 1ms
+[2025-12-30T22:14:24.893Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T22:14:24.900Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T22:14:24.903Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T22:14:24.925Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T22:14:24.936Z] [INFO] GET /js/knowledge.js 304 2ms
+[2025-12-30T22:14:24.948Z] [INFO] GET /css/list.css 304 1ms
+[2025-12-30T22:14:24.956Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T22:14:24.970Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T22:14:24.989Z] [INFO] GET /css/gitea.css 304 2ms
+[2025-12-30T22:14:25.000Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T22:14:25.008Z] [INFO] GET /css/knowledge.css 304 4ms
+[2025-12-30T22:14:26.258Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T22:14:26.259Z] [INFO] POST /api/auth/login 200 470ms
+[2025-12-30T22:14:26.333Z] [INFO] GET /api/auth/users 304 4ms
+[2025-12-30T22:14:26.372Z] [INFO] GET /api/projects 401 4ms
+[2025-12-30T22:14:26.389Z] [INFO] Socket connected: HG (SkSQokf_suCpKbH6AAAJ)
+[2025-12-30T22:14:26.413Z] [INFO] GET /api/proposals?sort=date&archived=0 401 1ms
+[2025-12-30T22:14:26.423Z] [INFO] Socket disconnected: HG (SkSQokf_suCpKbH6AAAJ)
+[2025-12-30T22:14:26.447Z] [INFO] GET /api/notifications 401 2ms
+[2025-12-30T22:14:26.483Z] [INFO] GET /api/knowledge/categories 401 2ms
+[2025-12-30T22:14:29.131Z] [INFO] Logout: MH
+[2025-12-30T22:14:29.132Z] [INFO] POST /api/auth/logout 200 8ms
+[2025-12-30T22:14:31.840Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T22:15:01.940Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:15:32.066Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:16:02.194Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T22:16:32.342Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T22:16:46.405Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T22:16:46.497Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T22:16:46.499Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T22:16:46.499Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T22:16:46.491Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T22:16:46.494Z] [INFO] Datenbank initialisiert
+[2025-12-30T22:16:46.497Z] [INFO] Umgebung: production
+[2025-12-30T22:16:50.661Z] [INFO] GET /api/health 200 17ms
+[2025-12-30T22:17:20.796Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T22:17:46.507Z] [INFO] Backup erstellt: backup_2025-12-30T22-17-46-503Z.db
+[2025-12-30T22:17:46.511Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T19-30-20-564Z.db
+[2025-12-30T22:17:46.514Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T22:17:50.894Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:18:21.036Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T22:18:51.154Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:19:21.271Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T22:19:51.389Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:20:21.476Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:20:51.559Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:21:21.664Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:21:51.774Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T22:22:04.315Z] [INFO] GET / 200 13ms
+[2025-12-30T22:22:04.371Z] [INFO] GET /css/variables.css 200 2ms
+[2025-12-30T22:22:04.399Z] [INFO] GET /css/base.css 200 2ms
+[2025-12-30T22:22:04.429Z] [INFO] GET /css/components.css 200 4ms
+[2025-12-30T22:22:04.432Z] [INFO] GET /css/board.css 200 5ms
+[2025-12-30T22:22:04.438Z] [INFO] GET /css/modal.css 200 4ms
+[2025-12-30T22:22:04.440Z] [INFO] GET /css/calendar.css 200 4ms
+[2025-12-30T22:22:04.448Z] [INFO] GET /css/admin.css 200 3ms
+[2025-12-30T22:22:04.450Z] [INFO] GET /css/list.css 200 4ms
+[2025-12-30T22:22:04.470Z] [INFO] GET /css/proposals.css 200 3ms
+[2025-12-30T22:22:04.481Z] [INFO] GET /css/notifications.css 200 2ms
+[2025-12-30T22:22:04.507Z] [INFO] GET /css/gitea.css 200 14ms
+[2025-12-30T22:22:04.509Z] [INFO] GET /css/responsive.css 200 14ms
+[2025-12-30T22:22:04.513Z] [INFO] GET /css/knowledge.css 200 5ms
+[2025-12-30T22:22:04.516Z] [INFO] GET /js/app.js 200 6ms
+[2025-12-30T22:22:04.592Z] [INFO] GET /js/offline.js 200 6ms
+[2025-12-30T22:22:04.593Z] [INFO] GET /js/store.js 200 6ms
+[2025-12-30T22:22:04.595Z] [INFO] GET /js/api.js 200 8ms
+[2025-12-30T22:22:04.596Z] [INFO] GET /js/auth.js 200 8ms
+[2025-12-30T22:22:04.597Z] [INFO] GET /js/sync.js 200 7ms
+[2025-12-30T22:22:04.600Z] [INFO] GET /js/board.js 200 9ms
+[2025-12-30T22:22:04.622Z] [INFO] GET /js/calendar.js 200 3ms
+[2025-12-30T22:22:04.630Z] [INFO] GET /js/task-modal.js 200 10ms
+[2025-12-30T22:22:04.637Z] [INFO] GET /js/list.js 200 13ms
+[2025-12-30T22:22:04.641Z] [INFO] GET /js/undo.js 200 8ms
+[2025-12-30T22:22:04.643Z] [INFO] GET /js/shortcuts.js 200 4ms
+[2025-12-30T22:22:04.657Z] [INFO] GET /js/admin.js 200 4ms
+[2025-12-30T22:22:04.666Z] [INFO] GET /js/proposals.js 200 3ms
+[2025-12-30T22:22:04.675Z] [INFO] GET /js/notifications.js 200 2ms
+[2025-12-30T22:22:04.685Z] [INFO] GET /js/gitea.js 200 4ms
+[2025-12-30T22:22:04.690Z] [INFO] GET /js/utils.js 200 3ms
+[2025-12-30T22:22:04.697Z] [INFO] GET /js/knowledge.js 200 3ms
+[2025-12-30T22:22:04.768Z] [INFO] GET /assets/icons/task.svg 304 6ms
+[2025-12-30T22:22:09.846Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T22:22:09.849Z] [INFO] POST /api/auth/login 200 542ms
+[2025-12-30T22:22:09.903Z] [INFO] GET /api/auth/users 304 7ms
+[2025-12-30T22:22:09.936Z] [INFO] Socket connected: HG (0aBVcD4vWBdq6DpQAAAB)
+[2025-12-30T22:22:09.945Z] [INFO] [AUTH] 401 - Token ungültig: GET / (token: eyJhbGciOiJIUzI1NiIs...)
+[2025-12-30T22:22:09.946Z] [INFO] GET /api/projects 401 4ms
+[2025-12-30T22:22:09.979Z] [INFO] Socket disconnected: HG (0aBVcD4vWBdq6DpQAAAB)
+[2025-12-30T22:22:09.988Z] [INFO] [AUTH] 401 - Kein Token: GET / (source: none)
+[2025-12-30T22:22:09.989Z] [INFO] GET /api/proposals?sort=date&archived=0 401 1ms
+[2025-12-30T22:22:10.028Z] [INFO] [AUTH] 401 - Kein Token: GET / (source: none)
+[2025-12-30T22:22:10.032Z] [INFO] GET /api/notifications 401 6ms
+[2025-12-30T22:22:10.063Z] [INFO] [AUTH] 401 - Kein Token: GET /categories (source: none)
+[2025-12-30T22:22:10.064Z] [INFO] GET /api/knowledge/categories 401 2ms
+[2025-12-30T22:22:13.800Z] [INFO] GET /css/variables.css 304 4ms
+[2025-12-30T22:22:13.804Z] [INFO] GET /css/modal.css 304 6ms
+[2025-12-30T22:22:13.807Z] [INFO] GET /css/calendar.css 304 5ms
+[2025-12-30T22:22:13.808Z] [INFO] GET /css/base.css 304 3ms
+[2025-12-30T22:22:13.810Z] [INFO] GET /css/components.css 304 1ms
+[2025-12-30T22:22:13.813Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T22:22:13.829Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T22:22:13.833Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T22:22:13.835Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T22:22:13.840Z] [INFO] GET /css/knowledge.css 304 2ms
+[2025-12-30T22:22:13.841Z] [INFO] GET /css/list.css 304 1ms
+[2025-12-30T22:22:13.845Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T22:22:13.864Z] [INFO] GET /css/responsive.css 304 2ms
+[2025-12-30T22:22:21.864Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:22:51.965Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:23:22.071Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:23:52.216Z] [INFO] GET /api/health 200 6ms
+[2025-12-30T22:24:15.185Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T22:24:15.278Z] [INFO] Umgebung: production
+[2025-12-30T22:24:15.279Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T22:24:15.279Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T22:24:15.270Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T22:24:15.273Z] [INFO] Datenbank initialisiert
+[2025-12-30T22:24:15.277Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T22:24:19.602Z] [INFO] GET /api/health 200 12ms
+[2025-12-30T22:24:49.698Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T22:25:15.293Z] [INFO] Backup erstellt: backup_2025-12-30T22-25-15-289Z.db
+[2025-12-30T22:25:15.298Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T19-59-53-354Z.db
+[2025-12-30T22:25:15.300Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T22:25:19.786Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:25:49.906Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:26:20.014Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T22:26:50.107Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T22:27:20.205Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:27:50.326Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T22:27:57.919Z] [INFO] [AUTH] JWT_SECRET configured (first 8 chars): 6d50da23...
+[2025-12-30T22:27:58.169Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T22:27:58.219Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T22:27:58.221Z] [INFO] Datenbank initialisiert
+[2025-12-30T22:27:58.225Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T22:27:58.226Z] [INFO] Umgebung: production
+[2025-12-30T22:27:58.227Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T22:27:58.227Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T22:28:02.317Z] [INFO] GET /api/health 200 12ms
+[2025-12-30T22:28:32.451Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T22:28:43.250Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T22:28:43.252Z] [INFO] POST /api/auth/login 200 554ms
+[2025-12-30T22:28:43.343Z] [INFO] Socket connected: MH (yjwrd2zg0tIEliHWAAAC)
+[2025-12-30T22:28:43.353Z] [INFO] [AUTH] Token erhalten für GET /api/auth/users: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:28:43.358Z] [INFO] GET /api/auth/users 304 9ms
+[2025-12-30T22:28:43.363Z] [INFO] Socket connected: MH (mQe-VJFasIDCDXuBAAAD)
+[2025-12-30T22:28:43.406Z] [INFO] [AUTH] Token erhalten für GET /api/projects: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:28:43.415Z] [INFO] GET /api/projects 200 11ms
+[2025-12-30T22:28:43.439Z] [INFO] [AUTH] Token erhalten für GET /api/columns/2: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:28:43.454Z] [INFO] GET /api/columns/2 200 16ms
+[2025-12-30T22:28:43.466Z] [INFO] [AUTH] Token erhalten für GET /api/stats/dashboard?projectId=2: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:28:43.473Z] [INFO] GET /api/stats/dashboard?projectId=2 200 9ms
+[2025-12-30T22:28:43.493Z] [INFO] GET /api/tasks/project/2 200 19ms
+[2025-12-30T22:28:43.475Z] [INFO] [AUTH] Token erhalten für GET /api/tasks/project/2: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:28:43.498Z] [INFO] [AUTH] Token erhalten für GET /api/labels/2: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:28:43.505Z] [INFO] GET /api/labels/2 304 10ms
+[2025-12-30T22:28:43.507Z] [INFO] MH joined project:[object Object]
+[2025-12-30T22:28:43.533Z] [INFO] [AUTH] Token erhalten für GET /api/proposals?sort=date&archived=0&projectId=2: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:28:43.539Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 8ms
+[2025-12-30T22:28:50.888Z] [INFO] [AUTH] Token erhalten für GET /api/tasks/4: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:28:50.897Z] [INFO] GET /api/tasks/4 200 13ms
+[2025-12-30T22:28:50.923Z] [INFO] [AUTH] Token erhalten für GET /api/files/4: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:28:50.930Z] [INFO] GET /api/files/4 304 7ms
+[2025-12-30T22:28:50.934Z] [INFO] [AUTH] Token erhalten für GET /api/subtasks/4: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:28:50.939Z] [INFO] GET /api/subtasks/4 200 8ms
+[2025-12-30T22:28:50.940Z] [INFO] [AUTH] Token erhalten für GET /api/comments/4: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:28:50.944Z] [INFO] GET /api/comments/4 304 11ms
+[2025-12-30T22:28:50.946Z] [INFO] [AUTH] Token erhalten für GET /api/links/4: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:28:50.951Z] [INFO] GET /api/links/4 304 6ms
+[2025-12-30T22:28:50.953Z] [INFO] [AUTH] Token erhalten für GET /api/tasks/4/history: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:28:50.958Z] [INFO] GET /api/tasks/4/history 404 6ms
+[2025-12-30T22:28:51.888Z] [INFO] [AUTH] Token erhalten für POST /api/auth/refresh: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:28:51.897Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:28:58.234Z] [INFO] Backup erstellt: backup_2025-12-30T22-28-58-230Z.db
+[2025-12-30T22:28:58.239Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T20-11-37-153Z.db
+[2025-12-30T22:28:58.242Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T22:29:01.286Z] [INFO] [AUTH] Token erhalten für POST /api/auth/refresh: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:29:01.298Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:29:02.556Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T22:29:05.127Z] [INFO] [AUTH] Token erhalten für PUT /api/subtasks/4: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:29:05.142Z] [INFO] PUT /api/subtasks/4 200 16ms
+[2025-12-30T22:29:05.197Z] [INFO] [AUTH] Token erhalten für PUT /api/tasks/4: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:29:05.202Z] [INFO] Aufgabe aktualisiert: Corporated Design (ID: 4)
+[2025-12-30T22:29:05.205Z] [INFO] PUT /api/tasks/4 200 8ms
+[2025-12-30T22:29:06.203Z] [INFO] [AUTH] Token erhalten für POST /api/auth/refresh: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid...
+[2025-12-30T22:29:06.210Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T22:29:32.659Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:29:33.267Z] [INFO] Socket disconnected: MH (mQe-VJFasIDCDXuBAAAD)
+[2025-12-30T22:29:33.271Z] [INFO] Socket disconnected: MH (yjwrd2zg0tIEliHWAAAC)
+[2025-12-30T22:30:02.752Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:30:21.217Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T22:30:21.310Z] [INFO] Umgebung: production
+[2025-12-30T22:30:21.312Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T22:30:21.298Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T22:30:21.302Z] [INFO] Datenbank initialisiert
+[2025-12-30T22:30:21.309Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T22:30:21.312Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T22:30:25.499Z] [INFO] GET /api/health 200 17ms
+[2025-12-30T22:30:55.639Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T22:31:21.335Z] [INFO] Backup erstellt: backup_2025-12-30T22-31-21-332Z.db
+[2025-12-30T22:31:21.342Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T20-14-06-429Z.db
+[2025-12-30T22:31:21.346Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T22:31:25.754Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:31:55.868Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T22:32:16.747Z] [INFO] GET / 200 11ms
+[2025-12-30T22:32:16.857Z] [INFO] GET /css/variables.css 200 5ms
+[2025-12-30T22:32:16.887Z] [INFO] GET /css/base.css 200 3ms
+[2025-12-30T22:32:16.915Z] [INFO] GET /css/components.css 200 4ms
+[2025-12-30T22:32:16.923Z] [INFO] GET /css/board.css 200 9ms
+[2025-12-30T22:32:16.928Z] [INFO] GET /css/modal.css 200 11ms
+[2025-12-30T22:32:16.938Z] [INFO] GET /css/calendar.css 200 5ms
+[2025-12-30T22:32:16.939Z] [INFO] GET /css/admin.css 200 5ms
+[2025-12-30T22:32:16.942Z] [INFO] GET /css/list.css 200 6ms
+[2025-12-30T22:32:16.958Z] [INFO] GET /css/proposals.css 200 3ms
+[2025-12-30T22:32:16.966Z] [INFO] GET /css/notifications.css 200 2ms
+[2025-12-30T22:32:16.970Z] [INFO] GET /css/gitea.css 200 2ms
+[2025-12-30T22:32:16.977Z] [INFO] GET /css/knowledge.css 200 5ms
+[2025-12-30T22:32:16.979Z] [INFO] GET /css/responsive.css 200 1ms
+[2025-12-30T22:32:16.995Z] [INFO] GET /js/app.js 200 3ms
+[2025-12-30T22:32:17.058Z] [INFO] GET /js/api.js 200 9ms
+[2025-12-30T22:32:17.062Z] [INFO] GET /js/store.js 200 11ms
+[2025-12-30T22:32:17.065Z] [INFO] GET /js/auth.js 200 10ms
+[2025-12-30T22:32:17.070Z] [INFO] GET /js/board.js 200 10ms
+[2025-12-30T22:32:17.073Z] [INFO] GET /js/sync.js 200 9ms
+[2025-12-30T22:32:17.074Z] [INFO] GET /js/offline.js 200 5ms
+[2025-12-30T22:32:17.091Z] [INFO] GET /js/list.js 200 2ms
+[2025-12-30T22:32:17.093Z] [INFO] GET /js/calendar.js 200 3ms
+[2025-12-30T22:32:17.100Z] [INFO] GET /js/task-modal.js 200 2ms
+[2025-12-30T22:32:17.104Z] [INFO] GET /js/undo.js 200 2ms
+[2025-12-30T22:32:17.107Z] [INFO] GET /js/shortcuts.js 200 4ms
+[2025-12-30T22:32:17.126Z] [INFO] GET /js/proposals.js 200 5ms
+[2025-12-30T22:32:17.130Z] [INFO] GET /js/notifications.js 200 7ms
+[2025-12-30T22:32:17.137Z] [INFO] GET /js/admin.js 200 12ms
+[2025-12-30T22:32:17.141Z] [INFO] GET /js/knowledge.js 200 5ms
+[2025-12-30T22:32:17.143Z] [INFO] GET /js/utils.js 200 4ms
+[2025-12-30T22:32:17.145Z] [INFO] GET /js/gitea.js 200 3ms
+[2025-12-30T22:32:17.207Z] [INFO] GET /assets/icons/task.svg 304 5ms
+[2025-12-30T22:32:19.229Z] [INFO] GET / 200 4ms
+[2025-12-30T22:32:19.312Z] [INFO] GET /css/variables.css 200 9ms
+[2025-12-30T22:32:19.313Z] [INFO] GET /css/components.css 200 8ms
+[2025-12-30T22:32:19.315Z] [INFO] GET /css/board.css 200 7ms
+[2025-12-30T22:32:19.319Z] [INFO] GET /css/base.css 200 9ms
+[2025-12-30T22:32:19.321Z] [INFO] GET /css/modal.css 200 7ms
+[2025-12-30T22:32:19.322Z] [INFO] GET /css/calendar.css 200 4ms
+[2025-12-30T22:32:19.343Z] [INFO] GET /css/list.css 200 1ms
+[2025-12-30T22:32:19.353Z] [INFO] GET /css/admin.css 200 2ms
+[2025-12-30T22:32:19.370Z] [INFO] GET /css/proposals.css 200 3ms
+[2025-12-30T22:32:19.372Z] [INFO] GET /css/gitea.css 200 3ms
+[2025-12-30T22:32:19.375Z] [INFO] GET /css/notifications.css 200 6ms
+[2025-12-30T22:32:19.377Z] [INFO] GET /css/knowledge.css 200 3ms
+[2025-12-30T22:32:19.381Z] [INFO] GET /css/responsive.css 200 5ms
+[2025-12-30T22:32:19.403Z] [INFO] GET /js/app.js 200 2ms
+[2025-12-30T22:32:19.512Z] [INFO] GET /js/store.js 200 5ms
+[2025-12-30T22:32:19.516Z] [INFO] GET /js/board.js 200 7ms
+[2025-12-30T22:32:19.518Z] [INFO] GET /js/auth.js 200 7ms
+[2025-12-30T22:32:19.524Z] [INFO] GET /js/offline.js 200 10ms
+[2025-12-30T22:32:19.528Z] [INFO] GET /js/api.js 200 11ms
+[2025-12-30T22:32:19.530Z] [INFO] GET /js/sync.js 200 8ms
+[2025-12-30T22:32:19.547Z] [INFO] GET /js/calendar.js 200 3ms
+[2025-12-30T22:32:19.555Z] [INFO] GET /js/list.js 200 5ms
+[2025-12-30T22:32:19.560Z] [INFO] GET /js/task-modal.js 200 3ms
+[2025-12-30T22:32:19.572Z] [INFO] GET /js/shortcuts.js 200 2ms
+[2025-12-30T22:32:19.574Z] [INFO] GET /js/undo.js 200 3ms
+[2025-12-30T22:32:19.577Z] [INFO] GET /js/admin.js 200 2ms
+[2025-12-30T22:32:19.589Z] [INFO] GET /js/proposals.js 200 4ms
+[2025-12-30T22:32:19.600Z] [INFO] GET /js/notifications.js 200 2ms
+[2025-12-30T22:32:19.606Z] [INFO] GET /js/utils.js 200 3ms
+[2025-12-30T22:32:19.607Z] [INFO] GET /js/knowledge.js 200 2ms
+[2025-12-30T22:32:19.620Z] [INFO] GET /js/gitea.js 200 2ms
+[2025-12-30T22:32:19.703Z] [INFO] GET /assets/icons/task.svg 304 2ms
+[2025-12-30T22:32:23.918Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T22:32:23.919Z] [INFO] POST /api/auth/login 200 511ms
+[2025-12-30T22:32:23.960Z] [INFO] GET /api/auth/users 304 8ms
+[2025-12-30T22:32:24.001Z] [INFO] GET /api/projects 401 10ms
+[2025-12-30T22:32:24.018Z] [INFO] Socket connected: HG (_WkGggW9gK-R3p62AAAB)
+[2025-12-30T22:32:24.042Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms
+[2025-12-30T22:32:24.048Z] [INFO] Socket disconnected: HG (_WkGggW9gK-R3p62AAAB)
+[2025-12-30T22:32:24.075Z] [INFO] GET /api/notifications 401 2ms
+[2025-12-30T22:32:24.108Z] [INFO] GET /api/knowledge/categories 401 1ms
+[2025-12-30T22:32:25.961Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T22:32:34.139Z] [INFO] GET / 304 2ms
+[2025-12-30T22:32:34.195Z] [INFO] GET /css/components.css 304 5ms
+[2025-12-30T22:32:34.198Z] [INFO] GET /css/variables.css 304 6ms
+[2025-12-30T22:32:34.201Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T22:32:34.205Z] [INFO] GET /css/calendar.css 304 3ms
+[2025-12-30T22:32:34.207Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T22:32:34.210Z] [INFO] GET /css/modal.css 304 2ms
+[2025-12-30T22:32:34.232Z] [INFO] GET /css/admin.css 304 3ms
+[2025-12-30T22:32:34.234Z] [INFO] GET /css/list.css 304 4ms
+[2025-12-30T22:32:34.241Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T22:32:34.241Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T22:32:34.244Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T22:32:34.252Z] [INFO] GET /css/knowledge.css 304 1ms
+[2025-12-30T22:32:34.267Z] [INFO] GET /css/responsive.css 304 2ms
+[2025-12-30T22:32:34.271Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T22:32:34.321Z] [INFO] GET /js/api.js 304 4ms
+[2025-12-30T22:32:34.326Z] [INFO] GET /js/board.js 304 2ms
+[2025-12-30T22:32:34.331Z] [INFO] GET /js/auth.js 304 3ms
+[2025-12-30T22:32:34.334Z] [INFO] GET /js/offline.js 304 2ms
+[2025-12-30T22:32:34.335Z] [INFO] GET /js/store.js 304 2ms
+[2025-12-30T22:32:34.337Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T22:32:34.352Z] [INFO] GET /js/task-modal.js 304 1ms
+[2025-12-30T22:32:34.355Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T22:32:34.359Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T22:32:34.364Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T22:32:34.365Z] [INFO] GET /js/admin.js 304 2ms
+[2025-12-30T22:32:34.384Z] [INFO] GET /js/undo.js 304 2ms
+[2025-12-30T22:32:34.390Z] [INFO] GET /js/proposals.js 304 2ms
+[2025-12-30T22:32:34.394Z] [INFO] GET /js/notifications.js 304 2ms
+[2025-12-30T22:32:34.397Z] [INFO] GET /js/knowledge.js 304 1ms
+[2025-12-30T22:32:34.400Z] [INFO] GET /js/gitea.js 304 2ms
+[2025-12-30T22:32:34.402Z] [INFO] GET /js/utils.js 304 0ms
+[2025-12-30T22:32:34.450Z] [INFO] GET /assets/icons/task.svg 304 2ms
+[2025-12-30T22:32:35.966Z] [INFO] GET /sw.js 200 4ms
+[2025-12-30T22:32:36.005Z] [INFO] GET / 304 2ms
+[2025-12-30T22:32:36.010Z] [INFO] GET /css/variables.css 304 2ms
+[2025-12-30T22:32:36.017Z] [INFO] GET /index.html 304 1ms
+[2025-12-30T22:32:36.034Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T22:32:36.038Z] [INFO] GET /css/components.css 304 1ms
+[2025-12-30T22:32:36.052Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T22:32:36.064Z] [INFO] GET /css/modal.css 304 2ms
+[2025-12-30T22:32:36.071Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T22:32:36.084Z] [INFO] GET /css/responsive.css 304 2ms
+[2025-12-30T22:32:36.094Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T22:32:36.097Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T22:32:36.116Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T22:32:36.124Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T22:32:36.127Z] [INFO] GET /js/auth.js 304 2ms
+[2025-12-30T22:32:36.144Z] [INFO] GET /js/sync.js 304 2ms
+[2025-12-30T22:32:36.153Z] [INFO] GET /js/offline.js 304 0ms
+[2025-12-30T22:32:36.157Z] [INFO] GET /js/board.js 304 1ms
+[2025-12-30T22:32:36.177Z] [INFO] GET /js/task-modal.js 304 2ms
+[2025-12-30T22:32:36.185Z] [INFO] GET /js/calendar.js 304 2ms
+[2025-12-30T22:32:36.189Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T22:32:36.209Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T22:32:36.218Z] [INFO] GET /js/undo.js 304 3ms
+[2025-12-30T22:32:36.224Z] [INFO] GET /js/tour.js 304 3ms
+[2025-12-30T22:32:36.238Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T22:32:36.257Z] [INFO] GET /js/proposals.js 304 2ms
+[2025-12-30T22:32:36.260Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T22:32:36.268Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T22:32:36.291Z] [INFO] GET /js/knowledge.js 304 1ms
+[2025-12-30T22:32:36.298Z] [INFO] GET /css/list.css 304 1ms
+[2025-12-30T22:32:36.311Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T22:32:36.325Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T22:32:36.329Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T22:32:36.345Z] [INFO] GET /css/gitea.css 304 2ms
+[2025-12-30T22:32:36.357Z] [INFO] GET /css/knowledge.css 304 1ms
+[2025-12-30T22:32:38.853Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T22:32:38.854Z] [INFO] POST /api/auth/login 200 461ms
+[2025-12-30T22:32:38.904Z] [INFO] GET /api/auth/users 304 10ms
+[2025-12-30T22:32:38.932Z] [INFO] Socket connected: HG (QZkBzHBur4jg0lJUAAAD)
+[2025-12-30T22:32:38.942Z] [INFO] GET /api/projects 401 6ms
+[2025-12-30T22:32:38.976Z] [INFO] Socket disconnected: HG (QZkBzHBur4jg0lJUAAAD)
+[2025-12-30T22:32:38.980Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms
+[2025-12-30T22:32:39.028Z] [INFO] GET /api/notifications 401 1ms
+[2025-12-30T22:32:39.060Z] [INFO] GET /api/knowledge/categories 401 1ms
+[2025-12-30T22:32:42.844Z] [INFO] GET / 304 2ms
+[2025-12-30T22:32:42.845Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T22:32:42.848Z] [INFO] GET /css/variables.css 304 2ms
+[2025-12-30T22:32:42.849Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T22:32:42.850Z] [INFO] GET /css/modal.css 304 0ms
+[2025-12-30T22:32:42.852Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T22:32:42.878Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T22:32:42.884Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T22:32:42.888Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T22:32:42.890Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T22:32:42.892Z] [INFO] GET /css/list.css 304 1ms
+[2025-12-30T22:32:42.896Z] [INFO] GET /css/gitea.css 304 0ms
+[2025-12-30T22:32:42.909Z] [INFO] GET /css/knowledge.css 304 1ms
+[2025-12-30T22:32:42.925Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T22:32:56.087Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T22:33:14.279Z] [INFO] GET / 200 6ms
+[2025-12-30T22:33:14.343Z] [INFO] GET /css/variables.css 200 2ms
+[2025-12-30T22:33:14.377Z] [INFO] GET /css/base.css 200 4ms
+[2025-12-30T22:33:14.426Z] [INFO] GET /css/calendar.css 200 7ms
+[2025-12-30T22:33:14.427Z] [INFO] GET /css/list.css 200 7ms
+[2025-12-30T22:33:14.432Z] [INFO] GET /css/components.css 200 8ms
+[2025-12-30T22:33:14.433Z] [INFO] GET /css/modal.css 200 8ms
+[2025-12-30T22:33:14.437Z] [INFO] GET /css/board.css 200 12ms
+[2025-12-30T22:33:14.443Z] [INFO] GET /css/admin.css 200 15ms
+[2025-12-30T22:33:14.459Z] [INFO] GET /css/proposals.css 200 4ms
+[2025-12-30T22:33:14.465Z] [INFO] GET /css/notifications.css 200 2ms
+[2025-12-30T22:33:14.472Z] [INFO] GET /css/gitea.css 200 2ms
+[2025-12-30T22:33:14.477Z] [INFO] GET /css/knowledge.css 200 2ms
+[2025-12-30T22:33:14.489Z] [INFO] GET /css/responsive.css 200 5ms
+[2025-12-30T22:33:14.496Z] [INFO] GET /js/app.js 200 3ms
+[2025-12-30T22:33:14.560Z] [INFO] GET /js/api.js 200 5ms
+[2025-12-30T22:33:14.563Z] [INFO] GET /js/store.js 200 6ms
+[2025-12-30T22:33:14.573Z] [INFO] GET /js/board.js 200 6ms
+[2025-12-30T22:33:14.575Z] [INFO] GET /js/offline.js 200 6ms
+[2025-12-30T22:33:14.579Z] [INFO] GET /js/auth.js 200 9ms
+[2025-12-30T22:33:14.581Z] [INFO] GET /js/sync.js 200 9ms
+[2025-12-30T22:33:14.591Z] [INFO] GET /js/task-modal.js 200 3ms
+[2025-12-30T22:33:14.595Z] [INFO] GET /js/calendar.js 200 2ms
+[2025-12-30T22:33:14.609Z] [INFO] GET /js/list.js 200 5ms
+[2025-12-30T22:33:14.610Z] [INFO] GET /js/undo.js 200 6ms
+[2025-12-30T22:33:14.611Z] [INFO] GET /js/shortcuts.js 200 4ms
+[2025-12-30T22:33:14.626Z] [INFO] GET /js/admin.js 200 5ms
+[2025-12-30T22:33:14.649Z] [INFO] GET /js/proposals.js 200 17ms
+[2025-12-30T22:33:14.652Z] [INFO] GET /js/notifications.js 200 13ms
+[2025-12-30T22:33:14.655Z] [INFO] GET /js/gitea.js 200 7ms
+[2025-12-30T22:33:14.656Z] [INFO] GET /js/knowledge.js 200 5ms
+[2025-12-30T22:33:14.659Z] [INFO] GET /js/utils.js 200 5ms
+[2025-12-30T22:33:14.724Z] [INFO] GET /assets/icons/task.svg 200 6ms
+[2025-12-30T22:33:14.727Z] [INFO] GET /sw.js 200 5ms
+[2025-12-30T22:33:14.768Z] [INFO] GET /css/variables.css 304 1ms
+[2025-12-30T22:33:14.771Z] [INFO] GET / 304 1ms
+[2025-12-30T22:33:14.776Z] [INFO] GET /index.html 200 11ms
+[2025-12-30T22:33:14.809Z] [INFO] GET /css/base.css 304 2ms
+[2025-12-30T22:33:14.811Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T22:33:14.816Z] [INFO] GET /css/board.css 304 2ms
+[2025-12-30T22:33:14.840Z] [INFO] GET /css/modal.css 304 3ms
+[2025-12-30T22:33:14.851Z] [INFO] GET /css/calendar.css 304 3ms
+[2025-12-30T22:33:14.852Z] [INFO] GET /css/responsive.css 304 3ms
+[2025-12-30T22:33:14.873Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T22:33:14.882Z] [INFO] GET /js/utils.js 304 2ms
+[2025-12-30T22:33:14.884Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T22:33:14.901Z] [INFO] GET /js/auth.js 304 1ms
+[2025-12-30T22:33:14.911Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T22:33:14.915Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T22:33:14.930Z] [INFO] GET /js/offline.js 304 0ms
+[2025-12-30T22:33:14.959Z] [INFO] GET /js/board.js 304 3ms
+[2025-12-30T22:33:14.965Z] [INFO] GET /js/task-modal.js 304 8ms
+[2025-12-30T22:33:14.970Z] [INFO] GET /js/calendar.js 304 2ms
+[2025-12-30T22:33:14.995Z] [INFO] GET /js/shortcuts.js 304 2ms
+[2025-12-30T22:33:14.996Z] [INFO] GET /js/list.js 304 2ms
+[2025-12-30T22:33:14.998Z] [INFO] GET /js/undo.js 304 1ms
+[2025-12-30T22:33:15.026Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T22:33:15.034Z] [INFO] GET /js/proposals.js 304 4ms
+[2025-12-30T22:33:15.036Z] [INFO] GET /js/tour.js 200 7ms
+[2025-12-30T22:33:15.059Z] [INFO] GET /js/notifications.js 304 0ms
+[2025-12-30T22:33:15.064Z] [INFO] GET /js/knowledge.js 304 2ms
+[2025-12-30T22:33:15.065Z] [INFO] GET /js/gitea.js 304 3ms
+[2025-12-30T22:33:15.090Z] [INFO] GET /css/list.css 304 1ms
+[2025-12-30T22:33:15.094Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T22:33:15.097Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T22:33:15.120Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T22:33:15.126Z] [INFO] GET /css/gitea.css 304 3ms
+[2025-12-30T22:33:15.131Z] [INFO] GET /css/knowledge.css 304 3ms
+[2025-12-30T22:33:19.025Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T22:33:19.027Z] [INFO] POST /api/auth/login 200 497ms
+[2025-12-30T22:33:19.070Z] [INFO] GET /api/auth/users 200 8ms
+[2025-12-30T22:33:19.115Z] [INFO] Socket connected: HG (GQ78Yme8BH9rMuH4AAAF)
+[2025-12-30T22:33:19.122Z] [INFO] GET /api/projects 200 22ms
+[2025-12-30T22:33:19.154Z] [INFO] HG joined project:[object Object]
+[2025-12-30T22:33:19.179Z] [INFO] GET /api/tasks/project/2 200 20ms
+[2025-12-30T22:33:19.182Z] [INFO] GET /api/columns/2 200 22ms
+[2025-12-30T22:33:19.188Z] [INFO] GET /api/labels/2 200 4ms
+[2025-12-30T22:33:19.198Z] [INFO] GET /api/stats/dashboard?projectId=2 200 7ms
+[2025-12-30T22:33:19.256Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 200 10ms
+[2025-12-30T22:33:19.307Z] [INFO] GET /api/notifications 200 6ms
+[2025-12-30T22:33:19.352Z] [INFO] GET /api/knowledge/categories 200 10ms
+[2025-12-30T22:33:26.196Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T22:33:31.281Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T22:33:33.850Z] [INFO] GET /api/knowledge/entries?categoryId=1 200 8ms
+[2025-12-30T22:33:34.864Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:33:37.323Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T22:33:37.841Z] [INFO] GET /api/knowledge/entries?categoryId=2 200 8ms
+[2025-12-30T22:33:38.242Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 5ms
+[2025-12-30T22:33:39.197Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 7ms
+[2025-12-30T22:33:39.617Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 4ms
+[2025-12-30T22:33:40.630Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:33:42.984Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:33:45.197Z] [INFO] Knowledge-Kategorie aktualisiert: AccountForger
+[2025-12-30T22:33:45.198Z] [INFO] PUT /api/knowledge/categories/2 200 14ms
+[2025-12-30T22:33:45.243Z] [INFO] GET /api/knowledge/categories 200 12ms
+[2025-12-30T22:33:46.202Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:33:46.741Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 10ms
+[2025-12-30T22:33:47.698Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 4ms
+[2025-12-30T22:33:48.704Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T22:33:49.959Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:33:54.072Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:33:56.294Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:33:57.083Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:34:12.725Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:34:16.129Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:34:18.291Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:34:18.503Z] [INFO] Knowledge-Kategorie erstellt: nützliche Links
+[2025-12-30T22:34:18.504Z] [INFO] POST /api/knowledge/categories 201 10ms
+[2025-12-30T22:34:18.538Z] [INFO] GET /api/knowledge/categories 200 4ms
+[2025-12-30T22:34:19.515Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:34:19.566Z] [INFO] GET /api/knowledge/entries?categoryId=11 200 7ms
+[2025-12-30T22:34:20.578Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T22:34:26.386Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:34:31.400Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 6ms
+[2025-12-30T22:34:32.108Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 8ms
+[2025-12-30T22:34:32.591Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 9ms
+[2025-12-30T22:34:33.601Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T22:34:56.498Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:35:11.687Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:35:18.675Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:35:23.108Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:35:26.616Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:35:48.979Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:35:52.687Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:35:54.250Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:35:55.755Z] [INFO] Knowledge-Eintrag erstellt: Testlink
+[2025-12-30T22:35:55.757Z] [INFO] POST /api/knowledge/entries 201 12ms
+[2025-12-30T22:35:55.795Z] [INFO] GET /api/knowledge/entries?categoryId=11 200 6ms
+[2025-12-30T22:35:55.837Z] [INFO] GET /api/knowledge/categories 200 8ms
+[2025-12-30T22:35:56.727Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:35:56.752Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:35:58.696Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:35:59.848Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:36:03.325Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:36:04.633Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:36:11.261Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:36:14.421Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T22:36:16.199Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:36:16.775Z] [INFO] Knowledge-Eintrag erstellt: Testlink 2
+[2025-12-30T22:36:16.777Z] [INFO] POST /api/knowledge/entries 201 7ms
+[2025-12-30T22:36:16.811Z] [INFO] GET /api/knowledge/entries?categoryId=11 200 4ms
+[2025-12-30T22:36:16.844Z] [INFO] GET /api/knowledge/categories 200 4ms
+[2025-12-30T22:36:17.775Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:36:18.904Z] [INFO] PUT /api/knowledge/entries/3/position 200 5ms
+[2025-12-30T22:36:20.759Z] [INFO] PUT /api/knowledge/entries/3/position 200 6ms
+[2025-12-30T22:36:23.155Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 8ms
+[2025-12-30T22:36:23.492Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 6ms
+[2025-12-30T22:36:24.502Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T22:36:25.484Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 7ms
+[2025-12-30T22:36:25.811Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 5ms
+[2025-12-30T22:36:26.152Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 6ms
+[2025-12-30T22:36:26.734Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 4ms
+[2025-12-30T22:36:26.825Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:36:27.053Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 3ms
+[2025-12-30T22:36:28.062Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T22:36:56.933Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:37:27.027Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:37:33.749Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:37:35.609Z] [INFO] GET /api/knowledge/search?q=you 200 9ms
+[2025-12-30T22:37:36.312Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T22:37:38.055Z] [INFO] GET /api/knowledge/search?q=yo 200 5ms
+[2025-12-30T22:37:38.297Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 4ms
+[2025-12-30T22:37:39.573Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:37:41.039Z] [INFO] GET /api/tasks/6 200 15ms
+[2025-12-30T22:37:41.084Z] [INFO] GET /api/subtasks/6 200 12ms
+[2025-12-30T22:37:41.121Z] [INFO] GET /api/links/6 200 7ms
+[2025-12-30T22:37:41.149Z] [INFO] GET /api/files/6 200 10ms
+[2025-12-30T22:37:41.156Z] [INFO] GET /api/comments/6 200 5ms
+[2025-12-30T22:37:41.161Z] [INFO] GET /api/tasks/6/history 404 4ms
+[2025-12-30T22:37:41.195Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTM0MjU5LCJleHAiOjE3NjcxMzQ4NTl9.KoNOeSyfa_Hs8yCay3JqbF2QZ5Nv6vB2I4qApEVykuM 200 9ms
+[2025-12-30T22:37:41.196Z] [INFO] GET /api/files/preview/7?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTM0MjU5LCJleHAiOjE3NjcxMzQ4NTl9.KoNOeSyfa_Hs8yCay3JqbF2QZ5Nv6vB2I4qApEVykuM 200 15ms
+[2025-12-30T22:37:42.042Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:37:54.307Z] [INFO] GET / 200 5ms
+[2025-12-30T22:37:54.374Z] [INFO] GET /css/variables.css 304 1ms
+[2025-12-30T22:37:54.376Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T22:37:54.401Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T22:37:54.404Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T22:37:54.412Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T22:37:54.416Z] [INFO] GET /css/calendar.css 304 1ms
+[2025-12-30T22:37:54.419Z] [INFO] GET /css/list.css 304 1ms
+[2025-12-30T22:37:54.423Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T22:37:54.424Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T22:37:54.425Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T22:37:54.430Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T22:37:54.434Z] [INFO] GET /css/knowledge.css 200 1ms
+[2025-12-30T22:37:54.436Z] [INFO] GET /css/responsive.css 304 0ms
+[2025-12-30T22:37:54.443Z] [INFO] GET /js/app.js 200 2ms
+[2025-12-30T22:37:54.510Z] [INFO] GET /js/offline.js 304 3ms
+[2025-12-30T22:37:54.511Z] [INFO] GET /js/store.js 304 3ms
+[2025-12-30T22:37:54.515Z] [INFO] GET /js/api.js 200 9ms
+[2025-12-30T22:37:54.517Z] [INFO] GET /js/auth.js 200 5ms
+[2025-12-30T22:37:54.518Z] [INFO] GET /js/board.js 304 2ms
+[2025-12-30T22:37:54.520Z] [INFO] GET /js/sync.js 200 6ms
+[2025-12-30T22:37:54.538Z] [INFO] GET /js/task-modal.js 304 2ms
+[2025-12-30T22:37:54.539Z] [INFO] GET /js/calendar.js 304 2ms
+[2025-12-30T22:37:54.549Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T22:37:54.558Z] [INFO] GET /js/undo.js 304 1ms
+[2025-12-30T22:37:54.561Z] [INFO] GET /js/shortcuts.js 304 2ms
+[2025-12-30T22:37:54.563Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T22:37:54.566Z] [INFO] GET /js/proposals.js 304 2ms
+[2025-12-30T22:37:54.572Z] [INFO] GET /js/knowledge.js 200 3ms
+[2025-12-30T22:37:54.576Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T22:37:54.582Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T22:37:54.588Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T22:37:54.631Z] [INFO] POST /api/auth/refresh 200 17ms
+[2025-12-30T22:37:54.821Z] [INFO] GET /api/auth/users 304 10ms
+[2025-12-30T22:37:54.892Z] [INFO] GET /api/auth/users 304 9ms
+[2025-12-30T22:37:54.930Z] [INFO] Socket connected: MH (Oq1cCkzJG02iC_MuAAAH)
+[2025-12-30T22:37:54.940Z] [INFO] GET /api/projects 304 5ms
+[2025-12-30T22:37:54.944Z] [INFO] GET /assets/icons/task.svg 200 3ms
+[2025-12-30T22:37:54.978Z] [INFO] MH joined project:[object Object]
+[2025-12-30T22:37:54.987Z] [INFO] GET /api/stats/dashboard?projectId=2 304 8ms
+[2025-12-30T22:37:54.995Z] [INFO] GET /api/columns/2 304 15ms
+[2025-12-30T22:37:55.009Z] [INFO] GET /api/tasks/project/2 200 13ms
+[2025-12-30T22:37:55.015Z] [INFO] GET /api/labels/2 304 5ms
+[2025-12-30T22:37:55.085Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 6ms
+[2025-12-30T22:37:55.117Z] [INFO] GET /api/notifications 304 11ms
+[2025-12-30T22:37:55.146Z] [INFO] GET /api/knowledge/categories 200 4ms
+[2025-12-30T22:37:56.622Z] [INFO] GET /sw.js 200 4ms
+[2025-12-30T22:37:56.658Z] [INFO] GET / 304 2ms
+[2025-12-30T22:37:56.665Z] [INFO] GET /css/variables.css 304 3ms
+[2025-12-30T22:37:56.672Z] [INFO] GET /index.html 200 12ms
+[2025-12-30T22:37:56.677Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T22:37:56.686Z] [INFO] GET /css/components.css 304 1ms
+[2025-12-30T22:37:56.689Z] [INFO] GET /sw.js 200 2ms
+[2025-12-30T22:37:56.700Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T22:37:56.704Z] [INFO] GET /css/modal.css 304 0ms
+[2025-12-30T22:37:56.716Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T22:37:56.722Z] [INFO] GET /css/responsive.css 304 2ms
+[2025-12-30T22:37:56.724Z] [INFO] GET /js/app.js 304 0ms
+[2025-12-30T22:37:56.737Z] [INFO] GET /js/utils.js 304 2ms
+[2025-12-30T22:37:56.743Z] [INFO] GET /js/api.js 304 2ms
+[2025-12-30T22:37:56.747Z] [INFO] GET /js/auth.js 304 2ms
+[2025-12-30T22:37:56.759Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T22:37:56.761Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T22:37:56.766Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T22:37:56.786Z] [INFO] GET /js/task-modal.js 304 1ms
+[2025-12-30T22:37:56.787Z] [INFO] GET /js/board.js 304 1ms
+[2025-12-30T22:37:56.789Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T22:37:56.837Z] [INFO] GET /js/list.js 304 2ms
+[2025-12-30T22:37:56.840Z] [INFO] GET /js/shortcuts.js 304 2ms
+[2025-12-30T22:37:56.846Z] [INFO] GET /js/undo.js 304 2ms
+[2025-12-30T22:37:56.858Z] [INFO] GET /js/tour.js 304 2ms
+[2025-12-30T22:37:56.862Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T22:37:56.867Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T22:37:56.877Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T22:37:56.881Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T22:37:56.887Z] [INFO] GET /js/knowledge.js 304 1ms
+[2025-12-30T22:37:56.899Z] [INFO] GET /css/list.css 304 1ms
+[2025-12-30T22:37:56.904Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T22:37:56.910Z] [INFO] GET /css/proposals.css 304 2ms
+[2025-12-30T22:37:56.922Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T22:37:56.925Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T22:37:56.930Z] [INFO] GET /css/knowledge.css 304 1ms
+[2025-12-30T22:37:57.121Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:37:58.984Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T22:38:01.332Z] [INFO] GET /api/knowledge/entries?categoryId=1 200 8ms
+[2025-12-30T22:38:02.344Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T22:38:03.787Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T22:38:05.047Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:38:05.349Z] [INFO] GET /api/knowledge/entries?categoryId=11 200 7ms
+[2025-12-30T22:38:06.345Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:38:08.981Z] [INFO] PUT /api/subtasks/13 200 11ms
+[2025-12-30T22:38:09.025Z] [INFO] PUT /api/subtasks/13/position 200 9ms
+[2025-12-30T22:38:09.191Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T22:38:09.967Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:38:12.753Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T22:38:12.755Z] [INFO] PUT /api/tasks/6 200 8ms
+[2025-12-30T22:38:13.759Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:38:15.583Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T22:38:17.153Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T22:38:18.400Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:38:27.242Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:38:28.533Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:38:30.821Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 9ms
+[2025-12-30T22:38:31.230Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 9ms
+[2025-12-30T22:38:31.564Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 9ms
+[2025-12-30T22:38:32.566Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:38:57.368Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:39:27.466Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:39:57.596Z] [INFO] GET /api/health 200 7ms
+[2025-12-30T22:40:14.246Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:40:15.271Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:40:17.729Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T22:40:18.915Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:40:23.066Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T22:40:27.468Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T22:40:27.692Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:40:28.584Z] [INFO] Knowledge-Eintrag erstellt: AI Video Kanal
+[2025-12-30T22:40:28.585Z] [INFO] POST /api/knowledge/entries 201 7ms
+[2025-12-30T22:40:28.611Z] [INFO] GET /api/knowledge/entries?categoryId=11 200 5ms
+[2025-12-30T22:40:28.643Z] [INFO] GET /api/knowledge/categories 200 10ms
+[2025-12-30T22:40:29.588Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:40:33.413Z] [INFO] POST /api/auth/refresh 200 16ms
+[2025-12-30T22:40:57.787Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:41:18.069Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:41:19.207Z] [INFO] GET /api/knowledge/entries?categoryId=2 200 8ms
+[2025-12-30T22:41:20.215Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:41:21.920Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 6ms
+[2025-12-30T22:41:22.718Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 6ms
+[2025-12-30T22:41:23.131Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 5ms
+[2025-12-30T22:41:23.576Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 4ms
+[2025-12-30T22:41:24.589Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T22:41:25.185Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 9ms
+[2025-12-30T22:41:26.189Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:41:26.914Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 6ms
+[2025-12-30T22:41:27.884Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:41:27.912Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T22:41:29.738Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:41:31.711Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:41:58.072Z] [INFO] GET /api/health 200 7ms
+[2025-12-30T22:42:28.181Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:42:58.284Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:43:15.645Z] [INFO] POST /api/auth/refresh 200 17ms
+[2025-12-30T22:43:23.825Z] [INFO] GET /api/git/server/info 200 59ms
+[2025-12-30T22:43:23.898Z] [INFO] GET /api/git/server/status 200 51ms
+[2025-12-30T22:43:23.914Z] [INFO] GET /api/git/server/branches 200 14ms
+[2025-12-30T22:43:23.936Z] [INFO] GET /api/git/server/commits?limit=10 200 35ms
+[2025-12-30T22:43:24.785Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T22:43:27.114Z] [INFO] GET /api/gitea/repositories?page=1&limit=50 200 570ms
+[2025-12-30T22:43:27.608Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:43:28.401Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:43:28.892Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T22:43:31.083Z] [INFO] POST /api/auth/refresh 200 4ms
+[2025-12-30T22:43:33.264Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:43:58.491Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:44:28.601Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T22:44:31.412Z] [INFO] SIGTERM empfangen, fahre herunter...
+[2025-12-30T22:44:53.064Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T22:44:53.179Z] [INFO] Umgebung: production
+[2025-12-30T22:44:53.181Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T22:44:53.181Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T22:44:53.171Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T22:44:53.179Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T22:44:53.174Z] [INFO] Datenbank initialisiert
+[2025-12-30T22:44:53.943Z] [INFO] POST /api/auth/refresh 200 26ms
+[2025-12-30T22:44:55.981Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T22:44:56.940Z] [INFO] GET /api/health 200 8ms
+[2025-12-30T22:44:57.473Z] [INFO] Socket connected: MH (Gs99TuHJwdY62QpdAAAD)
+[2025-12-30T22:44:57.518Z] [INFO] MH joined project:[object Object]
+[2025-12-30T22:45:03.960Z] [INFO] GET / 200 21ms
+[2025-12-30T22:45:27.057Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T22:45:36.173Z] [INFO] GET / 200 8ms
+[2025-12-30T22:45:36.256Z] [INFO] GET /css/variables.css 200 7ms
+[2025-12-30T22:45:36.289Z] [INFO] GET /css/base.css 200 3ms
+[2025-12-30T22:45:36.312Z] [INFO] GET /css/components.css 200 3ms
+[2025-12-30T22:45:36.316Z] [INFO] GET /css/board.css 200 5ms
+[2025-12-30T22:45:36.332Z] [INFO] GET /css/modal.css 200 8ms
+[2025-12-30T22:45:36.338Z] [INFO] GET /css/calendar.css 200 10ms
+[2025-12-30T22:45:36.346Z] [INFO] GET /css/list.css 200 6ms
+[2025-12-30T22:45:36.348Z] [INFO] GET /css/admin.css 200 4ms
+[2025-12-30T22:45:36.369Z] [INFO] GET /css/notifications.css 200 4ms
+[2025-12-30T22:45:36.370Z] [INFO] GET /css/proposals.css 200 4ms
+[2025-12-30T22:45:36.374Z] [INFO] GET /css/gitea.css 200 3ms
+[2025-12-30T22:45:36.393Z] [INFO] GET /css/knowledge.css 200 3ms
+[2025-12-30T22:45:36.397Z] [INFO] GET /css/responsive.css 200 3ms
+[2025-12-30T22:45:36.408Z] [INFO] GET /js/app.js 200 9ms
+[2025-12-30T22:45:36.487Z] [INFO] GET /js/api.js 200 8ms
+[2025-12-30T22:45:36.492Z] [INFO] GET /js/store.js 200 10ms
+[2025-12-30T22:45:36.496Z] [INFO] GET /js/sync.js 200 11ms
+[2025-12-30T22:45:36.499Z] [INFO] GET /js/offline.js 200 9ms
+[2025-12-30T22:45:36.502Z] [INFO] GET /js/auth.js 200 8ms
+[2025-12-30T22:45:36.507Z] [INFO] GET /js/board.js 200 9ms
+[2025-12-30T22:45:36.513Z] [INFO] GET /js/task-modal.js 200 3ms
+[2025-12-30T22:45:36.526Z] [INFO] GET /js/calendar.js 200 2ms
+[2025-12-30T22:45:36.532Z] [INFO] GET /js/shortcuts.js 200 2ms
+[2025-12-30T22:45:36.534Z] [INFO] GET /js/list.js 200 4ms
+[2025-12-30T22:45:36.537Z] [INFO] GET /js/undo.js 200 2ms
+[2025-12-30T22:45:36.543Z] [INFO] GET /js/proposals.js 200 2ms
+[2025-12-30T22:45:36.559Z] [INFO] GET /js/notifications.js 200 3ms
+[2025-12-30T22:45:36.561Z] [INFO] GET /js/gitea.js 200 6ms
+[2025-12-30T22:45:36.571Z] [INFO] GET /js/utils.js 200 3ms
+[2025-12-30T22:45:36.573Z] [INFO] GET /js/knowledge.js 200 4ms
+[2025-12-30T22:45:36.583Z] [INFO] GET /js/admin.js 200 3ms
+[2025-12-30T22:45:36.636Z] [INFO] GET /sw.js 200 7ms
+[2025-12-30T22:45:36.646Z] [INFO] GET /assets/icons/task.svg 200 12ms
+[2025-12-30T22:45:36.675Z] [INFO] GET / 304 3ms
+[2025-12-30T22:45:36.679Z] [INFO] GET /css/variables.css 304 2ms
+[2025-12-30T22:45:36.681Z] [INFO] GET /index.html 200 8ms
+[2025-12-30T22:45:36.717Z] [INFO] GET /css/components.css 304 1ms
+[2025-12-30T22:45:36.722Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T22:45:36.731Z] [INFO] GET /css/board.css 304 2ms
+[2025-12-30T22:45:36.752Z] [INFO] GET /css/modal.css 304 2ms
+[2025-12-30T22:45:36.757Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T22:45:36.789Z] [INFO] GET /css/responsive.css 304 3ms
+[2025-12-30T22:45:36.796Z] [INFO] GET /js/app.js 304 2ms
+[2025-12-30T22:45:36.800Z] [INFO] GET /js/utils.js 304 2ms
+[2025-12-30T22:45:36.822Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T22:45:36.830Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T22:45:36.832Z] [INFO] GET /js/auth.js 304 1ms
+[2025-12-30T22:45:36.858Z] [INFO] GET /js/sync.js 304 3ms
+[2025-12-30T22:45:36.869Z] [INFO] GET /js/offline.js 304 6ms
+[2025-12-30T22:45:36.872Z] [INFO] GET /js/board.js 304 2ms
+[2025-12-30T22:45:36.892Z] [INFO] GET /js/task-modal.js 304 2ms
+[2025-12-30T22:45:36.899Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T22:45:36.902Z] [INFO] GET /js/list.js 304 0ms
+[2025-12-30T22:45:36.924Z] [INFO] GET /js/shortcuts.js 304 3ms
+[2025-12-30T22:45:36.936Z] [INFO] GET /js/undo.js 304 4ms
+[2025-12-30T22:45:36.945Z] [INFO] GET /js/tour.js 200 5ms
+[2025-12-30T22:45:36.960Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T22:45:36.964Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T22:45:36.977Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T22:45:36.991Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T22:45:36.996Z] [INFO] GET /js/knowledge.js 304 1ms
+[2025-12-30T22:45:37.011Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T22:45:37.022Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T22:45:37.029Z] [INFO] GET /css/proposals.css 304 4ms
+[2025-12-30T22:45:37.047Z] [INFO] GET /css/notifications.css 304 3ms
+[2025-12-30T22:45:37.051Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T22:45:37.059Z] [INFO] GET /css/knowledge.css 304 1ms
+[2025-12-30T22:45:40.688Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T22:45:40.692Z] [INFO] POST /api/auth/login 200 510ms
+[2025-12-30T22:45:40.740Z] [INFO] GET /api/auth/users 200 11ms
+[2025-12-30T22:45:40.766Z] [INFO] Socket connected: HG (5rh4-JpxNWea6gESAAAF)
+[2025-12-30T22:45:40.783Z] [INFO] GET /api/projects 200 9ms
+[2025-12-30T22:45:40.818Z] [INFO] HG joined project:[object Object]
+[2025-12-30T22:45:40.856Z] [INFO] GET /api/tasks/project/2 200 37ms
+[2025-12-30T22:45:40.865Z] [INFO] GET /api/columns/2 200 7ms
+[2025-12-30T22:45:40.870Z] [INFO] GET /api/stats/dashboard?projectId=2 200 10ms
+[2025-12-30T22:45:40.875Z] [INFO] GET /api/labels/2 200 4ms
+[2025-12-30T22:45:40.959Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 200 4ms
+[2025-12-30T22:45:41.000Z] [INFO] GET /api/notifications 200 9ms
+[2025-12-30T22:45:41.048Z] [INFO] GET /api/knowledge/categories 200 9ms
+[2025-12-30T22:45:41.471Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:45:44.570Z] [INFO] POST /api/auth/refresh 200 15ms
+[2025-12-30T22:45:47.323Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T22:45:51.953Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T22:45:53.187Z] [INFO] Backup erstellt: backup_2025-12-30T22-45-53-182Z.db
+[2025-12-30T22:45:53.191Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T21-09-27-499Z.db
+[2025-12-30T22:45:53.193Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T22:45:57.153Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:45:58.024Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:45:58.036Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:45:59.862Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T22:46:01.070Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:46:02.963Z] [INFO] POST /api/auth/refresh 200 15ms
+[2025-12-30T22:46:05.025Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T22:46:13.511Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:46:18.016Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:46:18.404Z] [INFO] Knowledge-Kategorie aktualisiert: nützliche Links
+[2025-12-30T22:46:18.405Z] [INFO] PUT /api/knowledge/categories/11 200 9ms
+[2025-12-30T22:46:18.441Z] [INFO] GET /api/knowledge/categories 200 4ms
+[2025-12-30T22:46:19.406Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:46:20.529Z] [INFO] GET /api/knowledge/entries?categoryId=2 200 5ms
+[2025-12-30T22:46:21.539Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T22:46:24.669Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:46:27.246Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:46:27.467Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:46:38.499Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T22:46:39.424Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T22:46:39.888Z] [INFO] GET /api/tasks/6 200 7ms
+[2025-12-30T22:46:39.924Z] [INFO] GET /api/subtasks/6 200 7ms
+[2025-12-30T22:46:39.949Z] [INFO] GET /api/links/6 304 4ms
+[2025-12-30T22:46:39.957Z] [INFO] GET /api/files/6 304 4ms
+[2025-12-30T22:46:39.960Z] [INFO] GET /api/comments/6 304 6ms
+[2025-12-30T22:46:39.963Z] [INFO] GET /api/tasks/6/history 404 2ms
+[2025-12-30T22:46:39.989Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMzQ3OTksImV4cCI6MTc2NzEzNTM5OX0.69ToN05ucR02Q5JR8FWbUHpLEPX48ha4OpJJBsFfyLs 200 12ms
+[2025-12-30T22:46:39.990Z] [INFO] GET /api/files/preview/7?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMzQ3OTksImV4cCI6MTc2NzEzNTM5OX0.69ToN05ucR02Q5JR8FWbUHpLEPX48ha4OpJJBsFfyLs 200 13ms
+[2025-12-30T22:46:40.892Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:46:43.348Z] [INFO] GET /api/knowledge/entries?categoryId=11 200 7ms
+[2025-12-30T22:46:43.402Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T22:46:44.349Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:46:46.816Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T22:46:48.654Z] [INFO] Knowledge-Kategorie aktualisiert: nützliche Links
+[2025-12-30T22:46:48.655Z] [INFO] PUT /api/knowledge/categories/11 200 4ms
+[2025-12-30T22:46:48.696Z] [INFO] GET /api/knowledge/categories 200 8ms
+[2025-12-30T22:46:49.662Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:46:50.075Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 9ms
+[2025-12-30T22:46:51.071Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:46:53.487Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T22:46:57.373Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:46:58.100Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:47:27.485Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:47:30.444Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T22:47:32.676Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:47:32.864Z] [INFO] Knowledge-Kategorie aktualisiert: AccountForger
+[2025-12-30T22:47:32.866Z] [INFO] PUT /api/knowledge/categories/2 200 13ms
+[2025-12-30T22:47:32.909Z] [INFO] GET /api/knowledge/categories 200 3ms
+[2025-12-30T22:47:33.864Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:47:34.254Z] [INFO] GET /api/knowledge/entries?categoryId=1 200 9ms
+[2025-12-30T22:47:35.260Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:47:38.586Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T22:47:42.640Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:47:47.597Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:47:49.275Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T22:47:50.902Z] [WARN] Abgelehnter Upload: 01.mp4 (video/mp4)
+[2025-12-30T22:47:50.904Z] [ERROR] Error: Dateityp nicht erlaubt: video/mp4 {"stack":"Error: Dateityp nicht erlaubt: video/mp4\n at fileFilter (/app/middleware/upload.js:113:8)\n at wrappedFileFilter (/app/node_modules/multer/index.js:44:7)\n at Multipart. (/app/node_modules/multer/lib/make-middleware.js:109:7)\n at Multipart.emit (node:events:524:28)\n at HeaderParser.cb (/app/node_modules/busboy/lib/types/multipart.js:358:14)\n at HeaderParser.push (/app/node_modules/busboy/lib/types/multipart.js:162:20)\n at SBMH.ssCb [as _cb] (/app/node_modules/busboy/lib/types/multipart.js:394:37)\n at feed (/app/node_modules/streamsearch/lib/sbmh.js:248:10)\n at SBMH.push (/app/node_modules/streamsearch/lib/sbmh.js:104:16)\n at Multipart._write (/app/node_modules/busboy/lib/types/multipart.js:567:19)"}
+[2025-12-30T22:47:50.907Z] [INFO] POST /api/files/6 500 21ms
+[2025-12-30T22:47:50.956Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:47:57.611Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:47:58.062Z] [INFO] PUT /api/knowledge/categories/1 200 7ms
+[2025-12-30T22:47:58.060Z] [INFO] Knowledge-Kategorie aktualisiert: Router
+[2025-12-30T22:47:58.100Z] [INFO] GET /api/knowledge/categories 200 8ms
+[2025-12-30T22:47:59.982Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:48:03.707Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:48:06.925Z] [INFO] GET / 304 1ms
+[2025-12-30T22:48:06.964Z] [INFO] Socket disconnected: HG (5rh4-JpxNWea6gESAAAF)
+[2025-12-30T22:48:06.969Z] [INFO] GET /css/variables.css 304 1ms
+[2025-12-30T22:48:07.003Z] [INFO] GET /css/base.css 304 4ms
+[2025-12-30T22:48:07.027Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T22:48:07.031Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T22:48:07.036Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T22:48:07.041Z] [INFO] GET /css/calendar.css 304 1ms
+[2025-12-30T22:48:07.044Z] [INFO] GET /css/list.css 304 1ms
+[2025-12-30T22:48:07.047Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T22:48:07.054Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T22:48:07.071Z] [INFO] GET /css/knowledge.css 304 2ms
+[2025-12-30T22:48:07.072Z] [INFO] GET /css/gitea.css 304 2ms
+[2025-12-30T22:48:07.074Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T22:48:07.077Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T22:48:07.081Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T22:48:07.120Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T22:48:07.122Z] [INFO] GET /js/board.js 304 1ms
+[2025-12-30T22:48:07.126Z] [INFO] GET /js/sync.js 304 3ms
+[2025-12-30T22:48:07.127Z] [INFO] GET /js/offline.js 304 2ms
+[2025-12-30T22:48:07.128Z] [INFO] GET /js/store.js 304 0ms
+[2025-12-30T22:48:07.130Z] [INFO] GET /js/auth.js 304 1ms
+[2025-12-30T22:48:07.152Z] [INFO] GET /js/calendar.js 304 2ms
+[2025-12-30T22:48:07.153Z] [INFO] GET /js/task-modal.js 304 2ms
+[2025-12-30T22:48:07.156Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T22:48:07.160Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T22:48:07.164Z] [INFO] GET /js/undo.js 304 2ms
+[2025-12-30T22:48:07.165Z] [INFO] GET /js/admin.js 304 2ms
+[2025-12-30T22:48:07.178Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T22:48:07.187Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T22:48:07.189Z] [INFO] GET /js/gitea.js 304 3ms
+[2025-12-30T22:48:07.193Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T22:48:07.194Z] [INFO] GET /js/knowledge.js 304 2ms
+[2025-12-30T22:48:07.236Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:48:07.242Z] [INFO] GET /api/auth/users 304 5ms
+[2025-12-30T22:48:07.245Z] [INFO] GET /assets/icons/task.svg 304 2ms
+[2025-12-30T22:48:07.286Z] [INFO] GET /api/auth/users 304 8ms
+[2025-12-30T22:48:07.316Z] [INFO] Socket connected: HG (wYxXqS3-Ze65HrFMAAAH)
+[2025-12-30T22:48:07.328Z] [INFO] GET /api/projects 304 6ms
+[2025-12-30T22:48:07.373Z] [INFO] GET /api/labels/2 304 8ms
+[2025-12-30T22:48:07.381Z] [INFO] GET /api/stats/dashboard?projectId=2 304 7ms
+[2025-12-30T22:48:07.387Z] [INFO] GET /api/columns/2 304 5ms
+[2025-12-30T22:48:07.404Z] [INFO] GET /api/tasks/project/2 304 14ms
+[2025-12-30T22:48:07.406Z] [INFO] HG joined project:[object Object]
+[2025-12-30T22:48:07.448Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 3ms
+[2025-12-30T22:48:07.502Z] [INFO] GET /api/notifications 304 9ms
+[2025-12-30T22:48:07.538Z] [INFO] GET /api/knowledge/categories 304 5ms
+[2025-12-30T22:48:08.975Z] [INFO] GET /sw.js 304 1ms
+[2025-12-30T22:48:09.525Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:48:14.638Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 5ms
+[2025-12-30T22:48:15.639Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T22:48:16.187Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T22:48:16.190Z] [INFO] PUT /api/tasks/6 200 16ms
+[2025-12-30T22:48:17.193Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:48:17.936Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:48:19.978Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:48:20.420Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T22:48:21.254Z] [INFO] GET / 200 3ms
+[2025-12-30T22:48:21.298Z] [INFO] Socket disconnected: MH (Gs99TuHJwdY62QpdAAAD)
+[2025-12-30T22:48:21.322Z] [INFO] GET /css/variables.css 200 3ms
+[2025-12-30T22:48:21.323Z] [INFO] GET /css/base.css 200 3ms
+[2025-12-30T22:48:21.362Z] [INFO] GET /css/components.css 200 4ms
+[2025-12-30T22:48:21.370Z] [INFO] GET /css/board.css 200 6ms
+[2025-12-30T22:48:21.372Z] [INFO] GET /css/modal.css 200 7ms
+[2025-12-30T22:48:21.375Z] [INFO] GET /css/calendar.css 200 8ms
+[2025-12-30T22:48:21.377Z] [INFO] GET /css/list.css 200 9ms
+[2025-12-30T22:48:21.378Z] [INFO] GET /css/admin.css 200 4ms
+[2025-12-30T22:48:21.396Z] [INFO] GET /css/proposals.css 200 2ms
+[2025-12-30T22:48:21.410Z] [INFO] GET /css/notifications.css 200 6ms
+[2025-12-30T22:48:21.413Z] [INFO] GET /css/gitea.css 200 7ms
+[2025-12-30T22:48:21.422Z] [INFO] GET /css/knowledge.css 200 7ms
+[2025-12-30T22:48:21.426Z] [INFO] GET /css/responsive.css 200 10ms
+[2025-12-30T22:48:21.430Z] [INFO] GET /js/app.js 200 5ms
+[2025-12-30T22:48:21.502Z] [INFO] GET /js/api.js 200 4ms
+[2025-12-30T22:48:21.505Z] [INFO] GET /js/store.js 200 6ms
+[2025-12-30T22:48:21.508Z] [INFO] GET /js/board.js 200 7ms
+[2025-12-30T22:48:21.510Z] [INFO] GET /js/auth.js 200 6ms
+[2025-12-30T22:48:21.513Z] [INFO] GET /js/sync.js 200 6ms
+[2025-12-30T22:48:21.514Z] [INFO] GET /js/offline.js 200 5ms
+[2025-12-30T22:48:21.532Z] [INFO] GET /js/task-modal.js 200 1ms
+[2025-12-30T22:48:21.545Z] [INFO] GET /js/calendar.js 200 3ms
+[2025-12-30T22:48:21.561Z] [INFO] GET /js/list.js 200 8ms
+[2025-12-30T22:48:21.567Z] [INFO] GET /js/app.js 200 4ms
+[2025-12-30T22:48:21.570Z] [INFO] GET /js/shortcuts.js 200 3ms
+[2025-12-30T22:48:21.570Z] [INFO] GET /js/undo.js 200 2ms
+[2025-12-30T22:48:21.576Z] [INFO] GET /js/admin.js 200 3ms
+[2025-12-30T22:48:21.579Z] [INFO] GET /js/proposals.js 200 4ms
+[2025-12-30T22:48:21.585Z] [INFO] GET /js/notifications.js 200 5ms
+[2025-12-30T22:48:21.587Z] [INFO] GET /js/api.js 200 6ms
+[2025-12-30T22:48:21.590Z] [INFO] GET /js/store.js 304 6ms
+[2025-12-30T22:48:21.595Z] [INFO] GET /js/gitea.js 200 4ms
+[2025-12-30T22:48:21.598Z] [INFO] GET /js/knowledge.js 200 5ms
+[2025-12-30T22:48:21.602Z] [INFO] GET /js/auth.js 200 6ms
+[2025-12-30T22:48:21.605Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T22:48:21.607Z] [INFO] GET /js/sync.js 200 7ms
+[2025-12-30T22:48:21.610Z] [INFO] GET /js/utils.js 200 4ms
+[2025-12-30T22:48:21.619Z] [INFO] GET /js/task-modal.js 304 3ms
+[2025-12-30T22:48:21.645Z] [INFO] GET /js/board.js 304 2ms
+[2025-12-30T22:48:21.647Z] [INFO] GET /js/calendar.js 304 3ms
+[2025-12-30T22:48:21.658Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:48:21.827Z] [INFO] GET /api/auth/users 200 9ms
+[2025-12-30T22:48:21.915Z] [INFO] GET /api/auth/users 304 12ms
+[2025-12-30T22:48:21.923Z] [INFO] GET /assets/icons/task.svg 200 15ms
+[2025-12-30T22:48:21.928Z] [INFO] Socket connected: MH (SuKW9DTAmCDgyO90AAAJ)
+[2025-12-30T22:48:21.951Z] [INFO] GET /api/projects 304 14ms
+[2025-12-30T22:48:21.979Z] [INFO] MH joined project:[object Object]
+[2025-12-30T22:48:21.990Z] [INFO] GET /api/labels/2 304 6ms
+[2025-12-30T22:48:21.996Z] [INFO] GET /api/stats/dashboard?projectId=2 304 5ms
+[2025-12-30T22:48:22.000Z] [INFO] GET /api/columns/2 304 3ms
+[2025-12-30T22:48:22.015Z] [INFO] GET /api/tasks/project/2 200 13ms
+[2025-12-30T22:48:22.020Z] [INFO] GET /js/list.js 304 4ms
+[2025-12-30T22:48:22.022Z] [INFO] GET /js/shortcuts.js 304 2ms
+[2025-12-30T22:48:22.023Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T22:48:22.025Z] [INFO] GET /js/undo.js 304 1ms
+[2025-12-30T22:48:22.027Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T22:48:22.028Z] [INFO] GET /js/proposals.js 304 2ms
+[2025-12-30T22:48:22.037Z] [INFO] GET /js/knowledge.js 200 1ms
+[2025-12-30T22:48:22.039Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T22:48:22.041Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T22:48:22.047Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 4ms
+[2025-12-30T22:48:22.088Z] [INFO] GET /api/notifications 304 12ms
+[2025-12-30T22:48:22.122Z] [INFO] GET /api/knowledge/categories 200 9ms
+[2025-12-30T22:48:24.537Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:48:27.703Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:48:28.403Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T22:48:30.565Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:48:32.026Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 8ms
+[2025-12-30T22:48:32.620Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 5ms
+[2025-12-30T22:48:33.288Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 6ms
+[2025-12-30T22:48:33.818Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 6ms
+[2025-12-30T22:48:34.235Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 8ms
+[2025-12-30T22:48:35.240Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T22:48:37.710Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T22:48:40.705Z] [INFO] Knowledge-Eintrag gelöscht: Testeintrag
+[2025-12-30T22:48:40.706Z] [INFO] DELETE /api/knowledge/entries/1 200 10ms
+[2025-12-30T22:48:40.762Z] [INFO] GET /api/knowledge/entries?categoryId=1 200 7ms
+[2025-12-30T22:48:40.801Z] [INFO] GET /api/knowledge/categories 200 5ms
+[2025-12-30T22:48:53.406Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T22:48:56.641Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T22:48:57.784Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T22:49:27.889Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T22:49:39.637Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T22:49:39.744Z] [INFO] GET /api/git/server/info 200 38ms
+[2025-12-30T22:49:39.820Z] [INFO] GET /api/git/server/status 200 43ms
+[2025-12-30T22:49:39.849Z] [INFO] GET /api/git/server/branches 200 16ms
+[2025-12-30T22:49:39.864Z] [INFO] GET /api/git/server/commits?limit=10 200 13ms
+[2025-12-30T22:49:40.731Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T22:49:44.697Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T22:49:55.705Z] [INFO] POST /api/auth/refresh 200 11ms