Files
libretro/platforms/_registry.yml
T
Abdessamad Derraz 2d26385efe feat: place save-dir files in each system folder
Batocera, KNULLI, Recalbox, RetroBat and RetroDECK hand a libretro core <saves>/<system> at each launch. Each copy lands below every system that runs the core. EmuDeck keeps one unsorted saves/retroarch/saves. The unsupported platforms record why.
2026-10-22 21:16:59 +02:00

1132 lines
43 KiB
YAML

# 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
# <home>/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
# <home>/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 <Application Support>/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 <exe folder>\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/<tag>/ 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/<system> 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).
# <system> 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).
save_directory:
folder: saves
by_core: false
by_system: true
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/<system> 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). <system> 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\<system> 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). <system> 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\<system>\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/<ROM
# folder> 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/<system> 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 <EmuHawk folder>/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/<TAG>
# (workspace/all/minarch/minarch.c:2943).
extract_to: <SD card>/
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/<TAG>
# (workspace/all/minarch/ma_core.c:76).
extract_to: <SD card>/
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/<TAG>
# (workspace/all/minarch/minarch.c:3532).
extract_to: <SD card>/
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-