RomM Sync for PS5

Project Screenshot

A RomM companion client for jailbroken PS5 consoles (etaHEN + kstuff). Through my insatiable need to mod everything electronic I encounter, I had my 12.70 PS5 jailbroken the minute that P2JB was out. I maintain a RomM server to centralize all my legal ROMs, saves, and savestates which all my devices sync with, and the PS5 needs similar treatment.

  • Background save sync
    • Monitors save file changes in the background, and uploads them as soon as they've changed. Periodic syncs also ensure that your PS5 always has the latest saves and savestates.
  • Interactive library
    • Browse your RomM library from the installed Romm Sync app (or some other device), download games and BIOS files into the right emulator folders, and resolve save conflicts.
  • Pluggable emulator profiles
    • RetroArch is supported out of the box. Mednafen and a PS2-ISO profile are included but disabled. I'll make sure we update as more emulators become available on the console.

Supported Emulators and Games

Technically, this RomM client will work with all emulators, but the PS5 is currently limited on emulators available. This is simply a matter of time, and the client will be updated frequently as new emulators are released. Currently, we have focused on using mihawk-99's unofficial implementation of RetroArch. It works beautifully!

PS4/PS5 Games

If you are interested in downloading PS4 and PS5 games from your RomM server, RomM has direct FPKGi support, simply add it as a library. This sync client does NOT handle PS4/PS5 save syncing at this time, but is being researched for potential future inclusion.

Requirements

  • A PS5 running etaHEN
  • RomM 5.0 or newer. (5.3.0 if you want to do shared memory card syncing instead of per-game)
  • RetroArch installed as a homebrew app

Install

  1. Download the latest romm-sync.elf from the releases page.
  2. Send it to the console (or use whichever favorite tool you wish):
    nc -w 1 <ps5-ip> 9021 < romm-sync.elf
    
  3. A RomM Sync tile appears on the home screen after about 30 seconds. Open it, or go to http://<ps5-ip>:8780 from another device.

To start RomM Sync with the console, copy the payload to etaHEN's autostart folder or use the autoloader. You can do this from the last setup step, or with make install PS5_HOST=<ps5-ip> if you build it yourself.

HTTP and HTTPS servers both work. Common certificate authorities (the Mozilla list) are built in, so there's nothing to copy for HTTPS. If your server uses a self-signed certificate, tick Skip certificate checks during setup, or turn off Verify TLS certificates in Settings. If it uses a certificate from your own CA, you can instead put that CA's certificate in /data/romm-sync/cacert.pem; it's trusted in addition to the built-in list.

Updates

Settings shows when a new version is out (it checks GitHub once a day, which you can turn off) and can install it for you. Nothing installs on its own. The update waits until no sync, download or game is running, replaces the payload in etaHEN's autostart folder (keeping the old one as romm-sync.elf.bak), and restarts RomM Sync.

Each release is signed. RomM Sync only installs an update whose signature matches a key built into it and whose file matches the signed checksum, so a modified download is rejected.

Setup

The setup walks you through five steps:

  1. Connecting to your server.
  2. Approving the console in RomM, by scanning a QR code or entering a code.
  3. Choosing which emulators to sync.
  4. Checking what the first sync will do.
  5. Choosing when to sync in the background.

Back up your saves before the first sync. Copy your emulator save folders to a computer or USB drive. RomM Sync keeps a local copy before replacing any file, but your own backup is the safest option.

PS2 Memory Cards

LRPS2 keeps every game on one shared memory card by default. RomM stores saves per game, so pick one of these during setup:

  • One card per game. Works with any RomM version. In RetroArch, open the LRPS2 core options and turn off Shared Memory Cards. After that, each game's card syncs like any other save. Saves already on the shared card stay there.
  • Back up the shared card. Needs RomM 5.3.0 or newer. The whole card is uploaded when it changes, and you can restore it from Settings. It isn't merged with other devices.

PSP, GameCube and Wii saves are synced as one zip per game, the same format other RomM clients use. Depending on the client, they may or may not support unzipping the saves (I don't truly know), but this client does!

My opinion? One card per game is better since 8MB memory cards fill up quick.

Emulator Profiles

Settings has a JSON editor for emulator profiles, and a table showing which folders are used for each platform. A profile lists an emulator's folders and the RomM platforms it plays:

{
  "id": "retroarch",
  "name": "RetroArch",
  "root": "/data/homebrew/PPSA99169",
  "retroarch_cfg": "{root}/config/retroarch.cfg",
  "rom_dir": "{root}/content/{platform}",
  "save_dir": "{root}/savefiles",
  "state_dir": "{root}/savestates",
  "bios_dir": "{root}/system",
  "save_exts": ".srm,.sav",
  "platforms": [{ "romm": ["snes", "sfam"], "dir": "snes", "emulator": "snes9x", "core_name": "Snes9x" }]
}

For RetroArch, it reads save and state folders from its own config, including its "sort by core" and "sort by content" options. RomM Sync never changes the emulator's settings. A save found outside the folder the emulator reads is listed on the status page and left alone.

Building

make host tools       # macOS or Linux build for development, plus tools/release-sign
tools/ps5-build.sh    # PS5 build in Docker, output in build/ps5/
tests/e2e.sh          # end-to-end tests against a mock RomM server

Releasing

Merge a pull request from a branch named with the version, such as release/v1.0.2. The release workflow tags the merge commit, builds the payload, signs it and publishes the release. You can also push a v1.2.3 tag yourself.

Signing needs the RELEASE_SIGNING_KEY repository secret: the 64-character hex key printed by build/host/release-sign keygen. Its public half must be in src/update_keys.h, which also holds a backup key that is kept offline. If the release key is ever lost or leaked, sign the next release with the backup key, and ship a new key pair in that release.

P.S to the industry

If buying isn't owning, then piracy isn't stealing. 🖕

License

GPL-3.0. Parts of the PS5 code are adapted from ftpsrv and websrv by John Törnblom. cJSON and qrcode-generator are MIT licensed. Monocypher is CC0 or BSD-2-Clause.

v1.0.2
Latest
2026-10-06 05:02:44 +02:00
Languages
C 71.7%
HTML 15.8%
Python 6.1%
Shell 5%
Makefile 1%
Other 0.4%