Database:
- Enable WAL + synchronous=NORMAL + bigger cache pragmas
- Add (profile, filename) index covering the hot queries
- _refresh_playlist_checks: one get_clip_counts_grouped() scan for the whole
profile instead of one query per file (was O(N) full scans per keystroke/
tab switch/file load)
Timeline (60fps playback):
- set_play_position only repaints when the playhead moves a whole pixel or the
view scrolls (≈30x fewer full repaints in non-zoomed playback)
- Cache all per-paint QColor/QPen objects and the other-folder color table in
__init__ instead of allocating them every frame; drop the per-paint
visible-markers list comprehension
File load / startup:
- PlaylistWidget stats files for the missing-set only when paths change, not on
every filter keystroke
- Cache the vid-folder lookup (DB + os.listdir) per (file, folder) so spinner
ticks don't repeat it; m-counter still recomputed so it stays correct
- Swap the waveform worker without blocking the UI thread (no wait(1000))
- Defer the changelog modal so the window is interactive first
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>