diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 5bc984b..41a043a 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,6 +1,54 @@
TASKMATE - CHANGELOG
====================
+================================================================================
+30.12.2025 - Browser-Upload: Lokale Verzeichnisse ins Gitea pushen
+================================================================================
+
+FEATURE: VERZEICHNIS-UPLOAD VOM BROWSER
+--------------------------------------------------------------------------------
+- Lokale Verzeichnisse direkt vom Computer ins Gitea pushen
+- Verwendet File System Access API (Chrome/Edge/Opera)
+- Drag & Drop als Fallback für andere Browser
+- Automatische Filterung von .git, node_modules, etc.
+
+ABLAUF
+--------------------------------------------------------------------------------
+1. Ziel-Repository aus Gitea-Liste auswählen
+2. Ziel-Branch eingeben (Standard: main)
+3. "Verzeichnis auswählen" klicken oder Ordner per Drag & Drop
+4. Datei-Vorschau prüfen
+5. Commit-Nachricht eingeben
+6. "Commit & Push" ausführen
+
+TECHNISCHE ÄNDERUNGEN
+--------------------------------------------------------------------------------
+- backend/routes/git.js:
+ * POST /api/git/browser-upload - Empfängt Dateien und pusht ins Gitea
+ * POST /api/git/browser-upload-prepare - Bereitet Upload-Session vor
+ * DELETE /api/git/browser-upload/:sessionId - Bricht Upload ab
+ * Multer-Konfiguration für Git-Uploads (50MB/Datei, 500 Dateien max)
+- frontend/js/api.js:
+ * prepareBrowserUpload() - Session vorbereiten
+ * browserUploadAndPush() - Dateien hochladen und pushen
+ * cancelBrowserUpload() - Session abbrechen
+- frontend/js/gitea.js:
+ * Browser-Upload Properties und Ignore-Patterns
+ * bindBrowserUploadEvents() - Event-Handler
+ * handleSelectDirectory() - File System Access API
+ * readDirectoryRecursive() - Verzeichnis rekursiv lesen
+ * handleDroppedFiles() - Drag & Drop Handler
+ * renderUploadPreview() - Datei-Vorschau
+ * executeBrowserUpload() - Upload durchführen
+- frontend/index.html: Neues Browser-Upload UI mit Schritten
+- frontend/css/gitea.css: Styles für Upload-Schritte, Drop-Zone, Progress
+- frontend/sw.js: Cache-Version auf 132 erhöht
+
+IGNORIERTE DATEIEN/ORDNER
+--------------------------------------------------------------------------------
+.git, node_modules, __pycache__, .env, .env.local, .env.production,
+.DS_Store, Thumbs.db, .idea, .vscode, dist, build, .cache, coverage
+
================================================================================
30.12.2025 - Gitea-Integration: Server-Modus
================================================================================
diff --git a/backend/routes/git.js b/backend/routes/git.js
index 3a5a232..ce29203 100644
--- a/backend/routes/git.js
+++ b/backend/routes/git.js
@@ -6,14 +6,49 @@
const express = require('express');
const router = express.Router();
+const path = require('path');
+const fs = require('fs');
+const os = require('os');
const { getDb } = require('../database');
const logger = require('../utils/logger');
const gitService = require('../services/gitService');
const giteaService = require('../services/giteaService');
+const multer = require('multer');
// Fester Pfad für Server-Modus (TaskMate Source-Code)
const SERVER_SOURCE_PATH = '/app/taskmate-source';
+// Temporäres Verzeichnis für Browser-Uploads
+const TEMP_UPLOAD_DIR = path.join(os.tmpdir(), 'taskmate-git-uploads');
+
+// Multer-Konfiguration für Git-Uploads (beliebige Dateitypen)
+const gitUploadStorage = multer.diskStorage({
+ destination: (req, file, cb) => {
+ // Erstelle eindeutiges temporäres Verzeichnis pro Upload-Session
+ const sessionId = req.body.sessionId || Date.now().toString();
+ const sessionDir = path.join(TEMP_UPLOAD_DIR, sessionId);
+
+ // Relativen Pfad aus dem Dateinamen extrahieren (wird vom Frontend gesendet)
+ const relativePath = file.originalname;
+ const fileDir = path.join(sessionDir, path.dirname(relativePath));
+
+ fs.mkdirSync(fileDir, { recursive: true });
+ cb(null, fileDir);
+ },
+ filename: (req, file, cb) => {
+ // Nur den Dateinamen ohne Pfad
+ cb(null, path.basename(file.originalname));
+ }
+});
+
+const gitUpload = multer({
+ storage: gitUploadStorage,
+ limits: {
+ fileSize: 50 * 1024 * 1024, // 50MB pro Datei
+ files: 500 // Maximal 500 Dateien
+ }
+});
+
/**
* Hilfsfunktion: Anwendung für Projekt abrufen
*/
@@ -757,4 +792,178 @@ router.get('/server/info', (req, res) => {
}
});
+// ============================================
+// BROWSER-UPLOAD ENDPOINTS
+// Für lokale Verzeichnis-Uploads vom Browser
+// ============================================
+
+/**
+ * Hilfsfunktion: Verzeichnis rekursiv löschen
+ */
+function deleteFolderRecursive(dirPath) {
+ if (fs.existsSync(dirPath)) {
+ fs.readdirSync(dirPath).forEach((file) => {
+ const curPath = path.join(dirPath, file);
+ if (fs.lstatSync(curPath).isDirectory()) {
+ deleteFolderRecursive(curPath);
+ } else {
+ fs.unlinkSync(curPath);
+ }
+ });
+ fs.rmdirSync(dirPath);
+ }
+}
+
+/**
+ * POST /api/git/browser-upload
+ * Empfängt Dateien vom Browser und pusht sie ins Gitea
+ *
+ * Body (multipart/form-data):
+ * - files: Die hochgeladenen Dateien (originalname enthält relativen Pfad)
+ * - repoUrl: Die Gitea-Repository-URL
+ * - branch: Der Ziel-Branch (default: main)
+ * - commitMessage: Die Commit-Nachricht
+ * - sessionId: Eindeutige Session-ID für den Upload
+ */
+router.post('/browser-upload', gitUpload.array('files', 500), async (req, res) => {
+ const sessionId = req.body.sessionId || Date.now().toString();
+ const sessionDir = path.join(TEMP_UPLOAD_DIR, sessionId);
+
+ try {
+ const { repoUrl, branch = 'main', commitMessage } = req.body;
+ const files = req.files;
+
+ // Validierung
+ if (!repoUrl) {
+ return res.status(400).json({ error: 'Repository-URL ist erforderlich' });
+ }
+
+ if (!commitMessage) {
+ return res.status(400).json({ error: 'Commit-Nachricht ist erforderlich' });
+ }
+
+ if (!files || files.length === 0) {
+ return res.status(400).json({ error: 'Keine Dateien hochgeladen' });
+ }
+
+ logger.info(`[Browser-Upload] ${files.length} Dateien empfangen für ${repoUrl}`);
+
+ // Git-Repository initialisieren
+ const initResult = gitService.initRepository(sessionDir);
+ if (!initResult.success) {
+ throw new Error('Git-Initialisierung fehlgeschlagen: ' + initResult.error);
+ }
+
+ // Remote hinzufügen
+ const remoteResult = gitService.addRemote(sessionDir, repoUrl, 'origin');
+ if (!remoteResult.success) {
+ throw new Error('Remote hinzufügen fehlgeschlagen: ' + remoteResult.error);
+ }
+
+ // Autor aus eingeloggtem Benutzer
+ const author = req.user ? {
+ name: req.user.display_name || req.user.username,
+ email: req.user.email || `${req.user.username.toLowerCase()}@taskmate.local`
+ } : null;
+
+ // Alle Dateien stagen
+ const stageResult = gitService.stageAll(sessionDir);
+ if (!stageResult.success) {
+ throw new Error('Staging fehlgeschlagen: ' + stageResult.error);
+ }
+
+ // Commit erstellen
+ const commitResult = gitService.commit(sessionDir, commitMessage, author);
+ if (!commitResult.success) {
+ throw new Error('Commit fehlgeschlagen: ' + commitResult.error);
+ }
+
+ // Push mit Upstream
+ const pushResult = gitService.pushWithUpstream(sessionDir, branch, 'origin', false);
+ if (!pushResult.success) {
+ // Bei Fehler: Versuche Force-Push falls Branch existiert
+ if (pushResult.error && pushResult.error.includes('rejected')) {
+ logger.warn('[Browser-Upload] Normaler Push abgelehnt, versuche mit Force...');
+ const forcePushResult = gitService.pushWithUpstream(sessionDir, branch, 'origin', true);
+ if (!forcePushResult.success) {
+ throw new Error('Push fehlgeschlagen: ' + forcePushResult.error);
+ }
+ } else {
+ throw new Error('Push fehlgeschlagen: ' + pushResult.error);
+ }
+ }
+
+ logger.info(`[Browser-Upload] Erfolgreich nach ${repoUrl}/${branch} gepusht`);
+
+ // Erfolgreich - Aufräumen
+ deleteFolderRecursive(sessionDir);
+
+ res.json({
+ success: true,
+ message: `${files.length} Dateien erfolgreich nach ${branch} gepusht`,
+ filesCount: files.length,
+ branch: branch,
+ commit: commitResult.hash || null
+ });
+
+ } catch (error) {
+ logger.error('[Browser-Upload] Fehler:', error);
+
+ // Bei Fehler aufräumen
+ try {
+ deleteFolderRecursive(sessionDir);
+ } catch (cleanupError) {
+ logger.warn('[Browser-Upload] Aufräumen fehlgeschlagen:', cleanupError);
+ }
+
+ res.status(500).json({
+ success: false,
+ error: error.message || 'Upload fehlgeschlagen'
+ });
+ }
+});
+
+/**
+ * POST /api/git/browser-upload-prepare
+ * Bereitet einen Upload vor und gibt eine Session-ID zurück
+ */
+router.post('/browser-upload-prepare', (req, res) => {
+ const sessionId = `upload_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
+ const sessionDir = path.join(TEMP_UPLOAD_DIR, sessionId);
+
+ try {
+ fs.mkdirSync(sessionDir, { recursive: true });
+
+ res.json({
+ success: true,
+ sessionId: sessionId,
+ maxFileSize: 50 * 1024 * 1024, // 50MB
+ maxFiles: 500
+ });
+ } catch (error) {
+ logger.error('[Browser-Upload] Prepare fehlgeschlagen:', error);
+ res.status(500).json({ error: 'Vorbereitung fehlgeschlagen' });
+ }
+});
+
+/**
+ * DELETE /api/git/browser-upload/:sessionId
+ * Löscht eine Upload-Session (für Abbruch)
+ */
+router.delete('/browser-upload/:sessionId', (req, res) => {
+ const { sessionId } = req.params;
+ const sessionDir = path.join(TEMP_UPLOAD_DIR, sessionId);
+
+ try {
+ if (fs.existsSync(sessionDir)) {
+ deleteFolderRecursive(sessionDir);
+ }
+
+ res.json({ success: true });
+ } catch (error) {
+ logger.error('[Browser-Upload] Löschen fehlgeschlagen:', error);
+ res.status(500).json({ error: 'Löschen fehlgeschlagen' });
+ }
+});
+
module.exports = router;
diff --git a/backups/backup_2025-12-28T16-17-00-340Z.db b/backups/backup_2025-12-28T16-17-00-340Z.db
deleted file mode 100644
index c09da33..0000000
Binary files a/backups/backup_2025-12-28T16-17-00-340Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-28T16-17-00-340Z.db-wal b/backups/backup_2025-12-28T16-17-00-340Z.db-wal
deleted file mode 100644
index b37a0ee..0000000
Binary files a/backups/backup_2025-12-28T16-17-00-340Z.db-wal and /dev/null differ
diff --git a/backups/backup_2025-12-28T16-19-37-475Z.db b/backups/backup_2025-12-28T16-19-37-475Z.db
deleted file mode 100644
index c09da33..0000000
Binary files a/backups/backup_2025-12-28T16-19-37-475Z.db and /dev/null differ
diff --git a/backups/backup_2025-12-28T16-19-37-475Z.db-wal b/backups/backup_2025-12-28T16-19-37-475Z.db-wal
deleted file mode 100644
index 4ea6f02..0000000
Binary files a/backups/backup_2025-12-28T16-19-37-475Z.db-wal and /dev/null differ
diff --git a/data/taskmate.db-shm b/data/taskmate.db-shm
index 74142a2..b0d807c 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 8c53d73..3af8f89 100644
Binary files a/data/taskmate.db-wal and b/data/taskmate.db-wal differ
diff --git a/frontend/css/gitea.css b/frontend/css/gitea.css
index 3795fd6..3d69c9e 100644
--- a/frontend/css/gitea.css
+++ b/frontend/css/gitea.css
@@ -695,3 +695,206 @@
justify-content: center;
}
}
+
+/* =============================================================================
+ BROWSER UPLOAD
+ ============================================================================= */
+
+.browser-compat-notice {
+ display: flex;
+ align-items: flex-start;
+ gap: var(--spacing-3);
+ padding: var(--spacing-3) var(--spacing-4);
+ background: rgba(245, 158, 11, 0.1);
+ border: 1px solid rgba(245, 158, 11, 0.3);
+ border-radius: var(--radius-md);
+ margin-bottom: var(--spacing-4);
+ color: var(--warning);
+ font-size: var(--text-sm);
+}
+
+.browser-compat-notice svg {
+ flex-shrink: 0;
+ margin-top: 2px;
+}
+
+/* Upload Steps */
+.upload-step {
+ background: var(--bg-tertiary);
+ border-radius: var(--radius-md);
+ padding: var(--spacing-4);
+ margin-bottom: var(--spacing-4);
+}
+
+.step-header {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-3);
+ margin-bottom: var(--spacing-4);
+}
+
+.step-number {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 28px;
+ height: 28px;
+ background: var(--primary);
+ color: white;
+ border-radius: 50%;
+ font-weight: 600;
+ font-size: var(--text-sm);
+ flex-shrink: 0;
+}
+
+.step-title {
+ font-weight: 500;
+ color: var(--text-primary);
+ flex: 1;
+}
+
+.file-count {
+ font-size: var(--text-sm);
+ color: var(--text-secondary);
+ background: var(--bg-primary);
+ padding: var(--spacing-1) var(--spacing-2);
+ border-radius: var(--radius-sm);
+}
+
+/* Directory Picker */
+.directory-picker {
+ display: flex;
+ flex-direction: column;
+ gap: var(--spacing-3);
+ align-items: center;
+}
+
+.btn-lg {
+ padding: var(--spacing-3) var(--spacing-6);
+ font-size: var(--text-base);
+}
+
+.drop-zone {
+ width: 100%;
+ padding: var(--spacing-8);
+ border: 2px dashed var(--border-default);
+ border-radius: var(--radius-lg);
+ text-align: center;
+ color: var(--text-tertiary);
+ transition: all 0.2s;
+}
+
+.drop-zone svg {
+ margin-bottom: var(--spacing-2);
+ color: var(--text-tertiary);
+}
+
+.drop-zone p {
+ margin: 0;
+ font-size: var(--text-sm);
+}
+
+.drop-zone.drag-over {
+ border-color: var(--primary);
+ background: rgba(59, 130, 246, 0.05);
+ color: var(--primary);
+}
+
+.drop-zone.drag-over svg {
+ color: var(--primary);
+}
+
+/* Files List */
+.upload-files-list {
+ max-height: 250px;
+ overflow-y: auto;
+ border: 1px solid var(--border-default);
+ border-radius: var(--radius-md);
+ background: var(--bg-primary);
+}
+
+.upload-file-item {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-2);
+ padding: var(--spacing-2) var(--spacing-3);
+ border-bottom: 1px solid var(--border-default);
+ font-size: var(--text-sm);
+ font-family: monospace;
+}
+
+.upload-file-item:last-child {
+ border-bottom: none;
+}
+
+.upload-file-item .file-icon {
+ color: var(--text-tertiary);
+ flex-shrink: 0;
+}
+
+.upload-file-item .file-path {
+ flex: 1;
+ color: var(--text-primary);
+ word-break: break-all;
+}
+
+.upload-file-item .file-size {
+ color: var(--text-tertiary);
+ font-size: var(--text-xs);
+ flex-shrink: 0;
+}
+
+.excluded-info {
+ margin-top: var(--spacing-2);
+ color: var(--text-tertiary);
+}
+
+/* Upload Actions */
+.upload-actions {
+ display: flex;
+ gap: var(--spacing-3);
+ justify-content: flex-end;
+ margin-top: var(--spacing-4);
+}
+
+/* Progress Bar */
+.upload-progress {
+ margin-top: var(--spacing-4);
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-3);
+}
+
+.progress-bar {
+ flex: 1;
+ height: 8px;
+ background: var(--bg-primary);
+ border-radius: var(--radius-full);
+ overflow: hidden;
+}
+
+.progress-fill {
+ height: 100%;
+ background: var(--primary);
+ border-radius: var(--radius-full);
+ transition: width 0.3s ease;
+ width: 0%;
+}
+
+#upload-progress-text {
+ font-size: var(--text-sm);
+ color: var(--text-secondary);
+ min-width: 40px;
+ text-align: right;
+}
+
+/* Responsive */
+@media (max-width: 480px) {
+ .upload-actions {
+ flex-direction: column;
+ }
+
+ .upload-actions .btn {
+ width: 100%;
+ }
+}
diff --git a/frontend/index.html b/frontend/index.html
index eeea9d9..0d08213 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -610,7 +610,110 @@
-
+
+
+
+
+
+
+
+
+
+
Die Verzeichnis-Auswahl funktioniert nur in Chrome, Edge oder Opera. In anderen Browsern können Sie Dateien per Drag & Drop hochladen.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Oder Verzeichnis hierher ziehen
+
+
+
+
+
+
+
+
+
+
+
+ Automatisch ausgeschlossen: .git, node_modules, __pycache__, .env, *.log
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Kein Projekt ausgewählt
diff --git a/frontend/js/api.js b/frontend/js/api.js
index cbadc55..9ed2449 100644
--- a/frontend/js/api.js
+++ b/frontend/js/api.js
@@ -884,6 +884,99 @@ class ApiClient {
async serverGitCheckout(branch) {
return this.post('/git/server/checkout', { branch });
}
+
+ // =====================
+ // BROWSER-UPLOAD ENDPOINTS
+ // =====================
+
+ async prepareBrowserUpload() {
+ return this.post('/git/browser-upload-prepare', {});
+ }
+
+ async cancelBrowserUpload(sessionId) {
+ return this.delete(`/git/browser-upload/${sessionId}`);
+ }
+
+ /**
+ * Lädt Dateien vom Browser hoch und pusht sie ins Gitea
+ * @param {Object} options - Upload-Optionen
+ * @param {File[]} options.files - Array von File-Objekten mit relativePath Property
+ * @param {string} options.repoUrl - Gitea Repository URL
+ * @param {string} options.branch - Ziel-Branch
+ * @param {string} options.commitMessage - Commit-Nachricht
+ * @param {string} options.sessionId - Session-ID vom prepare-Aufruf
+ * @param {Function} options.onProgress - Progress-Callback (optional)
+ */
+ async browserUploadAndPush(options) {
+ const { files, repoUrl, branch, commitMessage, sessionId, onProgress } = options;
+
+ const url = `${this.baseUrl}/git/browser-upload`;
+ const formData = new FormData();
+
+ // Metadaten hinzufügen
+ formData.append('repoUrl', repoUrl);
+ formData.append('branch', branch || 'main');
+ formData.append('commitMessage', commitMessage);
+ formData.append('sessionId', sessionId);
+
+ // Dateien hinzufügen (mit relativem Pfad als Dateiname)
+ files.forEach(fileInfo => {
+ // Erstelle neues File-Objekt mit relativem Pfad als Namen
+ const file = new File([fileInfo.file], fileInfo.relativePath, {
+ type: fileInfo.file.type
+ });
+ formData.append('files', file);
+ });
+
+ const token = this.getToken();
+ const csrfToken = this.getCsrfToken();
+
+ return new Promise((resolve, reject) => {
+ const xhr = new XMLHttpRequest();
+
+ xhr.open('POST', url);
+
+ if (token) {
+ xhr.setRequestHeader('Authorization', `Bearer ${token}`);
+ }
+
+ if (csrfToken) {
+ xhr.setRequestHeader('X-CSRF-Token', csrfToken);
+ }
+
+ if (onProgress) {
+ xhr.upload.addEventListener('progress', (e) => {
+ if (e.lengthComputable) {
+ const percentage = Math.round((e.loaded / e.total) * 100);
+ onProgress(percentage);
+ }
+ });
+ }
+
+ xhr.addEventListener('load', () => {
+ if (xhr.status >= 200 && xhr.status < 300) {
+ try {
+ resolve(JSON.parse(xhr.responseText));
+ } catch {
+ resolve({ success: true });
+ }
+ } else {
+ try {
+ const error = JSON.parse(xhr.responseText);
+ reject(new Error(error.error || 'Upload fehlgeschlagen'));
+ } catch {
+ reject(new Error('Upload fehlgeschlagen'));
+ }
+ }
+ });
+
+ xhr.addEventListener('error', () => {
+ reject(new Error('Netzwerkfehler beim Upload'));
+ });
+
+ xhr.send(formData);
+ });
+ }
}
// Custom API Error Class
diff --git a/frontend/js/gitea.js b/frontend/js/gitea.js
index 1ad2ead..90f862d 100644
--- a/frontend/js/gitea.js
+++ b/frontend/js/gitea.js
@@ -31,6 +31,29 @@ class GiteaManager {
this.serverBranches = [];
this.serverCommits = [];
this.hiddenServerCommits = new Set();
+
+ // Browser-Upload Eigenschaften
+ this.browserUploadFiles = [];
+ this.browserUploadSessionId = null;
+ this.supportsDirectoryPicker = 'showDirectoryPicker' in window;
+
+ // Zu ignorierende Ordner/Dateien
+ this.ignorePatterns = [
+ '.git',
+ 'node_modules',
+ '__pycache__',
+ '.env',
+ '.env.local',
+ '.env.production',
+ '.DS_Store',
+ 'Thumbs.db',
+ '.idea',
+ '.vscode',
+ 'dist',
+ 'build',
+ '.cache',
+ 'coverage'
+ ];
}
async init() {
@@ -51,8 +74,12 @@ class GiteaManager {
this.mainSection = $('#gitea-main-section');
this.connectionStatus = $('#gitea-connection-status');
+ // DOM Elements - Browser-Upload
+ this.browserUploadSection = $('#gitea-browser-upload');
+
this.bindEvents();
this.bindServerEvents();
+ this.bindBrowserUploadEvents();
this.subscribeToStore();
this.initialized = true;
}
@@ -143,14 +170,19 @@ class GiteaManager {
if (this.currentMode === 'server') {
// Server-Modus
this.serverModeSection?.classList.remove('hidden');
+ this.browserUploadSection?.classList.add('hidden');
this.noProjectSection?.classList.add('hidden');
this.configSection?.classList.add('hidden');
this.mainSection?.classList.add('hidden');
this.loadServerData();
} else {
- // Projekt-Modus
+ // Projekt-Modus (Browser-Upload)
this.serverModeSection?.classList.add('hidden');
- this.loadApplication();
+ this.browserUploadSection?.classList.remove('hidden');
+ this.noProjectSection?.classList.add('hidden');
+ this.configSection?.classList.add('hidden');
+ this.mainSection?.classList.add('hidden');
+ this.initBrowserUpload();
}
}
@@ -524,6 +556,402 @@ class GiteaManager {
}
}
+ // =====================
+ // BROWSER-UPLOAD METHODEN
+ // =====================
+
+ bindBrowserUploadEvents() {
+ // Verzeichnis auswählen
+ $('#btn-select-directory')?.addEventListener('click', () => this.handleSelectDirectory());
+
+ // Repository für Upload aktualisieren
+ $('#btn-refresh-upload-repos')?.addEventListener('click', () => this.loadBrowserUploadRepos());
+
+ // Upload abbrechen
+ $('#btn-cancel-upload')?.addEventListener('click', () => this.cancelBrowserUpload());
+
+ // Upload ausführen
+ $('#btn-execute-upload')?.addEventListener('click', () => this.executeBrowserUpload());
+
+ // Drop Zone Events
+ const dropZone = $('#drop-zone');
+ if (dropZone) {
+ dropZone.addEventListener('dragover', (e) => {
+ e.preventDefault();
+ dropZone.classList.add('drag-over');
+ });
+
+ dropZone.addEventListener('dragleave', () => {
+ dropZone.classList.remove('drag-over');
+ });
+
+ dropZone.addEventListener('drop', (e) => {
+ e.preventDefault();
+ dropZone.classList.remove('drag-over');
+ this.handleDroppedFiles(e.dataTransfer);
+ });
+ }
+ }
+
+ async initBrowserUpload() {
+ // Browser-Kompatibilität prüfen
+ const compatNotice = $('#browser-upload-compat');
+ if (compatNotice) {
+ if (!this.supportsDirectoryPicker) {
+ compatNotice.classList.remove('hidden');
+ // Drop-Zone anzeigen als Alternative
+ $('#drop-zone')?.classList.remove('hidden');
+ } else {
+ compatNotice.classList.add('hidden');
+ }
+ }
+
+ // Upload-Zustand zurücksetzen
+ this.browserUploadFiles = [];
+ this.browserUploadSessionId = null;
+ this.resetBrowserUploadUI();
+
+ // Repositories laden
+ await this.loadBrowserUploadRepos();
+ }
+
+ async loadBrowserUploadRepos() {
+ const select = $('#browser-upload-repo-select');
+ if (!select) return;
+
+ try {
+ const result = await api.getGiteaRepositories();
+ // API gibt { success, repositories } zurück
+ this.giteaRepos = result.repositories || [];
+
+ select.innerHTML = '
';
+
+ this.giteaRepos.forEach(repo => {
+ const option = document.createElement('option');
+ // API-Felder: cloneUrl, fullName, owner, name
+ option.value = repo.cloneUrl;
+ option.textContent = repo.fullName;
+ option.dataset.owner = repo.owner || '';
+ option.dataset.name = repo.name;
+ select.appendChild(option);
+ });
+
+ if (this.giteaRepos.length === 0) {
+ this.showToast('Keine Repositories gefunden', 'info');
+ }
+ } catch (error) {
+ console.error('[Browser-Upload] Repositories laden fehlgeschlagen:', error);
+ this.showToast('Repositories konnten nicht geladen werden', 'error');
+ }
+ }
+
+ async handleSelectDirectory() {
+ if (!this.supportsDirectoryPicker) {
+ this.showToast('Verzeichnis-Auswahl wird in diesem Browser nicht unterstützt', 'error');
+ return;
+ }
+
+ try {
+ // File System Access API verwenden
+ const dirHandle = await window.showDirectoryPicker({
+ mode: 'read'
+ });
+
+ this.showToast('Lese Verzeichnis...', 'info');
+
+ // Dateien rekursiv lesen
+ const files = await this.readDirectoryRecursive(dirHandle, '');
+
+ if (files.length === 0) {
+ this.showToast('Keine Dateien gefunden oder alle wurden ignoriert', 'warning');
+ return;
+ }
+
+ this.browserUploadFiles = files;
+ this.renderUploadPreview();
+
+ this.showToast(`${files.length} Dateien ausgewählt`, 'success');
+ } catch (error) {
+ if (error.name === 'AbortError') {
+ // Benutzer hat abgebrochen
+ return;
+ }
+ console.error('[Browser-Upload] Verzeichnis lesen fehlgeschlagen:', error);
+ this.showToast('Verzeichnis konnte nicht gelesen werden', 'error');
+ }
+ }
+
+ async readDirectoryRecursive(dirHandle, basePath) {
+ const files = [];
+
+ for await (const entry of dirHandle.values()) {
+ const relativePath = basePath ? `${basePath}/${entry.name}` : entry.name;
+
+ // Ignorierte Muster prüfen
+ if (this.shouldIgnore(entry.name, relativePath)) {
+ continue;
+ }
+
+ if (entry.kind === 'file') {
+ try {
+ const file = await entry.getFile();
+ files.push({
+ file: file,
+ relativePath: relativePath,
+ size: file.size
+ });
+ } catch (err) {
+ console.warn(`Datei konnte nicht gelesen werden: ${relativePath}`, err);
+ }
+ } else if (entry.kind === 'directory') {
+ const subFiles = await this.readDirectoryRecursive(entry, relativePath);
+ files.push(...subFiles);
+ }
+ }
+
+ return files;
+ }
+
+ shouldIgnore(name, path) {
+ // Einfache Muster prüfen
+ for (const pattern of this.ignorePatterns) {
+ if (pattern.startsWith('*.')) {
+ // Wildcard-Muster (z.B. *.log)
+ const ext = pattern.substring(1);
+ if (name.endsWith(ext)) {
+ return true;
+ }
+ } else if (name === pattern || path.includes(`/${pattern}/`) || path.startsWith(`${pattern}/`)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ async handleDroppedFiles(dataTransfer) {
+ const items = dataTransfer.items;
+ if (!items || items.length === 0) return;
+
+ const files = [];
+
+ for (const item of items) {
+ if (item.kind === 'file') {
+ // webkitGetAsEntry für Verzeichnis-Support
+ const entry = item.webkitGetAsEntry?.();
+ if (entry) {
+ const entryFiles = await this.readEntry(entry, '');
+ files.push(...entryFiles);
+ } else {
+ // Fallback: Einzelne Datei
+ const file = item.getAsFile();
+ if (file && !this.shouldIgnore(file.name, file.name)) {
+ files.push({
+ file: file,
+ relativePath: file.name,
+ size: file.size
+ });
+ }
+ }
+ }
+ }
+
+ if (files.length === 0) {
+ this.showToast('Keine Dateien gefunden oder alle wurden ignoriert', 'warning');
+ return;
+ }
+
+ this.browserUploadFiles = files;
+ this.renderUploadPreview();
+ this.showToast(`${files.length} Dateien ausgewählt`, 'success');
+ }
+
+ async readEntry(entry, basePath) {
+ const files = [];
+ const relativePath = basePath ? `${basePath}/${entry.name}` : entry.name;
+
+ if (this.shouldIgnore(entry.name, relativePath)) {
+ return files;
+ }
+
+ if (entry.isFile) {
+ return new Promise((resolve) => {
+ entry.file((file) => {
+ resolve([{
+ file: file,
+ relativePath: relativePath,
+ size: file.size
+ }]);
+ }, () => resolve([]));
+ });
+ } else if (entry.isDirectory) {
+ const reader = entry.createReader();
+ return new Promise((resolve) => {
+ reader.readEntries(async (entries) => {
+ for (const subEntry of entries) {
+ const subFiles = await this.readEntry(subEntry, relativePath);
+ files.push(...subFiles);
+ }
+ resolve(files);
+ }, () => resolve([]));
+ });
+ }
+
+ return files;
+ }
+
+ renderUploadPreview() {
+ const previewSection = $('#upload-preview-section');
+ const commitSection = $('#upload-commit-section');
+ const filesList = $('#upload-files-list');
+ const fileCount = $('#upload-file-count');
+
+ if (!previewSection || !filesList) return;
+
+ // Sektionen anzeigen
+ previewSection.classList.remove('hidden');
+ commitSection?.classList.remove('hidden');
+
+ // Dateianzahl
+ if (fileCount) {
+ fileCount.textContent = `${this.browserUploadFiles.length} Dateien`;
+ }
+
+ // Dateiliste rendern (max 100 anzeigen)
+ const displayFiles = this.browserUploadFiles.slice(0, 100);
+ filesList.innerHTML = displayFiles.map(f => `
+
+
+
+
+
${escapeHtml(f.relativePath)}
+
${this.formatFileSizeUpload(f.size)}
+
+ `).join('');
+
+ if (this.browserUploadFiles.length > 100) {
+ filesList.innerHTML += `
+
+ ... und ${this.browserUploadFiles.length - 100} weitere Dateien
+
+ `;
+ }
+ }
+
+ formatFileSizeUpload(bytes) {
+ if (bytes === 0) return '0 B';
+ const k = 1024;
+ const sizes = ['B', 'KB', 'MB', 'GB'];
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];
+ }
+
+ resetBrowserUploadUI() {
+ // Vorschau und Commit-Sektion verstecken
+ $('#upload-preview-section')?.classList.add('hidden');
+ $('#upload-commit-section')?.classList.add('hidden');
+ $('#upload-progress-container')?.classList.add('hidden');
+
+ // Felder zurücksetzen
+ const commitMessage = $('#browser-upload-commit-message');
+ if (commitMessage) commitMessage.value = '';
+
+ const filesList = $('#upload-files-list');
+ if (filesList) filesList.innerHTML = '';
+
+ // Progress zurücksetzen
+ const progressBar = $('#upload-progress-bar');
+ if (progressBar) progressBar.style.width = '0%';
+
+ const progressText = $('#upload-progress-text');
+ if (progressText) progressText.textContent = '0%';
+ }
+
+ cancelBrowserUpload() {
+ this.browserUploadFiles = [];
+ this.resetBrowserUploadUI();
+ this.showToast('Upload abgebrochen', 'info');
+ }
+
+ async executeBrowserUpload() {
+ // Validierung
+ const repoSelect = $('#browser-upload-repo-select');
+ const repoUrl = repoSelect?.value;
+
+ if (!repoUrl) {
+ this.showToast('Bitte wählen Sie ein Repository aus', 'error');
+ return;
+ }
+
+ if (this.browserUploadFiles.length === 0) {
+ this.showToast('Keine Dateien ausgewählt', 'error');
+ return;
+ }
+
+ const commitMessage = $('#browser-upload-commit-message')?.value.trim();
+ if (!commitMessage) {
+ this.showToast('Bitte geben Sie eine Commit-Nachricht ein', 'error');
+ return;
+ }
+
+ const branch = $('#browser-upload-branch')?.value || 'main';
+
+ // UI aktualisieren
+ const executeBtn = $('#btn-execute-upload');
+ const cancelBtn = $('#btn-cancel-upload');
+ const progressContainer = $('#upload-progress-container');
+
+ if (executeBtn) {
+ executeBtn.disabled = true;
+ executeBtn.innerHTML = '
Lädt hoch...';
+ }
+ if (cancelBtn) cancelBtn.disabled = true;
+ progressContainer?.classList.remove('hidden');
+
+ try {
+ // Session vorbereiten
+ const prepareResult = await api.prepareBrowserUpload();
+ this.browserUploadSessionId = prepareResult.sessionId;
+
+ // Upload durchführen
+ const result = await api.browserUploadAndPush({
+ files: this.browserUploadFiles,
+ repoUrl: repoUrl,
+ branch: branch,
+ commitMessage: commitMessage,
+ sessionId: this.browserUploadSessionId,
+ onProgress: (percent) => {
+ const progressBar = $('#upload-progress-bar');
+ const progressText = $('#upload-progress-text');
+ if (progressBar) progressBar.style.width = `${percent}%`;
+ if (progressText) progressText.textContent = `${percent}%`;
+ }
+ });
+
+ if (result.success) {
+ this.showToast(`Erfolgreich gepusht: ${result.filesCount} Dateien`, 'success');
+ this.cancelBrowserUpload(); // UI zurücksetzen
+ } else {
+ throw new Error(result.error || 'Upload fehlgeschlagen');
+ }
+ } catch (error) {
+ console.error('[Browser-Upload] Fehler:', error);
+ this.showToast(error.message || 'Upload fehlgeschlagen', 'error');
+ } finally {
+ // UI wiederherstellen
+ if (executeBtn) {
+ executeBtn.disabled = false;
+ executeBtn.innerHTML = `
+
+ Commit & Push
+ `;
+ }
+ if (cancelBtn) cancelBtn.disabled = false;
+ progressContainer?.classList.add('hidden');
+
+ this.browserUploadSessionId = null;
+ }
+ }
+
// =====================
// PROJEKT-MODUS METHODEN
// =====================
diff --git a/frontend/sw.js b/frontend/sw.js
index 0195213..64a4678 100644
--- a/frontend/sw.js
+++ b/frontend/sw.js
@@ -4,7 +4,7 @@
* Offline support and caching
*/
-const CACHE_VERSION = '131';
+const CACHE_VERSION = '133';
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;
diff --git a/logs/app.log b/logs/app.log
index 6171610..6522b93 100644
--- a/logs/app.log
+++ b/logs/app.log
@@ -44236,3 +44236,1371 @@ hint: See the 'Note about fast-forwards' in 'git push --help' for details.
[2025-12-30T17:25:02.394Z] [INFO] GET /api/health 200 3ms
[2025-12-30T17:25:06.787Z] [INFO] POST /api/auth/refresh 200 12ms
[2025-12-30T17:25:13.820Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T17:25:14.451Z] [INFO] Commit mit Autor: HG
+[2025-12-30T17:25:14.622Z] [INFO] POST /api/git/server/commit 200 284ms
+[2025-12-30T17:25:14.681Z] [INFO] GET /api/git/server/commits?limit=10 200 23ms
+[2025-12-30T17:25:14.708Z] [INFO] GET /api/git/server/branches 304 25ms
+[2025-12-30T17:25:14.759Z] [INFO] GET /api/git/server/status 200 49ms
+[2025-12-30T17:25:15.349Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T17:25:17.949Z] [INFO] POST /api/auth/refresh 200 17ms
+[2025-12-30T17:25:22.797Z] [INFO] POST /api/git/server/push 200 2286ms
+[2025-12-30T17:25:22.809Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T17:25:22.870Z] [INFO] GET /api/git/server/status 200 39ms
+[2025-12-30T17:25:22.882Z] [INFO] GET /api/git/server/branches 304 51ms
+[2025-12-30T17:25:22.895Z] [INFO] GET /api/git/server/commits?limit=10 304 10ms
+[2025-12-30T17:25:32.489Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:25:52.794Z] [INFO] GET /api/applications/2 304 11ms
+[2025-12-30T17:25:52.839Z] [INFO] GET /api/git/status/2 304 9ms
+[2025-12-30T17:25:52.844Z] [INFO] GET /api/git/branches/2 304 4ms
+[2025-12-30T17:25:52.850Z] [INFO] GET /api/git/commits/2?limit=10 304 5ms
+[2025-12-30T17:25:53.785Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T17:25:58.030Z] [INFO] POST /api/git/pull/2 200 4ms
+[2025-12-30T17:25:59.052Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T17:26:02.592Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:26:05.929Z] [INFO] GET /api/gitea/test 304 112ms
+[2025-12-30T17:26:06.040Z] [INFO] GET /api/gitea/repositories?page=1&limit=50 200 78ms
+[2025-12-30T17:26:06.811Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T17:26:07.948Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T17:26:10.187Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T17:26:11.980Z] [INFO] POST /api/applications 400 5ms
+[2025-12-30T17:26:12.989Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T17:26:28.358Z] [INFO] POST /api/applications 400 8ms
+[2025-12-30T17:26:29.348Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T17:26:32.692Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:26:37.573Z] [INFO] POST /api/applications 400 3ms
+[2025-12-30T17:26:38.588Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T17:26:49.296Z] [INFO] POST /api/applications 400 8ms
+[2025-12-30T17:26:50.282Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T17:27:02.787Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:27:09.595Z] [INFO] GET /api/git/server/info 304 20ms
+[2025-12-30T17:27:09.669Z] [INFO] GET /api/git/server/status 304 43ms
+[2025-12-30T17:27:09.701Z] [INFO] GET /api/git/server/branches 304 13ms
+[2025-12-30T17:27:09.713Z] [INFO] GET /api/git/server/commits?limit=10 304 10ms
+[2025-12-30T17:27:10.594Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T17:27:32.906Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T17:28:03.013Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:28:33.127Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:29:03.230Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:29:33.325Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:29:51.046Z] [INFO] GET / 304 2ms
+[2025-12-30T17:29:51.096Z] [INFO] GET /css/variables.css 304 2ms
+[2025-12-30T17:29:51.101Z] [INFO] GET /css/base.css 304 2ms
+[2025-12-30T17:29:51.118Z] [INFO] GET /css/components.css 304 3ms
+[2025-12-30T17:29:51.129Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T17:29:51.138Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T17:29:51.140Z] [INFO] GET /css/modal.css 304 2ms
+[2025-12-30T17:29:51.145Z] [INFO] GET /css/list.css 304 1ms
+[2025-12-30T17:29:51.149Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T17:29:51.152Z] [INFO] GET /css/proposals.css 304 2ms
+[2025-12-30T17:29:51.153Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T17:29:51.159Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T17:29:51.166Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T17:29:51.173Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T17:29:51.205Z] [INFO] GET /js/store.js 304 2ms
+[2025-12-30T17:29:51.209Z] [INFO] GET /js/api.js 304 2ms
+[2025-12-30T17:29:51.213Z] [INFO] GET /js/board.js 304 2ms
+[2025-12-30T17:29:51.217Z] [INFO] GET /js/auth.js 304 3ms
+[2025-12-30T17:29:51.219Z] [INFO] GET /js/offline.js 304 2ms
+[2025-12-30T17:29:51.221Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T17:29:51.227Z] [INFO] GET /js/task-modal.js 304 2ms
+[2025-12-30T17:29:51.232Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T17:29:51.235Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T17:29:51.241Z] [INFO] GET /js/shortcuts.js 304 3ms
+[2025-12-30T17:29:51.242Z] [INFO] GET /js/undo.js 304 2ms
+[2025-12-30T17:29:51.245Z] [INFO] GET /js/admin.js 304 2ms
+[2025-12-30T17:29:51.249Z] [INFO] GET /js/proposals.js 304 2ms
+[2025-12-30T17:29:51.255Z] [INFO] GET /js/notifications.js 304 2ms
+[2025-12-30T17:29:51.261Z] [INFO] GET /js/gitea.js 304 4ms
+[2025-12-30T17:29:51.264Z] [INFO] GET /js/utils.js 304 2ms
+[2025-12-30T17:29:51.303Z] [INFO] POST /api/auth/refresh 200 16ms
+[2025-12-30T17:29:51.486Z] [INFO] GET /api/auth/users 304 10ms
+[2025-12-30T17:29:51.550Z] [INFO] GET /api/admin/users 200 5ms
+[2025-12-30T17:29:51.554Z] [INFO] GET /assets/icons/task.svg 304 2ms
+[2025-12-30T17:29:51.588Z] [INFO] GET /api/admin/upload-settings 304 10ms
+[2025-12-30T17:29:53.220Z] [INFO] GET /sw.js 304 3ms
+[2025-12-30T17:29:53.310Z] [INFO] GET /sw.js 304 2ms
+[2025-12-30T17:29:56.330Z] [INFO] Logout: admin
+[2025-12-30T17:29:56.331Z] [INFO] POST /api/auth/logout 200 5ms
+[2025-12-30T17:29:56.372Z] [INFO] GET / 304 1ms
+[2025-12-30T17:29:56.413Z] [INFO] GET /css/base.css 304 6ms
+[2025-12-30T17:29:56.415Z] [INFO] GET /css/calendar.css 304 7ms
+[2025-12-30T17:29:56.416Z] [INFO] GET /css/variables.css 304 5ms
+[2025-12-30T17:29:56.419Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T17:29:56.421Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T17:29:56.423Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T17:29:56.430Z] [INFO] GET /css/list.css 304 1ms
+[2025-12-30T17:29:56.433Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T17:29:56.434Z] [INFO] GET /css/proposals.css 304 0ms
+[2025-12-30T17:29:56.437Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T17:29:56.438Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T17:29:56.440Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T17:29:56.453Z] [INFO] GET /js/app.js 304 2ms
+[2025-12-30T17:29:56.478Z] [INFO] GET /js/api.js 304 3ms
+[2025-12-30T17:29:56.479Z] [INFO] GET /js/store.js 304 3ms
+[2025-12-30T17:29:56.481Z] [INFO] GET /js/board.js 304 1ms
+[2025-12-30T17:29:56.485Z] [INFO] GET /js/auth.js 304 3ms
+[2025-12-30T17:29:56.487Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T17:29:56.489Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T17:29:56.495Z] [INFO] GET /js/task-modal.js 304 1ms
+[2025-12-30T17:29:56.498Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T17:29:56.502Z] [INFO] GET /js/list.js 304 3ms
+[2025-12-30T17:29:56.507Z] [INFO] GET /js/undo.js 304 4ms
+[2025-12-30T17:29:56.508Z] [INFO] GET /js/shortcuts.js 304 4ms
+[2025-12-30T17:29:56.513Z] [INFO] GET /js/admin.js 304 2ms
+[2025-12-30T17:29:56.516Z] [INFO] GET /js/proposals.js 304 2ms
+[2025-12-30T17:29:56.519Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T17:29:56.521Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T17:29:56.524Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T17:29:56.603Z] [INFO] GET /assets/icons/task.svg 304 2ms
+[2025-12-30T17:29:58.209Z] [INFO] GET /sw.js 304 1ms
+[2025-12-30T17:29:59.000Z] [INFO] GET /sw.js 304 1ms
+[2025-12-30T17:29:59.620Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T17:29:59.621Z] [INFO] POST /api/auth/login 200 594ms
+[2025-12-30T17:29:59.662Z] [INFO] GET /api/auth/users 304 9ms
+[2025-12-30T17:29:59.677Z] [INFO] Socket connected: MH (fXERTBxHOXj_kPv0AAAa)
+[2025-12-30T17:29:59.688Z] [INFO] Socket connected: MH (qg1lst8P_E12sIqpAAAb)
+[2025-12-30T17:29:59.693Z] [INFO] GET /api/projects 200 9ms
+[2025-12-30T17:29:59.754Z] [INFO] GET /api/tasks/project/2 200 32ms
+[2025-12-30T17:29:59.731Z] [INFO] GET /api/stats/dashboard?projectId=2 200 11ms
+[2025-12-30T17:29:59.760Z] [INFO] GET /api/columns/2 304 5ms
+[2025-12-30T17:29:59.768Z] [INFO] GET /api/labels/2 200 5ms
+[2025-12-30T17:29:59.770Z] [INFO] MH joined project:[object Object]
+[2025-12-30T17:29:59.810Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 403 9ms
+[2025-12-30T17:29:59.837Z] [INFO] GET /api/notifications 200 6ms
+[2025-12-30T17:30:03.432Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:30:33.546Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:31:03.675Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:31:33.773Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:32:03.883Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:32:33.985Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:33:04.103Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:33:34.247Z] [INFO] GET /api/health 200 6ms
+[2025-12-30T17:34:04.357Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:34:34.491Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:34:39.441Z] [INFO] GET /api/tasks/4 200 15ms
+[2025-12-30T17:34:39.473Z] [INFO] GET /api/subtasks/4 304 5ms
+[2025-12-30T17:34:39.509Z] [INFO] GET /api/links/4 304 8ms
+[2025-12-30T17:34:39.551Z] [INFO] GET /api/comments/4 304 8ms
+[2025-12-30T17:34:39.558Z] [INFO] GET /api/files/4 304 5ms
+[2025-12-30T17:34:39.564Z] [INFO] GET /api/tasks/4/history 404 5ms
+[2025-12-30T17:34:40.366Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T17:34:52.577Z] [INFO] Aufgabe aktualisiert: Corporated Design (ID: 4)
+[2025-12-30T17:34:52.580Z] [INFO] PUT /api/tasks/4 200 16ms
+[2025-12-30T17:34:53.588Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T17:35:04.597Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:35:07.973Z] [INFO] GET /api/tasks/6 200 8ms
+[2025-12-30T17:35:08.015Z] [INFO] GET /api/subtasks/6 200 5ms
+[2025-12-30T17:35:08.022Z] [INFO] GET /api/files/6 304 6ms
+[2025-12-30T17:35:08.027Z] [INFO] GET /api/links/6 304 10ms
+[2025-12-30T17:35:08.034Z] [INFO] GET /api/tasks/6/history 404 7ms
+[2025-12-30T17:35:08.038Z] [INFO] GET /api/comments/6 304 10ms
+[2025-12-30T17:35:08.051Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MywidXNlcm5hbWUiOiJhZG1pbiIsImRpc3BsYXlOYW1lIjoiQWRtaW5pc3RyYXRvciIsImNvbG9yIjoiIzhCNUNGNiIsInJvbGUiOiJhZG1pbiIsInBlcm1pc3Npb25zIjpbXSwiaWF0IjoxNzY3MTE2MDkzLCJleHAiOjE3NjcxMTY2OTN9.r3queZbeZa0rew7yo7hniqdNbXvoBCd1CilvqhfMmVM 200 8ms
+[2025-12-30T17:35:08.978Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T17:35:14.212Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T17:35:14.214Z] [INFO] PUT /api/tasks/6 200 12ms
+[2025-12-30T17:35:15.210Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T17:35:34.739Z] [INFO] GET /api/health 200 9ms
+[2025-12-30T17:36:04.847Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:36:34.961Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:37:05.066Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:37:09.503Z] [INFO] Logout: HG
+[2025-12-30T17:37:09.504Z] [INFO] POST /api/auth/logout 200 7ms
+[2025-12-30T17:37:09.539Z] [INFO] Socket disconnected: HG (IXFmuKk_0vrcB4_kAAAW)
+[2025-12-30T17:37:35.198Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T17:38:05.289Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:38:35.389Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:39:01.155Z] [INFO] SIGTERM empfangen, fahre herunter...
+[2025-12-30T17:39:24.102Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T17:39:24.192Z] [INFO] Datenbank initialisiert
+[2025-12-30T17:39:24.196Z] [INFO] Umgebung: production
+[2025-12-30T17:39:24.198Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T17:39:24.198Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T17:39:24.190Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T17:39:24.196Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T17:39:25.754Z] [INFO] Socket connected: MH (GLjYlEdpBHulePcAAAAB)
+[2025-12-30T17:39:25.790Z] [INFO] MH joined project:[object Object]
+[2025-12-30T17:39:26.023Z] [INFO] Socket connected: MH (VJ1vouZ2irZJxR7NAAAD)
+[2025-12-30T17:39:26.044Z] [INFO] MH joined project:[object Object]
+[2025-12-30T17:39:28.160Z] [INFO] GET /api/health 200 10ms
+[2025-12-30T17:39:58.290Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:40:24.217Z] [INFO] Backup erstellt: backup_2025-12-30T17-40-24-207Z.db
+[2025-12-30T17:40:24.220Z] [INFO] Altes Backup gelöscht: backup_2025-12-28T16-17-00-340Z.db
+[2025-12-30T17:40:24.222Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T17:40:28.410Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:40:58.502Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:41:28.586Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:41:58.705Z] [INFO] GET /api/health 200 11ms
+[2025-12-30T17:42:28.831Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:42:58.955Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:43:29.051Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:43:59.143Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:44:29.258Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:44:59.352Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:45:13.922Z] [INFO] Logout: admin
+[2025-12-30T17:45:13.923Z] [INFO] POST /api/auth/logout 200 13ms
+[2025-12-30T17:45:13.950Z] [INFO] Socket disconnected: MH (GLjYlEdpBHulePcAAAAB)
+[2025-12-30T17:45:29.453Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:45:59.562Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:46:29.657Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:46:59.762Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:47:29.875Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:47:59.975Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:48:30.070Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:49:00.165Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:49:23.656Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T17:49:23.658Z] [INFO] POST /api/auth/login 200 499ms
+[2025-12-30T17:49:23.739Z] [INFO] GET /api/auth/users 304 11ms
+[2025-12-30T17:49:23.746Z] [INFO] Socket connected: MH (xLdjuW5eWY3-hjlzAAAI)
+[2025-12-30T17:49:23.795Z] [INFO] GET /api/projects 401 10ms
+[2025-12-30T17:49:23.800Z] [INFO] Socket connected: MH (i-f1zuRWQ6svsU_RAAAJ)
+[2025-12-30T17:49:23.886Z] [INFO] GET /api/proposals?sort=date&archived=0 401 5ms
+[2025-12-30T17:49:23.888Z] [INFO] Socket disconnected: MH (i-f1zuRWQ6svsU_RAAAJ)
+[2025-12-30T17:49:26.613Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T17:49:26.614Z] [INFO] POST /api/auth/login 200 468ms
+[2025-12-30T17:49:26.655Z] [INFO] GET /api/auth/users 304 7ms
+[2025-12-30T17:49:26.667Z] [INFO] Socket connected: MH (Vsu1hyx0OhsaC1SiAAAM)
+[2025-12-30T17:49:26.677Z] [INFO] Socket connected: MH (iN1ejNj7MqXCj6O9AAAN)
+[2025-12-30T17:49:26.683Z] [INFO] GET /api/projects 401 4ms
+[2025-12-30T17:49:26.709Z] [INFO] Socket disconnected: MH (Vsu1hyx0OhsaC1SiAAAM)
+[2025-12-30T17:49:26.716Z] [INFO] GET /api/proposals?sort=date&archived=0 401 3ms
+[2025-12-30T17:49:28.395Z] [INFO] GET / 200 11ms
+[2025-12-30T17:49:28.444Z] [INFO] Socket disconnected: MH (xLdjuW5eWY3-hjlzAAAI)
+[2025-12-30T17:49:28.448Z] [INFO] Socket disconnected: MH (VJ1vouZ2irZJxR7NAAAD)
+[2025-12-30T17:49:28.449Z] [INFO] Socket disconnected: MH (iN1ejNj7MqXCj6O9AAAN)
+[2025-12-30T17:49:28.457Z] [INFO] GET /css/variables.css 304 1ms
+[2025-12-30T17:49:28.462Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T17:49:28.464Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T17:49:28.466Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T17:49:28.467Z] [INFO] GET /css/calendar.css 304 1ms
+[2025-12-30T17:49:28.469Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T17:49:28.480Z] [INFO] GET /css/list.css 304 1ms
+[2025-12-30T17:49:28.483Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T17:49:28.486Z] [INFO] GET /css/proposals.css 304 2ms
+[2025-12-30T17:49:28.487Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T17:49:28.489Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T17:49:28.493Z] [INFO] GET /css/gitea.css 200 3ms
+[2025-12-30T17:49:28.506Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T17:49:28.563Z] [INFO] GET /js/store.js 304 3ms
+[2025-12-30T17:49:28.565Z] [INFO] GET /js/auth.js 304 2ms
+[2025-12-30T17:49:28.568Z] [INFO] GET /js/api.js 200 7ms
+[2025-12-30T17:49:28.569Z] [INFO] GET /js/sync.js 304 3ms
+[2025-12-30T17:49:28.570Z] [INFO] GET /js/offline.js 304 3ms
+[2025-12-30T17:49:28.572Z] [INFO] GET /js/board.js 304 2ms
+[2025-12-30T17:49:28.586Z] [INFO] GET /js/task-modal.js 304 2ms
+[2025-12-30T17:49:28.588Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T17:49:28.601Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T17:49:28.603Z] [INFO] GET /js/undo.js 304 2ms
+[2025-12-30T17:49:28.605Z] [INFO] GET /js/shortcuts.js 304 3ms
+[2025-12-30T17:49:28.608Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T17:49:28.610Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T17:49:28.619Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T17:49:28.622Z] [INFO] GET /js/gitea.js 200 2ms
+[2025-12-30T17:49:28.624Z] [INFO] GET /js/utils.js 304 0ms
+[2025-12-30T17:49:28.951Z] [INFO] GET /assets/icons/task.svg 200 10ms
+[2025-12-30T17:49:30.281Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:49:30.481Z] [INFO] GET /sw.js 200 3ms
+[2025-12-30T17:49:30.516Z] [INFO] GET /css/variables.css 304 2ms
+[2025-12-30T17:49:30.519Z] [INFO] GET / 304 1ms
+[2025-12-30T17:49:30.523Z] [INFO] GET /index.html 200 8ms
+[2025-12-30T17:49:30.536Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T17:49:30.539Z] [INFO] GET /css/components.css 304 1ms
+[2025-12-30T17:49:30.551Z] [INFO] GET /sw.js 200 2ms
+[2025-12-30T17:49:30.556Z] [INFO] GET /css/board.css 304 2ms
+[2025-12-30T17:49:30.558Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T17:49:30.562Z] [INFO] GET /css/calendar.css 304 1ms
+[2025-12-30T17:49:30.574Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T17:49:30.579Z] [INFO] GET /js/app.js 304 2ms
+[2025-12-30T17:49:30.584Z] [INFO] GET /js/utils.js 304 2ms
+[2025-12-30T17:49:30.595Z] [INFO] GET /js/api.js 304 2ms
+[2025-12-30T17:49:30.598Z] [INFO] GET /js/auth.js 304 1ms
+[2025-12-30T17:49:30.607Z] [INFO] GET /js/store.js 304 2ms
+[2025-12-30T17:49:30.614Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T17:49:30.617Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T17:49:30.625Z] [INFO] GET /js/board.js 304 1ms
+[2025-12-30T17:49:30.634Z] [INFO] GET /js/task-modal.js 304 1ms
+[2025-12-30T17:49:30.638Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T17:49:30.644Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T17:49:30.655Z] [INFO] GET /js/shortcuts.js 304 2ms
+[2025-12-30T17:49:30.657Z] [INFO] GET /js/undo.js 304 0ms
+[2025-12-30T17:49:30.662Z] [INFO] GET /js/tour.js 304 1ms
+[2025-12-30T17:49:30.675Z] [INFO] GET /js/admin.js 304 2ms
+[2025-12-30T17:49:30.681Z] [INFO] GET /js/proposals.js 304 2ms
+[2025-12-30T17:49:30.685Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T17:49:30.694Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T17:49:30.702Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T17:49:30.707Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T17:49:30.715Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T17:49:30.720Z] [INFO] GET /css/notifications.css 304 1ms
+[2025-12-30T17:49:30.726Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T17:49:32.367Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T17:49:32.370Z] [INFO] POST /api/auth/login 200 457ms
+[2025-12-30T17:49:32.406Z] [INFO] GET /api/auth/users 304 3ms
+[2025-12-30T17:49:32.426Z] [INFO] Socket connected: MH (A2PI5vtKDXZf5biOAAAQ)
+[2025-12-30T17:49:32.431Z] [INFO] Socket connected: MH (MGvfAwqs9ZOiJxr3AAAR)
+[2025-12-30T17:49:32.437Z] [INFO] GET /api/projects 401 3ms
+[2025-12-30T17:49:32.461Z] [INFO] Socket disconnected: MH (A2PI5vtKDXZf5biOAAAQ)
+[2025-12-30T17:49:32.466Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms
+[2025-12-30T17:49:32.485Z] [INFO] GET /api/notifications 401 1ms
+[2025-12-30T17:49:35.276Z] [INFO] GET / 304 2ms
+[2025-12-30T17:49:35.296Z] [INFO] Socket disconnected: MH (MGvfAwqs9ZOiJxr3AAAR)
+[2025-12-30T17:49:35.307Z] [INFO] GET /css/variables.css 304 2ms
+[2025-12-30T17:49:35.309Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T17:49:35.311Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T17:49:35.313Z] [INFO] GET /css/calendar.css 304 1ms
+[2025-12-30T17:49:35.315Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T17:49:35.316Z] [INFO] GET /css/board.css 304 2ms
+[2025-12-30T17:49:35.331Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T17:49:35.337Z] [INFO] GET /css/list.css 304 4ms
+[2025-12-30T17:49:35.338Z] [INFO] GET /css/notifications.css 304 3ms
+[2025-12-30T17:49:35.340Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T17:49:35.342Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T17:49:35.343Z] [INFO] GET /css/responsive.css 304 0ms
+[2025-12-30T17:49:35.354Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T17:49:35.387Z] [INFO] GET /js/auth.js 304 5ms
+[2025-12-30T17:49:35.389Z] [INFO] GET /js/api.js 304 5ms
+[2025-12-30T17:49:35.390Z] [INFO] GET /js/store.js 304 2ms
+[2025-12-30T17:49:35.392Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T17:49:35.394Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T17:49:35.397Z] [INFO] GET /js/board.js 304 1ms
+[2025-12-30T17:49:35.405Z] [INFO] GET /js/task-modal.js 304 1ms
+[2025-12-30T17:49:35.406Z] [INFO] GET /js/calendar.js 304 0ms
+[2025-12-30T17:49:35.409Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T17:49:35.410Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T17:49:35.411Z] [INFO] GET /js/undo.js 304 0ms
+[2025-12-30T17:49:35.415Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T17:49:35.426Z] [INFO] GET /js/proposals.js 304 4ms
+[2025-12-30T17:49:35.432Z] [INFO] GET /js/notifications.js 304 3ms
+[2025-12-30T17:49:35.435Z] [INFO] GET /js/gitea.js 304 2ms
+[2025-12-30T17:49:35.438Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T17:49:35.505Z] [INFO] GET /assets/icons/task.svg 304 3ms
+[2025-12-30T17:49:37.250Z] [INFO] GET /sw.js 304 2ms
+[2025-12-30T17:49:37.273Z] [INFO] GET /sw.js 304 4ms
+[2025-12-30T17:49:44.864Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T17:49:44.865Z] [INFO] POST /api/auth/login 200 530ms
+[2025-12-30T17:49:44.902Z] [INFO] GET /api/auth/users 304 7ms
+[2025-12-30T17:49:44.928Z] [INFO] GET /api/projects 401 5ms
+[2025-12-30T17:49:44.934Z] [INFO] Socket connected: MH (sVJrCzh21jaNzlvaAAAU)
+[2025-12-30T17:49:44.939Z] [INFO] Socket connected: MH (Sp9YolDzLWuE_WuDAAAV)
+[2025-12-30T17:49:44.952Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms
+[2025-12-30T17:49:44.963Z] [INFO] Socket disconnected: MH (Sp9YolDzLWuE_WuDAAAV)
+[2025-12-30T17:49:44.972Z] [INFO] GET /api/notifications 401 1ms
+[2025-12-30T17:50:00.366Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:50:25.871Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T17:50:25.872Z] [INFO] POST /api/auth/login 200 439ms
+[2025-12-30T17:50:25.916Z] [INFO] GET /api/auth/users 304 8ms
+[2025-12-30T17:50:25.954Z] [INFO] Socket connected: MH (CdLoKQsnqoLFjB3MAAAY)
+[2025-12-30T17:50:25.964Z] [INFO] GET /api/projects 401 5ms
+[2025-12-30T17:50:25.969Z] [INFO] Socket connected: MH (0gD22vpLqgoPuhoZAAAZ)
+[2025-12-30T17:50:25.982Z] [INFO] GET /api/proposals?sort=date&archived=0 401 1ms
+[2025-12-30T17:50:25.984Z] [INFO] Socket disconnected: MH (0gD22vpLqgoPuhoZAAAZ)
+[2025-12-30T17:50:30.464Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:50:31.630Z] [INFO] Socket disconnected: MH (sVJrCzh21jaNzlvaAAAU)
+[2025-12-30T17:50:31.632Z] [INFO] Socket disconnected: MH (CdLoKQsnqoLFjB3MAAAY)
+[2025-12-30T17:50:39.010Z] [INFO] GET / 200 9ms
+[2025-12-30T17:50:39.099Z] [INFO] GET /css/variables.css 200 3ms
+[2025-12-30T17:50:39.134Z] [INFO] GET /css/base.css 200 4ms
+[2025-12-30T17:50:39.142Z] [INFO] GET /css/components.css 200 7ms
+[2025-12-30T17:50:39.145Z] [INFO] GET /css/board.css 200 7ms
+[2025-12-30T17:50:39.149Z] [INFO] GET /css/modal.css 200 10ms
+[2025-12-30T17:50:39.152Z] [INFO] GET /css/list.css 200 8ms
+[2025-12-30T17:50:39.153Z] [INFO] GET /css/calendar.css 200 6ms
+[2025-12-30T17:50:39.158Z] [INFO] GET /css/admin.css 200 2ms
+[2025-12-30T17:50:39.201Z] [INFO] GET /css/proposals.css 200 7ms
+[2025-12-30T17:50:39.204Z] [INFO] GET /css/gitea.css 200 7ms
+[2025-12-30T17:50:39.215Z] [INFO] GET /css/notifications.css 200 16ms
+[2025-12-30T17:50:39.217Z] [INFO] GET /css/responsive.css 200 14ms
+[2025-12-30T17:50:39.223Z] [INFO] GET /js/app.js 200 5ms
+[2025-12-30T17:50:39.297Z] [INFO] GET /js/store.js 200 10ms
+[2025-12-30T17:50:39.298Z] [INFO] GET /js/auth.js 200 10ms
+[2025-12-30T17:50:39.302Z] [INFO] GET /js/api.js 200 10ms
+[2025-12-30T17:50:39.306Z] [INFO] GET /js/sync.js 200 11ms
+[2025-12-30T17:50:39.308Z] [INFO] GET /js/board.js 200 7ms
+[2025-12-30T17:50:39.310Z] [INFO] GET /js/offline.js 200 6ms
+[2025-12-30T17:50:39.311Z] [INFO] GET /js/app.js 304 2ms
+[2025-12-30T17:50:39.327Z] [INFO] GET /js/task-modal.js 200 2ms
+[2025-12-30T17:50:39.335Z] [INFO] GET /js/calendar.js 200 4ms
+[2025-12-30T17:50:39.344Z] [INFO] GET /js/list.js 200 2ms
+[2025-12-30T17:50:39.345Z] [INFO] GET /js/shortcuts.js 200 2ms
+[2025-12-30T17:50:39.362Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T17:50:39.364Z] [INFO] GET /js/undo.js 200 4ms
+[2025-12-30T17:50:39.373Z] [INFO] GET /js/auth.js 200 3ms
+[2025-12-30T17:50:39.375Z] [INFO] GET /js/admin.js 200 4ms
+[2025-12-30T17:50:39.381Z] [INFO] GET /js/proposals.js 200 5ms
+[2025-12-30T17:50:39.385Z] [INFO] GET /js/notifications.js 200 6ms
+[2025-12-30T17:50:39.387Z] [INFO] GET /js/gitea.js 200 4ms
+[2025-12-30T17:50:39.388Z] [INFO] GET /js/utils.js 200 4ms
+[2025-12-30T17:50:39.397Z] [INFO] GET /js/api.js 200 2ms
+[2025-12-30T17:50:39.403Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T17:50:39.559Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T17:50:39.609Z] [INFO] GET /js/task-modal.js 304 2ms
+[2025-12-30T17:50:39.617Z] [INFO] GET /js/calendar.js 304 4ms
+[2025-12-30T17:50:39.619Z] [INFO] GET /js/board.js 200 7ms
+[2025-12-30T17:50:39.620Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T17:50:39.624Z] [INFO] GET /js/shortcuts.js 304 7ms
+[2025-12-30T17:50:39.626Z] [INFO] GET /js/undo.js 304 5ms
+[2025-12-30T17:50:39.630Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T17:50:39.636Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T17:50:39.645Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T17:50:39.646Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T17:50:39.647Z] [INFO] GET /js/gitea.js 200 4ms
+[2025-12-30T17:50:39.657Z] [INFO] GET /sw.js 200 2ms
+[2025-12-30T17:50:39.663Z] [INFO] GET /assets/icons/task.svg 200 3ms
+[2025-12-30T17:50:39.706Z] [INFO] GET /css/variables.css 304 4ms
+[2025-12-30T17:50:39.709Z] [INFO] GET / 304 5ms
+[2025-12-30T17:50:39.714Z] [INFO] GET /index.html 200 4ms
+[2025-12-30T17:50:39.730Z] [INFO] GET /css/base.css 304 2ms
+[2025-12-30T17:50:39.734Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T17:50:39.744Z] [INFO] GET /css/board.css 304 3ms
+[2025-12-30T17:50:39.752Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T17:50:39.754Z] [INFO] GET /css/calendar.css 304 0ms
+[2025-12-30T17:50:39.787Z] [INFO] GET /css/responsive.css 304 0ms
+[2025-12-30T17:50:39.790Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T17:50:39.792Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T17:50:39.807Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T17:50:39.810Z] [INFO] GET /js/auth.js 304 0ms
+[2025-12-30T17:50:39.813Z] [INFO] GET /js/store.js 304 0ms
+[2025-12-30T17:50:39.826Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T17:50:39.829Z] [INFO] GET /js/offline.js 304 2ms
+[2025-12-30T17:50:39.832Z] [INFO] GET /js/board.js 304 1ms
+[2025-12-30T17:50:39.850Z] [INFO] GET /js/task-modal.js 304 3ms
+[2025-12-30T17:50:39.853Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T17:50:39.859Z] [INFO] GET /js/list.js 304 2ms
+[2025-12-30T17:50:39.892Z] [INFO] GET /js/shortcuts.js 304 2ms
+[2025-12-30T17:50:39.899Z] [INFO] GET /js/undo.js 304 4ms
+[2025-12-30T17:50:39.902Z] [INFO] GET /js/tour.js 200 5ms
+[2025-12-30T17:50:39.912Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T17:50:39.921Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T17:50:39.925Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T17:50:39.932Z] [INFO] GET /js/gitea.js 304 2ms
+[2025-12-30T17:50:39.945Z] [INFO] GET /css/list.css 304 3ms
+[2025-12-30T17:50:39.950Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T17:50:40.041Z] [INFO] GET /css/proposals.css 304 2ms
+[2025-12-30T17:50:40.044Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T17:50:40.048Z] [INFO] GET /css/gitea.css 304 2ms
+[2025-12-30T17:50:42.344Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T17:50:42.345Z] [INFO] POST /api/auth/login 200 567ms
+[2025-12-30T17:50:42.380Z] [INFO] GET /api/auth/users 200 5ms
+[2025-12-30T17:50:42.407Z] [INFO] Socket connected: MH (78Nwu9SJ_qL-yGh-AAAc)
+[2025-12-30T17:50:42.415Z] [INFO] Socket connected: MH (gOVRi__zlLX_O0s8AAAd)
+[2025-12-30T17:50:42.423Z] [INFO] GET /api/projects 200 6ms
+[2025-12-30T17:50:42.445Z] [INFO] MH joined project:[object Object]
+[2025-12-30T17:50:42.457Z] [INFO] GET /api/stats/dashboard?projectId=2 200 9ms
+[2025-12-30T17:50:42.461Z] [INFO] GET /api/columns/2 200 3ms
+[2025-12-30T17:50:42.475Z] [INFO] GET /api/tasks/project/2 200 11ms
+[2025-12-30T17:50:42.480Z] [INFO] GET /api/labels/2 200 5ms
+[2025-12-30T17:50:42.550Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 200 7ms
+[2025-12-30T17:50:42.585Z] [INFO] GET /api/notifications 200 11ms
+[2025-12-30T17:51:00.584Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:51:24.637Z] [INFO] GET /api/tasks/6 200 16ms
+[2025-12-30T17:51:24.682Z] [INFO] GET /api/links/6 200 9ms
+[2025-12-30T17:51:24.692Z] [INFO] GET /api/subtasks/6 200 5ms
+[2025-12-30T17:51:24.698Z] [INFO] GET /api/tasks/6/history 404 4ms
+[2025-12-30T17:51:24.703Z] [INFO] GET /api/files/6 200 5ms
+[2025-12-30T17:51:24.708Z] [INFO] GET /api/comments/6 200 4ms
+[2025-12-30T17:51:24.734Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMTcwNDIsImV4cCI6MTc2NzExNzY0Mn0.RZLBMqyE0EovR0GzQQmesYT1L0ZX5tmtQpfqsn-a8i8 200 10ms
+[2025-12-30T17:51:25.608Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T17:51:30.698Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:51:41.476Z] [INFO] PUT /api/subtasks/32 200 7ms
+[2025-12-30T17:51:42.482Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T17:51:58.703Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6)
+[2025-12-30T17:51:58.707Z] [INFO] PUT /api/tasks/6 200 19ms
+[2025-12-30T17:51:59.701Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T17:52:00.791Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:52:30.893Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:53:01.009Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T17:53:31.142Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T17:54:01.244Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:54:20.133Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T17:54:27.008Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T17:54:28.460Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T17:54:31.337Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:54:31.352Z] [INFO] GET /api/tasks/1 200 8ms
+[2025-12-30T17:54:31.382Z] [INFO] GET /api/subtasks/1 200 5ms
+[2025-12-30T17:54:31.407Z] [INFO] GET /api/links/1 200 6ms
+[2025-12-30T17:54:31.418Z] [INFO] GET /api/files/1 200 5ms
+[2025-12-30T17:54:31.424Z] [INFO] GET /api/comments/1 200 4ms
+[2025-12-30T17:54:31.431Z] [INFO] GET /api/tasks/1/history 404 5ms
+[2025-12-30T17:54:32.362Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T17:54:34.448Z] [INFO] Aufgabe aktualisiert: Router (ID: 1)
+[2025-12-30T17:54:34.452Z] [INFO] PUT /api/tasks/1 200 19ms
+[2025-12-30T17:54:35.445Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T17:54:35.923Z] [INFO] GET /api/tasks/7 200 7ms
+[2025-12-30T17:54:35.957Z] [INFO] GET /api/links/7 200 9ms
+[2025-12-30T17:54:35.963Z] [INFO] GET /api/subtasks/7 200 13ms
+[2025-12-30T17:54:35.969Z] [INFO] GET /api/comments/7 200 5ms
+[2025-12-30T17:54:35.975Z] [INFO] GET /api/files/7 200 5ms
+[2025-12-30T17:54:35.979Z] [INFO] GET /api/tasks/7/history 404 3ms
+[2025-12-30T17:54:36.912Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T17:54:37.807Z] [INFO] Aufgabe aktualisiert: Telekom eSIM Beschaffung (ID: 7)
+[2025-12-30T17:54:37.809Z] [INFO] PUT /api/tasks/7 200 12ms
+[2025-12-30T17:54:38.812Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T17:55:01.438Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:55:03.866Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T17:55:06.433Z] [INFO] GET /api/tasks/4 200 10ms
+[2025-12-30T17:55:06.469Z] [INFO] GET /api/links/4 200 11ms
+[2025-12-30T17:55:06.477Z] [INFO] GET /api/subtasks/4 200 6ms
+[2025-12-30T17:55:06.483Z] [INFO] GET /api/tasks/4/history 404 5ms
+[2025-12-30T17:55:06.488Z] [INFO] GET /api/comments/4 200 4ms
+[2025-12-30T17:55:06.492Z] [INFO] GET /api/files/4 200 4ms
+[2025-12-30T17:55:07.447Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T17:55:10.866Z] [INFO] Aufgabe aktualisiert: Corporated Design (ID: 4)
+[2025-12-30T17:55:10.869Z] [INFO] PUT /api/tasks/4 200 13ms
+[2025-12-30T17:55:11.870Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T17:55:13.480Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T17:55:17.242Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T17:55:31.569Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:56:01.661Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:56:24.606Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T17:56:27.612Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T17:56:31.752Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:56:38.163Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T17:56:50.776Z] [INFO] Aufgabe erstellt: Logofarbgebung (ID: 9) von MH
+[2025-12-30T17:56:50.777Z] [INFO] POST /api/tasks 201 7ms
+[2025-12-30T17:56:51.786Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T17:56:53.475Z] [INFO] GET /api/tasks/9 200 4ms
+[2025-12-30T17:56:53.510Z] [INFO] GET /api/subtasks/9 200 10ms
+[2025-12-30T17:56:53.532Z] [INFO] GET /api/links/9 200 5ms
+[2025-12-30T17:56:53.539Z] [INFO] GET /api/files/9 200 6ms
+[2025-12-30T17:56:53.543Z] [INFO] GET /api/comments/9 200 9ms
+[2025-12-30T17:56:53.548Z] [INFO] GET /api/tasks/9/history 404 3ms
+[2025-12-30T17:56:54.485Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T17:56:56.413Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T17:56:57.533Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T17:56:58.196Z] [INFO] 1 Datei(en) hochgeladen für Task 9
+[2025-12-30T17:56:58.197Z] [INFO] POST /api/files/9 201 24ms
+[2025-12-30T17:56:58.226Z] [INFO] GET /api/files/preview/3?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMTc0MTcsImV4cCI6MTc2NzExODAxN30.vm2M2-TjJT4p0oUDiSzckodeaLS3iNWvTNZZ4GScI2E 200 7ms
+[2025-12-30T17:57:01.399Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T17:57:01.851Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:57:03.284Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T17:57:03.477Z] [INFO] 1 Datei(en) hochgeladen für Task 9
+[2025-12-30T17:57:03.478Z] [INFO] POST /api/files/9 201 15ms
+[2025-12-30T17:57:03.522Z] [INFO] GET /api/files/preview/3?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMTc0MjMsImV4cCI6MTc2NzExODAyM30.HiRgMnSHLbrdNlit50OHQIiMIU1kbjgFEbFK1qwzers 200 16ms
+[2025-12-30T17:57:03.524Z] [INFO] GET /api/files/preview/4?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMTc0MjMsImV4cCI6MTc2NzExODAyM30.HiRgMnSHLbrdNlit50OHQIiMIU1kbjgFEbFK1qwzers 200 16ms
+[2025-12-30T17:57:09.632Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T17:57:10.160Z] [INFO] 1 Datei(en) hochgeladen für Task 9
+[2025-12-30T17:57:10.162Z] [INFO] POST /api/files/9 201 10ms
+[2025-12-30T17:57:10.206Z] [INFO] GET /api/files/preview/3?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMTc0MjksImV4cCI6MTc2NzExODAyOX0.eQzviWs0jlbDpwFwQ6YyxPQ_REyM6KNW-LT88x8w5DE 200 19ms
+[2025-12-30T17:57:10.208Z] [INFO] GET /api/files/preview/5?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMTc0MjksImV4cCI6MTc2NzExODAyOX0.eQzviWs0jlbDpwFwQ6YyxPQ_REyM6KNW-LT88x8w5DE 200 14ms
+[2025-12-30T17:57:10.210Z] [INFO] GET /api/files/preview/4?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMTc0MjksImV4cCI6MTc2NzExODAyOX0.eQzviWs0jlbDpwFwQ6YyxPQ_REyM6KNW-LT88x8w5DE 200 9ms
+[2025-12-30T17:57:12.730Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T17:57:13.173Z] [INFO] 1 Datei(en) hochgeladen für Task 9
+[2025-12-30T17:57:13.174Z] [INFO] POST /api/files/9 201 15ms
+[2025-12-30T17:57:13.210Z] [INFO] GET /api/files/preview/3?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMTc0MzIsImV4cCI6MTc2NzExODAzMn0.JCLPLVBRGIpIDaZs7FMQFdPUw1uXD8GI2LgFokAO9ro 200 12ms
+[2025-12-30T17:57:13.211Z] [INFO] GET /api/files/preview/4?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMTc0MzIsImV4cCI6MTc2NzExODAzMn0.JCLPLVBRGIpIDaZs7FMQFdPUw1uXD8GI2LgFokAO9ro 200 14ms
+[2025-12-30T17:57:13.212Z] [INFO] GET /api/files/preview/6?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMTc0MzIsImV4cCI6MTc2NzExODAzMn0.JCLPLVBRGIpIDaZs7FMQFdPUw1uXD8GI2LgFokAO9ro 200 14ms
+[2025-12-30T17:57:13.213Z] [INFO] GET /api/files/preview/5?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMTc0MzIsImV4cCI6MTc2NzExODAzMn0.JCLPLVBRGIpIDaZs7FMQFdPUw1uXD8GI2LgFokAO9ro 200 7ms
+[2025-12-30T17:57:20.997Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T17:57:31.943Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:57:33.034Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T17:57:33.043Z] [INFO] Aufgabe aktualisiert: Logofarbgebung - Ist irgendwas davon ansprechend genug? (ID: 9)
+[2025-12-30T17:57:33.045Z] [INFO] PUT /api/tasks/9 200 8ms
+[2025-12-30T17:57:40.210Z] [INFO] Aufgabe aktualisiert: Logofarbgebung - Ist irgendwas davon ansprechend genug? (ID: 9)
+[2025-12-30T17:57:40.212Z] [INFO] PUT /api/tasks/9 200 6ms
+[2025-12-30T17:57:41.225Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T17:57:42.407Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T17:57:43.477Z] [INFO] Aufgabe aktualisiert: Logofarbgebung - Ist irgendwas davon ansprechend genug? (ID: 9)
+[2025-12-30T17:57:43.479Z] [INFO] PUT /api/tasks/9 200 7ms
+[2025-12-30T17:57:44.488Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T17:57:46.716Z] [INFO] GET /api/tasks/9 200 13ms
+[2025-12-30T17:57:46.746Z] [INFO] GET /api/subtasks/9 304 6ms
+[2025-12-30T17:57:46.751Z] [INFO] GET /api/files/9 200 4ms
+[2025-12-30T17:57:46.755Z] [INFO] GET /api/links/9 304 3ms
+[2025-12-30T17:57:46.759Z] [INFO] GET /api/tasks/9/history 404 4ms
+[2025-12-30T17:57:46.762Z] [INFO] GET /api/comments/9 304 6ms
+[2025-12-30T17:57:46.799Z] [INFO] GET /api/files/preview/6?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMTc0NjQsImV4cCI6MTc2NzExODA2NH0.Hw_r4dMKoK7hCK_aYxZnIe3lZGhGncZccdyTlQHQETE 200 24ms
+[2025-12-30T17:57:46.805Z] [INFO] GET /api/files/preview/5?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMTc0NjQsImV4cCI6MTc2NzExODA2NH0.Hw_r4dMKoK7hCK_aYxZnIe3lZGhGncZccdyTlQHQETE 200 17ms
+[2025-12-30T17:57:46.806Z] [INFO] GET /api/files/preview/4?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMTc0NjQsImV4cCI6MTc2NzExODA2NH0.Hw_r4dMKoK7hCK_aYxZnIe3lZGhGncZccdyTlQHQETE 200 16ms
+[2025-12-30T17:57:46.807Z] [INFO] GET /api/files/preview/3?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMTc0NjQsImV4cCI6MTc2NzExODA2NH0.Hw_r4dMKoK7hCK_aYxZnIe3lZGhGncZccdyTlQHQETE 200 9ms
+[2025-12-30T17:57:47.719Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T17:57:52.133Z] [INFO] Aufgabe aktualisiert: Logofarbgebung - Ist irgendwas davon ansprechend genug? (ID: 9)
+[2025-12-30T17:57:52.135Z] [INFO] PUT /api/tasks/9 200 6ms
+[2025-12-30T17:57:53.143Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T17:58:02.039Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:58:04.467Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T17:58:06.268Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 9ms
+[2025-12-30T17:58:06.873Z] [INFO] GET /api/git/server/info 200 63ms
+[2025-12-30T17:58:06.923Z] [INFO] GET /api/git/server/commits?limit=10 200 30ms
+[2025-12-30T17:58:06.980Z] [INFO] GET /api/git/server/status 200 55ms
+[2025-12-30T17:58:07.002Z] [INFO] GET /api/git/server/branches 200 20ms
+[2025-12-30T17:58:07.827Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T17:58:10.233Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 6ms
+[2025-12-30T17:58:12.223Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T17:58:21.920Z] [INFO] POST /api/auth/refresh 200 16ms
+[2025-12-30T17:58:23.700Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T17:58:25.683Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T17:58:27.743Z] [INFO] GET /api/tasks/3 200 6ms
+[2025-12-30T17:58:27.777Z] [INFO] GET /api/comments/3 200 7ms
+[2025-12-30T17:58:27.781Z] [INFO] GET /api/links/3 200 10ms
+[2025-12-30T17:58:27.784Z] [INFO] GET /api/files/3 200 12ms
+[2025-12-30T17:58:27.790Z] [INFO] GET /api/subtasks/3 200 5ms
+[2025-12-30T17:58:27.794Z] [INFO] GET /api/tasks/3/history 404 8ms
+[2025-12-30T17:58:28.753Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T17:58:32.149Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:58:35.751Z] [INFO] Aufgabe aktualisiert: Bilanzbuchhaltung - Bundesanzeiger (ID: 3)
+[2025-12-30T17:58:35.752Z] [INFO] PUT /api/tasks/3 200 10ms
+[2025-12-30T17:58:36.756Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T17:58:43.547Z] [INFO] GET /api/tasks/3 200 7ms
+[2025-12-30T17:58:43.578Z] [INFO] GET /api/subtasks/3 304 5ms
+[2025-12-30T17:58:43.583Z] [INFO] GET /api/links/3 304 9ms
+[2025-12-30T17:58:43.588Z] [INFO] GET /api/files/3 304 4ms
+[2025-12-30T17:58:43.593Z] [INFO] GET /api/tasks/3/history 404 4ms
+[2025-12-30T17:58:43.597Z] [INFO] GET /api/comments/3 304 3ms
+[2025-12-30T17:58:44.554Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T17:58:47.441Z] [INFO] Aufgabe aktualisiert: Bilanzbuchhaltung - Bundesanzeiger (ID: 3)
+[2025-12-30T17:58:47.442Z] [INFO] PUT /api/tasks/3 200 11ms
+[2025-12-30T17:58:48.442Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T17:58:50.594Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T17:58:53.236Z] [INFO] POST /api/auth/refresh 200 16ms
+[2025-12-30T17:59:02.275Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T17:59:14.511Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T17:59:15.710Z] [INFO] Aufgabe erstellt: Bilanzbuchhaltung - Finanzamt (ID: 10) von MH
+[2025-12-30T17:59:15.712Z] [INFO] POST /api/tasks 201 6ms
+[2025-12-30T17:59:16.716Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T17:59:17.614Z] [INFO] GET /api/tasks/10 200 10ms
+[2025-12-30T17:59:17.649Z] [INFO] GET /api/links/10 200 10ms
+[2025-12-30T17:59:17.656Z] [INFO] GET /api/comments/10 200 16ms
+[2025-12-30T17:59:17.663Z] [INFO] GET /api/subtasks/10 200 6ms
+[2025-12-30T17:59:17.667Z] [INFO] GET /api/files/10 200 9ms
+[2025-12-30T17:59:17.672Z] [INFO] GET /api/tasks/10/history 404 4ms
+[2025-12-30T17:59:18.624Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T17:59:23.151Z] [INFO] Aufgabe aktualisiert: Bilanzbuchhaltung - Finanzamt (ID: 10)
+[2025-12-30T17:59:23.153Z] [INFO] PUT /api/tasks/10 200 11ms
+[2025-12-30T17:59:24.166Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T17:59:31.400Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T17:59:32.386Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T17:59:36.797Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T17:59:39.791Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T17:59:42.245Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T17:59:42.701Z] [INFO] Aufgabe erstellt: E-Bilanz Software (ID: 11) von MH
+[2025-12-30T17:59:42.702Z] [INFO] POST /api/tasks 201 11ms
+[2025-12-30T17:59:43.691Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T17:59:44.391Z] [INFO] GET /api/tasks/11 200 8ms
+[2025-12-30T17:59:44.423Z] [INFO] GET /api/links/11 200 8ms
+[2025-12-30T17:59:44.428Z] [INFO] GET /api/subtasks/11 200 12ms
+[2025-12-30T17:59:44.432Z] [INFO] GET /api/tasks/11/history 404 3ms
+[2025-12-30T17:59:44.437Z] [INFO] GET /api/files/11 200 4ms
+[2025-12-30T17:59:44.441Z] [INFO] GET /api/comments/11 200 4ms
+[2025-12-30T17:59:45.405Z] [INFO] POST /api/auth/refresh 200 17ms
+[2025-12-30T17:59:53.842Z] [INFO] Aufgabe aktualisiert: E-Bilanz Software (ID: 11)
+[2025-12-30T17:59:53.844Z] [INFO] PUT /api/tasks/11 200 9ms
+[2025-12-30T17:59:54.213Z] [INFO] Aufgabe aktualisiert: E-Bilanz Software (ID: 11)
+[2025-12-30T17:59:54.215Z] [INFO] PUT /api/tasks/11 200 11ms
+[2025-12-30T17:59:55.208Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T17:59:55.875Z] [INFO] Aufgabe aktualisiert: E-Bilanz Software (ID: 11)
+[2025-12-30T17:59:55.878Z] [INFO] PUT /api/tasks/11 200 12ms
+[2025-12-30T17:59:56.881Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T18:00:01.009Z] [INFO] GET /api/tasks/10 200 5ms
+[2025-12-30T18:00:01.038Z] [INFO] GET /api/subtasks/10 304 6ms
+[2025-12-30T18:00:01.042Z] [INFO] GET /api/links/10 304 9ms
+[2025-12-30T18:00:01.046Z] [INFO] GET /api/files/10 304 3ms
+[2025-12-30T18:00:01.051Z] [INFO] GET /api/tasks/10/history 404 4ms
+[2025-12-30T18:00:01.056Z] [INFO] GET /api/comments/10 304 4ms
+[2025-12-30T18:00:02.010Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T18:00:02.496Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:00:12.402Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T18:00:15.929Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T18:00:16.464Z] [INFO] Subtask erstellt: ELSTER Account erstellen in Task 10
+[2025-12-30T18:00:16.466Z] [INFO] POST /api/subtasks 201 10ms
+[2025-12-30T18:00:17.483Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T18:00:32.615Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:01:02.704Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:01:32.787Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:02:02.889Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:02:32.991Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:03:03.094Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:03:33.243Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T18:04:03.380Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T18:04:33.475Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:05:03.596Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T18:05:33.728Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:06:03.838Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:06:33.953Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:07:02.776Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T18:07:04.059Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:07:34.182Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:07:42.065Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T18:07:47.473Z] [INFO] Aufgabe aktualisiert: Bilanzbuchhaltung - Finanzamt (ID: 10)
+[2025-12-30T18:07:47.475Z] [INFO] PUT /api/tasks/10 200 7ms
+[2025-12-30T18:07:48.492Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T18:07:50.126Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T18:08:04.275Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:08:34.366Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:08:53.187Z] [INFO] GET /api/tasks/10 200 8ms
+[2025-12-30T18:08:53.224Z] [INFO] GET /api/subtasks/10 200 9ms
+[2025-12-30T18:08:53.247Z] [INFO] GET /api/links/10 304 5ms
+[2025-12-30T18:08:53.263Z] [INFO] GET /api/comments/10 304 6ms
+[2025-12-30T18:08:53.269Z] [INFO] GET /api/files/10 304 5ms
+[2025-12-30T18:08:53.272Z] [INFO] GET /api/tasks/10/history 404 7ms
+[2025-12-30T18:08:54.157Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T18:08:58.368Z] [INFO] Socket disconnected: MH (gOVRi__zlLX_O0s8AAAd)
+[2025-12-30T18:08:58.369Z] [INFO] Socket disconnected: MH (78Nwu9SJ_qL-yGh-AAAc)
+[2025-12-30T18:09:01.016Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T18:09:04.459Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:09:09.095Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T18:09:21.002Z] [INFO] POST /api/subtasks 201 6ms
+[2025-12-30T18:09:21.001Z] [INFO] Subtask erstellt: Die Düsseldorf Nord - Langenfeld Problematik klären in Task 10
+[2025-12-30T18:09:22.003Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T18:09:32.322Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T18:09:34.092Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T18:09:34.545Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T18:09:39.265Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T18:09:43.121Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T18:10:04.649Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T18:10:34.751Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T18:11:04.464Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T18:11:04.856Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:11:31.643Z] [INFO] Subtask erstellt: ELSTER - Abgabe Körperschaftsteuererklärung in Task 10
+[2025-12-30T18:11:31.645Z] [INFO] POST /api/subtasks 201 10ms
+[2025-12-30T18:11:32.646Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T18:11:34.973Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:11:36.958Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T18:11:40.635Z] [INFO] Subtask erstellt: ELSTER - Abgabe Gewerbesteuererklärung in Task 10
+[2025-12-30T18:11:40.637Z] [INFO] POST /api/subtasks 201 10ms
+[2025-12-30T18:11:41.644Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T18:11:45.695Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T18:11:50.669Z] [INFO] Subtask erstellt: ELSTER - Umsatzsteuerjahreserklärung in Task 10
+[2025-12-30T18:11:50.671Z] [INFO] POST /api/subtasks 201 7ms
+[2025-12-30T18:11:51.673Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T18:11:57.789Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T18:11:59.371Z] [INFO] Subtask erstellt: E-Bilanz Abgabe in Task 10
+[2025-12-30T18:11:59.373Z] [INFO] POST /api/subtasks 201 7ms
+[2025-12-30T18:12:00.376Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T18:12:05.068Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:12:08.081Z] [INFO] Aufgabe aktualisiert: Bilanzbuchhaltung - Finanzamt (ID: 10)
+[2025-12-30T18:12:08.082Z] [INFO] PUT /api/tasks/10 200 9ms
+[2025-12-30T18:12:08.570Z] [INFO] Aufgabe aktualisiert: Bilanzbuchhaltung - Finanzamt (ID: 10)
+[2025-12-30T18:12:08.572Z] [INFO] PUT /api/tasks/10 200 13ms
+[2025-12-30T18:12:09.576Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T18:12:10.115Z] [INFO] Aufgabe aktualisiert: Bilanzbuchhaltung - Finanzamt (ID: 10)
+[2025-12-30T18:12:10.117Z] [INFO] PUT /api/tasks/10 200 8ms
+[2025-12-30T18:12:11.130Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T18:12:12.882Z] [INFO] GET /api/tasks/3 200 7ms
+[2025-12-30T18:12:12.913Z] [INFO] GET /api/subtasks/3 304 6ms
+[2025-12-30T18:12:12.937Z] [INFO] GET /api/links/3 304 6ms
+[2025-12-30T18:12:12.950Z] [INFO] GET /api/files/3 304 6ms
+[2025-12-30T18:12:12.954Z] [INFO] GET /api/comments/3 304 9ms
+[2025-12-30T18:12:12.959Z] [INFO] GET /api/tasks/3/history 404 3ms
+[2025-12-30T18:12:13.901Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T18:12:21.479Z] [INFO] Aufgabe aktualisiert: Bilanzbuchhaltung - Bundesanzeiger (ID: 3)
+[2025-12-30T18:12:21.481Z] [INFO] PUT /api/tasks/3 200 11ms
+[2025-12-30T18:12:22.480Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T18:12:35.160Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:13:05.279Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:13:35.389Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:14:05.495Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:14:35.613Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:15:05.704Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:15:35.826Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:16:05.928Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:16:36.017Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:17:06.121Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:17:36.223Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:18:06.324Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:18:36.449Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:19:06.567Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:19:36.665Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T18:19:44.404Z] [INFO] POST /api/auth/refresh 200 19ms
+[2025-12-30T18:20:06.788Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:20:36.882Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T18:21:06.989Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:21:37.100Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:22:06.857Z] [INFO] POST /api/auth/refresh 200 15ms
+[2025-12-30T18:22:07.208Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:22:12.542Z] [INFO] GET /api/tasks/10 200 8ms
+[2025-12-30T18:22:12.569Z] [INFO] GET /api/subtasks/10 200 3ms
+[2025-12-30T18:22:12.597Z] [INFO] GET /api/links/10 304 7ms
+[2025-12-30T18:22:12.607Z] [INFO] GET /api/files/10 304 5ms
+[2025-12-30T18:22:12.615Z] [INFO] GET /api/tasks/10/history 404 5ms
+[2025-12-30T18:22:12.619Z] [INFO] GET /api/comments/10 304 8ms
+[2025-12-30T18:22:13.557Z] [INFO] POST /api/auth/refresh 200 19ms
+[2025-12-30T18:22:17.978Z] [INFO] Aufgabe aktualisiert: Bilanzbuchhaltung - Finanzamt (ID: 10)
+[2025-12-30T18:22:17.980Z] [INFO] PUT /api/tasks/10 200 9ms
+[2025-12-30T18:22:18.994Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T18:22:37.321Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:22:54.185Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T18:22:57.186Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T18:23:00.474Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T18:23:02.442Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T18:23:05.375Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T18:23:07.414Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:23:08.722Z] [INFO] Spalte erstellt: zu Klären in Projekt 2 (Filter: completed)
+[2025-12-30T18:23:08.723Z] [INFO] POST /api/columns 201 6ms
+[2025-12-30T18:23:09.731Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T18:23:11.592Z] [INFO] GET /api/tasks/7 200 10ms
+[2025-12-30T18:23:11.623Z] [INFO] GET /api/subtasks/7 304 7ms
+[2025-12-30T18:23:11.633Z] [INFO] GET /api/links/7 304 8ms
+[2025-12-30T18:23:11.641Z] [INFO] GET /api/comments/7 304 6ms
+[2025-12-30T18:23:11.648Z] [INFO] GET /api/files/7 304 6ms
+[2025-12-30T18:23:11.651Z] [INFO] GET /api/tasks/7/history 404 3ms
+[2025-12-30T18:23:12.590Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T18:23:15.422Z] [INFO] Aufgabe aktualisiert: Telekom eSIM Beschaffung (ID: 7)
+[2025-12-30T18:23:15.424Z] [INFO] PUT /api/tasks/7 200 10ms
+[2025-12-30T18:23:16.428Z] [INFO] POST /api/auth/refresh 200 14ms
+[2025-12-30T18:23:16.851Z] [INFO] Aufgabe verschoben: Telekom eSIM Beschaffung -> zu Klären
+[2025-12-30T18:23:16.854Z] [INFO] PUT /api/tasks/7/move 200 12ms
+[2025-12-30T18:23:20.351Z] [INFO] Aufgabe verschoben: Logofarbgebung - Ist irgendwas davon ansprechend genug? -> zu Klären
+[2025-12-30T18:23:20.353Z] [INFO] PUT /api/tasks/9/move 200 6ms
+[2025-12-30T18:23:21.845Z] [INFO] Aufgabe verschoben: E-Bilanz Software -> zu Klären
+[2025-12-30T18:23:21.847Z] [INFO] PUT /api/tasks/11/move 200 7ms
+[2025-12-30T18:23:28.075Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T18:23:32.005Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T18:23:32.660Z] [INFO] Aufgabe erstellt: ELSTER Zugang (ID: 12) von MH
+[2025-12-30T18:23:32.663Z] [INFO] POST /api/tasks 201 10ms
+[2025-12-30T18:23:33.675Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T18:23:37.532Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T18:24:07.651Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:24:37.769Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:25:07.865Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:25:37.994Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:26:08.095Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:26:38.211Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:27:08.313Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:27:38.401Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:28:08.511Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:28:38.593Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:29:08.712Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:29:38.816Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:30:08.908Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:30:39.024Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:31:09.132Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:31:39.240Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:32:09.346Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:32:39.435Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:33:09.558Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:33:31.621Z] [INFO] Logout: MH
+[2025-12-30T18:33:31.622Z] [INFO] POST /api/auth/logout 200 13ms
+[2025-12-30T18:33:35.091Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T18:33:35.093Z] [INFO] POST /api/auth/login 200 528ms
+[2025-12-30T18:33:35.217Z] [INFO] GET /api/auth/users 304 7ms
+[2025-12-30T18:33:35.231Z] [INFO] Socket connected: MH (fIqiF12pzxckgttCAAAl)
+[2025-12-30T18:33:35.224Z] [INFO] Socket connected: MH (NcA5TA6MhaCmVPOOAAAk)
+[2025-12-30T18:33:35.243Z] [INFO] GET /api/projects 200 5ms
+[2025-12-30T18:33:35.268Z] [INFO] GET /api/stats/dashboard?projectId=2 200 6ms
+[2025-12-30T18:33:35.273Z] [INFO] GET /api/labels/2 200 10ms
+[2025-12-30T18:33:35.278Z] [INFO] GET /api/columns/2 200 4ms
+[2025-12-30T18:33:35.288Z] [INFO] GET /api/tasks/project/2 200 13ms
+[2025-12-30T18:33:35.291Z] [INFO] MH joined project:[object Object]
+[2025-12-30T18:33:35.326Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 7ms
+[2025-12-30T18:33:39.668Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:34:09.791Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:34:39.887Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:35:09.970Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:35:40.082Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:36:10.181Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:36:40.296Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:37:10.390Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:37:40.501Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:38:10.599Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:38:40.679Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:39:10.773Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:39:40.874Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:40:10.967Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:40:41.064Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:41:11.187Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:41:33.781Z] [INFO] GET / 200 6ms
+[2025-12-30T18:41:36.200Z] [INFO] GET /wordpress/ 200 4ms
+[2025-12-30T18:41:41.289Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:42:11.387Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:42:41.481Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:43:11.564Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:43:41.659Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T18:44:11.753Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:44:32.255Z] [INFO] POST /api/auth/logout 401 5ms
+[2025-12-30T18:44:32.275Z] [INFO] Socket disconnected: MH (fIqiF12pzxckgttCAAAl)
+[2025-12-30T18:44:41.834Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:45:11.938Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:45:42.040Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:46:12.143Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T18:46:42.255Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:47:12.389Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:47:42.503Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:48:12.602Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:48:42.705Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:49:12.802Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:49:42.903Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:50:12.992Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:50:36.053Z] [INFO] GET / 304 2ms
+[2025-12-30T18:50:36.104Z] [INFO] GET /css/variables.css 304 2ms
+[2025-12-30T18:50:36.107Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T18:50:36.125Z] [INFO] GET /css/components.css 304 1ms
+[2025-12-30T18:50:36.130Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T18:50:36.147Z] [INFO] GET /css/modal.css 304 2ms
+[2025-12-30T18:50:36.148Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T18:50:36.148Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T18:50:36.154Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T18:50:36.156Z] [INFO] GET /css/admin.css 304 1ms
+[2025-12-30T18:50:36.158Z] [INFO] GET /css/proposals.css 304 2ms
+[2025-12-30T18:50:36.174Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T18:50:36.177Z] [INFO] GET /css/responsive.css 304 2ms
+[2025-12-30T18:50:36.178Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T18:50:36.213Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T18:50:36.217Z] [INFO] GET /js/api.js 304 2ms
+[2025-12-30T18:50:36.218Z] [INFO] GET /js/auth.js 304 2ms
+[2025-12-30T18:50:36.222Z] [INFO] GET /js/sync.js 304 6ms
+[2025-12-30T18:50:36.222Z] [INFO] GET /js/board.js 304 1ms
+[2025-12-30T18:50:36.225Z] [INFO] GET /js/offline.js 304 2ms
+[2025-12-30T18:50:36.232Z] [INFO] GET /js/task-modal.js 304 1ms
+[2025-12-30T18:50:36.236Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T18:50:36.237Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T18:50:36.239Z] [INFO] GET /js/undo.js 304 0ms
+[2025-12-30T18:50:36.241Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T18:50:36.244Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T18:50:36.250Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T18:50:36.253Z] [INFO] GET /js/notifications.js 304 0ms
+[2025-12-30T18:50:36.256Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T18:50:36.261Z] [INFO] GET /js/utils.js 304 2ms
+[2025-12-30T18:50:36.556Z] [INFO] GET /assets/icons/task.svg 304 2ms
+[2025-12-30T18:50:38.204Z] [INFO] GET /sw.js 304 1ms
+[2025-12-30T18:50:38.276Z] [INFO] GET /sw.js 304 4ms
+[2025-12-30T18:50:39.925Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T18:50:39.926Z] [INFO] POST /api/auth/login 200 543ms
+[2025-12-30T18:50:39.962Z] [INFO] GET /api/auth/users 304 5ms
+[2025-12-30T18:50:39.977Z] [INFO] Socket connected: MH (xQtTiwwY814ogfFQAAAo)
+[2025-12-30T18:50:39.981Z] [INFO] Socket connected: MH (oIF2wKpZeTXqUW86AAAp)
+[2025-12-30T18:50:39.989Z] [INFO] GET /api/projects 401 5ms
+[2025-12-30T18:50:40.013Z] [INFO] Socket disconnected: MH (xQtTiwwY814ogfFQAAAo)
+[2025-12-30T18:50:40.015Z] [INFO] GET /api/proposals?sort=date&archived=0 401 3ms
+[2025-12-30T18:50:40.039Z] [INFO] GET /api/notifications 401 1ms
+[2025-12-30T18:50:42.033Z] [INFO] Socket disconnected: MH (oIF2wKpZeTXqUW86AAAp)
+[2025-12-30T18:50:43.089Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:50:48.936Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T18:50:48.937Z] [INFO] POST /api/auth/login 200 480ms
+[2025-12-30T18:50:49.007Z] [INFO] Socket connected: MH (uhnd5HEwZQTaclbbAAAs)
+[2025-12-30T18:50:49.019Z] [INFO] GET /api/auth/users 304 20ms
+[2025-12-30T18:50:49.030Z] [INFO] Socket connected: MH (X9gnwarVbVLEdekgAAAt)
+[2025-12-30T18:50:49.056Z] [INFO] GET /api/projects 304 10ms
+[2025-12-30T18:50:49.076Z] [INFO] MH joined project:[object Object]
+[2025-12-30T18:50:49.083Z] [INFO] GET /api/stats/dashboard?projectId=2 304 6ms
+[2025-12-30T18:50:49.088Z] [INFO] GET /api/columns/2 304 10ms
+[2025-12-30T18:50:49.101Z] [INFO] GET /api/tasks/project/2 304 12ms
+[2025-12-30T18:50:49.105Z] [INFO] GET /api/labels/2 304 3ms
+[2025-12-30T18:50:49.133Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 6ms
+[2025-12-30T18:50:55.085Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T18:51:00.185Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T18:51:01.502Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T18:51:02.601Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T18:51:10.196Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T18:51:13.174Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:51:35.336Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T18:51:38.380Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T18:51:40.687Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T18:51:40.911Z] [INFO] Aufgabe erstellt: TaskMate (ID: 13) von MH
+[2025-12-30T18:51:40.913Z] [INFO] POST /api/tasks 201 8ms
+[2025-12-30T18:51:41.919Z] [INFO] POST /api/auth/refresh 200 13ms
+[2025-12-30T18:51:43.273Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:51:57.293Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T18:51:59.122Z] [INFO] GET /api/tasks/12 200 12ms
+[2025-12-30T18:51:59.152Z] [INFO] GET /api/subtasks/12 200 8ms
+[2025-12-30T18:51:59.189Z] [INFO] GET /api/links/12 200 9ms
+[2025-12-30T18:51:59.196Z] [INFO] GET /api/comments/12 200 5ms
+[2025-12-30T18:51:59.201Z] [INFO] GET /api/files/12 200 4ms
+[2025-12-30T18:51:59.206Z] [INFO] GET /api/tasks/12/history 404 3ms
+[2025-12-30T18:52:00.116Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T18:52:00.474Z] [INFO] Aufgabe aktualisiert: ELSTER Zugang (ID: 12)
+[2025-12-30T18:52:00.475Z] [INFO] PUT /api/tasks/12 200 5ms
+[2025-12-30T18:52:02.400Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T18:52:13.366Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:52:43.479Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:52:56.704Z] [INFO] GET /api/tasks/10 200 5ms
+[2025-12-30T18:52:56.749Z] [INFO] GET /api/subtasks/10 304 14ms
+[2025-12-30T18:52:56.770Z] [INFO] GET /api/links/10 304 6ms
+[2025-12-30T18:52:56.781Z] [INFO] GET /api/comments/10 304 6ms
+[2025-12-30T18:52:56.788Z] [INFO] GET /api/files/10 304 5ms
+[2025-12-30T18:52:56.793Z] [INFO] GET /api/tasks/10/history 404 4ms
+[2025-12-30T18:52:57.628Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T18:53:02.302Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T18:53:13.577Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:53:43.688Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:53:56.217Z] [INFO] Socket disconnected: MH (NcA5TA6MhaCmVPOOAAAk)
+[2025-12-30T18:54:13.798Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:54:43.898Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:55:13.998Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:55:44.101Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:56:14.207Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:56:44.326Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:57:14.438Z] [INFO] GET /api/health 200 6ms
+[2025-12-30T18:57:44.538Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T18:58:14.634Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:58:44.742Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T18:59:14.873Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T18:59:44.977Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T19:00:15.065Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T19:00:33.044Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T19:00:33.045Z] [INFO] POST /api/auth/login 200 472ms
+[2025-12-30T19:00:33.143Z] [INFO] GET /api/auth/users 304 4ms
+[2025-12-30T19:00:33.148Z] [INFO] Socket connected: HG (v2WV4OdnlRRb51xtAAAy)
+[2025-12-30T19:00:33.176Z] [INFO] Socket connected: HG (IbK4n4f_1nIQJ-gfAAAz)
+[2025-12-30T19:00:33.190Z] [INFO] GET /api/projects 200 7ms
+[2025-12-30T19:00:33.228Z] [INFO] HG joined project:[object Object]
+[2025-12-30T19:00:33.235Z] [INFO] GET /api/columns/2 200 6ms
+[2025-12-30T19:00:33.241Z] [INFO] GET /api/stats/dashboard?projectId=2 200 5ms
+[2025-12-30T19:00:33.255Z] [INFO] GET /api/tasks/project/2 200 12ms
+[2025-12-30T19:00:33.263Z] [INFO] GET /api/labels/2 200 4ms
+[2025-12-30T19:00:33.306Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 6ms
+[2025-12-30T19:00:35.842Z] [INFO] GET / 200 3ms
+[2025-12-30T19:00:35.912Z] [INFO] Socket disconnected: HG (v2WV4OdnlRRb51xtAAAy)
+[2025-12-30T19:00:35.915Z] [INFO] Socket disconnected: HG (IbK4n4f_1nIQJ-gfAAAz)
+[2025-12-30T19:00:35.930Z] [INFO] GET /css/variables.css 304 2ms
+[2025-12-30T19:00:35.933Z] [INFO] GET /css/base.css 304 2ms
+[2025-12-30T19:00:35.937Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T19:00:35.939Z] [INFO] GET /css/components.css 304 1ms
+[2025-12-30T19:00:35.941Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T19:00:35.943Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T19:00:35.964Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T19:00:35.965Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T19:00:35.967Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T19:00:35.974Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T19:00:35.978Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T19:00:35.979Z] [INFO] GET /css/gitea.css 200 4ms
+[2025-12-30T19:00:35.997Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T19:00:36.061Z] [INFO] GET /js/store.js 304 2ms
+[2025-12-30T19:00:36.065Z] [INFO] GET /js/offline.js 304 2ms
+[2025-12-30T19:00:36.070Z] [INFO] GET /js/board.js 304 2ms
+[2025-12-30T19:00:36.072Z] [INFO] GET /js/api.js 200 6ms
+[2025-12-30T19:00:36.074Z] [INFO] GET /js/sync.js 304 3ms
+[2025-12-30T19:00:36.075Z] [INFO] GET /js/auth.js 304 2ms
+[2025-12-30T19:00:36.090Z] [INFO] GET /js/task-modal.js 304 1ms
+[2025-12-30T19:00:36.101Z] [INFO] GET /js/calendar.js 304 4ms
+[2025-12-30T19:00:36.106Z] [INFO] GET /js/list.js 304 2ms
+[2025-12-30T19:00:36.109Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T19:00:36.112Z] [INFO] GET /js/undo.js 304 1ms
+[2025-12-30T19:00:36.129Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T19:00:36.134Z] [INFO] GET /js/proposals.js 304 2ms
+[2025-12-30T19:00:36.136Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T19:00:36.139Z] [INFO] GET /js/gitea.js 200 2ms
+[2025-12-30T19:00:36.150Z] [INFO] GET /js/utils.js 304 1ms
+[2025-12-30T19:00:36.225Z] [INFO] POST /api/auth/refresh 200 5ms
+[2025-12-30T19:00:36.233Z] [INFO] GET /assets/icons/task.svg 200 2ms
+[2025-12-30T19:00:36.240Z] [INFO] GET /api/auth/users 304 4ms
+[2025-12-30T19:00:36.275Z] [INFO] GET /api/auth/users 304 3ms
+[2025-12-30T19:00:36.308Z] [INFO] Socket connected: HG (a8NApn3vuneXKyiTAAA1)
+[2025-12-30T19:00:36.315Z] [INFO] GET /api/projects 304 5ms
+[2025-12-30T19:00:36.361Z] [INFO] GET /api/stats/dashboard?projectId=2 304 12ms
+[2025-12-30T19:00:36.375Z] [INFO] GET /api/tasks/project/2 304 13ms
+[2025-12-30T19:00:36.379Z] [INFO] GET /api/labels/2 304 16ms
+[2025-12-30T19:00:36.380Z] [INFO] HG joined project:[object Object]
+[2025-12-30T19:00:36.385Z] [INFO] GET /api/columns/2 304 4ms
+[2025-12-30T19:00:36.427Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 6ms
+[2025-12-30T19:00:36.460Z] [INFO] GET /api/notifications 304 3ms
+[2025-12-30T19:00:37.990Z] [INFO] GET /sw.js 200 4ms
+[2025-12-30T19:00:38.035Z] [INFO] GET /css/variables.css 304 2ms
+[2025-12-30T19:00:38.039Z] [INFO] GET / 304 3ms
+[2025-12-30T19:00:38.044Z] [INFO] GET /index.html 200 13ms
+[2025-12-30T19:00:38.068Z] [INFO] GET /css/base.css 304 2ms
+[2025-12-30T19:00:38.072Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T19:00:38.096Z] [INFO] GET /css/board.css 304 0ms
+[2025-12-30T19:00:38.098Z] [INFO] GET /css/modal.css 304 0ms
+[2025-12-30T19:00:38.102Z] [INFO] GET /css/calendar.css 304 1ms
+[2025-12-30T19:00:38.130Z] [INFO] GET /css/responsive.css 304 2ms
+[2025-12-30T19:00:38.131Z] [INFO] GET /js/app.js 304 2ms
+[2025-12-30T19:00:38.138Z] [INFO] GET /js/utils.js 304 2ms
+[2025-12-30T19:00:38.162Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T19:00:38.164Z] [INFO] GET /js/auth.js 304 1ms
+[2025-12-30T19:00:38.170Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T19:00:38.202Z] [INFO] GET /js/sync.js 304 2ms
+[2025-12-30T19:00:38.205Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T19:00:38.214Z] [INFO] GET /js/board.js 304 1ms
+[2025-12-30T19:00:38.235Z] [INFO] GET /js/task-modal.js 304 2ms
+[2025-12-30T19:00:38.239Z] [INFO] GET /js/calendar.js 304 2ms
+[2025-12-30T19:00:38.248Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T19:00:38.267Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T19:00:38.271Z] [INFO] GET /js/undo.js 304 1ms
+[2025-12-30T19:00:38.280Z] [INFO] GET /js/tour.js 304 1ms
+[2025-12-30T19:00:38.297Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T19:00:38.300Z] [INFO] GET /js/proposals.js 304 1ms
+[2025-12-30T19:00:38.313Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T19:00:38.327Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T19:00:38.332Z] [INFO] GET /css/list.css 304 1ms
+[2025-12-30T19:00:38.345Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T19:00:38.358Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T19:00:38.363Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T19:00:38.375Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T19:00:41.307Z] [INFO] GET /api/git/server/info 304 33ms
+[2025-12-30T19:00:41.357Z] [INFO] GET /api/git/server/commits?limit=10 304 17ms
+[2025-12-30T19:00:41.378Z] [INFO] GET /api/git/server/branches 304 19ms
+[2025-12-30T19:00:41.411Z] [INFO] GET /api/git/server/status 200 31ms
+[2025-12-30T19:00:42.293Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T19:00:45.155Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T19:01:06.918Z] [INFO] GET /api/gitea/repositories?page=1&limit=50 304 426ms
+[2025-12-30T19:01:07.517Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T19:01:11.325Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T19:01:12.382Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T19:01:15.251Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T19:01:29.289Z] [INFO] POST /api/auth/refresh 200 16ms
+[2025-12-30T19:01:29.555Z] [INFO] GET /api/gitea/repositories?page=1&limit=50 304 131ms
+[2025-12-30T19:01:32.553Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T19:01:39.800Z] [INFO] Socket disconnected: MH (uhnd5HEwZQTaclbbAAAs)
+[2025-12-30T19:01:39.801Z] [INFO] Socket disconnected: MH (X9gnwarVbVLEdekgAAAt)
+[2025-12-30T19:01:45.352Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T19:01:45.886Z] [INFO] POST /api/auth/refresh 200 15ms
+[2025-12-30T19:01:51.149Z] [INFO] GET /api/git/server/info 304 26ms
+[2025-12-30T19:01:51.223Z] [INFO] GET /api/git/server/status 304 40ms
+[2025-12-30T19:01:51.240Z] [INFO] GET /api/git/server/branches 304 13ms
+[2025-12-30T19:01:51.256Z] [INFO] GET /api/git/server/commits?limit=10 304 15ms
+[2025-12-30T19:01:52.137Z] [INFO] POST /api/auth/refresh 200 15ms
+[2025-12-30T19:02:01.449Z] [INFO] GET /api/gitea/repositories?page=1&limit=50 304 79ms
+[2025-12-30T19:02:02.382Z] [INFO] POST /api/auth/refresh 200 10ms
+[2025-12-30T19:02:08.079Z] [INFO] GET /api/gitea/repositories?page=1&limit=50 304 95ms
+[2025-12-30T19:02:11.075Z] [INFO] GET / 304 2ms
+[2025-12-30T19:02:11.160Z] [INFO] GET /css/variables.css 304 1ms
+[2025-12-30T19:02:11.162Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T19:02:11.185Z] [INFO] GET /css/components.css 304 2ms
+[2025-12-30T19:02:11.189Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T19:02:11.201Z] [INFO] GET /css/modal.css 304 1ms
+[2025-12-30T19:02:11.212Z] [INFO] GET /css/calendar.css 304 2ms
+[2025-12-30T19:02:11.217Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T19:02:11.220Z] [INFO] GET /css/admin.css 304 2ms
+[2025-12-30T19:02:11.223Z] [INFO] GET /css/proposals.css 304 1ms
+[2025-12-30T19:02:11.226Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T19:02:11.231Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T19:02:11.238Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T19:02:11.242Z] [INFO] GET /js/app.js 304 1ms
+[2025-12-30T19:02:11.280Z] [INFO] GET /js/api.js 304 3ms
+[2025-12-30T19:02:11.280Z] [INFO] GET /js/store.js 304 2ms
+[2025-12-30T19:02:11.283Z] [INFO] GET /js/auth.js 304 2ms
+[2025-12-30T19:02:11.288Z] [INFO] GET /js/sync.js 304 4ms
+[2025-12-30T19:02:11.291Z] [INFO] GET /js/offline.js 304 1ms
+[2025-12-30T19:02:11.293Z] [INFO] GET /js/board.js 304 1ms
+[2025-12-30T19:02:11.299Z] [INFO] GET /js/task-modal.js 304 1ms
+[2025-12-30T19:02:11.301Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T19:02:11.302Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T19:02:11.305Z] [INFO] GET /js/shortcuts.js 304 0ms
+[2025-12-30T19:02:11.308Z] [INFO] GET /js/undo.js 304 0ms
+[2025-12-30T19:02:11.310Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T19:02:11.319Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T19:02:11.321Z] [INFO] GET /js/proposals.js 304 2ms
+[2025-12-30T19:02:11.323Z] [INFO] GET /js/gitea.js 304 1ms
+[2025-12-30T19:02:11.327Z] [INFO] GET /js/utils.js 304 2ms
+[2025-12-30T19:02:11.667Z] [INFO] GET /assets/icons/task.svg 304 2ms
+[2025-12-30T19:02:12.105Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T19:02:13.288Z] [INFO] GET /sw.js 304 1ms
+[2025-12-30T19:02:13.359Z] [INFO] GET /sw.js 304 1ms
+[2025-12-30T19:02:14.464Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T19:02:14.465Z] [INFO] POST /api/auth/login 200 643ms
+[2025-12-30T19:02:14.494Z] [INFO] GET /api/auth/users 304 4ms
+[2025-12-30T19:02:14.513Z] [INFO] Socket connected: MH (0_SfFavf8pab-FIIAAA4)
+[2025-12-30T19:02:14.518Z] [INFO] Socket connected: MH (dpSjgbsS0I4Zdd-hAAA5)
+[2025-12-30T19:02:14.523Z] [INFO] GET /api/projects 401 3ms
+[2025-12-30T19:02:14.546Z] [INFO] Socket disconnected: MH (dpSjgbsS0I4Zdd-hAAA5)
+[2025-12-30T19:02:14.549Z] [INFO] GET /api/proposals?sort=date&archived=0 401 1ms
+[2025-12-30T19:02:14.570Z] [INFO] GET /api/notifications 401 1ms
+[2025-12-30T19:02:15.465Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T19:02:23.446Z] [INFO] GET / 200 4ms
+[2025-12-30T19:02:23.504Z] [INFO] GET /css/variables.css 200 3ms
+[2025-12-30T19:02:23.558Z] [INFO] GET /css/base.css 200 19ms
+[2025-12-30T19:02:23.560Z] [INFO] GET /css/components.css 200 16ms
+[2025-12-30T19:02:23.561Z] [INFO] GET /css/board.css 200 15ms
+[2025-12-30T19:02:23.568Z] [INFO] GET /css/calendar.css 200 5ms
+[2025-12-30T19:02:23.569Z] [INFO] GET /css/modal.css 200 15ms
+[2025-12-30T19:02:23.571Z] [INFO] GET /css/list.css 200 6ms
+[2025-12-30T19:02:23.579Z] [INFO] GET /css/admin.css 200 3ms
+[2025-12-30T19:02:23.588Z] [INFO] GET /css/proposals.css 200 2ms
+[2025-12-30T19:02:23.598Z] [INFO] GET /css/gitea.css 200 2ms
+[2025-12-30T19:02:23.599Z] [INFO] GET /css/notifications.css 200 4ms
+[2025-12-30T19:02:23.603Z] [INFO] GET /css/responsive.css 200 3ms
+[2025-12-30T19:02:23.615Z] [INFO] GET /js/app.js 200 7ms
+[2025-12-30T19:02:23.669Z] [INFO] GET /js/app.js 304 2ms
+[2025-12-30T19:02:23.694Z] [INFO] GET /js/store.js 200 6ms
+[2025-12-30T19:02:23.698Z] [INFO] GET /js/api.js 200 8ms
+[2025-12-30T19:02:23.701Z] [INFO] GET /js/sync.js 200 8ms
+[2025-12-30T19:02:23.703Z] [INFO] GET /js/auth.js 200 7ms
+[2025-12-30T19:02:23.706Z] [INFO] GET /js/offline.js 200 7ms
+[2025-12-30T19:02:23.708Z] [INFO] GET /js/board.js 200 6ms
+[2025-12-30T19:02:23.720Z] [INFO] GET /js/task-modal.js 200 2ms
+[2025-12-30T19:02:23.730Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T19:02:23.737Z] [INFO] GET /js/list.js 200 4ms
+[2025-12-30T19:02:23.739Z] [INFO] GET /js/calendar.js 200 5ms
+[2025-12-30T19:02:23.750Z] [INFO] GET /js/api.js 304 2ms
+[2025-12-30T19:02:23.752Z] [INFO] GET /js/shortcuts.js 200 5ms
+[2025-12-30T19:02:23.753Z] [INFO] GET /js/undo.js 200 4ms
+[2025-12-30T19:02:23.762Z] [INFO] GET /js/admin.js 200 3ms
+[2025-12-30T19:02:23.768Z] [INFO] GET /js/sync.js 304 1ms
+[2025-12-30T19:02:23.770Z] [INFO] GET /js/proposals.js 200 4ms
+[2025-12-30T19:02:23.776Z] [INFO] GET /js/notifications.js 200 4ms
+[2025-12-30T19:02:23.782Z] [INFO] GET /js/gitea.js 200 3ms
+[2025-12-30T19:02:23.788Z] [INFO] GET /js/utils.js 200 2ms
+[2025-12-30T19:02:23.878Z] [INFO] GET /js/auth.js 304 2ms
+[2025-12-30T19:02:23.885Z] [INFO] GET /js/offline.js 304 4ms
+[2025-12-30T19:02:23.888Z] [INFO] GET /js/task-modal.js 304 5ms
+[2025-12-30T19:02:23.890Z] [INFO] GET /js/board.js 304 3ms
+[2025-12-30T19:02:23.898Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T19:02:23.905Z] [INFO] GET /js/calendar.js 304 2ms
+[2025-12-30T19:02:23.910Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T19:02:23.918Z] [INFO] GET /js/undo.js 304 5ms
+[2025-12-30T19:02:23.920Z] [INFO] GET /js/admin.js 304 4ms
+[2025-12-30T19:02:23.923Z] [INFO] GET /js/proposals.js 304 4ms
+[2025-12-30T19:02:23.924Z] [INFO] GET /js/notifications.js 304 3ms
+[2025-12-30T19:02:23.926Z] [INFO] GET /js/gitea.js 304 0ms
+[2025-12-30T19:02:23.928Z] [INFO] GET /js/utils.js 304 0ms
+[2025-12-30T19:02:24.042Z] [INFO] GET /sw.js 200 2ms
+[2025-12-30T19:02:24.049Z] [INFO] GET /assets/icons/task.svg 200 3ms
+[2025-12-30T19:02:24.089Z] [INFO] GET / 304 2ms
+[2025-12-30T19:02:24.091Z] [INFO] GET /css/variables.css 304 1ms
+[2025-12-30T19:02:24.093Z] [INFO] GET /index.html 200 5ms
+[2025-12-30T19:02:24.109Z] [INFO] GET /css/base.css 304 1ms
+[2025-12-30T19:02:24.115Z] [INFO] GET /css/components.css 304 3ms
+[2025-12-30T19:02:24.120Z] [INFO] GET /css/board.css 304 1ms
+[2025-12-30T19:02:24.128Z] [INFO] GET /css/modal.css 304 0ms
+[2025-12-30T19:02:24.132Z] [INFO] GET /css/calendar.css 304 0ms
+[2025-12-30T19:02:24.141Z] [INFO] GET /css/responsive.css 304 1ms
+[2025-12-30T19:02:24.153Z] [INFO] GET /js/app.js 304 4ms
+[2025-12-30T19:02:24.158Z] [INFO] GET /js/utils.js 304 4ms
+[2025-12-30T19:02:24.161Z] [INFO] GET /js/api.js 304 1ms
+[2025-12-30T19:02:24.190Z] [INFO] GET /js/store.js 304 1ms
+[2025-12-30T19:02:24.194Z] [INFO] GET /js/sync.js 304 2ms
+[2025-12-30T19:02:24.195Z] [INFO] GET /js/auth.js 304 2ms
+[2025-12-30T19:02:24.209Z] [INFO] GET /js/offline.js 304 0ms
+[2025-12-30T19:02:24.213Z] [INFO] GET /js/board.js 304 0ms
+[2025-12-30T19:02:24.215Z] [INFO] GET /js/task-modal.js 304 1ms
+[2025-12-30T19:02:24.229Z] [INFO] GET /js/calendar.js 304 1ms
+[2025-12-30T19:02:24.232Z] [INFO] GET /js/list.js 304 1ms
+[2025-12-30T19:02:24.234Z] [INFO] GET /js/shortcuts.js 304 1ms
+[2025-12-30T19:02:24.248Z] [INFO] GET /sw.js 304 0ms
+[2025-12-30T19:02:24.250Z] [INFO] GET /js/undo.js 304 1ms
+[2025-12-30T19:02:24.256Z] [INFO] GET /js/admin.js 304 1ms
+[2025-12-30T19:02:24.256Z] [INFO] GET /js/tour.js 200 3ms
+[2025-12-30T19:02:24.297Z] [INFO] GET /js/gitea.js 304 3ms
+[2025-12-30T19:02:24.301Z] [INFO] GET /js/proposals.js 304 2ms
+[2025-12-30T19:02:24.303Z] [INFO] GET /js/notifications.js 304 1ms
+[2025-12-30T19:02:24.334Z] [INFO] GET /css/list.css 304 2ms
+[2025-12-30T19:02:24.340Z] [INFO] GET /css/admin.css 304 4ms
+[2025-12-30T19:02:24.342Z] [INFO] GET /css/proposals.css 304 5ms
+[2025-12-30T19:02:24.357Z] [INFO] GET /css/notifications.css 304 2ms
+[2025-12-30T19:02:24.360Z] [INFO] GET /css/gitea.css 304 1ms
+[2025-12-30T19:02:26.792Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T19:02:26.793Z] [INFO] POST /api/auth/login 200 628ms
+[2025-12-30T19:02:26.822Z] [INFO] GET /api/auth/users 200 3ms
+[2025-12-30T19:02:26.840Z] [INFO] Socket connected: MH (em6Pp9I-quWQBGA5AAA8)
+[2025-12-30T19:02:26.847Z] [INFO] Socket connected: MH (9XCfaMbxWJ-2VgrjAAA9)
+[2025-12-30T19:02:26.854Z] [INFO] GET /api/projects 200 4ms
+[2025-12-30T19:02:26.876Z] [INFO] MH joined project:[object Object]
+[2025-12-30T19:02:26.882Z] [INFO] GET /api/stats/dashboard?projectId=2 200 7ms
+[2025-12-30T19:02:26.897Z] [INFO] GET /api/tasks/project/2 200 14ms
+[2025-12-30T19:02:26.902Z] [INFO] GET /api/columns/2 200 4ms
+[2025-12-30T19:02:26.906Z] [INFO] GET /api/labels/2 200 3ms
+[2025-12-30T19:02:26.947Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 200 9ms
+[2025-12-30T19:02:26.977Z] [INFO] GET /api/notifications 200 9ms
+[2025-12-30T19:02:36.363Z] [INFO] Socket disconnected: MH (9XCfaMbxWJ-2VgrjAAA9)
+[2025-12-30T19:02:36.365Z] [INFO] Socket disconnected: MH (em6Pp9I-quWQBGA5AAA8)
+[2025-12-30T19:02:45.554Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T19:02:57.636Z] [INFO] POST /api/auth/refresh 200 9ms
+[2025-12-30T19:03:15.645Z] [INFO] GET /api/health 200 0ms
+[2025-12-30T19:03:39.909Z] [INFO] GET /api/gitea/repositories 401 4ms
+[2025-12-30T19:03:45.747Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T19:04:15.823Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T19:04:45.947Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T19:05:16.034Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T19:05:17.156Z] [INFO] SIGTERM empfangen, fahre herunter...
+[2025-12-30T19:05:40.123Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen:
+[2025-12-30T19:05:40.227Z] [INFO] Datenbank initialisiert
+[2025-12-30T19:05:40.223Z] [INFO] Datenbank-Tabellen erstellt
+[2025-12-30T19:05:40.232Z] [INFO] Umgebung: production
+[2025-12-30T19:05:40.234Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden)
+[2025-12-30T19:05:40.234Z] [INFO] Automatische Backups aktiviert
+[2025-12-30T19:05:40.232Z] [INFO] Server läuft auf Port 3000
+[2025-12-30T19:05:43.986Z] [INFO] GET /api/health 200 19ms
+[2025-12-30T19:05:46.261Z] [INFO] Socket connected: MH (27WjZg96SHN_VdgvAAAB)
+[2025-12-30T19:05:48.372Z] [INFO] Socket connected: HG (hT0f_sIb0V5q75K2AAAD)
+[2025-12-30T19:05:48.442Z] [INFO] HG joined project:[object Object]
+[2025-12-30T19:06:05.684Z] [INFO] Login erfolgreich: momohomma@googlemail.com
+[2025-12-30T19:06:05.686Z] [INFO] POST /api/auth/login 200 522ms
+[2025-12-30T19:06:05.735Z] [INFO] GET /api/auth/users 304 8ms
+[2025-12-30T19:06:05.743Z] [INFO] Socket connected: MH (pbiUnMTct45TfoPfAAAG)
+[2025-12-30T19:06:05.758Z] [INFO] Socket connected: MH (kaoztwG-ubGZ5sPQAAAH)
+[2025-12-30T19:06:05.776Z] [INFO] GET /api/projects 401 6ms
+[2025-12-30T19:06:05.800Z] [INFO] Socket disconnected: MH (kaoztwG-ubGZ5sPQAAAH)
+[2025-12-30T19:06:05.815Z] [INFO] GET /api/proposals?sort=date&archived=0 401 5ms
+[2025-12-30T19:06:08.933Z] [INFO] Socket disconnected: MH (pbiUnMTct45TfoPfAAAG)
+[2025-12-30T19:06:08.936Z] [INFO] Socket disconnected: MH (27WjZg96SHN_VdgvAAAB)
+[2025-12-30T19:06:14.106Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T19:06:40.248Z] [INFO] Backup erstellt: backup_2025-12-30T19-06-40-235Z.db
+[2025-12-30T19:06:40.252Z] [INFO] Altes Backup gelöscht: backup_2025-12-28T16-19-37-475Z.db
+[2025-12-30T19:06:40.254Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet
+[2025-12-30T19:06:44.228Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T19:07:14.359Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T19:07:44.448Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T19:08:14.546Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T19:08:44.646Z] [INFO] GET /api/health 200 3ms
+[2025-12-30T19:09:14.752Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T19:09:44.880Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T19:10:15.017Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T19:10:45.125Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T19:11:15.217Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T19:11:45.313Z] [INFO] GET /api/health 200 5ms
+[2025-12-30T19:12:15.414Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T19:12:45.556Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T19:12:56.424Z] [INFO] Logout: HG
+[2025-12-30T19:12:56.425Z] [INFO] POST /api/auth/logout 200 8ms
+[2025-12-30T19:12:56.462Z] [INFO] Socket disconnected: HG (hT0f_sIb0V5q75K2AAAD)
+[2025-12-30T19:13:15.676Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T19:13:40.610Z] [INFO] GET / 200 25ms
+[2025-12-30T19:13:40.687Z] [INFO] GET /css/variables.css 200 6ms
+[2025-12-30T19:13:40.723Z] [INFO] GET /css/base.css 200 7ms
+[2025-12-30T19:13:40.749Z] [INFO] GET /css/components.css 200 4ms
+[2025-12-30T19:13:40.753Z] [INFO] GET /css/board.css 200 5ms
+[2025-12-30T19:13:40.759Z] [INFO] GET /css/list.css 200 7ms
+[2025-12-30T19:13:40.762Z] [INFO] GET /css/modal.css 200 6ms
+[2025-12-30T19:13:40.763Z] [INFO] GET /css/calendar.css 200 5ms
+[2025-12-30T19:13:40.766Z] [INFO] GET /css/admin.css 200 2ms
+[2025-12-30T19:13:40.794Z] [INFO] GET /css/proposals.css 200 3ms
+[2025-12-30T19:13:40.798Z] [INFO] GET /css/notifications.css 200 2ms
+[2025-12-30T19:13:40.802Z] [INFO] GET /css/gitea.css 200 2ms
+[2025-12-30T19:13:40.806Z] [INFO] GET /css/responsive.css 200 2ms
+[2025-12-30T19:13:40.828Z] [INFO] GET /js/app.js 200 3ms
+[2025-12-30T19:13:40.910Z] [INFO] GET /js/store.js 200 8ms
+[2025-12-30T19:13:40.916Z] [INFO] GET /js/board.js 200 8ms
+[2025-12-30T19:13:40.920Z] [INFO] GET /js/sync.js 200 8ms
+[2025-12-30T19:13:40.922Z] [INFO] GET /js/offline.js 200 7ms
+[2025-12-30T19:13:40.924Z] [INFO] GET /js/auth.js 200 6ms
+[2025-12-30T19:13:40.926Z] [INFO] GET /js/api.js 200 7ms
+[2025-12-30T19:13:40.941Z] [INFO] GET /js/task-modal.js 200 2ms
+[2025-12-30T19:13:40.949Z] [INFO] GET /js/calendar.js 200 2ms
+[2025-12-30T19:13:40.959Z] [INFO] GET /js/list.js 200 6ms
+[2025-12-30T19:13:40.962Z] [INFO] GET /js/shortcuts.js 200 7ms
+[2025-12-30T19:13:40.963Z] [INFO] GET /js/undo.js 200 6ms
+[2025-12-30T19:13:40.972Z] [INFO] GET /js/admin.js 200 3ms
+[2025-12-30T19:13:40.973Z] [INFO] GET /js/proposals.js 200 3ms
+[2025-12-30T19:13:40.980Z] [INFO] GET /js/notifications.js 200 2ms
+[2025-12-30T19:13:40.989Z] [INFO] GET /js/gitea.js 200 2ms
+[2025-12-30T19:13:40.999Z] [INFO] GET /js/utils.js 200 5ms
+[2025-12-30T19:13:41.064Z] [INFO] GET /assets/icons/task.svg 304 4ms
+[2025-12-30T19:13:45.860Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de
+[2025-12-30T19:13:45.861Z] [INFO] POST /api/auth/login 200 539ms
+[2025-12-30T19:13:45.863Z] [INFO] GET /api/health 200 7ms
+[2025-12-30T19:13:45.904Z] [INFO] GET /api/auth/users 304 6ms
+[2025-12-30T19:13:45.937Z] [INFO] Socket connected: HG (TxhbvUMp5KlCqt05AAAK)
+[2025-12-30T19:13:45.946Z] [INFO] Socket connected: HG (puaSOtDOJHMxVLNXAAAL)
+[2025-12-30T19:13:45.955Z] [INFO] GET /api/projects 304 7ms
+[2025-12-30T19:13:45.989Z] [INFO] HG joined project:[object Object]
+[2025-12-30T19:13:46.011Z] [INFO] GET /api/tasks/project/2 304 21ms
+[2025-12-30T19:13:46.015Z] [INFO] GET /api/columns/2 304 4ms
+[2025-12-30T19:13:46.027Z] [INFO] GET /api/stats/dashboard?projectId=2 304 7ms
+[2025-12-30T19:13:46.031Z] [INFO] GET /api/labels/2 304 4ms
+[2025-12-30T19:13:46.072Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 7ms
+[2025-12-30T19:13:46.108Z] [INFO] GET /api/notifications 304 10ms
+[2025-12-30T19:13:48.718Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T19:14:15.976Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T19:14:46.074Z] [INFO] GET /api/health 200 4ms
+[2025-12-30T19:15:06.035Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T19:15:06.123Z] [INFO] GET /api/git/server/info 304 48ms
+[2025-12-30T19:15:06.204Z] [INFO] GET /api/git/server/status 200 48ms
+[2025-12-30T19:15:06.235Z] [INFO] GET /api/git/server/branches 304 17ms
+[2025-12-30T19:15:06.266Z] [INFO] GET /api/git/server/commits?limit=10 304 28ms
+[2025-12-30T19:15:06.974Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T19:15:08.112Z] [INFO] GET /api/gitea/repositories?page=1&limit=50 304 360ms
+[2025-12-30T19:15:08.788Z] [INFO] POST /api/auth/refresh 200 7ms
+[2025-12-30T19:15:10.013Z] [INFO] POST /api/auth/refresh 200 6ms
+[2025-12-30T19:15:11.201Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T19:15:12.744Z] [INFO] POST /api/auth/refresh 200 11ms
+[2025-12-30T19:15:16.182Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T19:15:46.286Z] [INFO] GET /api/health 200 2ms
+[2025-12-30T19:16:16.400Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T19:16:46.494Z] [INFO] GET /api/health 200 1ms
+[2025-12-30T19:16:48.537Z] [INFO] POST /api/auth/refresh 200 17ms
+[2025-12-30T19:16:56.269Z] [INFO] GET /api/git/server/info 304 20ms
+[2025-12-30T19:16:56.339Z] [INFO] GET /api/git/server/status 304 38ms
+[2025-12-30T19:16:56.377Z] [INFO] GET /api/git/server/branches 304 13ms
+[2025-12-30T19:16:56.394Z] [INFO] GET /api/git/server/commits?limit=10 304 14ms
+[2025-12-30T19:16:57.258Z] [INFO] POST /api/auth/refresh 200 8ms
+[2025-12-30T19:17:01.350Z] [INFO] POST /api/auth/refresh 200 12ms
+[2025-12-30T19:17:06.156Z] [INFO] POST /api/auth/refresh 200 8ms