Troubleshooting¶
Common issues and how to fix them.
Tender's Backend Won't Start¶
Connection shows "Backend error"¶
Symptom: The Tender QAM panel's Connection row shows a "Backend error" badge with the note "Tender's backend failed to start — check its log", and the Sync buttons are disabled. This state means Tender's own backend process never started — it is not the same as an unreachable RomM server, which shows Not connected instead, nor a backend that restarted while the panel stayed in Steam, after which the panel shows only a note that Tender was restarted (Tender says it was restarted).
Fix: The backend aborted during startup, so the panel can't reach it. Its log says why:
Then start it again:
If it still fails, restart Steam (or the Steam Deck); if the error persists, include the log output when you report it.
Reaching that verdict takes up to about a minute and a half, because the check keeps retrying to ride out a backend that is merely slow to start rather than calling it dead too early. It runs to its conclusion whether or not the panel is open, so you do not have to sit and watch it — close the QAM and reopen it later, and the row shows the answer. While a check is running, the row keeps showing the previous result rather than resetting to Checking….
Sign-in reports "Tender's backend never answered"¶
Symptom: The Sign in to RomM dialog sits on Signing in… for a minute and then shows "Tender's backend never answered. Restart it, or restart Steam, then try again."
Fix: The dialog reached Tender's backend process and got no reply at all, which normally means the backend is no
longer running — the panel itself keeps working because its code is already loaded in Steam. Start it again with
systemctl --user restart romm-tender, or restart Steam, then sign in again. A pairing code is single-use and expires
after 60 seconds, so generate a fresh one for the retry.
This message is specific to Tender's backend being unreachable. A RomM server that is merely down or misconfigured answers with its own message instead — "Server unreachable", "Sign-in rejected", or the RomM version notice.
Tender Can't Start Right Now¶
Symptom: In place of its panel, Tender shows "Tender can't start right now", a sentence saying what happened and what to do about it, and a list of names.
Explanation: Before it draws the panel, Tender looks up parts of Steam's interface, and one it cannot draw without was not found. The sentence says which case this is:
- Steam has changed and this version of Tender does not know its way around it yet — updating Tender should fix it.
- Tender and Decky Loader are out of step with each other — updating both should fix it.
- Steam has changed and Decky Loader does not know its way around it yet — Tender shares that part with Decky, and updating Decky Loader should fix it.
- Steam has changed and Decky Loader does not know its way around it yet, and something else is missing too — updating Decky Loader fixes that part; if the page still appears afterwards, please report it.
- Tender started before Steam was ready — restarting Steam is the first thing to try.
- Tender could not find the parts it needs from Steam — please report it.
The list of names is what to include when you report it.
What the page offers:
- Restart Steam, whatever the sentence says. While a game is starting, running or closing — or Tender cannot tell whether one is — it does not restart and says "Close your running game before restarting Steam."
- Where the sentence says updating Tender, or updating both, should fix it, the Tender update as well; for "both", Decky Loader still needs its own update. When the page appears it runs the usual check for a newer release (with Check for updates daily on in Settings › Updates, at most once a day); Check for updates — Check now in Settings — asks GitHub now, whatever that switch says. A newer release shows as "Available: version" with Install update, which installs it exactly as Settings › Updates does: while a game runs or Tender is busy the button waits and the page lists what for, an install shows its steps and how far the download has got, and an update that failed — including one the installer rolled back or its pre-install check refused — says why, as Settings › Updates does, and offers Try again. "No newer release of Tender was out at the last check." means the last check found none; Check for updates asks again. "GitHub gave no usable answer. Try again later." means Check for updates got no answer. A copy of Tender that was not installed with the installer says "Development build — install updates with the installer." and is offered no update.
- Once an install has started its installer, Tender restarts. The update's buttons go, Restart Steam stays, and the page says "Tender was restarted — it reloads Steam's interface once no game is running." or "Tender was restarted — restart Steam to use it again.", adding "The update's result shows after that." Unlike the panel (Tender says it was restarted), this page raises no notification and does not ask the backend again when you open the menu.
Where the page says "Use the touch screen to press these.", the parts of Steam that make a button reachable with the controller were among those not found: tap the buttons instead. Under the other sentences the page offers no Tender update: where it names Decky Loader alone, the update is Decky Loader's; where Tender started before Steam was ready, restart Steam; and where it asks for a report, send one with the names.
Main Says "Steam has changed"¶
Symptom: Tender's panel works, and Main shows a notice titled "Steam has changed": "This Steam version is missing parts Tender uses. Not working: …. Please report this." — or, where nothing you can see is affected, "Everything still works; please report this."
Explanation: When it starts, Tender looks up the parts of Steam it uses. Some were not found in the Steam version you are running, and the notice names what does not work without them — for example setting artwork, starting a game or Tender's notifications. Everything else works as usual. The notice can appear a moment after the panel opens: some of Steam's parts are looked up only once Steam has finished starting.
What to do: Report it, and include Tender's log, which names every part that was missing
(grep "start-up check" ~/.local/state/romm-tender/backend.log | tail -n 5). If Log Level in Settings ›
Advanced is set to Error, set it back to Warn and restart Steam first, or the line is not written. What fixes
it is a newer Tender, or, where you also run Decky Loader, possibly a newer Decky Loader; where the log line names a
repair, it names which. The notice has no button because there is nothing to do inside Tender.
Tender's Quick Access Entry Is Missing¶
Symptom: A notification says "Tender couldn't add its Quick Access entry with this Steam version. Please report this.", and Tender's entry is not in the Quick Access menu.
Explanation: The part of Steam that Tender's entry is put into was not found in this Steam version, so the panel cannot be opened. Where nothing else is missing, Tender keeps running without it: its section on a game's page, the check before a game starts and the save sync around a game still run. A library sync and Sync All Saves start from the panel, so they cannot be started until the entry is back. Where something Tender needs to draw its panel is missing as well, none of these run, and the log names what was missing.
What to do: Report it, with Tender's log. Where Steam's notifications are affected as well, no notification appears, and the log alone says so.
Tender Says It Was Restarted¶
Symptom: A notification says "Tender was restarted", and Tender's panel shows only one of two notes, on every page:
- "Tender was restarted — it reloads Steam's interface once no game is running."
- "Tender was restarted — restart Steam to use it again."
Until then nothing in Tender's panel can work, so it offers nothing to press. If an update you started was installing — Settings › Updates said Tender is restarting — the note adds "The update's result shows after that." While any game is running, it adds "Quit the running game yourself — Tender can't stop it right now." If Steam lists a game as running but Tender cannot tell whether it still is, and sees no other game running, it says that instead — "Steam lists Celeste as running, and Tender can't tell whether it still is. Quit it if it's open; if it has already closed, restart Steam." On a game's page the section below the play row shows the same note. The play row keeps a Tender restarted badge, which says nothing about RomM then, and Steam's own LAST PLAYED and PLAYTIME, and SPACE REQUIRED for a game not downloaded; while that page's game runs it keeps Resume on a page you opened before the restart, and otherwise nothing to press. Starting a RomM game from elsewhere in Steam — the library, the home screen, the game's menu — does not start it, and shows "Couldn't start the game" with the same note, since the game would run without its saves synced.
Explanation: Tender's backend restarted while Steam kept running, and the panel in Steam is the one the backend that stopped had loaded. The running backend can never accept it, and it told the panel what happens next. The first note means the backend replaces the panel by itself once no game is running (below); the second means it will not — it already tried, or it has taken Steam's interface down twice in the last ten minutes. In the first seconds after the backend starts the panel is told nothing yet, and the notification comes once the backend has looked at Steam.
Fix: For the first note, quit every running game; Steam's interface reloads a moment later with a working panel. If the note says Tender can't tell whether a game Steam lists is still running, quit that game if it is open; if it has already closed, restart Steam. For the second, restart Steam. Opening the Quick Access menu on Tender's page or starting a RomM game from Steam asks the backend again, and a new notification says so when its answer has changed. The backend's log carries one line for that panel, and one more each time its answer changes:
Steam's Screen Reloads by Itself After a Backend Restart¶
Symptom: Shortly after Tender's backend restarts — after systemctl --user restart romm-tender, a reinstall, or the
backend starting again by itself — Steam's interface disappears for a moment and comes back, and Tender's panel returns
a few seconds later. If a game was running, this happens after you exit it.
Explanation: Nothing is wrong. The panel still in Steam belonged to the backend that just stopped, and it cannot talk to the new one, so the new backend asks Steam to reload its interface once to put a fresh panel in. It waits while a game is running. If Steam cannot reload, or the old panel is still there after the reload, it restarts part of Steam once, which takes the interface away for a few more seconds.
Fix: If no game is running and a few minutes later Tender's panel is still missing, or its section on a game page still says "Loading..." or that Tender was restarted, restart Steam to load the new panel. The backend tries only once after each backend restart, and it takes Steam's interface away no more than twice in ten minutes. The log says what was tried:
A WARNING line that says "Restart Steam to load" means the backend has stopped trying. Not every case leaves one — the backend may still be waiting because it cannot tell whether a game is running, or Steam's interface reloaded and the old panel went with it but the new one did not arrive — so the missing panel, not that line, is the reason to restart Steam.
An Update Was Rolled Back¶
Symptom: An update marks the Service row failed, says Rolled back instead of Done, and ends with
install.sh: update to <new> failed; back on <previous> and a line pointing at the log and at the journal. Tender says
the same once in a message, and its main panel says it — that the update to the new version failed and you are still on
the one you had — until you dismiss it there or a later update goes through.
Explanation: The new version did not answer within about a minute of being started, so the installer put the version
you had back, together with the library database and settings it had before the update, and started it again. Tender is
running as it was. Anything the new version wrote in that minute is gone. The installer does not try again by itself,
and it leaves ~/.local/state/romm-tender/update-failure.json naming both versions and the time. That note is what the
panel's notice and Settings › Updates show, and what Tender's log repeats in one line each time it starts
(the update to <new> was rolled back at <time>; back on <previous> — …); the next update whose new version answers
removes it. Where the installer also said could not record the rolled-back update, there is no note of this rollback,
and neither the panel nor Tender's log says anything about it.
Fix: Look at what the new version printed. Show what the installer said under the block in Settings › Updates shows it, in Game Mode too: the installer's run, and then X, when it tried to start with the new version's own lines from that start (What the installer said). From a terminal, the log is shared by both versions, so the lines just before the previous version's start are the new version's; a version that failed before it could open its log left nothing there, and its reason is only in the journal:
Include that when you report it. Try again in Settings › Updates, or running the installer again, tries the update again.
Going back to the previous version by hand¶
If an update did start but you want the version before it back, the installed copy of the installer does that:
It puts back the previous version and the database and settings as they were before the update, and says the date
that was. Anything Tender recorded since, such as a download or a sync, is forgotten: ROM files downloaded since stay on
disk and shortcuts created since stay in Steam, but the restored database no longer knows them. Before it puts anything
back, it copies the database and settings it replaces to ~/.local/share/romm-tender/rollback-backup/, and it says so.
That copy stays until the next time you go back by hand.
It works once per update — afterwards there is no previous version left to go back to — and refuses without changing
anything when there is nothing to go back to. It also refuses when the previous version and the saved data do not belong
together, which an update that was interrupted can leave behind: going back would run the older version over data a
newer one wrote. Start Tender instead if it is not running, with systemctl --user start romm-tender.
The New Version Does Not Start¶
Symptom: An update, or a first install, marks the Installing row failed with the new version does not start,
prints what the pre-install check said, and ends with install.sh: the new version does not start and
nothing was changed. After an update, Tender's main panel says Update to X failed — you are still on Y. with The
new version did not start, so nothing was changed. under it, and Settings › Updates says Update to X failed —
nothing was changed. with Check the new version marked as the step that failed, until a later update goes through.
Explanation: Before it stops anything, the installer runs the new version's pre-install check: it builds Tender from
the new files on copies of your library database and settings, the way a start would, without starting it. That failed,
or crashed, so the installer removed the new files and stopped there. Tender was not stopped, nothing was replaced, and
Steam's interface did not reload. An update leaves ~/.local/state/romm-tender/update-failure.json naming both versions
and the time, marked as refused ("kind": "check"); Tender's log repeats it in one line each time Tender starts
(the pre-install check refused <new> at <time>: …). A first install leaves nothing behind.
The check catches a new version that cannot be put together at all: a file of it that does not load, a part of it built for another system, an upgrade of your database or settings that fails on your data. It cannot catch a failure that only shows once Tender runs — answering the panel, loading it into Steam, talking to your server. Those are still caught after the update, by the rollback above.
Fix: The installer printed the check's reason, and the last lines the check printed, just above its last two lines —
for a crash, after a line naming the signal that ended it (the pre-install check crashed (SIGSEGV)). For an update
from Settings › Updates, Show what the installer said there shows that output; it is also in the installer's
journal:
Include it when you report it. The same release refuses the same way on the same data, so Try again in Settings › Updates, or running the installer again, helps only once something has changed: a newer release, or the data the reason names.
The check did not finish¶
The installer ends with install.sh: the check did not finish and nothing was changed, after
the pre-install check was stopped after 120s, the pre-install check was killed or
the pre-install check ended with status <N>. Building Tender takes seconds; a check still running after two minutes
was waiting on something — usually the library database, held by another program, or storage that stopped answering. A
check that was killed was ended by force: by the installer, when it did not stop ten seconds after it was told to, or by
something else, such as the system running out of memory. Any other status is one the installer cannot put down to the
new version — a check stopped from outside, for example, or one that could not be run at all. None of these is a verdict
on the new version, so nothing is recorded and the main panel does not mention it. An update started from Settings ›
Updates says The installer stopped without updating. there, and Show what the installer said under it shows
these lines, which are also in the installer's journal (journalctl --user -u romm-tender-update). Run the installer
again once the cause is resolved.
Your data could not be copied¶
The installer ends with install.sh: could not try the new version: your data could not be copied and
nothing was changed, with the reason just above. The check could not copy your library database or settings to try the
new version on — a full disk, or a file it could not read. That is about your data, not the new version, so nothing is
recorded and the main panel does not mention it. An update started from Settings › Updates says The installer
stopped without updating. there, and Show what the installer said under it shows these lines, which are also in
the installer's journal (journalctl --user -u romm-tender-update). Free space, or fix the file the reason names, and
run the installer again.
No pre-install check¶
A release from before the pre-install check has none. The installer installs it without one and says
this version has no pre-install check; an update to it that does not start is still rolled back
(An Update Was Rolled Back).
An Update From Settings Did Not Go Through¶
Symptom: After Install update in Settings › Updates, an amber block under the button says Update to X
failed — nothing was changed. or Update to X was cancelled — nothing was changed., marks the step it stopped at
with ✕ where one of the four steps failed, and says why under that; the button is back as Try again. Tender also
says it once in a message, which shows even when the panel is closed.
Explanation: Each of these ends the install before Tender was replaced, and Tender goes on running the version you have. The step each is marked at is in brackets; the ones with none are not a fault of the new version, and show no steps:
- The download failed. (Download) The release, or the checksum file beside it, could not be downloaded.
- The download did not match its checksum. (Verify) What arrived is not the file GitHub lists for the release, so Tender did not install it.
- The installer could not be started. The installer could not be taken out of the download, or could not be started — for example because an earlier one is still running.
- The installer stopped without updating. (Check the new version) The installer started, but ended before it stopped Tender — it refused, or it failed. A pre-install check that did not finish (The check did not finish), and data it could not copy (Your data could not be copied), end this way.
- A game was started. Try again once it has closed. The block says the update was cancelled: a game was started while the update downloaded; Tender checks right before the installer starts, and does not start it under a running game.
- Could not check whether a game is running. The update was cancelled here too: at that same check Tender could not ask Steam, and did not start the installer on a guess.
- The new version does not start. (Check the new version) The installer's pre-install check tried the new version before stopping Tender, and it could not be built, or it crashed (The New Version Does Not Start).
Nothing tries again by itself; what the attempt downloaded is removed.
An installer that stops without updating after it has stopped Tender cannot say so itself. If it started Tender again on the version you had, the main panel says Update to X failed — you are still on Y. with the same line about the installer, and Settings › Updates says the same in its block, with Install marked, and offers Try again. If it did not start Tender again, the block says after seven minutes Tender has not come back and how to start it; once it is running again and Steam's interface has reloaded, the main panel says the same as above.
Could not read the update state. under the button means the section asked Tender how the install stands and got no answer; it asks again every few seconds, and the line goes once an answer comes.
Fix: Tender's log names what went wrong, on its lines that say update:. For an installer that stopped, or a new
version that does not start, Show what the installer said under the block shows the installer's own output; from a
terminal it is in the journal:
grep "update:" ~/.local/state/romm-tender/backend.log | tail -n 20
journalctl --user -u romm-tender-update
Then press Try again. A download that failed is often just the network; a checksum that did not match again, or an installer that stops each time, is worth reporting together with that output.
RomM Won't Connect¶
Connection shows "Remove login from RomM URL"¶
Symptom: The Connection row on Tender's main QAM panel says Remove login from RomM URL, and a sync or download fails with an unexpected error, or as server unreachable. Signing in says, in the sign-in window, "Your saved RomM URL holds a user name and password, which Tender cannot sign in through. Remove them from the RomM URL, then sign in to RomM under RomM Account; a login for a proxy in front of RomM goes into Custom headers."
Explanation: The stored RomM URL carries a user name and password (https://user:password@host). Tender cannot sign
in through the address, and no request to it reaches RomM.
Fix: In Settings › Connections, tap Edit next to RomM URL and enter the address without the user name and password. If that login was for RomM, the Connection row says Connected again once the token you are signed in with is accepted; otherwise tap Sign in (or Sign in again) under RomM Account. If it was for a proxy in front of RomM, enter it under Custom headers instead.
Connection shows "Not connected" after "Your saved RomM login cannot be used"¶
Symptom: The Connection row says Not connected, and a sync, download or game page says "Your saved RomM login cannot be used. Sign in again to continue."
Explanation: The stored token holds a character no request can carry, such as a line break. Only a hand-edited settings file holds one.
Fix: Tap Sign in again under RomM Account in Settings › Connections.
Games Won't Launch¶
"RomM Sync" is still installed¶
Symptom: Decky still lists an older RomM Sync plugin, and Tender may look brand new, with no server configured and no synced games.
Fix: Nothing to fix, but do not remove the older plugin until you have checked one of your games. Your shortcuts may still start through a file inside that older plugin's folder; removing it before they have been repointed stops all of your games from starting, and nothing can put that file back. A game's own Target path tells you which state you are in — see Updating from a release before 0.31.0 for the check and what each answer means.
BIOS files missing¶
Symptom: A game for a system that requires BIOS files (PlayStation, Saturn, Dreamcast, etc.) fails to launch or shows a black screen.
Fix: Check the game's detail page — if the BIOS indicator is red, you're missing required BIOS files. Open Library › Platforms in the QAM, pick the platform, and tap Download all. See BIOS Management for details.
ROM not downloaded¶
Symptom: Pressing Play does nothing, or you get a toast saying the ROM needs to be downloaded.
Fix: Open the game's detail page and tap Download in the Tender panel. The game will be playable once the download completes.
File missing¶
Symptom: The game's detail page shows Download again with File missing under it, and no Play. If RomM has no file for the game either, the button reads "No file on RomM" instead and is greyed out.
What happened: The file Tender downloaded is not where it was put any more — it was deleted, its folder moved, or the drive holding it is unmounted. The arrow beside the button opens a menu titled File missing that names that path.
Fix: Put the drive or folder back if that is what happened; otherwise choose one of the two actions, described in Managing Games → When a Downloaded Game's File Is Missing. Where RomM has no file, Download again is greyed out in the menu too, and Forget this download is the action left: it clears the record of the download without touching any file.
The download has no launchable file¶
Symptom: The download finished, but Play is off and the line under it says the game has to be installed in an emulator first, or that the file is not the one the system starts from. Steam's own Play on the shortcut says the same.
What happened: Some titles are distributed as an installer rather than as playable content. The clearest case is a
PS3 game shipped as a .pkg (plus a .rap licence file): the game is sealed inside the package until an emulator
installs it, so there is nothing for a shortcut to start. The same applies to a disc rip that arrived as raw .bin
tracks with no .cue or .gdi alongside them. Whether a file starts is what the emulator source answers, asked each
time the game's page opens. Your download is not deleted — the files are on disk exactly where the ROM would
normally live.
Fix: Install the content in the emulator yourself. For a PS3 .pkg, that is RetroDECK's documented procedure — open
RetroDECK › Configurator › Open Emulator › RPCS3, use File › Install Packages (PKG), point it at the downloaded
.pkg, and install the .rap licence the same way. Launching from Steam once a package is installed is not supported
yet; start it from RPCS3 in the meantime.
Where the line says another emulator of the system starts the file, choose that emulator in the game's emulator menu; the menu says, for each emulator, whether it can start the game.
To find the files, open the game's detail page — the ROM File section shows the filename the download produced.
Play says "Couldn't start the game"¶
Symptom: Pressing Play — Tender's or Steam's own — starts nothing, and a notification says "Tender isn't responding — couldn't start the game." or "Couldn't start the game: …" with what went wrong.
What happened: Tender starts every game itself, at the moment you press Play: it asks the emulator source how the game starts and hands that to the game's shortcut for that one start. When Tender does not answer, or something stops it from handing the start over, nothing starts — a shortcut started without Tender runs nothing.
Fix: Make sure Tender is running (its panel opens in the QAM) and press Play again. If the message names something else, it says what stood in the way.
Play asks whether to launch with local saves¶
Symptom: You start a game — with Play on its detail page, where the button reads Preparing..., or with Steam's own Play or a link — and after a wait a Save Sync Unavailable dialog asks "Couldn't check your saves in time — launch with local saves?".
What happened: Before a game starts, Tender checks what the start needs, its saves among them, and every step of that check but the save sync itself has a time limit — about fifteen seconds for reading how the game's saves are set up on RomM, about five for every other step. A step that got no answer in time ends in this dialog, so a start never waits without end. Either Tender's backend is not answering, or RomM is slow. A save sync that takes long asks a different question — see Play is waiting for a save sync.
Fix: Launch Anyway starts the game on the save already on the device; the sync after the game compares that save
with the server's; where both changed, it tells you, and you choose which to keep before the next start. Cancel
starts nothing, and on the detail page the button returns to Play. If the dialog appears on every start, Tender's
backend is not running or not answering, or RomM is too slow to answer in time. If it is the backend, start it with
systemctl --user restart romm-tender; if the panel still does not answer, restart Steam.
Play is waiting for a save sync¶
Symptom: You start a game — with Play on its detail page, where the button reads Preparing... or, once the sync has begun, Syncing saves..., or with Steam's own Play or a link — and after about fifteen seconds a Waiting for Save Sync dialog names why the start is held up and offers Wait, Play Anyway and Cancel.
What happened: The save sync before the start is not done yet. The dialog says why: another save sync is still running (Sync All Saves Now, the sync after the last game, a manual sync, or the sync of another start), Tender is still busy with this game's saves, this game's saves are still syncing with RomM, or Tender is not answering.
Fix:
- Wait waits about fifteen seconds more. If the sync finishes in that time, the start goes on; if not, the dialog comes back.
- Play Anyway stops this game's sync and starts the game on the save already on the device. A save the sync had already put in place stays; one it was still downloading, or had not reached yet, stays on RomM, and the sync after the game compares that save with the server's; where both changed, it tells you, and you choose which to keep before the next start.
- Cancel starts nothing, and this game's sync runs to its end.
If the sync finishes with nothing to ask while the dialog is open, it changes to Saves Ready with Play and
Cancel — the game never starts by itself. If Tender is not answering on every start, restart its backend with
systemctl --user restart romm-tender.
Controller works in RetroArch's menu but not in the game¶
Symptom: More than one controller is connected — the Deck's own controls and a paired gamepad, say. The controller you hold steers RetroArch's menu, but does nothing in a single-player game.
Why: RetroArch makes player 1 whichever controller it finds first, and that need not be the one Steam lists first. RetroDECK sets RetroArch up so that every connected controller may steer its menu (All Users Control Menu), so the menu answers to any of them, while a single-player game listens to player 1 alone.
Fix: Turn the other controller off and start the game again. Or tell RetroArch which controller is player 1: open RetroArch's menu, go to Settings › Input › RetroPad Binds › Port 1 Controls, and set Device Index to the controller you want to play with.
RetroDECK runs through XWayland in Desktop Mode¶
In Desktop Mode on a Wayland session, a game started from Tender opens an XWayland window rather than a native Wayland one, on purpose.
Why: Steam is an X11 program and learns which window has focus only through X11, where a native Wayland window is
invisible. Started on Wayland, RetroArch opens such a window, and so can a standalone emulator that supports Wayland;
Steam cannot tell that it belongs to the running game, and it applies Steam Input's Desktop Layout to every controller:
the Deck's built-in controls act as mouse and keyboard, and the game gets no controller input at all. So Tender starts
every Flatpak emulator with flatpak run --nosocket=wayland, which leaves it no Wayland connection and makes every
emulator draw through XWayland, where Steam sees the window and applies the game's controller configuration. Under
Steam's 64-bit client Steam sees the window but cannot tell that it belongs to the game; what Tender does about that is
under
The controller acts as mouse and keyboard in a game in Desktop Mode.
In Gaming Mode games already draw through gamescope's XWayland, so nothing changes there.
This is a workaround for a Steam limitation (ValveSoftware/steam-for-linux#8020). It will be removed once Steam handles Wayland windows; that is tracked in #2271.
Shortcuts an earlier version of Tender made need nothing from you: every start asks for the command afresh, so the next start of any game carries it.
The controller acts as mouse and keyboard in a game in Desktop Mode¶
Symptom: In Desktop Mode, a game started from Tender is running and its window has focus, but the Deck's controls act as mouse and keyboard. The game's buttons do the wrong things, and RetroArch's menu does not open with L3 and R3.
Why: Steam's 64-bit client, which Steam may switch to without being asked, cannot tell that a window a Flatpak draws
belongs to the running game, and RetroDECK is a Flatpak. Steam then gives the window its Desktop layout, which turns the
controls into a mouse and a keyboard. Steam's 32-bit client and Gaming Mode are not affected. Valve tracks this in its
steam-for-linux tracker as issue 13053.
What Tender does: While Steam's 64-bit client runs in Desktop Mode, Tender's backend watches which window has focus. When a game's window that Steam cannot place has it, the backend tells Steam to load that game's controller layout. When focus moves on to Big Picture, the desktop or a game's window Steam places itself, it tells Steam once which layout that window gets and then hands the choice back to Steam, which decides by itself from then on — so a game Steam places itself, and its in-game overlay, are left to Steam. When the backend stops while a game's layout is still forced, it hands the choice back to Steam. Under the 32-bit client and in Gaming Mode it does nothing. It reaches Steam the same way Tender's panel does, so while the panel is not loaded into Steam it does nothing either. How it works is in Controller focus in Desktop Mode.
If the layout is still wrong, look at the backend's log with
journalctl --user -u romm-tender | grep "controller focus":
- "Steam's 64-bit client runs outside gamescope; watching": the watcher is at work for the Steam that runs now.
- "not watching, the X libraries could not be loaded": on Debian, Ubuntu, Linux Mint and openSUSE, one library
Tender needs comes in a package of its own. Install it with
sudo apt install libxcb-res0orsudo zypper install libxcb-res0, then restart the backend withsystemctl --user restart romm-tender. - "not watching, TENDER_FOCUS_WATCHER=off is set": you switched it off; see below.
- "not watching, the panel is not loaded into Steam": the watcher has no way to reach Steam in this run.
- "not watching, …" with any other reason: the backend could not reach the desktop session's display. It tries again every few seconds, and again after Steam restarts.
- "Steam could not be handed the input id yet; trying again": the backend's connection to Steam is not there at the moment. It tries again every few seconds for as long as that lasts.
If the backend was stopped without the chance to clean up while a game's layout was forced, the backend clears that layout as soon as it is running again: its first look at the focused window hands the choice back to Steam.
Switching it off: To see how things behave without it, switch the watcher off with an override of the backend's unit:
Add these two lines and save:
Then restart the backend with systemctl --user restart romm-tender. To switch it on again, run
systemctl --user edit romm-tender once more, delete the two lines, save, and restart the backend.
The Steam button opens only Steam's main menu in Desktop Mode¶
Symptom: In Desktop Mode, pressing the Steam button while a RetroDECK game is running opens only Steam's main menu, and it opens behind the game's window, so nothing seems to happen. There is no in-game overlay and no menu for the game, so there is no Exit Game and no controller layout page for it. Steam+X opens no on-screen keyboard over the game either.
Why: Steam's menu for a game follows its in-game overlay, and the overlay cannot work inside a Flatpak sandbox, which is how RetroDECK runs: from there it reports the sandbox's own process number, which Steam then looks for among the computer's processes and does not find. This holds under both of Steam's clients, and Tender cannot change it. It is a known limitation of Steam with Flatpak games (flatpak/flatpak#1756, ValveSoftware/steam-for-linux#8952). The missing on-screen keyboard is a limitation Tender cannot change either.
Fix: Leave the game through the emulator itself. In RetroArch, press Start and Select together: RetroDECK sets that as RetroArch's quit combination, and it quits RetroArch at once. It does not ask first, so pressing both by accident ends the game too. Or open RetroArch's menu, which RetroDECK sets to open when you press L3 and R3 together (both sticks pressed in), and choose Quit in the Main Menu. A standalone emulator has a menu or hotkeys of its own. With a keyboard you can also switch to Big Picture with Alt+Tab and end the game from its game page: the chevron beside Resume holds Stop Game, described under Stopping a running game.
In Gaming Mode the Steam button opens Steam's overlay as usual, because Steam's interface is drawn over the game there, and its Exit Game ends the game. Every way of ending a running game is under Stopping a running game.
Apply to All Shortcuts says "Not applied"¶
Symptom: Under Settings › Controller, tapping Apply to All Shortcuts shows a line starting with "Not applied".
What happened: The Steam Input mode could not be written into Steam's localconfig.vdf. What each line means is
listed under Steam Input Mode.
Saves Not Syncing¶
An emulator source's saves folder does not exist¶
Symptom: A game's save sync says the main panel's notice for that folder — for RetroDECK, RetroDECK: its saves folder path does not exist, so saves of its emulators cannot be synced. Repair it with RetroDECK's 'Repair RetroDECK Paths'. — and a game's exit says Save sync is unavailable: the saves folder path does not exist.
Fix: Insert the SD card or drive the saves folder is on. If it is there, repair the folder with the emulator source's own tool — for RetroDECK, Repair RetroDECK Paths. Tender does not create the folder itself (Save Sync).
An emulator's settings file is missing or cannot be read¶
Symptom: A game's save sync says Emulator's settings file file is missing, so Tender cannot tell where it keeps this game's saves., or … cannot be read, …, or repeats a notice from the main panel about an emulator source's settings file.
Fix: Start that emulator once, so it writes its settings file. If the file is there and cannot be read, check that it is readable, or reset that emulator in RetroDECK. Tender syncs no save at a place the emulator's own settings did not name (Save Sync).
A save action says the game is running¶
Symptom: Sync All Saves Now ends with "\<game> was skipped because it is running", or a press on a game's page — Sync Save Files or Delete Local Saves in the RomM Actions menu, or a slot or a version on the Saves tab — says "\<game> is running. Quit it first."
What happened: Steam lists that game as starting, running or exiting, and Tender changes no save of a game while it runs (While a game is running).
Fix: Quit the game. Its saves sync after it exits, as long as Sync after exit is on; then the press works again. A press refused right after you quit may have found the game still listed as exiting; try again a moment later. If no game is running and the message still names one, Steam's list could not be read the way Tender expects: restart Steam.
Auto-sync is disabled¶
Fix: Go to Save Sync in the QAM and make sure both "Sync before launch" and "Sync after exit" are toggled on.
Server unreachable¶
Symptom: The toast after a game exits says "Server offline — saves will sync next time", or a game's Saves tab shows "Server unreachable".
Fix: Check your network connection and verify the RomM server is running. The Connection row on Tender's main QAM panel shows the live status (and names the problem when it can't connect). A failed save sync is not queued: your local save stays as it is, and the next sync, before a game starts, after it exits or one you start yourself, carries it once the server answers. Playtime is queued separately and sent to RomM the next time a game starts or ends.
Offline detection and recovery¶
When Tender can't reach RomM, it notices from the calls that fail (a connection probe, a save-status or slot load, a version switch, or the first-time save-slot setup) and marks itself offline. On a game's detail page you'll see a RomM offline badge in the play row, the Download button and slot switching are disabled (they need the server), and the Saves tab shows a "RomM is offline" banner and renders straight away instead of hanging. The Achievements tab does the same — it shows a short "RomM offline — achievements unavailable." line (keeping any list and counts it had already loaded) instead of spinning on "Loading achievements…" forever. The first-time save-slot setup screen also shows its "RomM server is not reachable" message and a Retry button immediately rather than working through the connection attempts. Playtime keeps showing — it's tracked locally and doesn't depend on the connection.
While a save load is actually reaching the server, the Saves tab and the setup screen show a spinner labelled Connecting to RomM…. If the server is briefly slow or flaky, Tender retries a couple of times before giving up, and the spinner shows which attempt is in progress — Connecting to RomM… (attempt 2/3) — so a slow connection reads as busy rather than stuck. Several parts of the page can be waiting on the server at once, so the count follows the furthest one along and never walks backwards while a page is loading. Once Tender already knows the server is unreachable it stops retrying — one attempt, then the answer — so the spinner reads plain Connecting to RomM… with no attempt to count, and the offline state arrives quickly instead of after a full round of retries.
You don't need to do anything: while a game page is open, Tender checks the server roughly every 30 seconds in both directions. If RomM goes away, the RomM offline badge appears on its own within that window; the moment RomM is reachable again the badge clears, Download and slot switching re-enable, and the saves list, achievements, and setup screen reload themselves on the spot — no need to leave and re-open the page.
Only a genuine connection failure marks Tender offline. If RomM replies that it no longer has the thing being asked about — most often because the game was deleted and re-added on the server, which gives it a brand-new id, or because the RomM database was reset and this device's registration disappeared with it (Tender re-registers this device first, so this rarely shows) — that is the server answering, so the RomM offline badge stays clear and the surface tells you what's missing instead. If you see such a message while the badge is clear, the fix is on the RomM side (re-sync the library, or re-check the game), not with your network.
A slow answer isn't a failure either. The check a game page runs when it opens can take a while on a busy server or over a remote connection; while it's still outstanding the page simply keeps waiting, and the RomM offline badge appears only once something actually reports the server as unreachable. A page that takes a few seconds to settle is not the same thing as a page that found RomM missing.
When the missing thing is this device's own registration — the RomM database was wiped or restored and the id this device was issued no longer exists — you don't have to do anything. When you sign in, when Tender's panel loads (installing an update counts: the panel is loaded again after one), and before everything that asks RomM about this game's saves (a sync before a game launches, after it exits or by hand, the saves status, the previous versions, a copy into another slot, a restore, resolving a conflict, a slot switch, listing or deleting a slot's saves, the save-slot setup), Tender first checks that this device's id still exists on the server; the moment it finds the id is gone it registers this device afresh and carries on under the new id. A new entry shows up in RomM's device list; the old, dead one can be ignored. Play time that was recorded but not yet uploaded — sessions played while RomM was away — is carried over to the new registration, so it still lands on the server under this device rather than being stranded.
The first-time save-slot setup screen is the clearest example. If RomM can't find the save data that setup needs, it pauses with "RomM couldn't find the save data for this setup" rather than the "server is not reachable" message, and the offline badge stays clear. Setup deliberately stops there instead of picking a slot for you: Tender has no trustworthy view of what's on the server, and choosing a slot on that basis could overwrite real saves on the first sync. Re-check the game in RomM (a server database reset re-registers this device automatically — see above), then tap Retry.
"This device could not be registered with RomM"¶
Symptom: the Saves tab's sync line reads "Device not registered with RomM", the save-slot setup pauses with "This device could not be registered with RomM", the previous versions show the same message, resolving a conflict says "This device could not be registered with RomM — conflict left unresolved", or a sync, copy, restore or slot switch fails with "Device not registered with RomM"; the RomM offline badge stays clear.
Tender registers this device with RomM before it asks about a game's saves, and here RomM answered without registering
it — or a proxy in front of RomM answered in its place, or Tender could not send your saved login. Tender listed nothing
from RomM, and no save was synced. The usual cause is a token without the devices.write scope (see
Required scopes); sign in again with a token that has it. If a proxy sits in front
of RomM, check that it lets /api/devices through. Then tap Retry, or open the game page again.
Save file not found¶
Symptom: The game detail page shows save status but no save file is being synced.
Fix: What syncs is not one file type. For each game, Tender asks the emulator that will launch it which files its save consists of, and syncs only those. Where that answer is something Tender cannot carry — a card many games share, a save inside the game file, a name built from the game's own identity, a save folder that depends on the folder the game is started from, or nothing established — save sync does nothing for that game rather than guessing. When save sync does nothing, and why explains each case, and the save sync support matrix shows how each system usually lands.
Also check that the game has saved at all — some games use in-game passwords instead of battery saves, so there is nothing to sync.
A newer save wasn't downloaded before the game started¶
Symptom: You start a game and it loads an older save, although another device uploaded a newer one.
Fix: The sync before a game starts runs when you start a RomM game with Tender's Play button, Steam's own Play or a
steam://rungameid link, but it can end without downloading. Check:
- That the sync before launch is on — see Auto-sync is disabled.
- Whether RomM was reachable when the game started. If it was not, the game started on the save already on the device — or, if that save had changed since its last sync, you were asked first.
- Whether the other device uploaded to the same save slot. Each device syncs the slot that is active for the game on it; the game's Saves tab shows which one that is.
- Whether you chose Launch Anyway in the Save Sync Unavailable dialog. It asks when the sync before the start failed, or when a step of the check before it got no answer in time, and Launch Anyway starts the game on the save already on the device — see Play asks whether to launch with local saves.
- Whether you chose Play Anyway in the Waiting for Save Sync dialog. It stops the sync before the start, so a newer save it was still downloading, or had not reached yet, stayed on RomM — see Play is waiting for a save sync.
- Whether save sync covers the game at all — When save sync does nothing, and why.
Saves being overwritten unexpectedly¶
Symptom: Your save keeps reverting to an older version after syncing.
Fix: There is no conflict setting to change: Tender follows one automatic policy, described under When saves conflict. It downloads the server's save over yours whenever your local save has not changed since the last sync, so a save that keeps reverting usually means another device uploaded a newer one to the same slot.
Also make sure each person using RomM has their own account — shared accounts cause saves to overwrite each other.
Conflict prompt after a crash or power loss¶
Symptom: After an emulator crash, a full disk, or a power loss mid-save, the next sync shows a conflict prompt instead of uploading — and the local save shown is 0 bytes or much smaller than expected.
Why: A crash can leave a 0-byte or truncated save file on disk. Tender refuses to upload it over your good server copy: the upload would become the newest save in the slot, other devices that have not changed the save would then download it, and once RomM prunes the older versions the good one could be gone. So instead of silently destroying your progress, it asks you to choose. It goes by the save's content, not counting the empty padding some emulators write at the end of a save, so a save that is smaller only because it was written with less padding still uploads. (A save already changed before you updated Tender is judged once by its full size; resolving that one prompt with Keep Local settles it.)
Fix: In the conflict prompt, pick Use Server to restore the good copy from RomM (the bad local file is moved
aside into the .romm-backup folder next to your saves first, so nothing is lost). Only pick Keep Local if you are
certain the small/empty local file is the one you want to keep — that uploads it as the newest save in the slot.
If you need to recover a save by hand, look in the .romm-backup folder inside your saves directory (e.g.
<saves_path>/gba/.romm-backup/): every file Tender moves aside is timestamped there. Tender moves a save aside
whenever it is about to be overwritten or removed — not just when resolving a conflict with Use Server, but also
when the setup wizard copies an archived save (one uploaded without a slot) into a slot. When you switch save slots,
every save file of the game is moved aside, the ones the new slot replaces included, before the new slot's saves are
downloaded. If one of the new slot's saves fails to download, the game may find no save under that name until its next
sync; before the game starts, that sync runs while Sync before launch is on and RomM can be reached. If a save can't
be moved aside when you switch slots, the switch stops and the slot you were on stays active; you're told which saves,
if any, were already moved into .romm-backup. If the .romm-backup folder itself can't take backups, the switch is
refused before anything moves, and you're told the folder is the problem.
Backups are not kept forever. The folder keeps the newest 10 backups per save file; older ones are pruned the
next time that same save is moved aside (one that can't be removed is kept). Backups of a different save file are never
pruned to make room. If you want to keep a particular recovery copy long-term, move it out of .romm-backup yourself.
Artwork Missing¶
No SteamGridDB API key¶
Symptom: Games have cover art but no hero banner, logo, or wide grid image. The detail page background is blank.
Fix: Configure a SteamGridDB API key in Settings › Connections. It's free — create an account at steamgriddb.com and copy your API key.
Game not found on SteamGridDB¶
Symptom: Some games have full artwork while others are missing hero/logo/wide grid even with an API key configured.
Explanation: Tender finds a game on SteamGridDB by the SteamGridDB id your RomM server holds for it, and a RomM scan stores one when it asked SteamGridDB and found the game there. What a game without one shows is under Artwork.
Fix: Give RomM the ids (checked against RomM 5.3.1):
- In RomM's scan dialog, select SteamGridDB among the scan's metadata sources. It is under Specific, and it is a separate entry from Steam, which is RomM's source for the Steam store.
- For games that have no SteamGridDB id yet, run an Unmatched games scan with SteamGridDB selected.
- Or set it by hand: edit the game in RomM and enter its SteamGridDB ID.
Once RomM has the id, the next sync brings it over, and the background artwork job then gives the game its SteamGridDB wide grid, logo and — where it has none — cover, and its SteamGridDB icon in place of Tender's logo; the hero comes when the game's page is opened. Refresh Artwork stays greyed out until the game has a SteamGridDB game, so for a game without one it is that next sync that brings RomM's id over; from then on Refresh Artwork asks RomM for the id, downloads Tender's pick anew for every image on automatic and applies it, while an image you chose in the ARTWORK tab and one set in Steam stay. Opening the game's page for the first time in a session, once a sync has brought the id over from RomM, sets the hero banner, logo, wide grid, icon and cover only where the game has none yet (Tender's logo counts as no icon).
For a game SteamGridDB lists under another name, or not at all, a scan may find nothing. The game's ARTWORK tab then offers Choose game…, where you search SteamGridDB by name and apply a match; Tender remembers it until RomM has an id of its own for the game (The ARTWORK tab). If a game genuinely has no artwork uploaded to SteamGridDB, those slots fall back to Steam's defaults — you can contribute artwork there to help the community.
SteamGridDB refused the API key¶
Symptom: Refresh Artwork says "SteamGridDB refused the API key — check it in Settings".
Explanation: SteamGridDB no longer accepts the stored key, for example because it was regenerated on steamgriddb.com. The artwork your games already have stays; only new downloads stop.
Fix: In Settings › Connections, tap Edit next to API Key and paste the current key from your SteamGridDB API preferences.
Artwork not appearing after sync¶
Symptom: After a sync, some library tiles show Steam's default placeholder instead of the cover art.
Explanation: Covers are applied while the sync runs and fill in progressively, but Steam caches a brand-new shortcut's tile image and does not always refresh it right away. A tile that is still gray usually resolves on its own the first time you open that game's detail page, scroll it back into view, or the next time Steam restarts — the cover is already on disk; Steam just hasn't re-rendered the tile yet.
Fix: If a tile stays blank after that, open the game's detail page and tap Refresh Artwork in the Tender panel. This downloads the cover from RomM again and the SteamGridDB images anew, for the images on automatic. For a game without a SteamGridDB game it is greyed out; there the next sync brings the cover, or setting the cover back to Automatic in the game's ARTWORK tab reloads it at once — the cover's slot offers Automatic without a SteamGridDB game or key too. Refresh Metadata changes no artwork: it shows the metadata Tender stored at the last sync again and asks RomM nothing. (Hero banners, logos, and wide grid images additionally need a SteamGridDB API key — see above.)
Shortcuts Appear on Other Devices¶
Symptom: Games synced on your Steam Deck also appear on your HTPC (or vice versa), but without artwork. They disappear when the source device goes offline.
Explanation: This is Steam's Remote Play discovery protocol, not a bug in Tender. Steam automatically advertises all non-Steam shortcuts to other Steam clients on the same network. These "phantom" shortcuts are ephemeral — they only exist while both devices are online.
Tender cannot prevent this. Your options are:
- Disable Remote Play entirely in Steam Settings › Remote Play
- Ignore them — they show a "Stream" button instead of "Play" so they're distinguishable
For technical details, see Steam Remote Play and Cross-Device Shortcuts.
Downloads Stuck or Failed¶
Download shows no progress¶
Fix: Check your connection to the RomM server (the Connection row on Tender's main QAM panel). If the server is reachable, try cancelling and restarting the download from the game detail page.
Download failed¶
Fix: Open the Downloads page from the QAM to see error details. Common causes include insufficient disk space, network interruption, or the ROM being unavailable on the server. Failed downloads can be retried from the game detail page.
Download failed with "Not enough space to unpack"¶
Fix: The game arrived as a zip that Tender unpacks, and its contents do not fit beside it. Free space on the drive the game goes to and press Download again: the zip is kept, so the retry unpacks it without downloading it again — unless Tender has restarted in between, which clears the kept zip. See Managing Games for what is unpacked.
Download refused before it starts¶
Fix: The refusal says why. A download goes only into RetroDECK's folders, so it needs RetroDECK installed and switched on in Settings › Emulator sources, a system in RetroDECK for the game's platform, a ROM folder for that system, and RetroDECK's settings in order — when the main panel shows a notice for RetroDECK, the refusal repeats it; follow what the notice says. See Managing Games for every case.
Data Management¶
The Data Management page is an inventory of what this device holds. Each row on the left names a population — a set of things that is on your device — and carries its count; picking a row shows what that population is, the numbers about it, and whatever can be done with it. Most rows offer one action, Other non-Steam games offers a removal and a whitelist, and Recovery bundles offers none at all. The six rows are Tender's shortcuts, Installed ROMs, Grid images, Other non-Steam games, Gone from RomM and Recovery bundles.
A count shows a small spinner while it is being read, and a dash if it could not be read. Two counts cost a scan, so they read scan until you press for them: Grid images, which looks only at this device, and Gone from RomM, which also asks RomM once which games you hid; while that scan runs, its row shows the spinner and the button says it is scanning. When a count could not be read, its pane says so and how to try again: open the page again for most rows, or press the scan button again for a scan that failed. Grid images keeps what its scan found until a removal changes it (see Grid images); Gone from RomM keeps it until a cleanup run finishes — which is what changes the number — and then asks to be scanned again. Every destructive action asks first — press once to see the prompt, press again to confirm. The per-platform actions — removing one platform's shortcuts, deleting its save files, deleting its BIOS files — live in Library › Platforms, on the platform's own pane.
While a library sync is running (or cancelling), the shortcut and ROM removals and the grid-image cleanup are unavailable — the buttons are disabled with a short hint, and the backend refuses the request too. Wait for the sync to finish or cancel it first. Save-file and BIOS deletions are not affected.
Gone from RomM¶
This is the only workflow that deletes retained local database rows for games RomM no longer has. The initial scan may show a candidate, but deletion still requires a fresh exact-id 404 during the confirmed run and another check after long recovery or Steam work. A skip is therefore expected if RomM comes back, the response is uncertain, a download starts, local state changes, recovery cannot seal, or Steam cannot confirm its action.
While cleanup is starting or running, library sync, downloads/resumes, migrations, version switches, save mutations, session finalization, launch evaluation, core/disc changes, Steam Input application, uninstalls, and relevant cache cleanup are refused. Frontend Steam continuations hold bounded expiring leases until acknowledged, so a lost page or bridge response cannot block cleanup forever. Active work renews its lease while applying Steam changes; a lease expires only after five minutes without a successful renewal. An owner's teardown stops future Steam writes and renewal, but a lease is not explicitly released while an already-started Steam operation is still settling. An unresolved continuation stops renewing after its bounded frontend lifetime and then relies on backend expiry. Server, sign-in, token, and user changes (including a connection test that can backfill user identity) are refused during the run, and every exact-id check also verifies the same server/user namespace captured by the preview. Cancel or finish the cleanup before retrying those actions. This reciprocal block prevents newly downloaded content or recovered state from appearing after recovery was captured and then being removed by finalization.
Recovery bundles are under recovery/bundles/ in Tender's folder — ~/Tender/recovery/bundles/ unless you chose
another place under Settings › Tender folder. Older bundles sealed under ~/romm-tender-recovery/bundles/ or
~/decky-romm-sync-recovery/bundles/ stay where they are — nothing moves them, and those folders are yours to keep or
delete. A directory appears there only after every required copy and checksum succeeds, directory durability succeeds
where supported, and the staging directory is atomically sealed. A post-rename durability failure preserves the
directory with a .durability-uncertain suffix instead of making it look successfully sealed. Before the Steam action
and again before local finalization, the backend verifies the seal, manifest/checksums, bundle-bound source claims,
source root/descendant identities, mount IDs and bytes, expected absence of currently missing saves, database state,
save ownership, and captured Steam/controller state. Filesystem mutation then holds kernel writer-exclusion leases
through descriptor-relative removal; replacing a path, keeping a writable file descriptor open, crossing a nested mount,
or creating a previously absent save after sealing does not authorize deletion. Saves are moved into .romm-backup with
atomic no-replace semantics, so a backup created concurrently is preserved rather than overwritten. Recovery destination
directories and files stay attached to held descriptors through metadata updates, hashing, sealing, and validation, so a
swapped symlink is not re-authorized. A failed attempt may report recovery_failed; it leaves the local game unchanged.
Incomplete staging is removed only when descriptor-relative, mount-aware cleanup proves the tree safe. Otherwise the
error names the full path of that preserved staging so mounted or uncertain data is never traversed recursively.
Free-space blocking in the modal covers the installed ROM content you selected. The backend checks actual source size
and free space again at copy time, so a later disk-space change can still stop the group safely.
The cleanup report is per group: unrelated groups continue after a skip or failure. A large run's report arrives in parts, and the report is shown once every part has arrived. A partial result means the report lists a Steam or filesystem action that committed or became ambiguous before a later guard failed; read that group's concrete message and save warnings before retrying. If a recovery bundle was sealed but a later liveness or Steam check aborted, keep the bundle; it is a valid pre-action snapshot even though no local row was deleted. Recovery has no automatic import flow.
A bulk shortcut removal is paced so it never freezes the interface, so on a large library it can take a few seconds. While one is running, every removal button on every pane is disabled and a spinner above the list names the operation and counts off the shortcuts it has removed; the buttons re-enable and the final count appears once it finishes. You can't start a second removal (or a new one from another button) until the current one completes.
Tender's shortcuts¶
The row counts the shortcuts Tender created. Remove all shortcuts removes every one of them, across all platforms; collections are cleaned up with them. It also sweeps up any shortcut of ours that Steam still holds without a record on our side — what a run interrupted mid-apply leaves behind — so the button stays useful when the count reads zero. Downloaded ROM files and save files are left where they are, and the next sync puts the shortcuts back.
Installed ROMs¶
The row counts the installs Tender downloaded — one per install, so a multi-disc game counts once and two installed
versions of one game count twice — and the pane states their total size with a ≈. That size is what your RomM server
reported for those games rather than a measurement of your disk, so it is close rather than exact — an unpacked archive,
a patch beside the original or extras in the same folder are not what the server named, and a game whose size the server
never reported adds nothing to it.
Uninstall all ROM files deletes them from disk. Shortcuts remain in your library so you can download the games again. Use this to reclaim disk space.
Grid images¶
Deletes leftover Steam grid images (the grid/ cover, hero, logo, icon and wide files) whose shortcut no longer exists.
Removing or re-creating shortcuts leaves these image files behind, and they accumulate over time.
An image counts as orphaned only when all of these hold:
- its filename is a Steam grid-image name for a non-Steam shortcut appId — custom images you saved for regular Steam games are never touched,
- that appId belongs to no live shortcut — Tender scans your full shortcut list first, so images of shortcuts from other tools (Heroic, Lutris, manually added games, …) are protected too, not just RomM's.
The row reads scan until you press Scan for orphaned images, which counts them without deleting anything and puts the number on the row. The button then offers to remove that many, and asks once before it does. Deletion is permanent — there is no backup. If the shortcut scan can't run, or any synced RomM shortcut is missing from it, the cleanup refuses and deletes nothing, and the row keeps its count.
The removal looks for orphaned images again when it runs, so it also takes any left behind since the scan. While it runs, the page is busy and no other removal can start. Afterwards the row reads 0 only when every image the removal found was deleted. If some could not be deleted, the pane says how many, and the row goes back to scan; the same happens when the removal's result never came back. Removing Tender's shortcuts or other non-Steam games, or finishing a Gone from RomM cleanup, also puts the row back to scan, because each can leave images the scan did not count — a Tender shortcut that Tender itself had no record of, a non-Steam game whose images nothing here deletes, or a cleanup run without recovery, which leaves its games' images behind. Press Scan for orphaned images again to count what is left.
Other non-Steam games¶
Everything in your Steam library that neither Steam nor Tender installed — emulators, launchers, browsers, games you added by hand. Your RomM games are not in this row; they are counted under Tender's shortcuts, and removing them is that row's job. The removal here cannot touch them: Tender's own shortcuts are told apart by what they launch, not by their names.
If Steam's shortcut list cannot be read, that ownership cannot be established — the count shows a dash, the pane says the list could not be read, and the removal is refused rather than guessed at. Steam also does not always answer for an individual shortcut in time; those entries are counted neither way, are never offered for removal, and the pane says how many it is leaving alone.
A whitelist system lets you protect the rest from removal:
- Press Configure whitelist
- Toggle on any games you want to protect (RetroDECK is auto-protected by default)
- Use the search box to find specific games in long lists
- Protected games are excluded from the removal count
Tender shows extra warnings if RetroDECK is not whitelisted, since removing it would break all emulation.
Recovery bundles¶
The row counts the snapshots the cleanup sealed under recovery/bundles/ in Tender's folder, and states the disk they
take. Below that total the pane lists each bundle with the game it holds, the day (UTC) it was sealed as its folder name
carries it, and its size, newest first. The game is spelled the way the bundle's folder spells it — Shenmue-II for
Shenmue II — so it matches what you see in a file manager. A folder whose name is not in the shape Tender writes — one
you renamed, or one ending .durability-uncertain because its seal could not be confirmed — is listed under its folder
name, with no day, at the bottom. Nothing on this page removes one — they are yours to keep, move or delete in a
file manager. What a bundle holds is under
Cleaning up versions removed from RomM.
The count covers that folder only. Bundles an older version sealed under ~/romm-tender-recovery/bundles/ or
~/decky-romm-sync-recovery/bundles/ are still on your disk and are not counted here, so a device carrying those
has more than this row reports.
Per-platform removals moved¶
Removing one platform's shortcuts, deleting its save files and deleting its BIOS files are on that platform's pane in Library › Platforms, each behind its own confirmation. See Removing a platform from Steam and Deleting BIOS files.
Previous: Save Sync