Guide: Using Syncthing with Retro Handhelds

Last updated: 16JAN2025 (see Changelog for details)

Syncthing is a powerful peer-to-peer file synchronization service, available on a variety of platforms. In this guide I’ll walk you through the basics when it comes to setup and syncing your saves and save states within RetroArch.

Table of Contents

What is Syncthing?
RetroArch best practices
Set up a host PC
Set up a handheld client
Connecting devices to one another
Android
ROCKNIX (and JELOS)
ArkOS
muOS
KNULLI (and Batocera)
CrossMix OS
Onion OS
spruceOS
Windows handheld PC
Steam Deck
Notes

Changelog

What is Syncthing?

Before you decide whether to use this tool with your favorite handhelds, let’s talk about what Syncthing is (and perhaps more importantly, what it isn’t). We’ll also go over some advantages and disadvantages of a setup like this.

  • Syncthing is a peer-to-peer file synchronization app. This means it connects from one device to another, with no middleman. For example, this is not a cloud service, those will generally connect elsewhere (like Dropbox) and sync from there. Instead, you will need to connect your device to another handheld, or a host machine (like a PC) to sync your files. This syncing process is faster and more secure, and doesn’t rely on a third party for network upkeep.
  • Syncthing is multi-platform. It is available for Windows, Linux, and Mac, and has host applications on Android too. Many Linux-based handheld OS options, such as muOS, KNULLI, and ROCKNIX, have native support for Syncthing too. Once you have the process down, adding a new device can be very easy.
  • For the best results, use a PC host machine. It’s possible to simply sync between one device and another, but most handheld OS setups are dependent on a PC (Mac, Windows, or Linux) for the initial configuration. I’ve found that my ideal setup is to use a PC in my home that is always on and running Syncthing, which can then sync with every handheld as I use them. It also then serves as an unofficial backup machine as well.
  • Your “host PC” doesn’t need to be a PC! I’ve heard many stories of people using devices like an Android phone or TV box, or a Raspberry Pi, to be a lightweight Syncthing machine.
  • Syncthing can happen across the Internet, just not on your local network. The beauty of Syncthing is that once the devices are synced with your host PC (which will likely simply reside on your home network), even if they are connected to WiFi elsewhere they will still find one another and sync, provided your host PC is up and running at home. So you can take your handhelds on travel, connect them to any WiFi (or a hotspot on your phone), and they will still sync up as needed.
  • This app can sync just about anything. In this guide we’re going to focus on RetroArch saves and save states, but you could also sync saves from other standalone emulators, or even your ROM folders themselves.
  • It can get complicated. For example, by default RetroArch writes its save states into folders by core name, which means that in order to get them to sync, you’ll need to use the same RetroArch core for each device. Some devices, like the Miyoo Mini Plus, use modified or non-standard cores for optimal performance, which can cause incompatibilities with other handhelds. So just bear in mind that even if you have everything set up, some handhelds (and emulated systems) can become problematic.
  • Save states can be tricky. In this guide we’ll set up syncing for save states (.state) and in-game memory save files (.srm), but SRM files are generally more stable. They can be used across many RetroArch cores, whereas save states are mostly core-dependent. Additionally, the way that some handheld OS options handle save states can vary, which may inadvertently overwrite a beloved save state. We’ll set up Syncthing to keep version backups in case this happens, but just bear in mind that there is more risk when using a save state vs a save file. There is a balance here — save files will be more stable and compatible, but save states can be more convenient.
  • It takes a moment to sync. Some OS options have a handy suspend-resume function, where you can quickly power off your device and then boot right back to where you were previously thanks to auto load/save states. This function can sometimes not play well with Syncthing, because the sync may not complete in the short time that it takes to power down, and when it powers up, it may start RetroArch before you are connected to your network, which means it won’t sync or load the latest save file. For the best results, you will want to fully close your game (and quit RetroArch) and wait a few seconds before powering down your device, and when powering on the device, allow it to connect to your network and sync before starting up a game. This reduces the “pick up and play” aspect of a suspend-resume device, so it’s another balance to weigh when choosing a Syncthing setup.
  • Syncthing can drain your battery more quickly (especially on Android). Because this is a network service, it will result in increased network activity, which will by definition be more taxing on your battery than not syncing. This can be especially bad on Android, which will constantly be searching for file changes in your folders. Here are some tips to improve the Android battery experience, and I also cover them in the video guide above (and Android section below).

So if I haven’t scared you off at this point, let’s actually start getting set up.

RetroArch best practices

Let’s go over a couple tips that will help you get the best experience with this setup. Bear in mind that this guide assumes you have a rudimentary understanding of RetroArch and how to navigate its menus; if you are brand new to the app, check out my RetroArch starter guide.

Standardize your ROM library. RetroArch names its save files based on the names of your ROM files. If you have a haphazard collection of ROMs floating around on each of your devices, they will not sync properly. Instead, consider having a single ROM library that you can then use to populate each of your devices. Personally, I own an external SSD that hosts all of my ROM files, and all of my devices (and their SD cards) are populated from this single resource. This will standardize the games list and their file names so that the save files will work properly.

Standardize your RetroArch save settings. The way that each handheld OS is configured for saves and save states can vary, and there are many ways you can set this up. The setup process that I recommend is currently based on the way that most of these handheld OS options save their files, or can be easily modified to be compatible

Like I mentioned in the section above, save states can be tricky. If you want the most consistent results with Syncthing, I would recommend mostly relying on SRAM (in-game) saves instead of save states. If you do prefer to use save states, I would recommend saving and loading them manually (via hotkeys) instead of turning on auto save/load. If you really want to use auto save/load states, I would recommend using them with incremental save states, which we will configure below. We’re also going to save 10 incremental save states per game so that you can always go back to one in the RetroArch Quick Menu settings and revert to an old state in case the setup accidentally overwrites a crucial file.

When using incremental save states, there may be a moment where your device loads a state from a different increment than your device, and that conflict will result in loading an older save state. If that happens, open your device’s RetroArch Quick Menu while playing the game, then go into the Save States quick menu, adjust the increment, and load the state. Keep trying that until you find the state you are looking for.

With that out of the way, let’s go over my recommended save settings. This will need to be configured within RetroArch one time on each device (including your host PC) to make sure everything is uniform. I think that muOS’s settings are fairly standard, so let’s use that as our standard too.

Open RetroArch then navigate to Settings > Saving, and set the following configurations (some may already be set):

Sort Saves into Folders by Core Name: ON
Sort Save States into Folders by Core Name: ON
Sort Saves into Folders by Content Directory: OFF
Sort Save States into Folder by Content Directory: OFF
Write Saves to Content Directory: OFF
Write Save States to Content Directory: OFF
Auto Save State: ON (optional, see notes above)
Auto Load State: ON (optional, see notes above)
Increment Save State Index Automatically: ON
Maximum Auto-Increment Save States to Keep: 10

Optional:
Don't Overwrite SaveRAM on Loading Save State: ON (see note below)

^ The above option is recommended if you are going to be using auto save/load states, because it will preserve your in-game saves when writing a new save state. This will reduce accidental overwrites of your game data, but also keep in mind that it can cause some compatibility issues with certain games (SNES in particular).

Once complete, go to the RetroArch Main Menu > Configuration File > Save Current Configuration. If your OS uses both RetroArch64 and 32 independently (like ArkOS), then you may need to do this for each RetroArch version.

Some OS options (like ROCKNIX) will place its saves in the same folder as the ROMs by default. This is convenient for offline backups, but can really wreak having on a Syncthing setup. For this reason, you’ll want to change the saving options as we see above, and then manually move any old save files from your ROM folder to the new save folder (more instructions in the ROCKNIX section).

Set up a host PC

For best results, you will want a PC host machine — it will act as “home base” for your files, and devices will sync with your PC as needed. Windows, Linux, or Mac will work fine, even an Android device or Raspberry Pi can get the job done — but for this setup we’re going to use a Windows PC.

It is also possible to set up Syncthing without a “host machine”, so you can share directly from one handheld to another, and I explain that process in the “Connecting devices to one another” section down below. But bear in mind that most of these handheld operating systems require a PC for their initial setup.

  • If you haven’t already, download and install the latest Windows release of RetroArch onto your PC. You can download the Nightly or Stable version, I prefer the Nightly version. Once installed, run the program once to populate the folders we’ll use for syncing. Additionally, go into Settings > Saving and make the recommended save state changes indicated in the section above. Once complete, you can exit out of the app.
  • Download the latest release of Syncthing for Windows. Run the exe and install the app (approve any security permissions errors you encounter). When prompted, choose to run Syncthing when Windows starts, and then choose to open the Syncthing configuration client (you can also go directly to it by typing in http://127.0.0.1:8384 or localhost:8384 in your web browser’s address bar).
  • Under the Folders menu on the left side, click on the “Add Folder” button. Let’s set up our save files first.
    • In the General tab, create a Folder Label (like “ra-saves”), and then under Folder Path, type in the location of your RetroArch saves folder. By default it will be C:\RetroArch-Win64\saves — I would recommend navigating through your C: folder just to verify. (Mac users: the default RetroArch folder will be found in your Documents folder.)
    • In the File Versioning tab, change the File Versioning to “Simple File Versioning”. This will store up to five backup versions of each file every time they are updated, in case you need to restore one of them later. Syncthing will clean these up over time, so there’s no additional work on your end.
    • That’s it, we’ve now set up the save files folder on our host machine.
  • Repeat this setup process for save states. I recommend the Folder Label “ra-states” and the folder path should be C:\RetroArch-Win64\states — all other configurations should be the same.
Note that if you used EmuDeck to set up RetroArch previously, the save file locations will be different.

Saves: C:\Users\%USERPROFILE%\emudeck\EmulationStation-DE\Emulators\RetroArch\saves
States: C:\Users\%USERPROFILE%\emudeck\EmulationStation-DE\Emulators\RetroArch\states

If you are going to set up Syncthing on other operating systems, I recommend these apps:

Throughout this guide you may get prompts from Syncthing to set up a username and password for each client, or various security vulnerability warnings associated with your handheld. For this setup we’re not going to set up any credentials, since we’re syncing save files, not banking information or precious cat photos, and our host PC is within our home network. But if you plan on using your host PC as a mobile device, for example with a laptop that you will connect to unsecured public networks (like an airport or coffee shop WiFi), then I would recommend setting up login credentials on that machine. To do so, open the host PC’s Syncthing web interface, then click on Actions > Settings. In the GUI tab, add GUI Authentication User and Password information, then click Save. This will prompt you to log in with your credentials, and provide an additional layer of security.

Set up a handheld client

Now that we have a host machine that will work as our “home base” for our saves and states, let’s connect it with a handheld. Each handheld (and OS) is a little different, and I have instructions for each down below. We’re going to use muOS in this generic example because it’s fairly simple; if you aren’t using muOS, simply head to the instructions section of your preferred OS.

  • Connect your device to your home network. In muOS, this can be found under Config > WiFi Network. Once connected, you should see a confirmation on the bottom-right of the WiFi Network screen along with your IP address (which will look like 192.168.86.XX with XX being a number assigned to your device by your router). Make note of this IP address for later.
  • Now, go to Config > Web Services > Syncthing and select ENABLE.
  • For best results, go back to the main menu and restart your device, and wait for it to reconnect with your WiFi network.

Now that you have Syncthing enabled and your IP address noted, let’s connect your device to your PC host.

  • Back on your PC, go into your web client (you can go directly to it by typing in http://127.0.0.1:8384 or localhost:8384 in your web browser). On the bottom-right side you will see a Remote Devices header: click on the “Add Remote Device” button.
    • On the following pop-up menu you should be prompted to add a device that is nearby, click on the Device ID (a string of characters).
    • Under the Device Name block, name it whatever you would like, I usually standardize it with “os-device” (as in “muos-rg35xxsp”).
    • In the Sharing tab, click on whatever folders you want to sync with the device (“ra-saves” and “ra-states” in this example), then click on the Save button.
  • Open another tab on your web browser and type in the IP address of your muOS device. After the IP address, add a colon (:) and the port number of 7070. The full address should look like http://192.168.86.XX:7070
    • Note that if this doesn’t connect with your device, try port 8384 instead of 7070. muOS uses 7070 but most others use 8384.
  • This will bring up another Syncthing web client, but this time it’s for the device and not your host PC. Now we can link the two together.
    • On this web client, you should get a banner prompt to add a new device. Click on the “Add Device” button.
    • If things go well, the Device ID and Device Name of your host PC should be pre-populated. You can change the Device Name if you’d like, but at this point you can just click the Save button.
    • After you have connected with the host PC, you’ll get two additional banner prompts to share the folders you chose earlier. Let’s do ra-saves first. Click on the Add button, and a pop-up will appear. In the Folder Path section, we need to direct it to where muOS places its RetroArch saves. Here are the locations:
Saves: 
mnt/mmc/MUOS/save/file (if using single-card setup)
mnt/sdcard/MUOS/save/file (if using two-card setup)

States:
mnt/mmc/MUOS/save/state (if using single-card setup)
mnt/sdcard/MUOS/save/state (if using two-card setup)

Note that as you type in the path (like mnt/mmc/MUOS/save/file), Syncthing has a handy dropdown prompt to show you possible folder locations.

  • That’s it, now just click on the Save button.
  • Repeat this process but with the save states folder.

Congratulations, you are now synced! Anytime either the host PC or the device makes a change in the synced folders (i.e. saves a game), these changes will be reflected on the other device. Bear in mind that because this is a peer-to-peer service, both devices need to be running Syncthing at the same time for this sync to happen.

Connecting devices to one another

In the previous sections, we connected our devices to your single host PC. This is the simplest setup — any time your host PC is running Syncthing, a device will connect to it and sync its files. This allows your PC to act as a hub for all sync activity, as well as a backup repository for your save files.

However, you can also set up Syncthing to allow devices to talk directly to one another, not just the PC host. This means that instead of relying on the host PC as a middleman to sync your files, the devices can sync among themselves (provided they are both connected via Syncthing). This is totally optional but super cool!

To set this up, make sure that both devices (which we will name DEVICE1 and DEVICE2 for this demonstration) are connected to your network and running Syncthing, and already configured to sync the same folders with the host PC.

  • Open up the web client for DEVICE1 (which will generally be http://192.168.86.XX:8384 on your web browser, with the device’s IP address).
  • On the DEVICE1 web client, click on the “Add Remote Device” button on the bottom right of your screen.
  • You should see the DEVICE2’s Device ID as a clickable link, click on that. Next, add whatever Device Name you would like.
  • In the Sharing tab, click on whatever folders you want to sync with DEVICE2, then click on the Save button.
  • Open up the web client for DEVICE2 (which will generally be http://192.168.86.XX:8384 on your web browser, with the device’s IP address).
  • You should see a banner prompt to connect to DEVICE1. Click on Add Device and then Save on the pop-up window. After that, you should get more banner prompts, for each folder that you are sharing. Simply click the Share buttons for each and everything will be set up.

Now both devices will sync with one another in addition to the host PC.

Android

This guide will work with any Android device running RetroArch, including handhelds, smartphones, and tablets. There are two easy ways to install Syncthing on Android:

  • Syncthing-Fork: this app is on the Play Store, and what we’ll be using for this setup.
  • Syncthing (official): this app is no longer on the Play Store, but you can download a version on their GitHub releases page

Once you have installed Syncthing-Fork on your device, make sure that it is connected to your WiFi.

If you haven’t already, go into RetroArch on your device and set the Settings > Saving options as recommended in the RetroArch Best Practices section above.

  • Back on your host PC, go into your web client (you can go directly to it by typing in http://127.0.0.1:8384 or localhost:8384 in your web browser). On the bottom-right side you will see a Remote Devices header: click on the “Add Remote Device” button.
    • On the following pop-up menu you should be prompted to add a device that is nearby, click on the Device ID (a string of characters).
    • Under the Device Name block, name it whatever you would like, I usually standardize it with “os-device” (as in “android-odin2”).
    • In the Sharing tab, click on whatever folders you want to sync with the device (“ra-saves” and “ra-states” in this example), then click on the Save button.
  • On your Android device, swipe down from the top to bring up the notifications tray. You should see a Syncthing notification that your host PC wants to connect to your device. Tap on the small arrow on the right side to bring up an “Accept/Ignore” option menu, tap on “Accept”. You’ll get a window pop-up with options to change the name of your PC; otherwise, tap on the “Create” button on the top-right.
  • Swipe down again from the top to bring up the notifications tray, and now you should see new Syncthing notifications asking you to accept connections from the host PC for the folders you specified earlier (“ra-saves” and “ra-states”). Tap on one of those notifications (let’s do “ra-saves” first) and “Accept” the connection, and then in the pop-up window you will see an option for a folder icon and the word Directory. Tap on that and then navigate to the location of your RetroArch saves folder. Here are the standard locations on Android:
Saves: Device root directory > RetroArch > saves
States: Device root directory > RetroArch > states
  • Once you have navigated to your saves folder, tap on “Use this Folder” and accept any permissions requests. Once back in the pop-up window, tap on the “Create” button on the top-right.
  • Do the same thing with the ra-states notification in your notification tray, and you are all synced.

Battery tips for running on Android: Because Syncthing will run constantly on your Android device, it can impact your battery life more than on other devices. Here are some tips to find the best balance between syncing and battery performance:

  • Go to Settings > Syncthing Options and set the following:
    • Global discovery: OFF
    • Enable Relaying: OFF
    • Note: if you plan on accessing Syncthing outside of your home network (which is possible!), then leave these two settings ON.
  • Go to Settings > Run Conditions and set the following:
    • Run on mobile data > OFF
    • Run without network connection > OFF
    • Run according to time schedule > ON (see note below)
    • Duration of the sync cycle: 5 minutes

With these settings, the device will only run Syncthing once per hour, for five minutes at a time. This will delay the sync process, so you won’t have instantaneous syncing, but it will drastically improve your battery life. Bear in mind that this will require your host PC to be running during that five-minute period when Syncthing runs on your Android device.

If you would like to manually sync (say for example right after a handheld gaming session and you’re ready to play on another device), open up the Syncthing-Fork app, then go to the STATUS tap and tap on “FORCE START / IGNORE RUN CONDITIONS”. This will turn on Syncthing and sync your files; after it’s complete, you can then tap on “FOLLOW RUN CONDITIONS” to go back to the sync-once-per-hour setup. Here are some more battery life tips.

Note that syncing saves from other emulator apps on Android can be problematic, because most of them save their data within the Android file system, which Syncthing cannot access without rooting your device first. Long story short: if the emulator allows you to choose where to put your app data (like PPSSPP or Lime3DS) then you can set it up with Syncthing. For others (Iike Duckstation and Dolphin) you won’t be able to without rooting your Android device.

ROCKNIX (and JELOS)

This setup guide will work for both ROCKNIX and its predecessor, JELOS.

The way that ROCKNIX is configured is unique — its save files are saved in the same folder as your ROMs, and the save states are saved in their own folder in the main ROMs directory. This setup give you easy offline access to those save files, and works really well when connecting between multiple devices running ROCKNIX, since they use the same file structure. But I have found that if you want to use Syncthing on ROCKNIX (or JELOS) with other devices running different operating systems, your best bet is to only in-game sync save files and not save states, because the save state organization isn’t really compatible with the other contemporary OS options out there.

Update RetroArch save location:

To get ROCKNIX in-game saves to work nicely with other devices on other operating systems, we are going to standardize the RetroArch saves location and manually move over any save files you want to preserve in their new location.

  • In the main ROCKNIX menu, navigate to Tools > RetroArch (64-bit) to open RetroArch
  • Navigate to Settings > Saving and make the following changes:
Sort Saves into Folders by Core Name: ON
Write Saves to Content Directory: OFF

(all other options should be off by default)
  • Navigate to the RetroArch main menu > Configuration File > Save Current Configuration, then exit out of RetroArch.

Enable and configure Syncthing:

  • In the ROCKNIX main menu, navigate to Network Settings
  • Connect to your local WiFi if you haven’t already, and make note of your IP address
  • Navigate down to Cloud Services > Enable Syncthing and turn it ON
  • Return to the ROCKNIX main menu and select System Settings
  • To make setting up easier, turn Rotate Root Password to OFF and then create a memorable root password.
  • Restart your device to make sure all configurations are properly saved and enabled.
  • Back on your PC, go into your web client (you can go directly to it by typing in http://127.0.0.1:8384 or localhost:8384 in your web browser). On the bottom-right side you will see a Remote Devices header: click on the “Add Remote Device” button.
    • On the following pop-up menu you should be prompted to add a device that is nearby, click on the Device ID (a string of characters).
    • Under the Device Name block, name it whatever you would like, I usually standardize it with “os-device” (as in “rocknix-rgb30”).
    • In the Sharing tab, click on whatever folders you want to sync with the device (just “ra-saves” in this example), then click on the Save button.
  • Open another tab on your web browser and type in the IP address of your ROCKNIX device. After the IP address, add a colon (:) and the port number of 8384. The full address should look like http://192.168.86.XX:8384
  • This will bring up another Syncthing web client, but this time it’s for the device and not your host PC. It will ask you to log in, the credentials will be “root” for the username, and whatever root password you configured in the previous step.
    • Once in the ROCKNIX web client, you should get a banner prompt to add a new device. Click on the “Add Device” button.
    • If things go well, the Device ID and Device Name of your host PC should be pre-populated. You can change the Device Name if you’d like, but at this point you can just click the Save button.
    • After you have connected with the host PC, you’ll get an additional banner prompt to share the ra-saves folder you chose earlier. Click on the Add button, and a pop-up will appear. In the Folder Path section, we need to direct it to where ROCKNIX now hosts its RetroArch saves. Here is the location:
Saves: storage/.config/retroarch/saves
  • That’s it, now just click on the Save button. After a moment, your save files will be synced with the host PC.

Manually move over saves:

Now that we have set up our new saves folder, and synced our save files from Syncthing, we can manually move any ROCKNIX saves from its previous location to the new one. Bear in mind that this assumes the ROCKNIX file you are moving is your priority save file, and you want to overwrite any existing saves from other synced devices.

  • If you have any old save files you want to preserve, go to Tools > File Manager and open the app
  • Navigate to /storage/roms (it should start there by default), and then find the ROM folder of the game that has the saves you want to preserve
  • Open the ROM folder and locate the save file, then press X to bring up a context menu; choose “Copy”
  • Now, navigate to /storage/.config/retroarch/saves and find the core of whatever ROM file you are using (for example, Gambatte for GB or GBC).
  • Press the X button again to bring up the context menu, then select “Paste”. If there is an existing save file in that location, you will get prompted to overwrite the file.
  • That’s it, just repeat that for any other saves you want to transfer to Syncthing.

For more information about using Syncthing on ROCKNIX, check out their wiki page on the subject.

ArkOS

ArkOS doesn’t support Syncthing out of the box, but because it is based on Ubuntu it’s possible to set it up with a couple Terminal commands. Here is a great written guide by len0rd; note that this is a more advanced topic. If you run into any issues, there are a few solutions offered in this Reddit post, as well as in this guide from developer Sarav.

muOS

The instructions for setting up on muOS are the same as described in the handheld client section above, so I’ll simply repeat them here:

  • Connect your device to your home network. In muOS, this can be found under Config > WiFi Network. Once connected, you should see a confirmation on the bottom-right of the WiFi Network screen along with your IP address (which will look like 192.168.86.XX with XX being a number assigned to your device by your router). Make note of this IP address for later.
  • Now, go to Config > Web Services > Syncthing and select ENABLE.
  • For best results, go back to the main menu and restart your device, and wait for it to reconnect with your WiFi network.

Now that you have Syncthing enabled and your IP address noted, let’s connect your device to your PC host.

  • Back on your host PC, go into your web client (you can go directly to it by typing in http://127.0.0.1:8384 or localhost:8384 in your web browser). On the bottom-right side you will see a Remote Devices header: click on the “Add Remote Device” button.
    • On the following pop-up menu you should be prompted to add a device that is nearby, click on the Device ID (a string of characters).
    • Under the Device Name block, name it whatever you would like, I usually standardize it with “os-device” (as in “muos-rg35xxsp”).
    • In the Sharing tab, click on whatever folders you want to sync with the device (“ra-saves” and “ra-states” in this example), then click on the Save button.
  • Open another tab on your web browser and type in the IP address of your muOS device. After the IP address, add a colon (:) and the port number of 7070. The full address should look like http://192.168.86.XX:7070
    • Note that if this doesn’t connect with your device, try port 8384 instead of 7070. muOS uses 7070 but most others use 8384.
  • This will bring up another Syncthing web client, but this time it’s for the device and not your host PC. Now we can link the two together.
    • On this web client, you should get a banner prompt to add a new device. Click on the “Add Device” button.
    • If things go well, the Device ID and Device Name of your host PC should be pre-populated. You can change the Device Name if you’d like, but at this point you can just click the Save button.
    • After you have connected with the host PC, you’ll get two additional banner prompts to share the folders you chose earlier. Let’s do ra-saves first. Click on the Add button, and a pop-up will appear. In the Folder Path section, we need to direct it to where muOS places its RetroArch saves. Here are the locations:
Saves: 
mnt/mmc/MUOS/save/file (if using single-card setup)
mnt/sdcard/MUOS/save/file (if using two-card setup)

States:
mnt/mmc/MUOS/save/state (if using single-card setup)
mnt/sdcard/MUOS/save/state (if using two-card setup)
  • That’s it, now just click on the Save button.
  • Repeat this process but with the save states folder.

KNULLI (and Batocera)

KNULLI offers Syncthing for all of the RG*XX devices (and the TrimUI Smart Pro), and it’s easy to set up. However, due to the way that saves are configured and the relatively locked-down nature of Batocera (from which KNULLI is forked), syncing its save configuration with other operating systems is problematic. For example, all saves and states are dumped into the same folder, which is contrary to the default RetroArch configuration (and how we’ve set up every other system in this guide). Instead, for the best compatibility and least amount of headaches, I recommend using Syncthing on KNULLI only with other KNULLI or Batocera devices.

Note that for KNULLI to work properly, your microSD cards must be formatted to ext4. This is done by default on KNULLI, but if you formatted to FAT32 or exFAT they won’t report changes to the filesystem, which will mess up syncing.

There is a full Syncthing setup guide available on the Batocera wiki, and this connection process will be the same with KNULLI. Here’s how to specifically set it up on handheld devices:

  • Connect your device to WiFi via the Network Settings menu. Once connected, make note of your IP address in that same menu.
  • Navigate to System Settings > Services > Syncthing > ON to enable the Syncthing service.
  • Restart your device to make sure the changes have saved and are enabled.
  • Repeat these steps for your second KNULLI or Batocera device.

Now we can connect our two devices, which we will name DEVICE1 and DEVICE2 for this portion of the guide.

  • On a PC, open up the web client for DEVICE1 (which will be http://192.168.86.XX:8384 on your web browser, with the device’s IP address that we made note of earlier).
  • Under the Folders section, click on the “Add Folder” button
  • Under Folder Label, name it “saves”, and under Folder Path, write userdata/saves, then click the Save button.
  • Back on the DEVICE1 web client main menu, click on the “Add Remote Device” button on the bottom right of your screen.
  • You should see the DEVICE2’s Device ID as a clickable link, click on that. Next, add whatever Device Name you would like.
  • In the Sharing tab, click on whatever folders you want to sync with DEVICE2 (“saves” in this case), then click on the Save button.
  • Open up the web client for DEVICE2 (which will generally be http://192.168.86.XX:8384 on your web browser, with the device’s IP address).
  • You should see a banner prompt to connect to DEVICE1. Click on Add Device and then Save on the pop-up window.
  • You’ll see another banner prompt to connect to DEVICE1’s “saves” folder. Click on the Add button and under Folder Path, type in userdata/saves and then click on the Save button.
  • The two devices should now sync with one another.

As an added bonus, these handhelds will sync directly with one another, without the need for a host PC as a middleman. You can repeat this process for any number of KNULLI or Batocera devices — handhelds, PC builds, and so on!

CrossMix OS (TrimUI Smart Pro)

This will help you get set up with Syncthing on a TrimUI Smart Pro running CrossMix OS.

To start, connect to your WiFi and then head to Apps > System Tools > Network > Display IP and make note of your device’s IP address.

Next, enable Syncthing by going to Apps > System Tools > Network > Syncthing > Enabled. Once enabled, restart your device for the best results.

Update RetroArch save location:

By default, CrossMix OS saves its RetroArch saves by content directory name (i.e. NES) instead of core name. In order to properly sync with other devices running other operating systems, we need to alter the way that RetroArch saves its games.

  • Go to Apps > RetroArch and open the app
  • Head to Settings > Saving and make changes as reflected below:
Sort Saves into Folders by Core Name: ON
Sort Save States into Folders by Core Name: ON
Sort Saves into Folders by Content Directory: OFF
Sort Save States into Folder by Content Directory: OFF
Write Saves to Content Directory: OFF
Write Save States to Content Directory: OFF
Auto Save State: ON (optional)
Auto Load State: ON (optional)
Increment Save State Index Automatically: ON
Maximum Auto-Increment Save States to Keep: 10

Optional:
Don't Overwrite SaveRAM on Loading Save State: ON (see note below)

^ The above option is recommended if you are going to be using auto save/load states, because it will preserve your in-game saves when writing a new save state. This will reduce accidental overwrites of your game data, but also keep in mind that it can cause some compatibility issues with certain games (SNES in particular).
  • Back on your PC, go into your web client (you can go directly to it by typing in http://127.0.0.1:8384 or localhost:8384 in your web browser). On the bottom-right side you will see a Remote Devices header: click on the “Add Remote Device” button.
    • On the following pop-up menu you should be prompted to add a device that is nearby, click on the Device ID (a string of characters).
    • Under the Device Name block, name it whatever you would like, I usually standardize it with “os-device” (as in “crossmix-tsp”).
    • In the Sharing tab, click on whatever folders you want to sync with the device (“ra-saves” and “ra-states” in this example), then click on the Save button.
  • Open another tab on your web browser and type in the IP address of your TrimUI Smart Pro. After the IP address, add a colon (:) and the port number of 8384. The full address should look like http://192.168.86.XX:8384
    • This will bring up another Syncthing web client, but this time it’s for the device and not your host PC. When connecting, it will ask for your username (trimui) and password (trimuisync)
    • On this web client, you should get a banner prompt to add a new device. Click on the “Add Device” button.
    • If things go well, the Device ID and Device Name of your host PC should be pre-populated. You can change the Device Name if you’d like, but at this point you can just click the Save button.
    • After you have connected with the host PC, you’ll get two additional banner prompts to share the folders you chose earlier. Let’s do ra-saves first. Click on the Add button, and a pop-up will appear. In the Folder Path section, we need to direct it to where CrossMix OS places its RetroArch saves. Here are the locations:
Saves: mnt/SDCARD/RetroArch/.retroarch/saves
States: mnt/SDCARD/RetroArch/.retroarch/states
  • That’s it, now just click on the Save button.
  • Repeat this process but with the save states folder.

OnionOS (Miyoo Mini Plus)

OnionOS does not have native Syncthing support, but it can be installed manually. Here is an excellent video guide from Phyrex to help you get set up.

This app will only work on the Miyoo Mini Plus (not the original Miyoo Mini), since it has WiFi. This is also meant to run with the latest Onion v4.3.1 or later, so update if you haven’t already. For more information, here is the GitHub page for the OnionOS Syncthing client.

spruceOS (Miyoo A30)

Syncthing is natively supported on the Miyoo A30 running spruceOS.

  • Go to Settings on your device and enable WiFi, then connect to your home network
  • Once connected, make note of your device’s IP address within the Settings menu
  • On the main spruceOS menu, go to Apps > RTC and set the clock on your device to the current time.
  • Still in the Apps menu, click on the Syncthing app. It will take a moment to set up Syncthing and then return you to the Apps folder.
  • Back on your PC, go into your web client (you can go directly to it by typing in http://127.0.0.1:8384 or localhost:8384 in your web browser). On the bottom-right side you will see a Remote Devices header: click on the “Add Remote Device” button.
    • On the following pop-up menu you should be prompted to add a device that is nearby, click on the Device ID (a string of characters).
    • Under the Device Name block, name it whatever you would like, I usually standardize it with “os-device” (as in “spruce-miyooA30”).
    • In the Sharing tab, click on whatever folders you want to sync with the device (“ra-saves” and “ra-states” in this example), then click on the Save button.
  • Open another tab on your web browser and type in the IP address of your A30 device. After the IP address, add a colon (:) and the port number of 8384. The full address should look like http://192.168.86.XX:8384
    • This will bring up another Syncthing web client, but this time it’s for the device and not your host PC.
    • On this web client, you should get a banner prompt to add a new device. Click on the “Add Device” button.
    • If things go well, the Device ID and Device Name of your host PC should be pre-populated. You can change the Device Name if you’d like, but at this point you can just click the Save button.
    • After you have connected with the host PC, you’ll get two additional banner prompts to share the folders you chose earlier. Let’s do ra-saves first. Click on the Add button, and a pop-up will appear. In the Folder Path section, we need to direct it to where spruceOS places its RetroArch saves. Here are the locations:
Saves: mnt/SDCARD/Saves/saves
States: mnt/SDCARD/Saves/states
  • That’s it, now just click on the Save button.
  • Repeat this process but with the save states folder.

Some notes for spruceOS:

  • Due to the nature of the Miyoo A30 and spruceOS, some emulator cores may differ from the standard cores used with most other operating systems. A good example is SNES: spruceOS uses the Supafaust core, while most others use Snes9x. Because we are saving our game files via core name, that means that SNES cross-compatibility won’t work. Other systems, like GB/GBC and GBA, will work fine because they use the same standard Gambatte and mGBA cores, respectively.
    • You CAN manually sync the Snes9x folder with the Supafaust folder to force updates between the two. This will only work with in-game save files and not save states.
    • On the spruceOS device’s web client, click on “Add Folder” and name the Folder Label “snes-saves”; for Folder Path, choose /mnt/SDCARD/Saves/saves/Supafaust
    • Under the Sharing tab, choose your host PC and then click the Save button
    • On your host PC’s web client, you’ll get a banner notification that the MiyooA30 wants to share the snes-saves folder. Click on the Add button and under Folder Path choose C:\RetroArch-Win64\saves\Snes9x and click the Save button. Now you should be able to sync saves between the A30 and your other devices (but not save states).
    • If you run into any timezone sync issues with spruceOS, it’s recommended to set your RTC to the UTC time zone and disable WiFi Time Sync in the settings.

Windows handheld PC

Windows handhelds (like the ROG Ally X, Lenovo Legion Go, and so on) are unique because you will need to manually install Syncthing before setting it up. For this guide we are going to assume that a different PC is acting as your host PC. If you are going to use the Windows handheld as a host PC, then follow the host PC configuration instructions above.

  • On your handheld PC, download the latest release of Syncthing for Windows. Run the exe and install the app (approve any security permissions errors you encounter). When prompted, choose to run Syncthing when Windows starts, and then choose to open the Syncthing configuration client.
  • Back on your host PC, go into your web client (you can go directly to it by typing in http://127.0.0.1:8384 or localhost:8384 in your web browser). On the bottom-right side you will see a Remote Devices header: click on the “Add Remote Device” button.
    • On the following pop-up menu you should be prompted to add a device that is nearby, click on the Device ID (a string of characters).
    • Under the Device Name block, name it whatever you would like, I usually standardize it with “os-device” (as in “windows-rogally”).
    • In the Sharing tab, click on whatever folders you want to sync with the device (“ra-saves” and “ra-states” in this example), then click on the Save button
  • On your Windows handheld, open the Syncthing configuration client if you haven’t already, you can access it by typing http://127.0.0.1:8384 or localhost:8384 in your web browser.
  • On the handheld PC web client, you should get a banner prompt to add a new device. Click on the “Add Device” button.
    • If things go well, the Device ID and Device Name of your host PC should be pre-populated. You can change the Device Name if you’d like, but at this point you can just click the Save button.
    • After you have connected with the host PC, you’ll get two additional banner prompts to share the folders you chose earlier. Let’s do sa-saves first. Click on the Add button, and a pop-up will appear. In the Folder Path section, we need to direct it to where RetroArch places its saves on Windows. Here are the locations:
Saves: C:\RetroArch-Win64\saves
States: C:\RetroArch-Win64\states

Note that if you used EmuDeck to set up RetroArch previously, the save file locations will be different.

Saves: C:\Users\%USERPROFILE%\emudeck\EmulationStation-DE\Emulators\RetroArch\saves
States: C:\Users\%USERPROFILE%\emudeck\EmulationStation-DE\Emulators\RetroArch\states
  • That’s it, now just click on the Save button.
  • Repeat this process but with the save states folder.

Steam Deck

Setting up Syncthing on the Steam Deck is possible, but can get quite complicated when you start factoring in other emulators. The EmuDeck team has a full writeup on their website to help you get started, but I would consider it to be an advanced topic.

Note that the RetroArch paths on Steam Deck are located here:

/home/deck/.var/app/org.libretro.RetroArch/config/retroarch/saves
/home/deck/.var/app/org.libretro.RetroArch/config/retroarch/states

Also note that the EmuDeck team is hard at work on creating a cross-platform cloud sync solution. It’s already working pretty great on the Steam Deck, with varying degrees of success on Windows EmuDeck as well. They’re also working on a sync solution for the Miyoo Mini Plus!

Notes

  • This setup could be used with any number of standalone emulators. The trick will be to understand where each of their save files are located on your respective device, and then point them to the same location as you sync their folders. This could be done with PPSSPP, Dolphin, PCSX2, and so on.
  • Syncthing could be used with more than just save files. For example you could host your retro ROM directory on your host PC, and then sync them with each device (provided they use a similar folder structure). This means you could add and remove games from your host PC and they will be similarly updated on each device.
  • Developer Sarav has also written up a handy guide if you want to dive further into the world of Syncthing on retro devices.

Changelog

16JAN2025
– updated spruceOS notes based on feedback

30OCT2024
– updated muOS paths due to new update

13AUG2024
– fixed some typos

12AUG2024
– updates to the guide that I wasn’t able to finish in time of video release

11AUG2024
– published guide

20 thoughts on “Guide: Using Syncthing with Retro Handhelds

  1. When I’m trying to setup the saves and states folder of Retroarch within Syncthing on my PC, it fails and I get the following error messages:

    2024-08-11 22:46:51: Failed to create folder marker: mkdir \?C:Program FilesRetroArch-Win64states.stfolder: Zugriff verweigert

    2024-08-11 22:46:51: Error on folder “RA-states” (*folder ID*): folder marker missing (this indicates potential data loss, search docs/forum to get information about how to proceed)

    2024-08-11 22:46:51: Failed to create folder marker: mkdir \?C:Program FilesRetroArch-Win64saves.stfolder: Zugriff verweigert

    2024-08-11 22:46:51: Error on folder “RA-saves” (*folder ID*): folder marker missing (this indicates potential data loss, search docs/forum to get information about how to proceed)

    “Zugriff verweigert” meaning “Permission denied” (I’m using Windows in german).

    Any way to fix this?

    Still, thanks a lot, Russ, for your amazing guides!

    Like

    1. Hi I got the same error (albeit in English); in my case I uninstalled->reinstalled Syncthing just for current user only, not ‘all users.’ That seems to fixed it so hopefully it will work on yours.

      Like

    2. I had the same problem on linux. Although this fix won’t work for you I’ll say it anyways for someone else looking for this information. I also have a suggestion for a windows fix.

      Linux fix – install syncthing using apt.syncthing.net (the official) website and NOT the Snap Store.

      Windows recommendation – try giving the program administrator permission in properties.

      Like

  2. Thanks for the guide and the video, Russ! I’ve been putting this off for a couple of years and now I feel like it’s a much more approachable task.

    FYI, I just installed Crossmix v1.2.1 on my TSP, and noted that the default save path is: /RetroArch/.retroarch/saves/**RomFolderName**/**Corename**

    It might be helpful to add to the Crossmix written guide the note you made in the video, about first turning off Save By Content Directory in RA.

    Like

  3. I would love to see iOS guide as there is no Syncthing app available on AppStore.

    There is Möbius Sync (paid) app which is using open-source Syncthing engine 😅

    Like

  4. Hey Russ, great article, just for reference and maybe easier to remember

    127.0.0.1 is also known as localhost, both should work

    Like

  5. Thought: Might it be beneficial to use “Sort Saves into Folders by Content Directory” instead of “Sort Saves into Folders by Core”? It’ll require a settings change on more devices, but this should work around the issue of different devices using different cores.

    Liked by 1 person

    1. It’s definitely something I considered! I decided to keep them sorted by core because I worried that if all save files are thrown into the same content directory folder regardless of core, there might be a core whose in-game saves aren’t compatible with the other cores, which would cause a corruption across the various nodes/devices. I decided to err on the side of being overly cautious (compartmentalizing the save files by core) with the downside of some lack of cross-compatibility than to potentially corrupt someone’s save file.

      In my spruceOS section above I detail how to sync up folders from two different cores (supafaust and snes9x), since they are indeed cross-compatible — it’s a more manual process but my hope is that if anyone runs into a syncing error due to differing cores they could take that approach.

      Neither solution is perfect, and I appreciate the feedback!

      Liked by 2 people

  6. Russ, thanks for another neat guide as always.

    Syncing state-saves indeed causes problems with some systems. In my testing PC-98 (np2kai core) didn’t like it at all 😂. The game straight up complained that something was wrong with the disk, which is totally understandble since for that case save data proper is written INTO the ‘rom’ (=I used HDD image) itself hence the corruption would be inevitable.

    I am currently thinking about having RA ‘Write Save States to Content Directory’ for those specific systems (via override feature) whilst letting ST sync general “states” folder. I know you’re not exactly into computer emulation but it would be nice to hear your input if there are any other systems where syncing savestates is a no-go.

    Like

  7. Russ, I tried using syncthing on my devices and I have mixed feelings. Each emulator saves files however it likes and sometimes it is impossible to change it – because of which syncthing does not have access to this directory (I am talking about android). Of course if someone has root then everything will work. I am thinking about an initiative for emulator creators to add the ability to change the path for saves, especially for syncthing. You have the power to push, you can start talking about it loudly together with ETA Prime, MVG or Mr Sujano. You have the power – for the good of emulation.

    Like

  8. I’ve tried this a few times. It mostly works. However after the initial dump, my RG35XXSP on MuOS just gets stuck on certain files, and they never finish moving over. This causes a blockage in the pipeline, which just builds up. No idea why.

    Like

  9. Is there a list of recommended cores per system in order to standardize our selected cores on each device? It would be terrible if I chose the same core on every device only to find out it’s not ideal and that it has a serious flaw or something and then have to change it on all devices.

    Like

  10. Any way to change how Knulli or Batocera fork manages saves? I’d really like if my one Knulli device could play nice with my other systems. I don’t like the idea of getting rid of it for another system.

    Like

  11. Typing the IP I find in MuOS into safari on a Mac is not doing anything so I’m stuck. Tried both ports :7070 and :8384. No clue how to get the device ID off my RG35XXSP on MuOS. Typing localhost:8384 does open syncthings

    Like

  12. Do I need to move my save files and save state files from my Android device to my Windows PC or once I configured it, they’ll be automatically replicated from one folder to the other?

    Like

  13. wish I could get my Synology’s Syncthing to work again. I changed a setting on it and now when trying to visit the gui it says something like page cannot be found.

    Like

  14. Hi russ, you can actually reach the android folder without rooting the android device. I’ve done it by pressing the gear icon on the right side of the blank directory line. This will open a path type of navigation where you can and will be able to link the android/data/nethersx2/files/memcard for example. I was able to reach it on my Odin 2, give it a try and do update the guide after!

    Like

    1. can confirm this works on android, both with nethersx2 and dolphin. just clicked the gear option and navigated to the storage/emulated/~ and was able to sync everything from the android to the pc and vice versa perfectly fine. No root needed!

      Like

  15. Hey Papa Russ – today i found a way to add syncthing to my anbernic rg35xxH on stock Mod Os. A little bit of tinkering and SSH, change in RA save setting and directory and now my Miyoo Minis, A30s & anbernic RG35xxH are in Sync

    I’d love to see an option to add syncthing on Stock Os for the Brick

    Like

Leave a reply to Nash Cancel reply