Zaparoo Core v2.18.0 and App v1.15.0 released
Zaparoo Core v2.18.0 and Zaparoo App v1.15.0 are now available, and this release is mostly about your library. You can build decks in the App, lists of games and scripts that play like a playlist from one card, and change them any time without rewriting the card. Alongside favorites, you can now like, dislike, or save a game for later. It all lives on your device and works without an account, and with a free Zaparoo Online account, Library sync keeps it the same on every device.
Windows gets real keyboard and gamepad input and a PinUP Popper launcher for virtual pinball cabinets. Tapping the card for the game you are already playing no longer restarts it, and tapping a playlist's card again moves to the next item. You can group systems into your own categories, hide entries from the library, and multi-disc games show as one item.
MiSTer gains CDTV and DVD Player launchers, arcade metadata from the MiSTer arcade catalog, and arcade artwork from Skraper-style gamelists, and shared folders like Game Boy and Game Boy Color stop mixing up each other's artwork. RetroArch launchers can swap discs from a card, huge folders and big searches no longer stall on every page, and when Core cannot start, it tells you why instead of silently exiting.
Thank you to Trey Turner for adding support for PN532Killer readers.
The highlights:
- Decks: build, play, write, and share decks in the App
- Likes and play later: like, dislike, or save a game for later, each with its own collection in the Library tab
- Library sync: favorites, likes, play later, and decks follow you across devices and Zaparoo Online
- Windows input:
input.keyboardworks, and a virtual gamepad is available with the ViGEmBus driver - PinUP Popper: index, launch, and stop virtual pinball tables on Windows, with Popper's own artwork
- Tap mode: scanning the running game leaves it alone, unless you turn
allow_relaunchback on - Custom categories: a kids shelf or favorites group of systems, shown in the App and Frontend
- Library: hidden entries, multi-disc sets as one game, folder artwork, and fast pages in huge folders
- MiSTer: CDTV and DVD Player launchers, arcade metadata from the MiSTer catalog, Arcade Organizer folders back by choice
- RetroArch disc controls: open the tray and switch discs from a control card
Download
Core will let you know about this release in the Inbox. On MiSTer, Update All installs it, and on Batocera the package manager does. Everywhere else it installs itself if you have turned on automatic installs, or you can download it above.
The App updates itself on iOS and Android: with v1.14.1 installed, v1.15.0 downloads in the background when you open the App and takes over the next time you reopen it. The web UI built into Core v2.18.0 is already v1.15.0.
Before you update
- Decks and the new buttons need Core v2.18.0. The App hides them when it is connected to an older Core.
- Windows now requires paired clients. Encryption is on by default, including for existing installs unless
config.tomlsetsencryption = false. Pair the App and other remote clients with Pair Device... in the tray menu. See client security. - Tapping the card for the running game no longer restarts it. To get the old behavior back, set
allow_relaunch = trueunder[readers.scan]. - Tapping a playlist's card again moves to the next item instead of starting over.
**playlist.goto:1goes back to the start. - Windows gamepad input is off until you turn it on. Tick the ViGEmBus driver in the installer, then set
gamepad_enabled = trueunder[input]. See Windows input. - Custom Zaparoo Online servers use one key now.
online_base_urlunder[service]replaces the three oldbase_urlkeys, which are ignored from now on. - A
[[launchers.default]]entry naming a launcher now beats one naming its group, wherever the two sit in the file. - Virtual systems use
categoriesnow. Custom launchers withkind = "virtual_system"take acategorieslist. The oldcategorykey still works. - Genre and series tags changed. Genres come from Core's own list, series are
search:franchise:tags, and thegamegenreandgamefamilytypes are gone, so check any filters that used them. For now the App's game details show genres as raw values likeshmup:v, with no series row. See tags. - SteamOS backups no longer include the EmuDeck and RetroDECK
biosfolders, and a backup taken before this update will not restore. Keep your own copy of those files, and take a fresh backup after updating. - Update the media database, then scrape again. Multi-disc sets, folder artwork, hidden entries, and the new tag values need a fresh index, and MiSTer scrapers pick up the arcade and shared-folder fixes below.
- CDTV on MiSTer needs a saved preset. See Commodore CDTV.
Find changes for your setup
- Every Core platform: decks and your library, readers and scanning, library and scraping, custom categories, launchers, service and diagnostics, API changes
- Windows: Windows, PinUP Popper
- MiSTer: MiSTer
- Linux, SteamOS, Bazzite, and ChimeraOS: launchers
Decks and your library
Applies to: All Core platforms, in the App and the web UI. Library sync needs a linked Zaparoo Online account.
A deck is a list of games and scripts saved on your device that plays as a playlist. A card written for a deck keeps working when you change what is in it.
- Build decks in the App. Start one with New deck on the Create tab, or Add to deck on any game's details. Add games from a search, your own ZapScript, or a virtual card by its ID, then drag to reorder. A deck holds up to 120 items.
- Play, open, write, or share. Play starts the deck, Open shows a menu to pick an item, Write puts it on a card, and Share copies a link to it.
- Like, dislike, and play later. These sit next to favorite on a game's details and on Now Playing, and each has its own collection under Collections in the Library tab. Each is also a tag you can filter on. Frontend does not have these buttons yet.
- Library sync. A free setting, off by default. Turn on Sync library on the App's Zaparoo Online settings page, or Library sync under Settings > Online in the TUI, and your favorites, likes, play later list, and decks stay the same on every linked device and in Online's Library and Decks pages, within seconds. A deck edited in two places keeps both sets of changes, and hidden entries stay on the device. Your game list is uploaded too, so remote control and deck building in Online know what each device can play. See Library sync.
- Manage a device's Online settings from the App, signed in or not: Library sync, remote control, the All online features switch, and unlinking. This needs an admin or local connection to Core.
- Deck links work offline. Scan a Zap Link to a shared deck once and Core keeps a copy that opens without a connection. Someone else's deck is read-only, and so is one your Online account has locked.
- Shared decks cannot type or run programs. A deck someone else made, or any playlist opened from a Zap Link, follows the same rules as Zap Links. Your own decks and playlist files are unaffected.
Zaparoo Online is an optional account for features that need a cloud connection. Library sync, decks, virtual cards, and play history sync are free; only cloud backup needs the paid Warp tier. Link a device from Settings > Online in the TUI, then turn on every feature at once or pick them one by one. Core keeps working without an account.
Zaparoo Online fixes
- One bad play session no longer stalls history sync. A session the account refuses is skipped and reported in the Inbox, and the rest upload.
- Cloud backups that do not fit upload what they can, starting with Core's own data, and are reported as partial instead of failing outright.
Windows
- Keyboard input works.
input.keyboard,input.text, the coin commands, and keyboard macros did nothing on Windows before. Keys cannot reach a window running as administrator or the lock screen. See Windows input. - A virtual gamepad, with a driver.
input.gamepaduses ViGEmBus, which the installer offers as an unticked option (no ARM64 build). It stays off by default because an extra controller shifts every real one's slot in games; turn it on withgamepad_enabled. - The App's remote keyboard follows the key lists. Keyboard input from a paired member client goes through the same
[zapscript.input]allow and block lists as a scanned card. Admins and localhost are exempt. - Filesystem roots show up in browse. Directories like
C:/roms/were missing from the root listing.
PinUP Popper
Applies to: Windows.
Core launches virtual pinball tables through PinUP Popper. It indexes every table in Popper's database under the Pinball system and asks Popper to start and stop them, so your launch scripts, PuP-Packs, and DOF setup keep working. Visual Pinball, Future Pinball, Pinball FX, Pinball M, Zaccaria, and Pro Pinball tables are tracked as running games, so hold mode and playtime limits behave as they do everywhere else.
A pinup-popper scraper imports each table's year, manufacturer, player count, notes, and wheel, playfield, backglass, and flyer images from Popper's own library. It runs on its own after a media database update. See pinup-popper.
Readers and scanning
- Tap mode leaves the running game alone. Any card, mapping, or script that lands on the game already playing is skipped, playtime and playlists carry on, and other commands on the card still run. Launch guard no longer asks you to confirm a tap that would change nothing. Hold mode and API launches are unchanged.
- PN532Killer readers are supported in UART mode, like any PN532 USB reader. Thanks to Trey Turner.
- Unplugged readers go quietly. USB readers no longer reappear and vanish every second in the log after being unplugged.
- Auto-detect stops re-probing serial devices that are not a PN532, and the log lists the ports it actually tried.
- Held keys can be shifted or combos.
{press:M},{press:!}, and{press:ctrl+c}now hold what they say, and combos like{ctrl+A}work. See input macros. - A playlist stops on an item that fails to launch instead of carrying on as if it had played. Play the playlist to try the item again, or skip to another one.
- A missing file fails cleanly. A card pointing at a file that is not there reports it as not found instead of starting a core or emulator with nothing to play and ending your game.
- Stopping background audio leaves the game alone.
**stop?slot=backgroundno longer also stops what is in the main slot. - Hold mode ownership survives a fast relaunch.
Library and scraping
- Multi-disc games are one game. A folder of loose disc images with one title, in
.cue,.chd,.iso,.bin,.img, or.pbp, shows and launches as one item, like an.m3ufolder already did. You can still open the folder to pick a disc. - Folders can have artwork. The
media-folderscraper picks up an image named after any folder. See media-folder. - Hide entries you do not want to see. A
user:hiddentag removes an entry from browse, search, and random picks while cards and scripts still launch it. No App or Frontend button yet. - Tags stay consistent. Scrapers map their sources' genres, series, regions, and arcade boards onto Core's own lists and drop anything that does not fit, so a filter means the same thing wherever the metadata came from. New scraped tags show up without a reindex, and
(Revision B)or Redump's(RE1)in a filename count as revisions. - Scrape one game or one folder, and a scrape interrupted by a restart carries on where it stopped. Frontend already offers this on a game's options menu.
- Huge folders page quickly. A folder with thousands of games, or a sorted search across a big library, no longer stalls on every page.
- Unreadable gamelists are reported. A
gamelist.xmlthat cannot be read is named in an Inbox warning instead of skipped silently, one bad entry no longer fails the whole file, and the size limit rises to 128 MB (16 MB on MiSTer). - Title matching fixes. A plain title launch no longer picks a fan translation over the original, a game whose only copies are prototypes, translations, or hacks launches the right one, and a card written for a ROM hack on one device no longer launches the original on another.
- Restores bring favorites back in line. Favorites, hidden entries, and per-game launcher choices now match the restored backup.
Custom categories
Applies to: All Core platforms.
Systems have always sat in fixed categories: Console, Handheld, Computer, Arcade, and Other. You can now add your own in config.toml:
[[systems.category]]
name = "Kids"
systems = ["NES", "SNES", "Genesis"]
A system stays in its built-in category and also appears under every custom one that names it. The App and Frontend show custom categories alongside the built-in ones. See systems.category.
Config handling got sturdier in the same change: a bad entry is skipped instead of stopping Core, a settings change is refused rather than overwriting a config.toml that would not load, and every file Core writes is saved atomically so an interrupted write cannot leave half a file behind.
MiSTer
- Arcade metadata from the MiSTer catalog. The
mister-arcadescraper fills in year, developer, genre, players, controls, and monitor rotation for every arcade game in the catalog Core already downloads. It runs on its own after an arcade index and only fills what is empty. MiSTeX gets it too. See mister-arcade. - Arcade Organizer folders, if you want them. Set
scan_duplicates = trueon theArcadelauncher and reindex to browse those folders again. Every copy becomes its own entry, so the arcade library grows several times over and indexing takes longer. - Commodore CDTV. CD images in a
CDTVfolder launch through Minimig using a savedCDTVpreset. See Commodore CDTV. - DVD Player.
.isoimages in aDVDfolder launch through the DVD core, with aHybridDVDPlayerlauncher for the hybrid core. - Kitrinx NGPC is preferred when installed, with Jotego's core as the fallback.
- Arcade gamelists match by set name. A Skraper pack that lists
pacman.zipnow matches the.mrafor that set, artwork included, through a custom bundle. See MiSTer arcade gamelists. - Shared folders keep their artwork straight. Systems that share a folder, like Game Boy and Game Boy Color in
GAMEBOY, no longer pick up each other's gamelist entries. - ScummVM games get metadata and artwork, including multi-language games that share one folder and variants kept in subfolders. Reindex ScummVM after updating.
- Scripts can tell who launched them.
**mister.scripttakes alaunch_origin_idoption that the script reads asLAUNCH_ORIGIN_ID. - The log survives a reboot. Core copies it to
/media/fat/zaparoo/core.logwhen it shuts down cleanly, and when it stops on a startup problem that needs your attention. - Two games behind the same MGL launched through
.LASTLAUNCH.mglare told apart now.
Launchers
- RetroArch disc controls. The built-in RetroArch launchers on Linux and SteamOS accept
toggle_tray,next, andpreviouscontrol actions, so a card can swap discs without restarting the game. RetroArch does not report whether the swap worked. - Steam games that are not installed open their details page instead of being handed to Steam, without stopping the game you are playing.
- SteamOS launches can be hosted by a frontend. A frontend Steam launched, like a coming release of Zaparoo Frontend, can run the emulator itself so you do not end up with two Steam apps open for one game.
- One
before_exitfor a whole family of launchers. Set it on a[[launchers.default]]entry for a launcher or group, or on[launchers]for everything else, instead of repeating it under every system. See exit hooks. - A missing gamepad no longer stops the service.
Service and diagnostics
- A failed start explains itself. The web UI address shows a page while Core is starting, and if Core stops because a newer version upgraded its data, the page names that version and what to reinstall. The TUI shows the same, with the last error from the log. You should never see it, but you are not left guessing if you do.
- Get the log out without the service. The TUI shows a Logs button while Core is down, the Windows tray has Upload Log, and the other platforms have
-upload-log. - Crashes leave evidence in
core.crash.login Core's data directory, included in log bundles. With error reporting on, one sanitized report is sent on the next start. - Restores finish. A restore keeps going when the app that started it stops waiting, and is no longer refused while other requests are in progress.
- Core identifies itself. Web requests Core makes, including
http.getandhttp.post, send aZaparoo-Core/<version>user agent with the platform. - Remote launches follow the house rules. Remote control launches now respect the require-a-profile setting and playtime limits.
- Smaller fixes. Stale or empty PID files recover on start,
-service startsays why it failed, long WebSocket sessions are no longer cut off, expected outcomes are no longer sent as error reports, and release binaries are smaller.
API changes
systemsandmedia.searchresults carry acategoriesarray;categoryis kept and equals the first entry.- Tags follow a closed vocabulary.
genreholds the canonical genre list, series aresearch:franchise:*, andgamegenreandgamefamilyare removed. media.tags.updateacceptsuser:hidden,user:liked,user:disliked, anduser:playlateralongsideuser:favorite. Browse, search, and counts takeincludeHidden, andmedia.visibilityannounces changes.media.browsemarks disc sets and folders with artwork throughhasCover;media.imageaccepts a directory.media.scrapetakes an optional scope: a media ID, a file, or a folder.- New
media.lookup.candidates(up to five ranked titles for an approximate name) andmedia.asset(chunked PDF manuals over the WebSocket). - New
decks,decks.get,decks.new,decks.update,decks.delete, anddecks.openmethods, and adecks.changednotification. - The playlist state in
mediacarriesunsafewhen its items come from an untrusted source. settingsexposeslibrarySyncEnabledand the read-onlyonlineBaseUrlto localhost and admin clients.- New
run.failednotification, sent once for every ZapScript run that fails, with the same error category as therunmethod. /healthreturns{"status":"ok","state":"ready"}instead of a bareOK, withstatealsostartingorfailed. It still answers 200.
See the API reference for details.
As always, feedback and bug reports are welcome on our Discord or GitHub.
