- eventlet worker deprecated in gunicorn 25+; WebSocket hijack broken,
causing all socket.io connections to stay on long-polling forever and
produce 'Bad file descriptor' errors on every poll cycle.
- Replace eventlet monkey_patch / spawn / sleep with gevent equivalents
- async_mode='gevent' in both SocketIO instances
- worker_class='gevent' in gunicorn.conf.py
- Add gevent-websocket to requirements (needed for WS upgrade in gunicorn)
- StreamingWorker: replace -re with token-bucket pacing; -ss before -i
for fast seek; add -write_xing 0; halve chunk size to 2048 bytes.
Eliminates startup burst and glitchy audio on listener side.
- Suppress Qt6 internal ffmpeg AV_LOG_WARNING noise via ctypes av_log_set_level
- Progress bar colour changed from blue to green
- server.py: drain ffmpeg stderr pipe in transcoder to prevent deadlock
- Fix waveform/BPM thread signal race (disconnect before replacing thread)
- Fix _roll_end: clamp real_pos to track duration
- Fix open_settings: wrap file write in try/except
- Fix hot cue initial tooltip text
- Remove src-tauri (Tauri desktop wrapper removed)