Logger service
The Logger service (src/services/logger.ts) is the primary debugging tool in Masterselects. It is available as window.Logger in the browser console at any time.
Default log level: WARN — only warnings and errors are shown by default.
Usage in code
Timing helper
Grouped logs
Console commands
All commands are available asLogger.<method>() or window.Logger.<method>() in the browser console.
Enable/disable debug logs
Set log level
Inspect logs
Status and configuration
Log sync (dev mode)
In development, logs are automatically synced to the Vite dev server every 2 seconds viaPOST /api/logs.
Common module groups
Common issues
| Problem | Solution |
|---|---|
| 15 fps on Linux | Enable Vulkan: chrome://flags/#enable-vulkan |
| ”Device mismatch” error | HMR broke the engine singleton — refresh the page |
| Black canvas after reload | Cold-start: video GPU surface not warm. Press Play/Pause once, or wait for preCacheVideoFrame |
| WebCodecs fails | Automatically falls back to HTMLVideoElement |
| Device lost | Auto-recovery up to 3 attempts, then manual page reload |
| Black preview / no rendering | Logger.enable('WebGPU,Compositor,RenderLoop') + Logger.setLevel('DEBUG') |
| Export fails | Logger.enable('Export,FrameExporter,VideoEncoder,FFmpeg') + Logger.setLevel('DEBUG') |
| Audio out of sync | Logger.enable('Audio,AudioMixer,TimeStretch') + Logger.setLevel('DEBUG') |
| File import problems | Logger.enable('Media,Import,Project') + Logger.setLevel('DEBUG') |
WebCodecs pipeline monitors
Two ring-buffer monitors are exposed onwindow for console-based playback debugging.
window.__WC_PIPELINE__
WebCodecs decode pipeline events (set by src/services/monitoring/wcPipelineMonitor.ts). 5000-event ring buffer.
Recorded events include:
decode_feed,decode_output— sample feed and frame outputframe_read,frame_drop— frame consumption and dropsdecoder_reset— decoder reinitializationpending_seek_start/end,seek_start/end/skip/cancel/publish— seek lifecyclecollector_hold,collector_drop— frame collector decisionsdrift_correct,queue_pressure,stall,rAF_gap— health metricsplay,pause,advance_seek— playback state changes
window.__VF_PIPELINE__
VideoFrame (HTMLVideo + VideoFrame API) pipeline events (set by src/services/monitoring/vfPipelineMonitor.ts). 5000-event ring buffer.
Recorded events include:
vf_capture,vf_read,vf_drop— frame delivery lifecyclevf_gpu_cold,vf_gpu_ready— GPU surface warmupvf_play,vf_pause,vf_seek_fast,vf_seek_precise,vf_seek_done— playback and seekingvf_drift,vf_stall,vf_readystate_drop— health and syncaudio_drift,audio_drift_correct,audio_status— audio sync
AI debug tools via bridge
When the dev server (or Native Helper) is running, the AI bridge exposes debug tools callable from any HTTP client:| Tool | Description |
|---|---|
getStats | Engine snapshot: FPS, timing, decoder type, drops, audio, GPU memory |
getStatsHistory | N snapshots over time with min/max/avg summary |
getLogs | Filter browser logs by level, module, or search text |
getPlaybackTrace | WebCodecs/VF pipeline events + health state |
Playback monitoring services
7 monitoring services insrc/services/monitoring/ provide deeper playback health data:
| Service | File | What it tracks |
|---|---|---|
playbackHealthMonitor | playbackHealthMonitor.ts | 8 anomaly types: FRAME_STALL, WARMUP_STUCK, RVFC_ORPHANED, SEEK_STUCK, READYSTATE_DROP, GPU_SURFACE_COLD, RENDER_STALL, HIGH_DROP_RATE. Per-clip escalation: 3+ anomalies within 12s triggers aggressive recovery |
playbackDebugStats | playbackDebugStats.ts | Real-time stats: pipeline name, decoder resets, pending seek timing, collector hold/drop counts |
framePhaseMonitor | framePhaseMonitor.ts | Frame lifecycle phase timing: stats, build, render, sync-video, sync-audio, cache |
wcPipelineMonitor | wcPipelineMonitor.ts | WebCodecs event ring buffer (window.__WC_PIPELINE__) |
vfPipelineMonitor | vfPipelineMonitor.ts | VideoFrame event ring buffer (window.__VF_PIPELINE__) |
scrubSettleState | scrubSettleState.ts | Scrub-to-play transition state per clip (settle, retry, warmup stages) |
Logger configuration
Buffering behavior
- WARN and ERROR entries are always buffered (for post-mortem debugging)
- DEBUG and INFO entries are only buffered when they are displayed (module enabled + level threshold met)
- Buffer is a FIFO ring of 500 entries
Persistence
Logger configuration is saved tolocalStorage under the key logger_config. Enabled modules, level, timestamps setting, and buffer size all persist across page refreshes.
Log entry structure
Related
- GPU Engine — WebGPU troubleshooting and feature flags
- Render Pipeline — pipeline architecture
- AI Tools Bridge — remote debug tools