Skip to content

Releases: AverageConsumer/R-Shop

🚀 v1.5.1 — Detail Screen UX Polish

16 Mar 18:23

Choose a tag to compare

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 MarqueeText to lib/widgets/marquee_text.dart
  • isSectionFocused parameter threaded through ActionButtonsRow, ScreenshotsCarousel, OtherVersionsSection

🚀 v1.5.0 — Smart Sync & Quick Menu Controls

15 Mar 20:06

Choose a tag to compare

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_metadata storage 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 (ClipRect fix)
  • Dead-end when enabling "Hide Empty Consoles" during first sync — never hides ALL systems

Internal:

  • GameMetadataInfo model for IGDB metadata, gameMetadataProvider / groupMetadataProvider
  • SystemConfig.autoSync field with JSON serialization and copyWith
  • SyncCooldownNotifier / syncCooldownProvider with cycle-through UI
  • StorageService.getLastSyncTime() / setLastSyncTime() for per-system ISO 8601 persistence
  • LibrarySyncService.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

09 Mar 19:58

Choose a tag to compare

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)
  • gameCountsPerSystemProvider for 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_metadata and ra_matches rows
  • Background refresh orphan safety — saveGames orphan deletion is now explicit to prevent incomplete fetches from wiping cached games

Internal:

  • LibrarySyncService.syncSystem() for single-system sync
  • CoverPreloadService._generation counter 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

07 Mar 19:10

Choose a tag to compare

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 clearFilters test — 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

06 Mar 15:16

Choose a tag to compare

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 removal
  • DatabaseService.systemsWithCache() for batch system presence checks
  • LibrarySyncState.failedSystems replaces 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

01 Mar 14:34

Choose a tag to compare

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_metadata table (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:

  • GameMetadataInfo model with hasContent, genreList, averageRating helpers.
  • gameMetadataProvider (FutureProvider.family) for async metadata loading.
  • RommRom extended to parse summary, 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

27 Feb 22:26

Choose a tag to compare

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.
  • RaNameMatcher with 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

27 Feb 00:45

Choose a tag to compare

Native SMB via Kotlin MethodChannel, folder downloads, redesigned onboarding, and 1,069 tests.

Highlights

  • Native SMB — Replaced the smb_connect Dart 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_connect dependency removed (replaced by native Kotlin implementation).
  • NativeSmbService Dart wrapper for com.retro.rshop/smb MethodChannel.
  • NativeSmbDownloadHandle / NativeSmbFolderDownloadHandle download handle types.

🚀 v1.0.0 — The "Stable" Release

26 Feb 00:23

Choose a tag to compare

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_shop to com.retro.rshop with 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 debugPrint calls 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

25 Feb 00:39

Choose a tag to compare

Note: This release introduces custom game shelves, adaptive memory tiering, and a major codebase refactoring pass. Upgrading from <= 0.9.3 still 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 DeviceInfoCard widget (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, ShelfFilterRule with JSON serialization.
  • New providers: CustomShelvesNotifier / customShelvesProvider for shelf CRUD.
  • DeviceInfoService with MemoryTier classification.
  • ~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.