Skip to content

Performance & Visuals

SpinDeck’s desktop experience prioritizes atmosphere and visual quality. It targets modern hardware (Retina displays, capable GPUs) for a fluid 3D shelf and playback mood—not older devices at the cost of look and feel. Memory and GPU use will vary with the WebView, WebGL, and fullscreen compositing layers; that is expected.

Design principles

PrincipleMeaning
Visuals firstKeep fullscreen backdrop blur, glass, vinyl glow, antialiasing, and similar mood effects by default
Cull off-screen, keep on-screenFree GPU resources the user cannot see; do not deliberately degrade the visible frame
Measure release buildsProfile packaged desktop builds; Vite localhost dev adds overhead
WebView is the bottleneckThe Tauri/Rust shell is small; resident memory is dominated by the system WebView (WebContent / GPU) and the frontend scene

3D shelf strategy

Most of this lives in apps/web/app/components/PlaylistShelf.tsx.

Browse mode (playlist shelf)

  • Viewport window: Meshes and cover/spine textures mount only near the scroll center; slots outside the window stay empty until needed.
  • Cover cap: Oversized covers are downscaled before upload to the GPU so a single original cannot blow VRAM.
  • Idle frame throttle: Full frame rate while dragging, coasting, or running GSAP; lower draw rate only when the scene is visually settled (the still frame itself is unchanged).

Playback mode (selected cover + tonearm)

  • During the enter animation: Neighboring books keep their textures so the slide-away motion stays complete.
  • After the animation settles: Unload every other book’s mesh/textures and keep only the selected cover in 3D.
  • Track changes: Immediately keep only the newly selected book.
  • Exit playback: Silently remount the browse window, then run the slide-back animation (no pop-in that breaks the rhythm).

The vinyl layer (@spindeck/vinyl-ui) and playback backdrop (blurred cover, glass gradient) are separate DOM/CSS compositing and are not removed by shelf cull—they are part of the playback atmosphere.

Leaving the route

When navigating away from the shelf, the WebGL renderer is disposed and forceContextLoss() is called so the GPU context can be released promptly.

Numbers in Activity Monitor

On macOS, SpinDeck splits across processes (main, WebContent, GPU, Networking). “Memory” and “Graphics and Media” often come from different processes:

CategoryRough meaning
Main processTauri/Rust shell — usually small
WebContentJS heap, decoded images, WebGL-related resources (often the largest)
GPU / Graphics and MediaCompositor layers, IOSurfaces, WebGL framebuffers, etc.

Tens of MB under Graphics with fullscreen WebGL plus CSS blur / backdrop-filter is normal and not by itself a leak. Compare optimizations in the same UI state (idle home / browsing shelf / playback) on a release build.

What we deliberately skip

These would hurt atmosphere and are not the default path:

  • Turning off realtime playback backdrop blur or fullscreen glass
  • Crushing cover/spine textures until they look soft
  • Globally disabling antialiasing or forcing very low resolution for legacy GPUs

If a future “power saver / low memory” mode appears, it should be optional—not the default.

Contributors

Changelog

Released under the Apache License 2.0.