v1.8.7

August 3, 2026

Two-track release. Graphics/shaders: a live in-game shader editor with unsaved-change confirmation, bezel reflections now blurring into the CRT scanline/phosphor result for Famicom and RF displays, Slang preset grouping with SHA-256 stable IDs, a cached final-pass scaling flag, an overscan default that keeps the full frame visible in RGBA conversion, and a rendering performance pass. Library & TV Mode: box art display modes with a blurred-fill background cache, a new GenreGroupingDiagram with per-genre counts, a refreshed context-menu look for cards and list rows, clearer TV Mode settings copy across languages, and adjusted TV Mode tile/layout dimensions. Plus: a full Japanese UI translation.

Highlights

  • Japanese localization: A full Japanese UI translation lands as ja.json, wired into the language picker in GeneralSettingsView and the Xcode build. The app now ships with English, Spanish, Portuguese, and Japanese.
  • Live in-game shader editor sidebar: From the game window, open a sidebar to live-edit shader parameters. Unsaved edits are guarded with a confirmation overlay, and parameter changes persist into the shader preset with SwiftUI state refreshing automatically.
  • Bezel reflection blur: Bezel reflections blend the reflected bezel into the scanline/phosphor result of FamicomRF and RfDisplay for a more realistic CRT-on-flat-panel effect. New uniform parameters control bezel rounding, glow, and reflection blur; mask handling is more stable in the RF display.
  • Slang preset management & stable IDs: Presets are grouped on display, and name collisions are disambiguated by a SHA-256–derived stable preset ID. Discovery errors are handled and logged, and a cached _finalPassIsAbsolute flag drives aspect-ratio/viewport scaling without entering @MainActor context.
  • Overscan & aspect-ratio handling: The RGBA conversion path defaults overscan to zero so the full source image remains visible, and MetalCoordinator caches system recognition for consistent aspect-ratio handling; XPCBridgeAdapter caches the aspect ratio to cut synchronous XPC round trips.
  • Rendering performance pass: A generation-gated uniform cache in the RF decoder path avoids needless dictionary copies during gameplay; CRTFilter.metal aligns the phosphor mask/scanlines to source pixels regardless of output upscale; audio resampling in StreamRecordingService uses UnsafeBufferPointer; GameTimeBarOverlay connects its timers only when the overlay is visible; drawable alpha is reset after Slang renders to prevent transparency artifacts.
  • Box art display modes: A new display-mode setting plus integration into GameCardView, GridCollectionView, and LibraryGridView, backed by a blurred-fill background image cache in ImageCache so cards render with a soft tinted backdrop derived from their own cover.
  • Genre grouping diagram & per-genre counts: New GenreGroupingDiagram visualizes genre settings; GenreManager exposes counts and GenrePickerView shows them. New labels and descriptions are added in en/es/pt.
  • Card/list-row context menu polish: GameCardView and GameListRowView get a refreshed context-menu appearance and structure.
  • TV Mode copy & layout: TV Mode settings descriptions are rewritten for clarity and consistency across en/es/pt, and the TV Mode game tile and view layout dimensions are adjusted for better fit.
  • 8-bit GameBoy shader cleanup: Uniform variables in 8bGameBoy.metal are renamed for consistency and clarity, with matching updates in ShaderPreset, MetalCoordinator, and ShaderUniforms.
  • RA badge prefetch logging: Removed debug logging for existing badges during the prefetch pass.

Detailed Changes

  • feat(shader): implement live shader editor sidebar with unsaved changes confirmation β€” StandaloneGameWindowController hosts the sidebar; parameters apply instantly; a confirmation overlay protects unsaved edits; preset handling refactored for seamless apply/persist; en/es/pt shader-key translations added
  • feat: implement bezel reflection blur for enhanced visual effects and optimize rich presence handling
  • feat: enhance bezel reflection handling in applyMaskAndBezel for improved visual fidelity
  • feat: enhance bezel mask handling for improved visual fidelity and stability in the RF display
  • feat: add support for bezel reflection in RfDisplay and ShaderUniforms β€” new uniform parameters: bezel rounding, glow, reflection blur
  • Enhance Slang Compiler and Metal Coordinator for improved rendering β€” cached _finalPassIsAbsolute accessed without @MainActor; aspect-ratio/viewport scaling strategies keyed off the preset's final pass type; final-pass state logged at activation; drawable alpha handling fix prevents transparency after Slang renders; SlangPresetDiscoveryService tracks errors and disambiguates names via SHA-256 stable IDs
  • Enhance shader and rendering performance β€” generation-gated uniform cache for the RF decoder path in EmulatorRunner; CRTFilter.metal aligns phosphor mask and scanlines to source pixels regardless of output upscale; FamicomRF.metal / RfDisplay.metal incorporate bezel reflection blur; cached aspect ratio in XPCBridgeAdapter; StreamRecordingService resamples audio with UnsafeBufferPointer; GameTimeBarOverlay manages timer connections by overlay visibility; MetalCoordinator caches system recognition for aspect-ratio decisions
  • feat: enhance Slang preset management with grouping and improved display handling
  • feat: adjust overscan setting to zero for improved visual output in RGBA conversion
  • feat: add box art display mode options and integrate into library views β€” new display-mode options on SystemInfo; GameCardView, GridCollectionView, LibraryGridView updated; en/es/pt keys added
  • feat: implement blurred fill image caching for box art display mode β€” ImageCache grows a blurred-fill background cache; GameCardView uses it for soft tinted card backdrops
  • feat: add GenreGroupingDiagram and enhance genre grouping settings with new labels and descriptions β€” new 315-line diagram view, wired into GenreSettingsView and SettingsCatalog; en/es/pt labels added
  • feat: add genre count functionality to GenreManager and integrate with GenrePickerView β€” per-genre counts surfaced in the picker and the grid view
  • feat: enhance context menu appearance in GameCardView and GameListRowView
  • feat: enhance TV Mode settings descriptions for clarity and consistency across languages β€” TVModeMainSettingsView rewrite; en/es/pt copy aligned
  • feat: adjust dimensions for TV Mode game tile and view layout β€” TVModeGameTile and TVModeView sizing pass
  • feat: rename shader uniform variables for consistency and clarity for 8-bit GameBoy shader β€” 8bGameBoy.metal, ShaderPreset, MetalCoordinator, ShaderUniforms kept in sync
  • feat: remove debug logging for existing badges during the prefetching process β€” RABadgeCacheService
  • feat: add full Japanese UI translation β€” ja.json (2468 lines), wired into the language picker in GeneralSettingsView and the Xcode resource build; the app now ships en/es/pt/ja
  • Refactor code structure for improved readability and maintainability
  • Bump marketing version to 1.8.7 and build number to 30 across project.yml, both Info.plists, and docs/_config.yml