* feat: add emulator support
* chore: update known binaries and enhance disc sniffing logic
- Changed version flag for known binaries from --version to -version.
- Increased buffer size for disc sniffing from 4MB to 16MB.
- Expanded DiscPlatform type to include ps3.
- Added PS3 markers for improved detection of PS3 discs.
- Adjusted alignment in emulator detail styles for better UI consistency.
- Removed unused rescan button from emulator detail component.
* feat: integrate launchbox support in game catalogue
- Added support for the launchbox shop in the game catalogue, allowing users to fetch and display game details from Launchbox.
- Introduced new interfaces for handling Launchbox game data and assets.
- Updated the catalogue search state to include a mode for modern and classics games, with corresponding UI adjustments.
- Enhanced the game details component to handle Launchbox-specific assets and fallback images.
- Updated translation files to include new keys for game modes.
* chore: update translation files and enhance Launchbox integration
- Added new translation keys for platforms and game details in the translation files.
- Updated the game details and catalogue components to support additional Launchbox-specific fields.
- Enhanced the scanning process to return matched and unmatched game counts.
- Introduced new UI elements for displaying import progress and matching status during ROM imports.
- Refactored related components to improve clarity and maintainability.
* chore: update translation files and enhance emulator functionality
- Added new translation key for missing executable path in the translation files.
- Updated emulator detail component to check for executable existence and display appropriate messages.
- Enhanced ROM folder management by integrating language support in add and rescan functions.
- Improved scanning logic to handle additional file types and ensure better detection of ROM folders.
- Refactored related components for clarity and maintainability.
* chore: enhance classics game support and update translations
- Added new translation keys for disc management and game launch messages.
- Implemented functionality for handling multiple discs in classics games, including selection and management.
- Introduced new event handlers for opening classics games and updating disc selections.
- Enhanced the user interface with a disc selection modal for better user experience.
- Updated library components to support filtering and displaying classics games.
* feat: enhance Launchbox ROM import functionality
- Added a new utility function to strip disc markers from filenames, allowing multi-disc games to be grouped correctly.
- Improved logging for SKU extraction and matching processes during ROM imports, providing better traceability.
- Refactored game matching logic to utilize the new disc marker stripping function, ensuring accurate group key generation for multi-disc titles.
- Updated the import process to handle unmatched groups more effectively, enhancing overall import accuracy.
* chore: remove redundant usage of disc selection in the game settings general
* chore: update translations and enhance emulator detail functionality
- Modified translation keys for game file counts to improve clarity.
- Added new translation keys for executable path updates and scan completion messages.
- Enhanced emulator detail component to provide feedback on executable path changes and scan results.
- Introduced flag icons for regions in the disc selection modal and launchbox details section for better visual representation.
- Updated styles for flag icons and buttons to improve user interface consistency.
* chore: enhance classics onboarding and emulator functionality
- Added new translation keys for the classics onboarding process, improving user guidance.
- Introduced a new modal for classics onboarding, triggered under specific conditions.
- Enhanced emulator functionality by adding a preview feature for executable paths.
- Updated the emulator setup modal to handle executable path previews and improve user experience.
- Refactored related components for better maintainability and clarity.
* chore: update translations and enhance emulator functionality
- Added new translation key for opening disc location in the translation files.
- Modified scan completion message for improved clarity in user feedback.
- Enhanced emulator detection logic to handle executable path validation and session management.
- Improved game details component with a new layout effect for description overflow handling.
- Refactored disc selection modal for better sorting and user experience.
* chore: enhance emulator validation and update translations
- Added a new translation key for invalid emulator executable messages.
- Implemented validation for emulator executable paths to ensure they are valid before proceeding.
- Updated error handling in game launch processes to provide clearer feedback based on specific error codes.
- Refactored related components to improve user experience and maintainability.
* chore: update translations and enhance emulator setup functionality
- Added new translation key for selecting emulator executable in the setup process.
- Modified existing translation keys for improved clarity in user feedback.
- Enhanced the emulator setup modal to include better handling of executable paths and user guidance.
- Introduced new UI elements for displaying emulator and ROM folder information.
- Refactored related components for improved maintainability and user experience.
* feat: add user preferences for classics appearance
- Introduced new user preferences for hiding the Hydra Classics bookmark and using a hero layout for classics game pages.
- Added corresponding translation keys for the new settings in the translation files.
- Updated the game details component to conditionally render the classics bookmark based on user preferences.
- Enhanced the settings context to manage the new preferences effectively.
* chore: update translations and enhance RPCS3 emulator functionality
- Introduced a new function to retrieve default sources for RPCS3, enhancing the emulator setup process.
- Updated the emulator setup modal to display the count of registered games, providing clearer context to users.
- Enhanced the logic for handling game paths and title IDs, ensuring better integration with RPCS3's games.yml.
- Refactored related components for improved maintainability and user experience.
* fix: typecheck fix
* chore: update translations and enhance RPCS3 emulator handling
- Added new translation keys for RPCS3 emulator error messages and disc folder addition.
- Improved the logic for handling game launches when RPCS3 is already running, prompting user confirmation.
- Refactored game library and classics game handling to include platform information.
- Enhanced the user interface for adding discs, including support for adding disc folders.
- Cleaned up and removed stale comments in the codebase for better readability.
* feat: enhance game library handling
- Updated translation for the redetect unchanged message to improve clarity.
- Introduced a new function to cache and retrieve platform information for games in the library.
- Enhanced the logic for adding games to the library to utilize cached platform data.
- Improved the UI for displaying platform and emulator information in the game card component.
- Adjusted styles for better layout and visual consistency in the game details and library components.
* fix: update translations and enhance game context menu
- Updated translation keys for game-related messages to improve clarity.
- Added confirmation modal for RPCS3 emulator when already running, enhancing user experience.
- Refactored game context menu actions to include new handlers for RPCS3 launch confirmation.
- Improved styling for catalogue mode toggle buttons for better visual consistency.
- Adjusted layout and styles in game details and library components for improved usability.
* feat: update profile endpoints to display launchbox games in currentGame and recentGames, update profile to display both steam and launchbox games in 1 tab 'library'
* feat: enhance user profile and library functionality
- Updated user profile context to include new methods for fetching user stats and library games with platform filtering.
- Enhanced library component to support filtering by platform and added onboarding modal for classics games.
- Improved translation keys for platform-related strings and ensured proper usage in UI components.
- Refactored sorting and filtering logic in the library and profile tabs for better user experience.
* fix: refine type definitions in filter dropdown
- Refined type definition for FilterIcon to use ReactNode for better type safety in filter-dropdown component.
* feat: enhance emulator setup and scanning experience
- Added new translation keys for emulator setup and scanning steps to improve user guidance.
- Implemented handling for unmatched files during the scanning process, allowing users to see which files couldn't be matched.
- Enhanced the UI for the emulator setup modal to include download help options and improved layout for better user interaction.
- Refactored components to manage state more effectively during the scanning process, ensuring a smoother user experience.
* style: enhance setup UI
- Improved layout in setup-shell.scss for better spacing and alignment.
- Wrapped hint elements in a new group for improved structure in setup-step-find-emulator.tsx.
* feat: add PS2 memory card save scanning and .psu export
Parse PCSX2 .ps2 memory cards to detect per-game saves, match them to
LaunchBox metadata by SKU, and surface them in a new "Memory Cards"
section on the PS2 emulator settings page. Saves can be exported locally
as standard, re-importable .psu files.
- Port the .ps2 filesystem reader (superblock, two-level FAT, directory
walk, ECC auto-detect) to TypeScript in
src/main/services/emulators/ps2-memory-card/, ported from mymc/mymcplus
- Extract game SKUs from save-folder names (BESLES-50009 -> SLES-50009),
validating against known serial prefixes and skipping system folders
- Add .psu export behind a MemoryCardBackupTarget seam (local now, cloud
upload can slot in later)
- Store detected saves in a dedicated ps2MemoryCardSaves sublevel, keeping
them out of the games library
- Share the LaunchBox shop-details lookup between ROM import and the
memory-card scan
- Add scan/list/forget/export IPC + the Memory Cards settings UI
- Add scripts/inspect-ps2-memcard.cjs to verify parsing and .psu export
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: extract PS2 save SKU when folder name has a game suffix
PS2 memory card save folders append a game-specific suffix after the
serial (e.g. BASCUS-97481GOWII, BASLUS-20294USER, BESLES-52988XXX), so
anchoring the serial match at the end of the name failed and every save
came back with a null SKU and no LaunchBox match.
Strip the leading B<region> marker only when a serial follows, then match
the serial (4-letter prefix + 5 digits) from the start and ignore the
trailing suffix. Add the suffixed real-world cases to the self-test.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: don't abort CHD scan on an undecodable hunk
CD-based CHDs include cdfl (CD-FLAC) audio hunks the reader can't decode.
The leading-data scan broke on the first such hunk, so the data track
holding SYSTEM.CNF was never read and SKU extraction returned null (e.g.
Pac-Man World 2). Skip undecodable hunks and keep scanning the data hunks
instead of aborting, bound the scan, and add [chd] diagnostic logs
(header / codecs / decoded / skipped) so future failures are explicit.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: make the profile "View all" badges modal scrollable
The 400px cap sat on the modal wrapper while overflow-y lived on the
inner unbounded list, so the list never scrolled and the last badge(s)
were clipped with no way to reach them. Move the height bound + scroll
onto the list itself.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat: always show the library category switch and platform filter
The All | PC | Classics switch and the platform filter were gated behind
having classics games, and the selected category was forced to "all"
without them. Always render the controls and honour the selected
category so the switch works even before any classics game exists.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat: PS1 memory cards, save management, and cloud save sync
Extends the classics memory-card feature across PS1 and PS2:
- PS1 (DuckStation) support: a flat 128 KB card parser, .mcs export, and
DuckStation memcard-dir discovery, mirroring the PS2 path. The Memory
cards section and scan flow are generalised to be system-aware.
- Memory-card management: auto-prune stale/renamed cards on rescan,
remove a whole card, collapsible card groups, region flags, and a
local-library art fallback when the remote shop-details misses a SKU.
- Memory-card writers: import a .psu/.mcs back into a .ps2/.mcd
(PS2 FAT + ECC, PS1 block chains), with a .hydra-bak safety copy and
post-write verification. Validated by the inspect-*-memcard self-tests.
- Cloud emulation saves (/profile/emulation-saves): per-game upload,
list, restore-into-card, delete and rename, gated on a Cloud
subscription, with a new Cloud saves section on the emulator page.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat: surface per-game emulation saves in the game Hydra Cloud tab
Show a game's PS1/PS2 cloud saves in the game options modal's Hydra Cloud
tab (classics games only; PC games keep the existing artifact panel). Lists
local memory-card saves for the game with a per-save back-up action, the
already-backed-up cloud saves with restore/rename/delete, an empty state when
no saves match, and a deep link to the emulator settings when no cards are
added. Scopes the cloud list by objectId both server-side and client-side.
Also refine the emulation console cards: distinguish "no emulator" (Setup
required) from "no ROM path" (Not detected), reserving "Ready to play" for
when both exist.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat: refine emulation card setup label and per-game cloud empty states
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat: truncate emulator executable path to a single line
Clip the executable path with an ellipsis instead of wrapping, and surface
the full path on hover.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat: add library, sources, and source filter to classics catalogue
Give classics catalogue cards a +/added add-to-library button and download
source badges (trimmed to a +N overflow badge on narrow cards), and add the
download sources filter to the classics filter sidebar for parity with modern.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat: default classic downloads to ROM folder and auto-link discs
Default the download directory to the emulator's primary ROM folder for
launchbox games, and after a classic game finishes downloading/extracting,
scan the files, extract each disc serial, and link the discs to the game so
it becomes launchable.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: read classic download default from configured ROM folders
Resolve the default download directory from the emulator config's romFolders
(the store the settings screen manages) instead of the emulator INI's
RecursivePaths, so adding/removing ROM folders updates it and it falls back
to the normal downloads path when none are configured.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat: redesign emulator cloud saves with console connector diagram
Add console-backside artwork above the cloud saves cards with
responsive connector lines measured from the live layout, and restyle
each save card to match the updated Figma (art, kebab menu, host/date).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat: add shop switch to header search suggestions
Send the new shop param (steam/launchbox) to the catalogue search
suggestions endpoint, and add a PC/Classics icon toggle in the
suggestions dropdown header to pick which catalogue to search.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* refactor: address sonar findings across emulator services
Reduce cognitive complexity of scan/import/parser/writer functions by
extracting helpers, and apply lint fixes (RegExp.exec, optional chains,
.at(), Math.trunc, String.raw, codePointAt, globalThis, single push,
guard-clause verifies). No behavior change; memcard self-tests pass.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat: refine emulation settings UI
Add stat icons (gamepad/database/clock) and last-scan caption, surface a
path-missing warning on console cards, neutralize status badges, shrink
console art, compact the memory-card list with a kebab menu, and give the
suggestions shop switch a styled tooltip.
* feat: polish emulator detail layout and responsiveness
- Place executable path edit icon directly after the path text
- Remove version from hero meta and the section synced badge placement
- Pin stat captions to card bottom and fluidly scale stat/folder text
- Collapse memory cards by default on first load
* fix: address greptile review on emulator save paths
- harden RPCS3 relaunch: poll for process exit and escalate to SIGKILL
instead of a blind 500ms wait, and refuse to launch if the old
instance is still alive to avoid concurrent save-state writes
- extract PS1 memory-card link offset and free-block mask into named
constants in types.ts
- replace the unsafe EmulationSaveEmulator casts with a shared runtime
guard that rejects rpcs3
* fix: show skeleton when switching catalogue modes
Tie loaded results to the mode they were fetched for and render the
skeleton while the active mode differs. Prevents PC games from briefly
rendering with the classics card layout (and vice-versa) during the
debounce and fetch window after a mode switch.
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Helio Kroger <me@heliokroger.com>