Side Projects
Deckport: Getting Native Linux Games Onto the Steam Deck Without the Busywork
Part 3 of the thread Games and gear
- What it is
- Open-source tool
- My role
- Creator
- Built with
- Python
- Steam Deck
- Deckport takes a native Linux game folder from your PC and lands it in Game Mode on the Deck, registered and wearing real box art.
- The PC side grabs artwork from SteamGridDB. The Deck side is one standard-library Python script that edits
shortcuts.vdffor you. - Close Steam first, and run it with
--dry-runthe first time. - Windows games are out of scope on purpose. Lutris and Bottles already do that well.
The Steam Deck is a Linux PC, which means plenty of games run on it natively. Godot exports, LÖVE games, plain Linux binaries from itch.io or a game jam. Getting the files onto the Deck is easy. Getting them to show up properly in Game Mode, with a name and real artwork, next to everything else in your library? That's where the busywork starts.
Deckport is the tool I wrote to make that part go away. It's open source, written in Python, and I've shared it on Reddit and in a few dev communities. The pitch in the README says it best: drop a portable game on your PC and have it land on your Deck unlocked, registered with Steam, dressed in real box art, and ready to play in Game Mode.
How non-Steam shortcuts work
Some quick background, because it explains why this is fiddly by hand.
Anything you add to Steam that Steam didn't sell you is a "non-Steam game" shortcut. Steam keeps those in a file called shortcuts.vdf, inside your user's config folder:
~/.local/share/Steam/userdata/<your Steam user ID>/config/shortcuts.vdf
It's a binary VDF file, Valve's key-value format in its binary flavor, not the text version you see elsewhere in Steam's folders. So you can't just open it in an editor and add a line.
Heads up
Steam keeps that file in memory while it's running and writes it back out when it closes. Edit it while Steam's open and your changes get quietly overwritten. Steam has to be closed when you touch it.
Doing it the normal way means switching to Desktop Mode, clicking "Add a Non-Steam Game", browsing to the executable, then going off to hunt down artwork and drop it into the right folder with the right filenames. Once is fine. Twenty games in, you start wanting a script.
What Deckport does
The work is split between your PC and the Deck.
On the PC, Deckport fetches artwork from SteamGridDB and bundles it into a .deckport-art/ folder inside the game folder. Then the whole folder goes over to the Deck in one push (rsync or SFTP, whatever you like).
On the Deck, you run a single script, deckport.py. It:
- Finds the executable. It looks for ELF binaries by their magic bytes, scores the candidates, and prefers Godot exports when it sees one.
- Fixes permissions. File transfers tend to strip the execute bit, so it sets the binary back to
0755. - Writes the shortcut. It parses and rewrites
shortcuts.vdfdirectly, makes a backup first, and keeps the rewrite byte-for-byte faithful to what Steam expects. - Installs the artwork. It copies the bundled images into Steam's grid folder with filenames that match the shortcut.
That last step leans on a small trick. Steam gives a non-Steam shortcut an app ID based on its executable and name, so Deckport computes the same ID on both sides: a CRC32 of the executable path and name, with the high bit set, which lands it in the range Steam reserves for non-Steam games. The PC and the Deck never have to talk to each other to agree on which artwork belongs to which game.
The Deck-side script only uses the Python standard library. That matters because SteamOS has an immutable root filesystem, so installing packages system-wide isn't really an option.
Using it
There's a one-time setup on the Deck: give the deck user a password, turn on SSH, and make a folder for games.
passwd
sudo systemctl enable --now sshd
mkdir -p ~/Games
Copy deckport.py into your home folder. After that, the routine is: push a game folder into ~/Games/, close Steam, and run:
python3 ~/deckport.py
It has a few options:
--games-dir PATH drop directory to scan (default: ~/Games)
--tag NAME collection name (default: "Ported Games")
--dry-run show decisions, write nothing
--user STEAMID3 pick a specific Steam user directory
Tip
Use
--dry-runfirst. It shows you what it's going to do without writing anything, which is exactly what you want the first time something edits a file Steam cares about.
Recipes
Not every game is a clean drop-in. Some need a launch option or some other per-game setting. Deckport captures that as recipes: small TOML files, one per game, each with a status of unverified, needs-test, working or borked. working means somebody confirmed it on real Deck hardware. Recipes describe configuration only, never where to get game files and nothing to do with DRM.
What it doesn't do
Deckport is about native Linux games. Windows games need a Wine or Proton prefix, and tools like Lutris and Bottles already handle that well, so Deckport deliberately stays out of it.
Heads up
A few things to know going in: Steam must be closed while it runs, SteamOS updates can wipe anything outside
/home, and deleting a game folder leaves its shortcut behind until you remove it.
Try it
It's free and on GitHub. If you've got a pile of itch.io downloads you've been meaning to put on the Deck, give it a spin, and if a game needs a recipe, add one.
- Picking One Android Handheld for Emulation and MoviesResources & Recommendations