Skip to main content
Version: Stable

Launchers

Detailed launcher configuration for Windows.

Steam

Launches games from your Steam library via the steam:// URL scheme. Both official Steam games and non-Steam shortcuts are detected.

Steam is auto-detected via Windows registry. Games are indexed from your Steam library folders.

To manually launch a Steam game, write steam://<app_id> to a token. For example: steam://1145360 for Hades.

config.toml
[[launchers.default]]
launcher = "Steam"
install_dir = "D:\\Steam" # Optional custom Steam install directory

LaunchBox

Required Plugin

LaunchBox integration requires the Zaparoo plugin. Download Zaparoo LaunchBox Integration v1.0.0.zip and follow the installation steps below.

Plugin Installation

  1. Download the Zaparoo LaunchBox Integration v1.0.0.zip file
  2. Extract the zip file
  3. Copy the Zaparoo LaunchBox Integration folder to your LaunchBox Plugins directory (usually <LaunchBox>/Plugins/)
  4. Restart LaunchBox

To verify the plugin loaded correctly, right-click any game in LaunchBox - you should see "Write to tag" in the context menu.

Once installed, Zaparoo will automatically detect LaunchBox and add all games to the media database.

To manually create a LaunchBox game token, write launchbox://<game_id> to a token.

config.toml
[[launchers.default]]
launcher = "LaunchBox"
install_dir = "D:\\LaunchBox" # Optional custom install directory

RetroBat

RetroBat integration uses the EmulationStation API. RetroBat must be running for games to launch.

Games are automatically detected from your RetroBat roms folder based on gamelist.xml files.

config.toml
[[launchers.default]]
launcher = "RetroBat"
install_dir = "D:\\RetroBat" # Optional custom install directory

Web API access

Core launches games and detects the running game through RetroBat's EmulationStation web API, which it reaches at http://localhost:1234 on the same PC. If RetroBat is running but games won't launch, two things on the RetroBat side usually need attention.

First, enable EmulationStation's web access. In RetroBat's EmulationStation menu this sits under the system settings, typically Main Menu > System Settings > Frontend Developer Options > Enable public web access. Restart RetroBat after changing it. If you can't find the option, the RetroBat Discord and wiki are the best places to check, since the menu layout changes between versions.

Second, make sure localhost resolves to 127.0.0.1. Core connects to localhost, and on some Windows setups that name resolves only to IPv6 (::1) or fails to resolve, which stops Core from reaching the web server. Editing the Windows hosts file at C:\Windows\System32\drivers\etc\hosts as administrator to include this line forces an IPv4 match:

127.0.0.1 localhost

Supported Systems

System IDRetroBat Folder
Arcademame, fbneo
Atomiswaveatomiswave
NAOMInaomi
NAOMI2naomi2
Model2model2
Model3model3
Triforcetriforce
Chihirochihiro
Hikaruhikaru
CPS1cps1
CPS2cps2
CPS3cps3
DAPHNEdaphne
Singesinge
SG1000sg1000
MasterSystemmastersystem
Genesismegadrive
MegaCDmegacd
Sega32Xsega32x
Saturnsaturn
Dreamcastdreamcast
GameGeargamegear
NESnes
FDSfds
SNESsnes
SNESMSU1snes-msu1
Sufamisufami
Nintendo64n64
GameCubegamecube
Wiiwii
WiiUwiiu
Switchswitch
VirtualBoyvirtualboy
Gameboygb
Gameboy2Pgb2players
SGBMSU1gb-msu
GameboyColorgbc
GBAgba
GBA2Pgba2players
NDSnds
PokemonMinipokemini
GameNWatchgw
PSXpsx
PS2ps2
PS3ps3
PS4ps4
Xboxxbox
Xbox360xbox360
TurboGrafx16pcengine
TurboGrafx16CDpcenginecd
SuperGrafxsupergrafx
PCFXpcfx
NeoGeoneogeo
NeoGeoCDneogeocd
Atari2600atari2600
Atari5200atari5200
Atari7800atari7800
AtariLynxlynx
Jaguarjaguar
JaguarCDjaguarcd
3DO3do
ColecoVisioncolecovision
Intellivisionintellivision
ChannelFchannelf
Vectrexvectrex
Odyssey2odyssey2
Amiga500amiga500
Amiga1200amiga1200
AmigaCD32amigacd32
Amstradamstradcpc
Atari800atari800
AtariSTatarist
AtariXEGSxegs
C64c64
MSX1msx1
MSX2msx2
MSX2Plusmsx2+
ZXSpectrumzxspectrum
ZX81zx81
X68000x68000
X1x1
PC88pc88
PC98pc98
Aquariusaquarius
SAMCoupesamcoupe
Thomsonthomson
Spectravideospectravideo
Oricoricatmos

Flashpoint

Launches games from Flashpoint Archive. Games won't appear in the media database, but you can manually create tokens by writing flashpoint://<game_id> or copying the URL from the Flashpoint launcher.

Kodi

Plays media via Kodi's JSON-RPC API. Kodi must be running with remote control enabled.

Local Files

System IDExtensions
Video.mp4, .mkv, .avi, .mov, .webm, .m4v, .wmv, .flv
MusicTrack.mp3, .flac, .ogg, .wav, .m4a, .wma, .aac

Library Media

System IDDescription
MovieMovies from Kodi library
TVEpisodeTV episodes from Kodi library
TVShowTV shows (plays next unwatched episode)
MusicTrackSongs from Kodi library
MusicAlbumAlbums from Kodi library
MusicArtistArtists from Kodi library (plays all songs)

Configuration

Configure the Kodi server URL in config.toml:

config.toml
[[launchers.default]]
launcher = "Kodi"
server_url = "http://192.168.1.100:8080"

If Kodi requires authentication, add credentials to auth.toml:

auth.toml
["http://192.168.1.100:8080"]
username = "kodi"
password = "your_password"

Web Browser

Opens URLs in the default web browser. Supports http:// and https:// schemes.

Executables

Security Risk

Be extremely careful! Executables can do anything, including deleting files and installing malware. Only use this feature if you trust the executable.

System IDExtensions
Any.exe

Executables must be explicitly allowed in config.toml:

config.toml
[launchers]
allow_file = [
'^C:\\Games\\.*\\.exe$',
'^D:\\Emulators\\.*\\.exe$'
]

Scripts

Security Risk

Scripts can execute arbitrary code. Only allow scripts you trust.

System IDExtensions
Any.bat, .cmd, .lnk, .a3x, .ahk

Scripts must be explicitly allowed in config.toml:

config.toml
[launchers]
allow_file = [
'^C:\\Scripts\\.*\\.bat$',
'^C:\\Scripts\\.*\\.ahk$'
]

Custom Launchers

Custom launchers allow you to start ROMs with a specified emulator. They are TOML files placed in the launcher directory (%localappdata%\zaparoo\launchers).

Example for PCSX2:

PCSX2PS2_zaparoo_launcher.toml
[[launchers.custom]]
id = "PCSX2PS2"
system = "PS2"
media_dirs = ["D:\\Emulation\\Roms\\PS2"]
file_exts = [".iso", ".bin", ".img", ".nrg", ".mdf", ".chd"]
execute = "\"D:\\Emulation\\Emulators\\PCSX2-Nightly\\pcsx2-qt.exe\" \"[[media_path]]\""

Quoting paths and PowerShell

Core runs the execute command directly, without a shell. It splits the string into a program and arguments itself (respecting single and double quotes), then starts the program. This stops characters in a ROM path from being treated as shell commands.

Launch the emulator executable directly whenever you can, as in the example above. Quote the program path and [[media_path]] separately so paths with spaces (like D:\Roms\Sony - PlayStation 2\) stay intact. Running the executable directly also lets Core track the process for media tracking.

Avoid wrapping the command in PowerShell

Wrapping the launch in PowerShell with Start-Process -ArgumentList '"[[media_path]]"' makes PowerShell parse the arguments a second time. It can strip your quotes and split the path on its spaces. A folder name with a space or hyphen like Sony - PlayStation 2 then breaks, giving errors such as Unknown parameter: '-' and launching the emulator with no game. Use a PowerShell wrapper only when you need PowerShell-specific behavior.

If you do need PowerShell, such as to set an environment variable before launching, put the whole script in one -Command "..." argument and use the call operator & with single-quoted paths:

execute = "powershell -WindowStyle Hidden -NoProfile -ExecutionPolicy Bypass -Command \"& 'D:\\Emulation\\Emulators\\PCSX2-Nightly\\pcsx2-qt.exe' '[[media_path]]'\""

The whole & '...' '...' script is a single argument to -Command, so Core passes it to PowerShell untouched, and PowerShell's single quotes keep the paths intact.

PowerShell script for automatic launcher creation
launcher-generator.ps1
Write-Host "=== Zaparoo Launcher TOML Generator ==="

$system = Read-Host "Enter system name (e.g., CPS2, PS1, NES)"
$rompath = Read-Host "Enter full path to ROM folder"
$emupath = Read-Host "Enter full path to emulator executable"

$coreMap = @{
"PS1" = "mednafen_psx_hw_libretro.dll"
"PS2" = ""
"NES" = "mesen_libretro.dll"
"SNES" = "snes9x_libretro.dll"
"N64" = "mupen64plus_next_libretro.dll"
"GBA" = "mgba_libretro.dll"
"CPS1" = "fbalpha2012_cps1_libretro.dll"
"CPS2" = "fbalpha2012_cps2_libretro.dll"
"CPS3" = "fbalpha2012_cps3_libretro.dll"
"NeoGeo" = "fbalpha2012_neogeo_libretro.dll"
"Arcade" = "fbneo_libretro.dll"
"Genesis" = "genesis_plus_gx_libretro.dll"
"TG16" = "mednafen_pce_fast_libretro.dll"
"GB" = "gambatte_libretro.dll"
"GBC" = "gambatte_libretro.dll"
"DS" = "melonds_libretro.dll"
"PSP" = "ppsspp_libretro.dll"
"Saturn" = "mednafen_saturn_libretro.dll"
"Dreamcast" = "flycast_libretro.dll"
"3DO" = "opera_libretro.dll"
"MSX" = "bluemsx_libretro.dll"
"DOS" = "dosbox_pure_libretro.dll"
"ScummVM" = "scummvm_libretro.dll"
"Amiga" = "puae_libretro.dll"
}

$extMap = @{
"PS1" = '".cue", ".bin", ".iso", ".chd"'
"NES" = '".nes"'
"SNES" = '".sfc", ".smc"'
"N64" = '".z64", ".n64", ".v64"'
"GBA" = '".gba"'
"CPS1" = '".zip"'
"CPS2" = '".zip"'
"CPS3" = '".zip"'
"NeoGeo" = '".zip"'
"Arcade" = '".zip"'
"Genesis" = '".md", ".bin"'
"TG16" = '".pce"'
"GB" = '".gb"'
"GBC" = '".gbc"'
"DS" = '".nds"'
"PSP" = '".iso", ".cso"'
"Saturn" = '".cue", ".bin"'
"Dreamcast" = '".cdi", ".gdi"'
"3DO" = '".iso"'
"MSX" = '".rom", ".dsk"'
"DOS" = '".zip"'
"ScummVM" = '".svm"'
"Amiga" = '".adf"'
}

$corepath = $null
if ($coreMap.ContainsKey($system)) {
$core = $coreMap[$system]
if ($core -ne "") {
$corepath = Join-Path (Split-Path $emupath) "cores\$core"
}
}

$rompath = $rompath -replace '\\', '\\'
$emupath = $emupath -replace '\\', '\\'
if ($corepath) { $corepath = $corepath -replace '\\', '\\' }

# Launch the executable directly. Single quotes keep paths with spaces intact
# through Core's command split, and avoid a second round of PowerShell parsing.
if ($corepath) {
$exec = "'$emupath' -L '$corepath' '[[media_path]]'"
} else {
$exec = "'$emupath' '[[media_path]]'"
}

$exts = if ($extMap.ContainsKey($system)) { $extMap[$system] } else { '".zip"' }

$outfile = "${system}_zaparoo_launcher.toml"
@"
[[launchers.custom]]
id = "$system"
system = "$system"
media_dirs = ["$rompath"]
file_exts = [$exts]
execute = "$exec"
"@ | Set-Content -Encoding UTF8 $outfile

Write-Host "`nTOML launcher created: $outfile"
Read-Host -Prompt "`nPress Enter to exit"