Skip to main content
Back to all articles
·5 min read·Engineering Note

Running Levyra Natively on Windows with Compose Multiplatform and libVLC

Why the Windows build of Levyra skips Electron and WebView wrappers in favor of Compose Multiplatform on JVM 21, native libVLC C bindings, and hardware-accelerated Skia rendering.

Kotlin MultiplatformWindowslibVLCJetpack Compose

Most cross-platform desktop music players ship a full Chromium browser inside Electron or wrap a web app in a system WebView. That approach is quick to ship, but it costs 400 to 800 MB of idle RAM just to keep a playback queue open in the background.

When I brought Levyra to Windows 10 and 11, I wanted to share the Kotlin core from the Android app without turning the desktop player into a browser tab. Compose Multiplatform lets both platforms share the UI, state machines, synced lyrics canvas, and playlist database while rendering through Skia on DirectX and OpenGL.

For audio output on Windows (x64), Levyra runs on a bundled JVM 21 runtime and talks directly to native libVLC binaries through vlcj C bindings. Because there is no Chromium V8 heap or DOM tree sitting behind the window, memory usage during idle and background playback stays roughly 60% to 75% lower than an Electron wrapper.

Every non-trivial change across Android and Windows is checked with repository quality-gate scripts before release, paired with a PowerShell ADB qualification script that installs debug APKs on a real phone, inspects MediaSession state, and records memory diagnostics.

LUC4N3X
LUC4N3XIndependent software developer · Creator of Levyra