React 19 Core
The desktop UI is React 19 inside Tauri webviews. Tabs replace a router; Zustand picks the active surface.
main.tsx checks getCurrentWindow().label and mounts either App, MiniPlayer, or NotifyOverlayApp. Same React 19 + StrictMode entry for each webview label.
App.tsx is the shell: sidebar nav sets activeTab in Zustand (downloader, explorer, media, player, settings). AnimatePresence swaps the major views. Explorer is special: the tab body is mostly a positioned host div because the child webview paints on top.
Heavy feature UIs are split components. Downloader logic sits in useDownloaderView.ts with UI in DownloaderView.tsx and DownloadJobQueuePanel.tsx. Player splits outer PlayerView (nullable playingFile guard) from inner PlayerViewWithFile so hooks never run without a file. Settings uses nested collapsible trees for SponsorBlock and playback prefs.
Mini player is a separate bundle with duplicated playback UI state (progress, hover, layout mode). It listens for Tauri events instead of subscribing to the main store. Fast refresh works under npm run tauri dev the same as plain Vite.
In the repo
Where it shows up
-
main.tsxwebview label routing -
App.tsxtab shell, window chrome, event listeners -
PlayerView.tsx,MediaView.tsx,DownloaderView.tsx,SettingsView.tsx -
MiniPlayer.tsxsecond-window playback UI