• v3.3.54 127807d62a

    Administrator released this 2026-06-08 22:03:41 +02:00 | 8 commits to master since this release

    CRITICAL hotfix for 3.3.53 + 7 bugs from the latest audit (42 confirmed findings).

    CRITICAL:

    1. safeSend() in 3.3.53 called itself instead of webContents.send — infinite recursion every IPC send. Bulk-replace script accidentally matched the safeSend implementation itself. This blocked all main→renderer IPC (progress, stats, rotation events, batch-done, …) and triggered RangeError stack overflows that could crash the main process. Fixed by restoring the inner call to mainWindow.webContents.send.

    2. queueMicrotask() reference in renderer/app.js _computeQueueStats — not defined in all Chromium contexts and threw ReferenceError on every stats compute (during active uploads), bubbling up through the rAF queue. Replaced with feature-detect fallback: queueMicrotask || Promise.resolve().then.

    Other bugs fixed in this release:
    3. Account edit silently lost when the account was removed between modal open and save (findIndex returned -1, code skipped without error). Now shows 'Account nicht mehr in der Config' and aborts.
    4. deleteAccount saveConfig was fire-and-forget with empty .catch() — failures swallowed. Now logs + toasts.
    5. Vidmoly file-list recovery fallback 'one new file → take it' could claim job A's file as job B's result during parallel uploads. Removed; exact title match only (same as the byse fix in 3.3.x).
    6. config-store .bak refresh wrote any non-empty file as backup, including a freshly-corrupted live file. Now JSON.parse + structure validation before refreshing .bak — a corrupt live file no longer poisons the backup.
    7. Chunked startBatch loops (3.3.48) didn't check signal.aborted between chunks. Cancel during a 5000-job batch kept spawning 100 more _runJobs per chunk gap. Added abort check at the top of each chunk.
    8. before-quit: tray destruction was missing — Windows could leave a dead tray icon visible after the app process exited. Added tray.destroy() in before-quit. Also wrapped destroyDropTargetWindow() in try/catch.
    9. Renderer init() failure now shows a top-of-page banner with the error + asks for diagnose-paket instead of leaving the user on a blank window.

    Downloads