# Shared by every platform below: same files, same destinations. _standalone_copies: &standalone_copies # Switch emulators (keys) - file: prod.keys targets: linux: - $HOME/.local/share/yuzu/keys - $HOME/.local/share/eden/keys - $HOME/.local/share/citron/keys - $HOME/.local/share/suyu/keys - $HOME/.var/app/dev.eden_emu.eden/data/eden/keys - $HOME/.config/Ryujinx/system - $HOME/.var/app/io.github.ryubing.Ryujinx/config/Ryujinx/system windows: - '%APPDATA%\yuzu\keys' - '%APPDATA%\eden\keys' - '%APPDATA%\citron\keys' - '%APPDATA%\suyu\keys' - '%APPDATA%\Ryujinx\system' darwin: - $HOME/Library/Application Support/yuzu/keys - $HOME/Library/Application Support/Ryujinx/system - file: title.keys targets: linux: - $HOME/.local/share/yuzu/keys - $HOME/.local/share/eden/keys - $HOME/.local/share/citron/keys - $HOME/.local/share/suyu/keys - $HOME/.var/app/dev.eden_emu.eden/data/eden/keys windows: - '%APPDATA%\yuzu\keys' - '%APPDATA%\eden\keys' - '%APPDATA%\citron\keys' - '%APPDATA%\suyu\keys' darwin: - $HOME/Library/Application Support/yuzu/keys # 3DS emulators - file: Citra/sysdata/aes_keys.txt targets: linux: - $HOME/.local/share/azahar-emu/sysdata - $HOME/.var/app/org.azahar_emu.Azahar/data/azahar-emu/sysdata windows: - '%APPDATA%\Azahar\sysdata' # common_paths.h:36,61 (azahar 987f1840). darwin: - $HOME/Library/Application Support/Azahar/sysdata - file: Citra/sysdata/boot9.bin targets: linux: - $HOME/.local/share/azahar-emu/sysdata - $HOME/.var/app/org.azahar_emu.Azahar/data/azahar-emu/sysdata windows: - '%APPDATA%\Azahar\sysdata' # common_paths.h:36,61 (azahar 987f1840). darwin: - $HOME/Library/Application Support/Azahar/sysdata # DuckStation (PS1) - pattern: 'scph*.bin' targets: linux: - $HOME/.local/share/duckstation/bios - $HOME/.var/app/org.duckstation.DuckStation/config/duckstation/bios windows: - '%LOCALAPPDATA%\DuckStation\bios' - '%USERPROFILE%\Documents\DuckStation\bios' darwin: - $HOME/Library/Application Support/DuckStation/bios # PCSX2 (PS2) - pattern: 'ps2-*.bin' emulator: pcsx2 targets: linux: - $HOME/.config/PCSX2/bios - $HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios windows: - '%USERPROFILE%\Documents\PCSX2\bios' darwin: - $HOME/Library/Application Support/PCSX2/bios # RPCS3 (PS3) - needs menu install - note: 'PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.' detect: linux: - $HOME/.config/rpcs3 - $HOME/.var/app/net.rpcs3.RPCS3/config/rpcs3 windows: - '%APPDATA%\rpcs3' # Dolphin (GameCube) - file: GC/USA/IPL.bin emulator: dolphin targets: linux: - $HOME/.local/share/dolphin-emu/GC/USA - $HOME/.var/app/org.DolphinEmu.dolphin-emu/data/dolphin-emu/GC/USA windows: - '%APPDATA%\Dolphin Emulator\GC\USA' darwin: - $HOME/Library/Application Support/Dolphin/GC/USA - file: GC/EUR/IPL.bin emulator: dolphin targets: linux: - $HOME/.local/share/dolphin-emu/GC/EUR - $HOME/.var/app/org.DolphinEmu.dolphin-emu/data/dolphin-emu/GC/EUR windows: - '%APPDATA%\Dolphin Emulator\GC\EUR' darwin: - $HOME/Library/Application Support/Dolphin/GC/EUR - file: GC/JAP/IPL.bin emulator: dolphin targets: linux: - $HOME/.local/share/dolphin-emu/GC/JAP - $HOME/.var/app/org.DolphinEmu.dolphin-emu/data/dolphin-emu/GC/JAP windows: - '%APPDATA%\Dolphin Emulator\GC\JAP' darwin: - $HOME/Library/Application Support/Dolphin/GC/JAP - file: dsp_rom.bin emulator: dolphin targets: linux: - $HOME/.local/share/dolphin-emu - $HOME/.var/app/org.DolphinEmu.dolphin-emu/data/dolphin-emu windows: - '%APPDATA%\Dolphin Emulator' darwin: - $HOME/Library/Application Support/Dolphin - file: dsp_coef.bin emulator: dolphin targets: linux: - $HOME/.local/share/dolphin-emu - $HOME/.var/app/org.DolphinEmu.dolphin-emu/data/dolphin-emu windows: - '%APPDATA%\Dolphin Emulator' darwin: - $HOME/Library/Application Support/Dolphin # PPSSPP - file: PPSSPP/ppge_atlas.zim targets: linux: - $HOME/.config/ppsspp/PSP/SYSTEM - $HOME/.var/app/org.ppsspp.PPSSPP/config/ppsspp/PSP/SYSTEM windows: - '%USERPROFILE%\Documents\PPSSPP\PSP\SYSTEM' darwin: - $HOME/Library/Application Support/PPSSPP/PSP/SYSTEM # Flycast (Dreamcast) - file: dc/dc_boot.bin targets: linux: - $HOME/.local/share/flycast/data - $HOME/.var/app/org.flycast.Flycast/data/flycast windows: - '%APPDATA%\flycast\data' # shell/apple/emulator-osx/emulator-osx/osx-main.mm:83-101 (flycast 6bb0fc3e). darwin: - $HOME/Library/Application Support/Flycast/data # /data/ (shell/android-studio/flycast/src/main/jni/src/Android.cpp: # 143-159, flycast a9bd1c74), writable from Termux up to Android 10. android: - $EXTERNAL_STORAGE/Android/data/com.flycast.emulator/files/data - file: dc/dc_nvmem.bin targets: linux: - $HOME/.local/share/flycast/data - $HOME/.var/app/org.flycast.Flycast/data/flycast windows: - '%APPDATA%\flycast\data' # shell/apple/emulator-osx/emulator-osx/osx-main.mm:83-101 (flycast 6bb0fc3e). darwin: - $HOME/Library/Application Support/Flycast/data # /data/ (shell/android-studio/flycast/src/main/jni/src/Android.cpp: # 143-159, flycast a9bd1c74), writable from Termux up to Android 10. android: - $EXTERNAL_STORAGE/Android/data/com.flycast.emulator/files/data platforms: retroarch: config: retroarch.yml status: active device_group: computer extract_to: system/ logo: https://raw.githubusercontent.com/libretro/RetroArch/master/media/retroarch-vector_invader-only.svg scraper: libretro source_url: https://raw.githubusercontent.com/libretro/libretro-database/master/dat/System.dat source_format: clrmamepro_dat hash_type: sha1 verification_mode: existence base_destination: system # The directory RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY returns # (runloop.c:2699-2700, libretro/RetroArch a81e450c): savefile_directory, # saves/ beside system/ by default (platform_unix.c:3364-3365, # platform_win32.c:1343, platform_darwin.m:456), with the core's # library_name appended since sort_savefiles_enable defaults to true # (config.def.h:1099, runloop.c:11285-11293). save_directory: folder: saves by_core: true case_insensitive_fs: true schedule: weekly cores: all_libretro target_scraper: retroarch_targets target_source: https://buildbot.libretro.com/nightly/ install: detect: - os: linux method: config_file config: $HOME/.var/app/org.libretro.RetroArch/config/retroarch/retroarch.cfg parse_key: system_directory - os: linux method: config_file config: $HOME/snap/retroarch/current/.config/retroarch/retroarch.cfg parse_key: system_directory - os: linux method: config_file config: $HOME/.config/retroarch/retroarch.cfg parse_key: system_directory # configuration.c reads /RetroArch/config, and a value # left at default is ~/Documents/RetroArch/system (platform_darwin.m). # Older builds kept the file one level up. - os: darwin method: config_file config: $HOME/Library/Application Support/RetroArch/config/retroarch.cfg parse_key: system_directory bios_path: $HOME/Documents/RetroArch/system - os: darwin method: config_file config: $HOME/Library/Application Support/RetroArch/retroarch.cfg parse_key: system_directory bios_path: $HOME/Documents/RetroArch/system # Beside retroarch.exe first, then %APPDATA%; default \system. # The folders its installers, Steam and ES-DE put it in. - os: windows method: config_file config: 'C:\RetroArch-Win64\retroarch.cfg' parse_key: system_directory - os: windows method: config_file config: 'C:\RetroArch\retroarch.cfg' parse_key: system_directory - os: windows method: config_file config: '%ProgramFiles%\RetroArch-Win64\retroarch.cfg' parse_key: system_directory - os: windows method: config_file config: '%ProgramFiles%\RetroArch\retroarch.cfg' parse_key: system_directory - os: windows method: config_file config: '%ProgramFiles%\ES-DE\Emulators\RetroArch-Win64\retroarch.cfg' parse_key: system_directory - os: windows method: config_file config: '%ProgramFiles%\ES-DE\Emulators\RetroArch\retroarch.cfg' parse_key: system_directory - os: windows method: config_file config: '%ProgramFiles(x86)%\RetroArch-Win64\retroarch.cfg' parse_key: system_directory - os: windows method: config_file config: '%ProgramFiles(x86)%\RetroArch\retroarch.cfg' parse_key: system_directory - os: windows method: config_file config: '%ProgramFiles(x86)%\ES-DE\Emulators\RetroArch-Win64\retroarch.cfg' parse_key: system_directory - os: windows method: config_file config: '%ProgramFiles(x86)%\ES-DE\Emulators\RetroArch\retroarch.cfg' parse_key: system_directory - os: windows method: config_file config: '%APPDATA%\RetroArch\retroarch.cfg' parse_key: system_directory - os: windows method: config_file config: '%ProgramFiles(x86)%\Steam\steamapps\common\RetroArch\retroarch.cfg' parse_key: system_directory - os: windows method: config_file config: '%ProgramFiles%\Steam\steamapps\common\RetroArch\retroarch.cfg' parse_key: system_directory # Handheld systems that run RetroArch as their frontend, each found by # what its own build writes. A system built on another (derives_from) # matches both and is the one meant. # muOS: MustardOS/internal f41f4a89: retroarch.sh:8-20, bind.sh:4,116-150, # retroarch.default.cfg:2806,3151. /mnt/mmc/MUOS is the older layout. - os: linux name: muOS method: file_exists file: /opt/muos bios_path: /run/muos/storage/bios config: [/opt/muos/share/info/config/retroarch.cfg, /opt/muos/share/emulator/retroarch/retroarch.default.cfg] - os: linux name: muOS method: file_exists file: /mnt/mmc/MUOS bios_path: /mnt/mmc/MUOS/bios # JELOS: JustEnoughLinuxOS/distribution 7b2e116c scripts/image:118-120, # options:17, runemu.sh:37, RK3566/retroarch.cfg:716. - os: linux name: JELOS method: os_release match: [OS_NAME=JELOS] bios_path: /storage/roms/bios config: [/storage/.config/retroarch/retroarch.cfg] home: /storage # KOLOS: AnonLinuxOS/KOLOS 7daf5950: OS_NAME=JELOS kept, jelos-ready.service # ("KOLOS system ready script") installed by scripts/install:100-102. - os: linux name: KOLOS method: file_exists file: /usr/lib/systemd/system/jelos-ready.service bios_path: /storage/roms/bios config: [/storage/.config/retroarch/retroarch.cfg] home: /storage derives_from: JELOS # UnofficialOS: RetroGFX/UnofficialOS 22635796 scripts/image:119-120, options:17, # packages/unofficialos/sources/scripts/runemu.sh:37. - os: linux name: UnofficialOS method: os_release match: [OS_NAME=UnofficialOS] bios_path: /storage/roms/bios config: [/storage/.config/retroarch/retroarch.cfg] home: /storage # ArchR: archr-linux/Arch-R dbd45d45 scripts/image:164-177, options:17, # factoryreset:9-10, RK3326/retroarch.cfg:718. - os: linux name: ArchR method: os_release match: [OS_NAME=ArchR] bios_path: /storage/roms/bios config: [/storage/.config/retroarch/retroarch.cfg] home: /storage # ArkOS: christianhaitian/arkos dedf4278 Update-RGB10.sh:76 (splash title). # Both configs move to /roms2 with "Switch to SD2 for Roms" (darkos # daecf488, scripts/Switch to SD2 for Roms.sh:91-92). - os: linux name: ArkOS method: file_exists file: [/home/ark, /opt/system] bios_path: /roms/bios config: [/home/ark/.config/retroarch/retroarch.cfg, /home/ark/.config/retroarch32/retroarch.cfg] - os: linux name: ArkOS method: file_matches file: /usr/share/plymouth/themes/text.plymouth pattern: '^title=\s*ArkOS\b' bios_path: /roms/bios config: [/home/ark/.config/retroarch/retroarch.cfg, /home/ark/.config/retroarch32/retroarch.cfg] # dArkOS: christianhaitian/darkos daecf488 finishing_touches.sh:359-361, # retroarch.cfg.rgb10:3043. The dArkOSRE, dArkOSen and ArkOS4Clone overlays # keep the title. - os: linux name: dArkOS method: file_matches file: /usr/share/plymouth/themes/text.plymouth pattern: '^title=\s*dArkOS' bios_path: /roms/bios config: [/home/ark/.config/retroarch/retroarch.cfg, /home/ark/.config/retroarch32/retroarch.cfg] derives_from: ArkOS # RetroOZ: RetroOZ 0.60 image: splash title, /opt/.retrooz/version, # retroarch32/retroarch.cfg:3046. /etc/retrooz_version is the file PortMaster # reads (PortMaster-GUI ccea6b74, PortMaster/device_info.txt:95). - os: linux name: RetroOZ method: file_matches file: /usr/share/plymouth/themes/text.plymouth pattern: '^title=\s*RetroOZ' bios_path: /roms/bios config: [/home/odroid/.config/retroarch/retroarch.cfg, /home/odroid/.config/retroarch32/retroarch.cfg] - os: linux name: RetroOZ method: file_exists file: /opt/.retrooz bios_path: /roms/bios config: [/home/odroid/.config/retroarch/retroarch.cfg, /home/odroid/.config/retroarch32/retroarch.cfg] - os: linux name: RetroOZ method: file_exists file: /etc/retrooz_version bios_path: /roms/bios config: [/home/odroid/.config/retroarch/retroarch.cfg, /home/odroid/.config/retroarch32/retroarch.cfg] # spruceOS: spruceOS 824b1aae spruce/scripts/helperFunctions.sh:157-165, # RetroArch/platform/retroarch-Brick.cfg.bak:3279. - os: linux name: spruceOS method: file_exists file: /mnt/SDCARD/spruce bios_path: /mnt/SDCARD/BIOS config: ['/mnt/SDCARD/Saves/ra-configs/retroarch-*.cfg'] derives_from: TrimUI # CrossMix-OS: cizia64/CrossMix-OS 206d612f System/usr/trimui/scripts/ # update_common.sh:20, patch_ra_cfg.sh:5, RetroArch/retroarch.cfg:3202. - os: linux name: CrossMix-OS method: file_exists file: /mnt/SDCARD/System/usr/trimui/crossmix-version.txt bios_path: /mnt/SDCARD/BIOS config: [/mnt/SDCARD/RetroArch/retroarch.cfg] derives_from: TrimUI # Onion: OnionUI/Onion 07505ea5 Makefile:75-76, # .tmp_update/script/patch_ra_cfg.sh:6, retroarch.cfg:3009. - os: linux name: Onion method: file_exists file: /mnt/SDCARD/.tmp_update/onionVersion/version.txt bios_path: /mnt/SDCARD/BIOS config: [/mnt/SDCARD/RetroArch/.retroarch/retroarch.cfg] # Allium: goweiwen/Allium ee0dda97 crates/common/src/constants.rs:19-34, # launch_without_savestate_auto_load.sh:2-7. Its RetroArch patch makes # $ROOT/BIOS the default system folder. - os: linux name: Allium method: file_exists file: /mnt/SDCARD/.allium bios_path: /mnt/SDCARD/BIOS config: [/mnt/SDCARD/RetroArch/.retroarch/retroarch.cfg] # Koriki: Rparadise-Team/Koriki 8513071c src/systemInfo/main.c:106, # .tmp_update/runtime.sh:271, RetroArch/.retroarch/retroarch.cfg:3191. - os: linux name: Koriki method: file_exists file: /mnt/SDCARD/Koriki/version.txt bios_path: /mnt/SDCARD/BIOS config: [/mnt/SDCARD/RetroArch/.retroarch/retroarch.cfg] # MiyooCFW: MiyooCFW buildroot d5912eeb board/miyoo/rootfs/etc/main:4 (HOME), # package/miyoo/miyoo-ctl/miyoo-ctl.mk:12. DINGUX RetroArch defaults to # $HOME/.retroarch/system. - os: linux name: MiyooCFW method: file_exists file: [/etc/main, /usr/bin/miyooctl] bios_path: /mnt/.retroarch/system config: [/mnt/.retroarch/retroarch.cfg] home: /mnt # plumOS: game-de-it/plumOS-pixel2_v2 dec872c0 rootfs/pixel2/etc/os-release:2, # sbin/init:29, plumos-retroarch-launch:342. Other plumOS builds append a # folder of their own at launch (plumOS-MF 0095017c, # plumos-retroarch-launch:15): found, not installed to. - os: linux name: plumOS method: file_exists file: /mnt/plumos-user bios_path: /mnt/plumos-user/bios - os: linux name: plumOS method: os_release match: [ID=plumos] # TrimUI: the stock firmware publishes no source naming its BIOS folder. # /usr/trimui is where PortMaster finds its libraries # (trimui/launch_hooks.txt:37). Found so that what runs on it is told # apart, never installed to. - os: linux name: TrimUI method: file_exists file: /usr/trimui installs: false # MinUI: MinUI dbf89435 workspace/all/common/defines.h:14-16, minarch.c:2942. # One Bios// folder per core, not written by the installer. - os: linux name: MinUI method: file_exists file: /mnt/SDCARD/.system/res installs: false derives_from: TrimUI - os: linux name: MinUI method: file_exists file: /mnt/sdcard/.system/res installs: false derives_from: TrimUI # Anbernic stock firmware: the stock Linux of Anbernic devices. - os: linux name: 'Anbernic stock firmware' method: file_exists file: /mnt/vendor/bin/dmenu.bin bios_path: /mnt/mmc/bios standalone_copies: *standalone_copies batocera: config: batocera.yml status: active device_group: gaming-os extract_to: /userdata/bios/ logo: https://raw.githubusercontent.com/batocera-linux/batocera-emulationstation/master/resources/splash_batocera.svg scraper: batocera source_url: https://raw.githubusercontent.com/batocera-linux/batocera.linux/master/package/batocera/core/batocera-scripts/scripts/batocera-systems source_format: python_dict hash_type: md5 # configgen hands each libretro core /userdata/saves/ at every # launch, with sort_savefiles_enable off (package/batocera/core/ # batocera-configgen/configgen/configgen/generators/libretro/ # libretroConfig.py:225-228 and batoceraPaths.py:22 at batocera-43.1). # is the ES system name (Emulator.py:119, args.system), so a # file is placed once below each system es_systems.yml offers the core # for (libretro_systems in batocera.yml). The pack keeps them in # userdata-saves/: batocera-systems lists bios/saves/dolphin-emu/ # Triforce/segaboot.gcm, so saves/ already belongs to the BIOS tree. save_directory: folder: saves by_core: false by_system: true pack_folder: userdata-saves schedule: weekly target_scraper: batocera_targets target_source: https://github.com/batocera-linux/batocera.linux install: detect: # batocera.linux 38845725, package/batocera/core/batocera-system/ # batocera-system.mk:21-22 writes batocera.arch and batocera.version. - os: linux name: Batocera method: file_exists file: /usr/share/batocera/batocera.version bios_path: /userdata/bios standalone_copies: *standalone_copies recalbox: config: recalbox.yml status: active device_group: gaming-os extract_to: /recalbox/share/bios/ logo: https://raw.githubusercontent.com/homarr-labs/dashboard-icons/main/svg/recalbox.svg scraper: recalbox source_url: https://gitlab.com/recalbox/recalbox/-/raw/master/board/recalbox/fsoverlay/recalbox/share_init/system/.emulationstation/es_bios.xml source_format: xml hash_type: md5 # Bios.cpp:64-68 hashes a .zip with Zip::Md5Composite, never its bytes zip_digest: composite # configgen hands each libretro core /recalbox/share/saves/ at # every launch, with sort_savefiles_enable off (projects/configgen/ # configgen/generators/libretro/libretroRetroarch.py:338, 347-348 and # 419-420, recalboxFiles.py:84 at 10.1.1). is the name the # system.ini gives, so a file is placed once below each system offering # the core (libretro_systems in recalbox.yml). save_directory: folder: saves by_core: false by_system: true schedule: monthly target_scraper: recalbox_targets target_source: https://gitlab.com/recalbox/recalbox/-/tree/master/configs install: detect: - os: linux name: Recalbox method: file_exists file: /recalbox/recalbox.version bios_path: /recalbox/share/bios - os: linux name: Recalbox method: file_exists file: /usr/bin/recalbox-settings bios_path: /recalbox/share/bios standalone_copies: *standalone_copies retrobat: config: retrobat.yml status: active device_group: computer extract_to: bios/ logo: https://raw.githubusercontent.com/RetroBat-Official/retrobat/main/system/resources/retrobat_logo_notext.png scraper: retrobat source_url: https://raw.githubusercontent.com/RetroBat-Official/emulatorlauncher/master/batocera-systems/Resources/batocera-systems.json source_format: json hash_type: md5 # Windows: names differing only by case land on one file. case_insensitive_fs: true # emulatorLauncher hands each libretro core saves\ at every # launch, saves\ beside bios\ (emulatorLauncher.cfg in retrobat 8.3.1), # and sorts saves by core for dolphin alone (CoreSaveSort) # (emulatorLauncher/Generators/LibRetro.Generator.cs:1128-1132, 1304-1315 # and 2707 at 48cdc616). is the ES system name, so a file is # placed once below each system es_systems.cfg offers the core for # (libretro_systems in retrobat.yml). mame (saves\) and amiberry # (saves\\LR-amiberry) differ, and neither profile has a file # read below the save directory. save_directory: folder: saves by_core: false by_system: true by_core_for: [dolphin] schedule: weekly target_scraper: null target_source: null install: detect: # RetroBat.exe writes its own folder there on every start, wherever it # was installed (retrobat-executable 702da66a, # RetroBat/RetroBat/Program.cs:57 and 99, RegistryTools.cs:15-50). - os: windows method: registry key: 'HKCU\SOFTWARE\RetroBat' value: LatestKnownInstallPath bios_subdir: bios # installer.iss: DefaultDirName=C:\RetroBat, the first place to look. - os: windows method: path_exists path: 'C:\RetroBat\bios' - os: windows method: path_exists path: '%USERPROFILE%\RetroBat\bios' standalone_copies: *standalone_copies emudeck: config: emudeck.yml status: active device_group: computer extract_to: ~/Emulation/bios/ logo: https://raw.githubusercontent.com/dragoonDorise/EmuDeck/main/icons/EmuDeck.png scraper: emudeck source_url: https://raw.githubusercontent.com/dragoonDorise/EmuDeck/main/functions/checkBIOS.sh source_wiki: https://raw.githubusercontent.com/EmuDeck/emudeck.github.io/main/docs/tables/ source_format: bash_script+csv hash_type: md5 # Windows: names differing only by case land on one file. case_insensitive_fs: true # RetroArch_setupSaves points savefile_directory at # $savesPath/retroarch/saves (functions/EmuScripts/emuDeckRetroArch.sh:236 # at dddb3022), savesPath ~/Emulation/saves beside biosPath # ~/Emulation/bios (functions/helperFunctions.sh:347-348). The shipped # retroarch.cfg turns savefiles_in_content_dir and both sort options off # (configs/org.libretro.RetroArch/config/retroarch/retroarch.cfg:3135, # 3176-3177): one folder for every core. save_directory: folder: saves/retroarch/saves by_core: false schedule: weekly target_scraper: emudeck_targets target_source: https://github.com/dragoonDorise/EmuDeck install: detect: - os: linux method: config_file config: $HOME/.config/EmuDeck/settings.sh parse_key: emulationPath bios_subdir: bios - os: linux method: path_exists path: $HOME/Emulation/bios # functions/all.sh:3-4,24 and vars.sh:2 (EmuDeck dddb3022): the macOS # build reads the same settings.sh, emulationPath=~/Emulation by # default (settings.sh:79). - os: darwin method: config_file config: $HOME/.config/EmuDeck/settings.sh parse_key: emulationPath bios_subdir: bios - os: darwin method: path_exists path: $HOME/Emulation/bios # functions/all.ps1:4-14 (emudeck-we 037460ef): the APPDATA settings, # else the profile ones, and C:\Emulation when neither names a folder. - os: windows method: config_file config: '%APPDATA%\EmuDeck\settings.ps1' parse_key: $emulationPath bios_subdir: bios - os: windows method: config_file config: '%USERPROFILE%\EmuDeck\settings.ps1' parse_key: $emulationPath bios_subdir: bios standalone_copies: *standalone_copies lakka: config: lakka.yml status: active device_group: gaming-os extract_to: /storage/system/ logo: https://raw.githubusercontent.com/libretro/retroarch-assets/master/src/xmb/flatui/lakka.svg scraper: libretro inherits_from: retroarch cores: all_libretro # Lakka's retroarch.cfg sets savefile_directory to /storage/savefiles, # beside /storage/system, and sorts saves by core # (packages/lakka/retroarch_base/retroarch/config/retroarch.cfg:3164-3165 # and 3206-3207, libretro/Lakka-LibreELEC cc3bf85d). save_directory: folder: savefiles by_core: true # Lakka is a Linux distribution: two names that differ by case are two # files there, not the one RetroArch's Windows and macOS builds see. case_insensitive_fs: false schedule: weekly # Lakka builds its cores per device image: libretro_cores/package.mk # excludes cores by PROJECT, DEVICE and OpenGL ES. target_scraper: lakka_targets target_source: https://github.com/libretro/Lakka-LibreELEC/blob/master/packages/lakka/libretro_cores/package.mk install: detect: - os: linux name: Lakka method: os_release match: [ID=lakka] bios_path: /storage/system retrodeck: config: retrodeck.yml status: active device_group: computer extract_to: ~/retrodeck/ logo: https://raw.githubusercontent.com/RetroDECK/RetroDECK/main/res/icon.svg scraper: retrodeck source_url: https://github.com/RetroDECK/components source_format: github_component_manifests hash_type: md5 # savefile_directory is $saves_path, ~/retrodeck/saves beside # ~/retrodeck/bios (retroarch/component_prepare.sh:27 and 44 at # components fcd0d729), and RetroArch sorts saves by content, not by # core (retroarch/rd_assets/rd_config/retroarch.cfg:3233-3234 and # 3275-3276). RetroArch 1.22.2 appends the name of the folder holding # the ROM (runloop.c:8205-8209 and 8249-8258 at 69a4f0ea): saves/ for a ROM at the top of its system folder, the folder of each # system whose ES-DE command loads the core (libretro_systems in # retrodeck.yml, from RetroDECK/ES-DE resources/systems/linux/ # es_systems.xml at 15e1b236, the release RetroDECK takes as latest). save_directory: folder: saves by_core: false by_system: true schedule: monthly contributed_by: - username: monster-penguin contribution: platform support pr: 36 target_scraper: null target_source: null install: detect: # retrodeck.json since the cfg-to-json migration (global.sh:149-153), # retrodeck.cfg before it. A home moved to an SD card lives only there. - os: linux method: config_file config: $HOME/.var/app/net.retrodeck.retrodeck/config/retrodeck/retrodeck.json parse_key: paths.rd_home_path bios_path: $HOME/retrodeck - os: linux method: config_file config: $HOME/.var/app/net.retrodeck.retrodeck/config/retrodeck/retrodeck.cfg parse_key: rdhome bios_path: $HOME/retrodeck - os: linux method: path_exists path: $HOME/.var/app/net.retrodeck.retrodeck bios_path: $HOME/retrodeck standalone_copies: *standalone_copies romm: config: romm.yml status: active device_group: server extract_to: library/bios/ logo: https://avatars.githubusercontent.com/u/164058018 scraper: romm source_url: https://raw.githubusercontent.com/rommapp/romm/master/backend/models/fixtures/known_bios_files.json source_format: json hash_type: sha1 # Cores run in the browser through EmulatorJS: the save file lives in # the Emscripten filesystem and goes through RomM's save API # (frontend/src/views/Player/EmulatorJS/utils.ts:409-426 at 5.4.0). # Nothing a user installs reaches it. save_directory: null schedule: monthly contributed_by: - username: PixNyb contribution: platform support pr: 37 inherits_from: emulatorjs # RomM lists a firmware folder without descending into it # (backend/handler/filesystem/base_handler.py:1002, recursive=False), and # EmulatorJS writes the chosen file, or each member of a zip, under its # bare name (data/src/emulator.js:713-722). A file below the platform # folder never reaches a core. firmware_folder_flat: true target_scraper: null target_source: null install: detect: - os: linux method: path_exists path: /romm/library/bios # RomM 5.4 places firmware by filesystem.structure.firmware in this # file, relative to /romm/library (rommapp/romm 5.4.0, # backend/config/config_manager.py:58,101-109,264-265,564-568): a # {platform}/bios library has no library/bios to find. - os: linux method: path_exists path: /romm/config/config.yml bios_path: /romm/library/bios cores: - atari800 - clk - directxbox - dolphin - dolphin_launcher - ecwolf - ep128emu - ep128emu_core - freej2me - hatari - ishiiruka - lrps2 - minivmac - nekop2 - np2kai - o2em - pcsx2 - play - pokemini - primehack - px68k - scummvm - squirreljme - x1 - xemu rocknix: config: rocknix.yml status: active device_group: handheld extract_to: /storage/roms/bios/ logo: https://avatars.githubusercontent.com/u/163176886 scraper: rocknix # Every device's retroarch.cfg sets savefiles_in_content_dir (for # instance projects/ROCKNIX/packages/emulators/libretro/retroarch/ # sources/RK3566/retroarch.cfg:664-665 at 20261001) and setsettings.sh # leaves it: saves sit beside each game, no single place. save_directory: null schedule: weekly target_scraper: rocknix_targets target_source: https://github.com/ROCKNIX/distribution/blob/next/projects/ROCKNIX/packages/virtual/emulators/package.mk install: detect: - os: linux name: ROCKNIX method: os_release match: [OS_NAME=rocknix, ID=rocknix] bios_path: /storage/roms/bios # AmberELEC's checker (batocera-systems) md5s each file under /storage/roms, # where its list also names neogeo/neogeo.zip and neogeo/aes.zip: the pack # is extracted there, not into bios/. EmulationStation's BIOS screen runs # it (ApiSystem.cpp:603-613 at e3846751). The launch-failure check in # 99-distribution.conf:320 passes --strictfilter, an argument the script # does not handle, so that path reports nothing. No release since # 20230203: the scraper reads the commit of the newest prerelease. # Several device images, no per-device core list: no target file. amberelec: config: amberelec.yml status: active device_group: handheld extract_to: /storage/roms/ logo: https://avatars.githubusercontent.com/u/102820909 scraper: amberelec source_url: https://github.com/AmberELEC/AmberELEC/blob/dev/packages/amberelec/sources/scripts/batocera-systems source_format: python_dict hash_type: md5 # retroarch.cfg sets savefiles_in_content_dir (packages/games/tools/ # retroarch/sources/retroarch.cfg:567-568 at a21975bf) and # setsettings.py leaves it: saves sit beside each game, no single place. save_directory: null schedule: monthly target_scraper: null target_source: null install: detect: # AmberELEC 5a3882cb scripts/image:150-152, options:17. CHAos # (tech4bot/AmberELEC c0a4b0c6) writes the same name. Its list is # written against /storage/roms (bios/, ports/, neogeo/ side by side). - os: linux name: AmberELEC method: os_release match: [NAME=AmberELEC] bios_path: /storage/roms # PAN4ELEC: Kegg1701/P4ELEC 9c19bfb2, AmberELEC/usr/bin/batocera-info:101. - os: linux name: PAN4ELEC method: file_matches file: /usr/bin/batocera-info pattern: 'OPERATING SYSTEM: PAN4ELEC' bios_path: /storage/roms derives_from: AmberELEC # EmuELEC's checker md5s each file under /storage/roms and never reads # zippedFile: its FM Towns entries hash the whole archive against a # member's md5 and report UNTESTED whatever the archive holds. Run by # EmulationStation's BIOS screen and by ee_check_bios after a failed # launch (99-emuelec.conf:261). naomi and Dinothawr are written twice in # the dict and the later entry is the one Python keeps. emuelec: config: emuelec.yml status: active device_group: handheld extract_to: /storage/roms/ logo: https://avatars.githubusercontent.com/u/57574835 scraper: emuelec source_url: https://github.com/EmuELEC/EmuELEC/blob/master/packages/sx05re/emuelec/bin/batocera/batocera-systems source_format: python_dict hash_type: md5 # savefile_directory stays commented out (packages/sx05re/libretro_base/ # retroarch/package.mk:115 at v4.8) and setsettings.sh never sets it, so # RetroArch saves beside each game: no single place. save_directory: null schedule: monthly target_scraper: null target_source: null install: detect: # EmuELEC d4c7b2f1 scripts/image:172-176, options:4. - os: linux name: EmuELEC method: os_release match: [NAME=EmuELEC] bios_path: /storage/roms # KNULLI's knulli-systems is its own fork of Batocera's list, checked the # same way (md5, checkInsideZip, emulator/core gates) by its # EmulationStation (knulli-cfw/batocera-emulationstation 10834d00, # ApiSystem.cpp:764-774). Arch R (archr-linux/Arch-R dbd45d45) ships the # same dict as archr-systems: lines 1-870 are identical, only the prefix # (/storage/roms instead of /userdata) and the es_systems.cfg path differ. # Many boards, no per-board core list: no target file. knulli: config: knulli.yml status: active device_group: handheld extract_to: /userdata/bios/ logo: https://avatars.githubusercontent.com/u/166268572 scraper: knulli source_url: https://github.com/knulli-cfw/knulli-linux/blob/knulli-main/package/system/knulli-scripts/scripts/knulli-systems source_format: python_dict hash_type: md5 # configgen hands each libretro core /userdata/saves/ at every # launch, with sort_savefiles_enable off (package/system/knulli-configgen/ # configgen/configgen/generators/libretro/libretroConfig.py:240-243 and # batoceraPaths.py:22 at 20260511), as Batocera's does: a file is placed # once below each system es_systems.yml offers the core for # (libretro_systems in knulli.yml). save_directory: folder: saves by_core: false by_system: true schedule: monthly target_scraper: null target_source: null install: detect: # knulli-linux 57afa662: OS_NAME in os-release # (board/scripts/post-build-script.sh:233-236) and knulli.version # (package/system/knulli-system/knulli-system.mk:98-102). - os: linux name: KNULLI method: os_release match: [OS_NAME=knulli] bios_path: /userdata/bios derives_from: Batocera - os: linux name: KNULLI method: file_exists file: /usr/share/knulli/knulli.version bios_path: /userdata/bios derives_from: Batocera retropie: config: retropie.yml status: archived device_group: gaming-os extract_to: ~/RetroPie/BIOS/ logo: https://avatars.githubusercontent.com/u/11378204 scraper: retropie source: https://github.com/RetroPie/RetroPie-Setup # No cores here: the registry overrides the config, and RetroPie's own # scriptmodules are what say which packages it ships. # RetroPie runs on Linux, where case tells two files apart. case_insensitive_fs: false # Not RetroArch's: RetroPie sets no savefile_directory and turns # sort_savefiles_enable off (scriptmodules/emulators/retroarch.sh:289-290, # RetroPie-Setup 46128cd2), and its RetroArch (retropie-v1.19.0) has no # default save directory on Linux (frontend/drivers/platform_unix.c sets # DEFAULT_DIR_SRAM only at 1624-1626, for Android). The save directory is # then the folder of the loaded content (runloop.c runloop_path_set_redirect), # one per game: a file read below it has no single place. save_directory: null schedule: null target_scraper: retropie_targets target_source: https://retropie.org.uk/stats/pkgflags/ install: detect: - os: linux method: path_exists path: $HOME/RetroPie/BIOS bizhawk: config: bizhawk.yml status: active device_group: computer extract_to: Firmware/ logo: https://avatars.githubusercontent.com/u/11743303 scraper: bizhawk source_url: https://raw.githubusercontent.com/TASEmulators/BizHawk/master/src/BizHawk.Emulation.Common/Database/FirmwareDatabase.cs source_format: csharp_firmware_database hash_type: sha1 # Windows: names differing only by case land on one file. case_insensitive_fs: true schedule: monthly # EmuHawk finds firmware by SHA1 against FirmwareDatabase.FirmwareRecords # and its cores are its own builds (CoreNames.cs): no libretro profile # describes what it reads, so the database alone decides, as MiSTer's # BiosDB does. cores: [] target_scraper: null target_source: null install: detect: # A portable archive reading /Firmware wherever it was # extracted (PathExtensions.cs DataDirectoryPath): found by its # executable in the home folder or one level down, the newest first. - os: windows method: path_exists path: '%USERPROFILE%\BizHawk\Firmware' - os: linux method: executable file: [$HOME/BizHawk*/EmuHawkMono.sh, $HOME/*/BizHawk*/EmuHawkMono.sh] bios_subdir: Firmware - os: windows method: executable file: ['%USERPROFILE%\BizHawk*\EmuHawk.exe', '%USERPROFILE%\*\BizHawk*\EmuHawk.exe'] bios_subdir: Firmware misterfpga: config: misterfpga.yml status: active device_group: fpga extract_to: /media/fat/games/ logo: https://avatars.githubusercontent.com/u/29345272 scraper: misterfpga source_url: https://raw.githubusercontent.com/ajgowans/BiosDB_MiSTer/db/bios_db.json.zip source_format: mister_downloader_db hash_type: md5 schedule: weekly cores: [] target_scraper: null target_source: null contributed_by: - username: Takiiiiiiii contribution: platform support pr: 50 install: detect: # Main_MiSTer mounts the SD card at /media/fat (file_io.cpp:1150-1156) # and reads game data from GAMES_DIR (file_io.h:168) - os: linux method: path_exists path: /media/fat/MiSTer bios_path: /media/fat/games minui: config: minui.yml status: active device_group: handheld # The card root: minarch hands each core SDCARD_PATH/Bios/ # (workspace/all/minarch/minarch.c:2943). extract_to: / logo: https://avatars.githubusercontent.com/u/225589 scraper: minui # minarch hands each core a folder and names no file (workspace/all/minarch/minarch.c:2943): # there is no BIOS list of its own to export corrected. native_list: none source_url: https://github.com/shauninman/MinUI source_format: pak_launch_scripts hash_type: sha1 # The primary card is formatted FAT32 (skeleton/BASE/README.txt:15). case_insensitive_fs: true schedule: null target_scraper: null target_source: null install: detect: # The release zip holds the build's SYSTEM tree as .system/ at the card # root with version.txt, whose first line is the release name # (makefile:22-24, 152-157). The installer runs on the computer the # card is mounted on and reads it from --dest. - os: any method: card_marker file: .system/version.txt first_line_prefix: MinUI- nextui: config: nextui.yml status: active device_group: handheld # minarch hands each core SDCARD_PATH/Bios/ # (workspace/all/minarch/ma_core.c:76). extract_to: / logo: https://avatars.githubusercontent.com/u/202386615 scraper: nextui # minarch hands each core a folder and names no file (workspace/all/minarch/ma_core.c:76): # there is no BIOS list of its own to export corrected. native_list: none source_url: https://github.com/LoveRetro/NextUI source_format: pak_launch_scripts hash_type: sha1 # The primary card is formatted FAT32 (skeleton/BASE/README.txt:17). case_insensitive_fs: true schedule: null target_scraper: null target_source: null install: detect: # makefile:33-35 and 249: version.txt in .system/, first line the # release name. - os: any method: card_marker file: .system/version.txt first_line_prefix: NextUI- myminui: config: myminui.yml status: active device_group: handheld # minarch hands each core SDCARD_PATH/Bios/ # (workspace/all/minarch/minarch.c:3532). extract_to: / scraper: myminui # minarch hands each core a folder and names no file (workspace/all/minarch/minarch.c:3532): # there is no BIOS list of its own to export corrected. native_list: none source_url: https://github.com/Turro75/MyMinUI source_format: pak_launch_scripts hash_type: sha1 # The card is formatted FAT32 (MANUAL.md:13). case_insensitive_fs: true schedule: null target_scraper: null target_source: null install: detect: # makefile:16-19 and 124: version.txt in .system/, first line the # release name. - os: any method: card_marker file: .system/version.txt first_line_prefix: MyMinUI-