Releases: AverageConsumer/R-Shop
🚀 v1.5.1 — Detail Screen UX Polish
Universal layout fixes and detail screen polish — focused on making every screen work perfectly on both 4:3 and 16:9 handhelds.
Highlights
- Crystal-clear focus indicators — white borders and glow replace accent-color-only styling, so you always know where the D-pad focus is, regardless of system theme color.
- Phantom focus eliminated — previously, the download button, favorite icon, and first screenshot all appeared focused simultaneously. Now only the actually focused element lights up.
- Universal 4:3 / 16:9 layout — 9 overlays and dialogs replaced hardcoded pixel constraints with screen-relative values. No more overflow on narrow screens, no wasted space on wide ones.
- Variant picker redesign — compact tag pills with region flags, marquee-scrolling filenames for long ROM names, wider overlay, and D-pad left/right blocked to prevent focus leaking to the background.
- Action buttons anchored — Download/Delete and icon buttons now stick to the bottom of the left column in landscape, consistent across all detail views.
Change Log
Improved:
- Detail screen focus visibility — white borders and dual-layer glow (white inner + accent outer) on all focusable elements
- Correct focus tracking — sub-widgets only highlight when their section is active
- Action buttons anchored to bottom of left column in landscape layout
- Variant picker — wider (55%), compact tag pills, marquee filenames, D-pad L/R consumed
- Other Versions section — shows only RomM/IGDB siblings, no longer duplicates local variants
- Universal 4:3 and 16:9 layout — screen-relative
clamp()values across description overlay, game detail overlay, exit dialog, system picker, shelf picker, game list overlay, system selector, quick menu, and detail screen cover column - MarqueeText shared widget — ticker-scroll for long text in version cards and sibling entries
Fixed:
- Variant picker focus restore after returning from download queue
- Icon button resize on focus — removed labels that caused multi-line wrapping on 4:3 screens
- LanguageBadges overflow in version cards
Internal:
- Extracted
MarqueeTexttolib/widgets/marquee_text.dart isSectionFocusedparameter threaded throughActionButtonsRow,ScreenshotsCarousel,OtherVersionsSection
🚀 v1.5.0 — Smart Sync & Quick Menu Controls
Smart sync, enriched game details, and ROM file sharing — the biggest update yet.
Highlights
- Enriched game detail screens — RomM metadata now powers a console-store-style detail view with genres, age ratings, developer, release date, game modes, star rating, summary, screenshots, and related games. Blurred cover background with accent-tinted glassmorphic cards.
- Smart sync with cooldown — app launch skips recently-synced systems, drastically reducing redundant network traffic on frequent launches. Configurable cooldown (Always / 15 min / 30 min / 1 hour / 2 hours / 6 hours).
- Per-system sync from quick menu — press Start on the home screen to sync just the selected console, with a "Synced X ago" subtitle showing freshness at a glance.
- Per-system auto-sync toggle — each console can opt out of automatic sync via console configuration; disabled systems only sync manually.
- ROM file sharing — Share button on game detail now sends the actual ROM file via the system share sheet.
- Shelf add & remove — when a game is already in all shelves, the action flips to "Remove from Shelf" with a picker.
Change Log
Added:
- Enriched game detail screen — genres, age ratings, developer, release year, game modes, star rating, summary, screenshots, and related games from RomM/IGDB metadata
- Game metadata table (DB v8) with separate
game_metadatastorage that survives game list refreshes - Blurred cover background with accent-tinted gradient overlay on detail screens
- Smart sync with cooldown —
syncSmart()skips systems within the configured cooldown window - Per-system auto-sync toggle in console configuration
- Sync cooldown setting (Always / 15 min / 30 min / 1 hour / 2 hours / 6 hours)
- Per-system sync from quick menu with human-readable "Synced X ago" subtitle
- Sync All from quick menu — forces full sync regardless of cooldown
- Shelf removal from game detail — "Add to Shelf" flips to "Remove from Shelf" when game is in all shelves
- Quick menu subtitle support
- ROM file sharing via
Share.shareXFiles
Improved:
- Game detail layout — console-store-style with scrollable landscape columns, adaptive portrait aspect ratio
- Post-settings sync only force-syncs newly added consoles instead of re-syncing everything
- Shelf picker dialog accepts custom title parameter
- Per-system last sync persistence via SharedPreferences (survives app restarts)
LibrarySyncService.waitForCompletion()for clean cancel-then-act flows- Game detail opens with Download/Delete button focused by default
Removed:
- Per-system sync list in Settings (replaced by quick menu sync)
- "Retry Sync" quick menu entry (replaced by "Sync [System]" and "Sync All")
Fixed:
- Blurred background bleeding through at bottom edge of game detail screen (
ClipRectfix) - Dead-end when enabling "Hide Empty Consoles" during first sync — never hides ALL systems
Internal:
GameMetadataInfomodel for IGDB metadata,gameMetadataProvider/groupMetadataProviderSystemConfig.autoSyncfield with JSON serialization andcopyWithSyncCooldownNotifier/syncCooldownProviderwith cycle-through UIStorageService.getLastSyncTime()/setLastSyncTime()for per-system ISO 8601 persistenceLibrarySyncService.syncSmart()with cooldown, forceSystemIds, and autoSync filtering- 143 new test lines (1666 total)
Thanks to @yangeric for the feature ideas and bug reports that shaped this release — the per-system sync, ROM count dashboard, and sync cooldown all came from your feedback. 🎮
🚀 v1.4.2 — Sync Controls & Cover Fix
Per-system sync, configurable timeouts, and cover search fix — thanks to @yangeric for the feature ideas and bug reports.
Highlights
- Per-system sync — Sync individual consoles from Settings instead of being forced to sync everything at once.
- ROM counts per platform — Each console tile now shows its game count directly in Settings.
- Configurable sync timeout — Choose between 1, 2, 5, or 10 minutes for slow connections (Synology NAS etc.).
- Cover search fix — Running "Search Game Covers" twice no longer causes the progress bar to exceed 100%.
Change Log
Added:
- Per-system sync button on each console tile in Settings (#7)
- ROM count badges per system in Settings (#7)
- Sync timeout setting (1m / 2m / 5m / 10m) passed through to all providers (#7)
gameCountsPerSystemProviderfor stable post-sync ROM counts (#6)
Fixed:
- Cover search progress exceeding 100% on consecutive runs — generation-based cancellation ensures clean state (thanks @yangeric! #8)
- DB cascade deletes — removing games now also cleans up orphaned
game_metadataandra_matchesrows - Background refresh orphan safety —
saveGamesorphan deletion is now explicit to prevent incomplete fetches from wiping cached games
Internal:
LibrarySyncService.syncSystem()for single-system syncCoverPreloadService._generationcounter for stale-worker protection- 78 new tests (1615 total)
Thanks to @yangeric for the detailed reports and feature suggestions — the screenshots and NAS context really help me prioritize the right things. 🎮
🚀 v1.4.1 — The "Archive & Scale" Hotfix
Hotfix for ZIP handling and large RomM libraries — thanks again to @yangeric for the detailed reports.
Highlights
- ZIP install detection fixed — Game detail screen now correctly recognizes archive files (.zip, .rar) as installed, matching the game list badge.
- autoExtract setting works — The per-system toggle is now respected. When off, downloaded .zip files stay as-is in the ROM folder.
- Large libraries supported — RomM pagination no longer times out with 7k+ ROMs per platform. Partial results are returned on failure instead of nothing.
Change Log
Fixed:
- ZIP install status inconsistency — detail screen now matches the game list badge for archive files (thanks @yangeric! #5)
- ZIP deletion — deleting a game kept as a .zip archive now works correctly
- autoExtract setting ignored — the per-system toggle is now properly wired through the download pipeline
- RomM pagination timeout — large libraries (7k+ ROMs per platform) no longer time out (thanks @yangeric! #4)
- Provider timeout separation — RomM gets a dedicated 10-minute paginated timeout; FTP/SMB/Web keep a tighter 60-second safety net
- Flaky
clearFilterstest — no longer fails intermittently under full test suite load
Thanks to @yangeric for both reports — the nginx log analysis on #4 and the clear reproduction steps on #5 made these quick fixes. 🎮
🚀 v1.4.0 — The "Community Fixes" Update
First community-driven release — fixing bugs reported by users, plus performance improvements across the board.
Highlights
- 3DS ROM support expanded — .cci, .cxi, and .app formats now recognized alongside .3ds and .cia.
- RomM Switch downloads fixed — Games served as ZIP archives by RomM are now correctly detected and extracted via Content-Disposition header parsing.
- Faster home screen — Carousel animations scoped per-item instead of globally, reducing unnecessary widget rebuilds.
- Smarter sync errors — Failed sources are now tracked individually with specific messages instead of a generic "Offline" banner.
Change Log
Fixed:
- 3DS extension support — added .cci, .cxi, and .app ROM formats (thanks @yangeric! #1)
- RomM Switch downloads — games served as ZIP archives are now correctly detected and extracted (thanks @gulasch! #2)
- Deleted games now immediately disappear from the game collection instead of lingering until the next background refresh
Improved:
- Home carousel performance — AnimatedBuilder now wraps individual items instead of the entire PageView
- Game list performance — favorites provider uses selective watch to avoid rebuilding when unrelated favorites change
- Visible systems query — single batch query replaces N individual database calls
- Sync error reporting — per-system failure tracking with specific error messages ("2 sources unavailable")
- Library screen — setEquals guard prevents unnecessary rebuilds when installed files haven't changed
- Thumbnail migration — batch size increased from 3 to 15 (capacity guard handled by ThumbnailService)
- Memory — gameMetadataProvider now auto-disposes when detail screen is closed
Internal:
DatabaseService.deleteGame()for targeted cache entry removalDatabaseService.systemsWithCache()for batch system presence checksLibrarySyncState.failedSystemsreplaces single error string with per-system failure map- 170+ new database upsert tests
- Updated sync and onboarding tests
Thanks to @yangeric and @gulasch for the first community bug reports — your detailed reports made tracking these down easy. Keep them coming! 🎮
🚀 v1.3.0 — The "Store Detail" Update
Console store-style game detail with IGDB metadata, variant picker, and quick menu consolidation.
Highlights
- Console store-style game detail — Redesigned detail screen with structured layout, section headers, and download area inspired by digital storefronts.
- IGDB metadata — RomM games now display genre, developer, release year, and summary via a glassmorphic "About This Game" card.
- Variant picker overlay — Multi-version games open a dedicated picker with all variants, install status, and per-variant download/delete.
- Quick menu consolidation — Tags, Description, Filename toggle, and Achievements now live in the quick menu instead of dedicated button shortcuts.
Change Log
Added:
- Console store-style game detail — redesigned detail screen with structured layout, section headers, and download area inspired by digital storefronts.
- IGDB metadata — RomM games now display genre, developer, release year, game modes, and summary via a glassmorphic "About This Game" card (fetched from RomM's IGDB data).
- Description overlay — full game summary accessible from the quick menu when metadata is available.
- Variant picker overlay — pressing A on multi-version games opens a dedicated picker with all variants, install status, and per-variant download/delete actions.
- Game metadata database — new
game_metadatatable (DB v8) stores IGDB metadata separately from game entries, surviving library re-syncs.
Improved:
- Quick menu consolidation — Tags, Description, Filename toggle, and Achievements are now accessible from the quick menu instead of dedicated button shortcuts.
- Detail screen layout — portrait mode uses scrollable layout with adaptive cover aspect ratio; landscape uses two-column layout with expandable info card.
- Download action button — redesigned as a standalone widget with distinct states (download, delete, installed, adding, unavailable) and variant count badge.
Fixed:
- RA sync not triggering after first-time onboarding due to premature mounted check.
Internal:
GameMetadataInfomodel withhasContent,genreList,averageRatinghelpers.gameMetadataProvider(FutureProvider.family) for async metadata loading.RommRomextended to parsesummary,genres,companies,first_release_date,game_modes,average_rating.- 194 new API service tests covering metadata parsing edge cases.
🚀 v1.2.0 — The "RetroAchievements" Update
RetroAchievements integration with hash verification, achievement tracking, and per-game progress — plus 1,209 tests.
Highlights
- RetroAchievements integration — Connect your RA account to track achievements, verify ROMs via hash matching, and view per-game progress directly in R-Shop.
- Achievements screen — Dedicated viewer with earned/locked badges, points, progress bar, mastery status, and full D-pad navigation.
- RA badges on game cards — Achievement count and match type (gold for name match, green for hash verified) displayed on every card; mastery outline when fully completed.
- Post-download hash verification — Downloaded ROMs are automatically hashed and matched against the RA database in the background.
Change Log
Added:
- RetroAchievements integration — connect your RA account to track achievements, verify ROMs via hash matching, and view per-game progress.
- Achievements screen — dedicated viewer with earned/locked badges, points, progress bar, mastery status, and full D-pad navigation.
- RA onboarding step — optional setup during first-run wizard with connection test and skip option.
- RA config screen — manage credentials (encrypted via SecureStorage) from Settings with connection testing.
- Post-download hash verification — downloaded ROMs are automatically hashed and matched against the RA database in the background.
- RA sync service — 3-phase background sync (catalog fetch → name matching → hash verification) with 24h freshness cache and cancellation support.
- RA badges on game cards — achievement count and match type (gold/green) on every card; mastery outline when fully completed.
- Add-to-queue toast — animated bottom-right notification when a game is added to the download queue.
- Hide empty consoles — new toggle in Settings → Preferences to hide systems with no games from the home screen.
Improved:
- Sync badge — now shows dual pills for library sync (cyan) and RA sync (gold) with independent progress tracking.
- Game detail screen — RA info section below metadata showing match status, progress bar, and "View Achievements" button; quick menu gains "Achievements" option.
- Download overlay — visual refinements and better state display.
- SystemModel — 15+ systems now carry RA console IDs (NES, SNES, N64, GB, GBC, GBA, Mega Drive, SMS, Game Gear, 32X, Atari 2600/7800, Lynx, NDS).
- Library screen — deduplication of installed entries when same game exists in multiple formats.
- Cover preload service — improved reliability and error handling.
Internal:
- Database schema v7 — new tables:
ra_games(catalog cache),ra_hashes(hash index),ra_matches(match results). - Hash computation for 10+ systems: simple MD5, NES (iNES header strip), SNES (copier header), NDS (multi-section), Lynx, Atari 7800.
RaNameMatcherwith 4-tier fallback: exact → contains → No-Intro filename → fuzzy (Levenshtein).- New providers:
raGameProgressProvider,raRefreshSignalProvider,raMatchResultProvider,raSyncServiceProvider. - 1,209 tests (up from 1,069) — new suites: RA hash service, RA models, RA name matcher, expanded database and onboarding tests.
🚀 v1.1.0 — The "Native SMB" Update
Native SMB via Kotlin MethodChannel, folder downloads, redesigned onboarding, and 1,069 tests.
Highlights
- Native SMB — Replaced the
smb_connectDart library with a Kotlin MethodChannel service (SmbService.kt), enabling folder downloads, progress reporting, and reliable timeout handling on Android. - Folder downloads — Games stored as multi-file directories (bin/cue, m3u) can now be downloaded as complete folders via SMB and FTP.
- Onboarding rework — Redesigned setup wizard with streamlined console configuration, local folder detection, and RomM integration.
- Gamepad button icons — SVG icon set (Xbox, PlayStation, Nintendo Switch) for context-aware controller hints.
Change Log
Added:
- Native SMB — Kotlin MethodChannel service replacing smb_connect library, with folder downloads, progress reporting, and 30s timeouts.
- Folder downloads — multi-file directory downloads (bin/cue, m3u) via SMB and FTP protocols.
- Gamepad button icons — SVG icon set (Xbox, PlayStation, Nintendo Switch) for controller hints.
- RomM config screen — full server management (add/edit/remove) with connection test, accessible from settings.
- Network constants — centralized timeout values (
NetworkTimeouts) shared across all providers. - File utilities — crash-safe atomic file move (
moveFile) with staging and cleanup.
Improved:
- Onboarding rework — redesigned setup wizard with streamlined console configuration, local folder detection, and RomM integration.
- FTP provider — host validation (hostname, IPv4, IPv6), injection protection, configurable timeouts.
- Web provider — security hardened directory parsing (path traversal, control chars, oversized hrefs filtered).
- Download service — folder-aware downloads for SMB and FTP with per-file progress.
- Friendly errors — expanded user-facing error mapping for network, auth, and provider failures.
- Console HUD / Quick Menu / Control Button — simplified rendering with gamepad icon integration.
Internal:
- 1,069 tests (up from 970) — new suites: SMB provider (14), FTP provider (8), Web provider (12), FocusSyncManager (32), OverlayPriorityManager (14), file_utils (5), friendly_error expansions.
smb_connectdependency removed (replaced by native Kotlin implementation).NativeSmbServiceDart wrapper forcom.retro.rshop/smbMethodChannel.NativeSmbDownloadHandle/NativeSmbFolderDownloadHandledownload handle types.
🚀 v1.0.0 — The "Stable" Release
R-Shop exits beta. After 10 beta releases, 950+ tests, and 8 security audits — this is the stable 1.0.
Highlights
- Stable release — R-Shop is production-ready. Zero TODO/FIXME markers, zero silent catches, all error paths logged.
- SVG platform icons — All 29 system icons migrated from PNG to crisp SVG format for sharp rendering at any resolution.
- Android package restructure — Migrated from
com.example.r_shoptocom.retro.rshopwith dedicated network security config.
Change Log
Improved:
- Test coverage — 950+ tests covering controllers, services, models, and utilities.
- Code quality — zero silent catches, all error paths logged, all
debugPrintcalls verified. - Dependency hygiene — all dependencies pinned to exact versions for reproducible builds.
Internal:
- New test suites: GameListController (43 tests), GameMergeHelper (12 tests), ImageHelper (19 tests).
- 8 additional test files covering app config, audio manager, config parser, onboarding, providers, and cover preload.
🚀 v0.9.9 Beta — The "Shelves" Update
Note: This release introduces custom game shelves, adaptive memory tiering, and a major codebase refactoring pass. Upgrading from
<= 0.9.3still requires a fresh install.
Highlights
- Custom Shelves — Create personal game collections with manual curation, filter rules (by system, region, language), or hybrid mode. Supports reordering, renaming, and per-shelf sort modes.
- Device Info Service — Adaptive memory tiering (low/standard/high RAM) auto-tunes image cache sizes, grid cache extents, and cover preload pools for low-end handhelds.
- Major Refactoring — Five mega-files split into focused widget modules, reducing the largest files by 40-90% (settings, download overlay, shelf edit, onboarding, library).
Change Log
Added:
- Custom Shelves — create personal game collections with manual curation, filter rules (by system, region, language), or hybrid mode; supports reordering, renaming, and per-shelf sort modes.
- Device Info Service — adaptive memory tiering (low/standard/high RAM) that auto-tunes image cache sizes, grid cache extents, and cover preload pools for low-end handhelds.
- Shelf Picker Dialog — quick-add games to shelves from library and game detail screens.
- System Selector Overlay — filter library view by system with visual system badges.
Improved:
- Settings screen refactored — split into Preferences, System, and About tabs with extracted
DeviceInfoCardwidget (1048→604 lines). - Download overlay refactored — extracted 7 widgets to
lib/widgets/download/(1477→793 lines). - Shelf edit screen refactored — extracted GameListOverlay, TextInputDialog to shared library widgets (1108→631 lines).
- RomM onboarding refactored — extracted RommConnectView, RommSelectView, RommFolderView, RommActionButton (1405→122 lines); state classes moved to
onboarding_state.dart(1713→1362 lines). - Library screen refactored — extracted ReorderableCardWrapper, LibraryEntry to dedicated widgets (1490→1386 lines).
- Dependency pinning — all 16 remaining caret-range dependencies pinned to exact resolved versions for reproducible builds.
Internal:
- New models:
CustomShelf,ShelfFilterRulewith JSON serialization. - New providers:
CustomShelvesNotifier/customShelvesProviderfor shelf CRUD. DeviceInfoServicewithMemoryTierclassification.- ~20 new test files covering download queue manager, unified game service, library sync, thumbnail service, custom shelves, database service, config storage, image cache, storage service, and widget tests.