Library: Rust library:: module is single authority for scan roots and media index; config persisted in tauri_plugin_store with one-shot localStorage import
Updater: download and install timeouts, failed full-window state with GitHub Releases link, post-install version verify
Updater UX: update available in expanded Dynamic Island instead of floating card or titlebar pill
Island: update island flex layout, compact version badge, pinned install footer, collapsed update {version} pill
Downloads: pause during pre-spawn simulate stays paused, not failed
Downloads: 2-minute watchdog scoped to audio-only auto-save jobs
Downloads: yt-dlp retries and fragment retries, 403 guidance, resume on manual retry
Music: playlist cover persisted to .ruforge-playlist-cover.jpg at download; album shelf and detail share local path
v0.2.0
Additions
14
Music playlists: batch downloads write `.ruforge-playlist.json` under Playlists with per-track roster and downloading/complete/incomplete status; Explore harvest path skips yt-dlp when webview roster is complete
Music Explore: SPA page context via History API in embedded WebView2; YTM header title polling; signed playlist coverUrl on album view with lazy sidecar heal
Music download dock: Ban cancel on expanded chip and collapsed orb; sidebar orbs for all active jobs even when panel never opened; cancel-all in panel header and collapsed stack
Music library: artist view immersive hero; canonical_album prefers yt-dlp info.json; album grouping strips date stamps and venue fallback; metadata backfill force re-process checkbox
Downloads: multi-item carousel hero (centered cards, plain progress, MB/s on active row); batch UI persists through playlist and Explorer multi-add; batch focus follows actively downloading job
Downloads: Deno JS runtime auto-install when yt-dlp reports no supported runtime; Settings Downloads shows status and install button; failed jobs in batch re-queue after install
Downloads: music batch retry-at-end (up to 3 attempts per failed track); Explorer mirrorHeroUrl and session queue restore on tab change
Scrub previews: parallel ffmpeg generation, global fleet cap, tail cell patch to duration; windowed sprite sheet preload on long videos; library backfill when auto mode on
Debugging: dev captures library under Settings Debugging (native screenshot, annotate, grid, drag-out); replay last download batch (Mode A real, Mode B simulate)
Crash recovery: root error boundary on every window; friendly hero with Reload app and collapsible details
Scrub previews: Windows thumb subdirs strip trailing dots; hover thumb uses img not CSS url for # in paths; ffmpeg sidecar uses output() with -nostdin
Scrub hover: rAF-throttled hover; sprite paths cached at gallery scan; defer library backfill during playback
Windows taskbar: dev builds use separate AppUserModelID and HWND set_icon to avoid stale shell icon
SponsorBlock: skip button tracks player chrome height when controls hide
Video Library: scroll bulge only; active pill hidden while bulge visible
Media chrome: tab bulge fillets track --rf-titlebar-h on Video Library and Settings
Debugging: dev capture and crash preview resolve main window via boot-cached state not child webview invoke context
v0.1.10
Additions
5
Website release automation: site version from root package.json at build time; npm run prep:website-release generates changelog from updater.json and copies signed NSIS for same-origin download
Listen-event log: append-only track_played JSONL in app data; dual-surface session coordinator (main + music-mini) with handoff; listen stats and play history from Rust snapshot; legacy localStorage import; music_listen_clear command
Music profile screen: YouTube identity, glance stats, highlights, liked songs, recent plays, storage; titlebar chip opens profile; Home stats strip removed in favor of profile entry
Music storage strip: bottom library storage bar on Home and Library (used GB, cap progress on internal vault); hides during playback, Explore bar, active downloads, or expanded player
YouTube titlebar profile chip: Log in pill when signed out; avatar-ratio spinner until PFP loads; session cached in localStorage; chip in titlebar across all modes; hover expands to @handle
Fixes
8
Music Explore auto-save: queue download only after 15s on the same track; skip cancels pending timer for the previous song
Download complete animation: global job-completion celebrations (auto-save and pick tracks); green/yellow ring and checkmark from first completion frame; auto-save thumbs on enqueue
Download watchdog: progress lines that do not advance bytes or percent no longer reset idle; audio-only stalls yellow-timeout; 30s pre-transfer, 45s audio idle, 2m wall clock from downloadingSince; re-arms after sleep, HMR, or foreground; timed_out status advances batch with yellow warning on Explore orb
Listen log integrity: accumulate uses deltas; end closes with server total only; v2 JSONL events; cutover in music-listen-integrity.json; scoring gates pre-cutover listenTimeSec
Music mini: clean transparent window corners; skip next/prev preserves play state
Music stats and profile UI: anti-pattern visual pass; plain labels; top track time and plays on cover hover only; responsive Home Quick picks grid; Liked Songs full-width banner row
Storage glyph: sidebar storage ring opens Authorize Cleanup on click (matches Music storage strip)
YouTube profile @handle: probe scoped to topbar and account menu only; brief account menu open to read real handle from DOM; hover shows @handle not Your channel
v0.1.11
Additions
10
Player comments: sliding drawer in PlayerView; v1 comments sidecar on single-video download when Download comments is on; ensure sidecar command with cookie parity; Top 25 threads cap
Music metadata: track sidecars schema v2 with genres and artistMbId from cached MusicBrainz artist lookup; stampTrackSidecarArtistTags setting (default on); backfill pass 2 for legacy sidecars
Windows taskbar: thumbnail transport toolbar on main HWND; white alpha icons; like button with heart-to-check morph; play/pause sync fix
Music Home: Recently added / Recently listened toggle; playlist glass rows, singles grid, albums vinyl shelf; listen history tab
Music detail: immersive gatefold track page; liner notes credits accordion in footer archive; Watch on YouTube via openUrl
Activity island (E-audio): owner-aware hasLivePlayback; expanded transport, volume hover slider, waveform bars from cover art with AGC
Playback (music nav): video keeps playing across music-mode enter; hoisted off-tab PlayerView; parks on audio claim
Playback scrub: Spotify model (preview while dragging, seek on release); beginScrub/releaseScrub API
Onboarding: alt-radial island demo starts expanded; portal fix for radial center-click
Boot splash: Siri-style edge gradient orbs (default + music modes)
Music library: single-track downloads stay standalone; lone yt-dlp playlist entries save under Music/ not Playlists/
Music playback: cold start always 0:00; expanded now-playing close no longer silences audio
Activity island: transport dead-zones fixed; scrub drag preview-only until mouseup; play/pause icon follows live bridge
Windows taskbar: thumbbar clicks no longer dismiss taskbar preview
Player: video play/pause icon no longer overwritten by idle music host sync
Window chrome: rounded outer shell when not maximized; edge resize strips restore borderless drag-resize
v0.1.9
Additions
14
Music mode: Spotify-style local library shell with Home, Explore, and Library tabs, persistent now-playing bar, vinyl expanded player, and embedded tag metadata (ID3, FLAC, Vorbis via lofty)
YouTube Music Explore: embedded music.youtube.com webview (shared Explorer cookies) with floating download strip, Pick tracks panel, Paste URL intake, per-track orb progress dock, and audio-only batch downloads
Music detail pages: artist view with MusicBrainz lookup, album mosaic hero, and vinyl album cards; album and song pages with Play, Shuffle, and navigation stack
Music metadata enrichment: {stem}.musicmeta.json sidecars written at download time and via Settings backfill (MusicBrainz match, cover art, canonical titles)
Music right panel: Queue, Recently played, and Segments tabs with manual queue, drag-reorder, play history rings, and music-only SponsorBlock skip toggle
Music listen stats and smart shuffle: play counts and listen time in localStorage, Home stats strip, dedicated Stats view (all-time and this-week top 10), weighted shuffle on Play, Shuffle, and end-of-queue
Liked Songs: heart on now playing and detail tracklists; virtual playlist with collage cover; Library tab and Home shelf; liked tracks influence Quick picks and Rediscover
Radial navigation: Alt-hold menu with per-mode palettes (default, movie, music), 56px icon rail, center click cycles nav mode including Music
Media library buckets: Videos, Music, Movies, Shows, and Playlists folder layout; Settings migration tool moves flat libraries into the new structure
Delete and Recently Deleted: library delete sends media and full sidecar set to OS Recycle Bin; title-bar trash opens restore-from-bin when recoverable
Export bundle: copy video and sidecars to timestamped RuForge Export folder; USB title-bar button on removable drives; panel from media context menus and Settings
Settings debug logging: per-category tree toggles for Rust terminal and JS DevTools with boot sync to Tauri log filter (lofty TRACE off by default)
App-wide YouTube profile chip in titlebar when signed in; music row context menus (Play, queue, go to song/artist/album, show in folder)
Website and mobile: full ruforge.app refresh with Obsidian-style docs, six feature pages, download flow, and 94-page mobile shell at /m/
Fixes
10
Music Explore: webview lifecycle and HMR reattach; download path honors internal vault; album tracklist harvest from ytmusic-browse-response before yt-dlp fallback; single-track watch URLs in Paste link
Music layout and UI: Home and Library panels fill column height; delayed tooltips replace native title; right panel tab clipping; mini player full-bleed cover; queue drag no longer starts playback on release
Music liked UX: liking no longer jumps rows to top of shelves; Home Liked shelf restored without scroll jolt; heart sizing matches transport icons
Gallery scan: duplicate download sweep moved off scan_gallery hot path; poster backfill skips audio with embedded cover
Library migrate moves musicmeta sidecars; artist metadata disk cache prevents repeat MusicBrainz fetches on revisits
Mini player: pop-out works from music mode; library pick stops main music; transparent corners; hover raises z-order without stealing focus
Chapter scrubber: playhead and hover aligned to segment grid; Explorer webview reattaches after HMR; radial Alt-release hover-to-select
Music mini dual-play: main playback stops popped-out music mini when both would play
Downloader: cookie-last yt-dlp (no cookies first, retry with Internal live CookieManager export); public videos work with Explorer open; raw yt-dlp stderr and export diagnostics in download.ytdlp debug log
Notifications no longer flash brown before enter animation
v0.1.8
Additions
8
Playlist downloader: URL intake from clipboard, paste, and drop; per-row audio toggle and sizes; duplicate summary before Download; batch jobs land in a numbered playlist subfolder with one Media stack card
Regroup flat playlist files into a numbered folder from Settings Debugging tab (library match by id, url, or title)
SponsorBlock fetches all skip, chapter, and POI categories (not sponsor-only API default); stale sidecars refresh on next play
Color-coded scrub hover pill for every SponsorBlock segment type (skip, chapter, POI, music off-topic, etc.)
Settings Downloads: yt-dlp Check & Update checks GitHub and installs a newer user copy automatically
Settings Advanced: Check for updates auto-downloads and installs RuForge when a newer build is available
General settings toggle reveals Debugging tab (group playlist tool and updater UI cycle)
Post-install What's New modal clamps to the viewport with a scrollable notes body
Fixes
4
Simple (no-chapter) seek bar no longer clips scrub hover previews
Scrubber sprite sheets reload after Generate Previews; sidecar duration from ..info.json for sprite timing
Mini player large mode: video frame no longer washed by stacked blur or idle ambient blur
Playlist regroup scans internal and custom library roots and matches entries by id, url, or title
v0.1.7
Additions
12
Audio-only player hero with full-canvas LED equalizer and glass side waveforms
Music badge on audio library cards; hover preview keeps cover art instead of a blank tile
SponsorBlock skip button, scrub segment overlays, chapter and POI bar colors, and a Playback settings tree
Segmented chapter scrubber with hover thumbnail preview, active chapter title, and prev or next jumps
Frosted player control dock: primary actions visible, secondary actions in a More menu
Settings Playback tab for auto-advance audio, prefetch, and SponsorBlock controls
Floating bottom-right download queue drawer with crossfading hero and row thumbnails
Per-job download stall watchdog that fails stuck jobs and notifies you
Auto scrubber preview sprites on video download (Settings, Downloads toggle, default on)
Dual yt-dlp simulate for separate audio vs video size estimates and smoothed ETA on the queue
Windows volume mixer shows RuForge as the app name with the RuForge icon
Mini player large layout: tooltips clamp inside the window and volume icons match mute level tiers
Fixes
10
Audio visualizer bars follow playback in WebView2 instead of staying frozen while audio plays
Audio-only downloads prefer m4a and no longer match full video file size from bestaudio fallback
Duplicate library cards after muxed downloads: leftover audio, .fNNN rows, and cross-folder dedupe
WebView playback syncs store volume and mute on load; mini player handoff no longer inherits autoplay mute
Download pause updates the queue only after Rust confirms the job actually paused
Processing phase stays latched for multi-fragment HLS so post-process progress still shows
Duration labels no longer show NaN when yt-dlp or catalog metadata is incomplete
Preview sprite generation avoids an ffmpeg nested-lock deadlock; delete cancels in-flight preview work
Download hero URL and metadata clear when a job finishes or is removed from the queue
Explorer embedded bounds stay synced during sidebar resize without tearing down listeners
v0.1.6
Additions
4
Mini player micro and tiny layouts down to 70px height with marquee title and compact controls
Mini player Video Library browse mode locks window size until a file is selected
Compact mode with morphing audio visualizer, borderless cover art, and accent-colored play button
Explorer title bar back, forward, and reload controls flush at the sidebar edge
Fixes
5
Audio toggle tooltip describes the action you will take, not the current mode
Video poster attribute loads library thumbnails immediately when swapping videos
Audio visualizer SVG path crash when toggling play/pause in mini player
Mini player cover art visibility and alignment across small, compact, and large modes
Sidebar collapse label no longer flashes at the top while the rail narrows
v0.1.5
Additions
3
Audio-only download toggle wired through to Rust DownloadOptions
Processing phase label on queue row and hero while ffmpeg post-processes
In-app delete confirmation dialog replaces native confirm in WebView2
Fixes
4
Duplicate download skip shows transient "Already in library" feedback
Deleting a library file removes matching ghost rows from the download queue
Download finish clears hero URL and metadata when the finished URL matches
Sidecar info.json path resolves both single-dot and double-dot filename variants