v1.11.0

August 28, 2026

This release adds HowLongToBeat completion-time estimates to the game detail view and hardens Holo card effects for big libraries: a deadlock in the mask cache is fixed, all holo caches are LRU-bounded, and the WebKit teardown is debounced so it no longer freezes the grid mid-hover. Scrolling a 50+ card holo collection is now smooth. The setup wizard gains a live native Holo preview that matches the in-app effect, multi-folder library management with removal reconciliation, and a sharper region selector.

Note: The Holo effects are still in beta testing. They are experimental and may change or be refined in future releases.

Highlights

  • HowLongToBeat completion times: The game detail view shows Main, Main + Extra, and Completionist estimates from HowLongToBeat, with automatic matching for titled ROMs and a search sheet for manual selection.
  • Holo performance pass: Holo mask decomposition only runs on actual hover, HoloSaliencyService is now protected by a single lock (fixes a scroll-time deadlock), and all holo caches are LRU-bounded.
  • Smoother scroll in the holo grid: The library's scroll state only republishes on real change, cards no longer observe the global saliency service, and WebKit teardown is debounced and async so it never interrupts a scroll gesture.
  • Setup wizard v2: A live native HoloPreviewCard in the region selector, multi-folder library management with DB reconciliation, bezel moved into Optional Features, and a sharper Zelda OoT-based region selector.

Detailed Changes

  • HowLongToBeat integration — ROMMetadataEntry gains HLTB fields (game ID, matched title, completion time estimates), HLTBWebSearchSheet for manual selection, HowLongToBeatCard with auto and manual matching, and integration into the game detail view's overview.
  • Holo saliency deadlock fix — HoloSaliencyService now uses a single OSAllocatedUnfairLock for both entries and LRU order; the previous two-lock design could deadlock during scroll.
  • Holo LRU caches — HoloFoilTileCache (32), HoloPatternStore (64/32/32), HoloSaliencyService (100), HoloBumpRenderer (16); DetailBoxArtComponents quantizes render sizes to 0.5pt buckets to prevent fragmentation.
  • Holo scroll lag fixes — LibraryScrollState.isScrolling only republishes on real change; HoloGameCardView no longer observes HoloSaliencyService (each card uses local @State for its own progress); mask decomposition is gated on a hover-trigger so it does not run for all visible cards.
  • HoloWebCardView — WKWebView is only created when isActive is true; teardown uses a debounced scheduleUnmount (0.35s, cancel-on-rehover) plus fully async deinit; all card webviews share one WKProcessPool; loadKey uses quantized 0.5pt frame buckets to stop reload thrashing.
  • HoloFoilLayers — luminance masking for a more accurate metallic effect.
  • Wizard — HoloPreviewCard now uses the native HoloFoilLayers + HoloSheenEffect + HoloScratchLayer pipeline, ratio-aware, hover-aware; pre-bundled hero masks for the region selector; multi-folder library list with DB reconciliation; bezel moved to Optional Features.
  • BoxArt — BoxArtLayers no longer pre-subtracts the title from the hero blob (the title hint was removing a title-shaped notch at full resolution); the wizard region selector uses Zelda OoT US/EU/JP samples to exercise aspect-ratio variation.
  • Localization — total playtime, plays, last played, and achievements translated across en/es/pt/ja; bezel feature entries localized; new Holo translations.
  • GameListRowView — onPlay action added for launching games.
  • GameCardView — image scaling changed from scaledToFit to scaledToFill with clipping for a tighter cover-art presentation.
  • Bump marketing version to 1.11.0 and build number to 34 across project.yml, both Info.plists, and docs/_config.yml.