Having Fun With Valve's Steam Deck
Valve's Steam Deck is a portable gaming device that runs an Arch-based Linux distro called "SteamOS". It's meant to give the user a console-like experience with Steam, but because it's "just" a Linux machine there are plenty of things you can do outside of Steam and what it provides. Join me as I discuss some of what I've been doing!
A quick note: what follows is not a review per se, nor is it a recommendation. It is a look at using the Steam Deck outside of Valve's walled garden, and me chronicling what I did with some occasional backstory. I think one of the great beauties of the Linux ecosystem is the fact that there's a lot of choice. I can do things my way, and you can do things your way! With that out of the way, on to the good stuff.
→ Why Steam Deck?
In a world where products that lock the users in while also locking them out are most common and sought after, the Steam Deck seems like a unicorn. Not only does Valve encourage people to open it up, they went as far as sponsoring an iFixit video to show you how to do it right! Add that to the fact that the OS is "just" Linux with no locking out of the user at all, there's suddenly a huge amount of possibilities open. 1
On a more personal level: I have always loved handheld devices. I still keep my Nintendo New 2DS XL and Switch around, and I don't always like playing in the fixed gaming area on a big TV. The proposition of "relatively open handheld that runs Linux" is indeed a pretty easy sell for me! 2
Although I have a fair amount of "verified" games in my Steam library, I've got a few games from other stores as well as free software such as emulators that I'm definitely interested in running. Thankfully, Steam allows adding such content with relative ease, but the process isn't quite as super slick as installing verified games directly from Steam.
I reserved my Steam Deck about a month after it was announced (early August 2021 or so) and got it about three weeks ago. In that time I've done quite a bit with it, but I've also tried to stick with the stock experience; I'm avoiding using the system package manager unless totally necessary and I'm not making system or UI changes like I might do on a "real" Linux setup.
→ Steam Games
Installing games from the Steam storefront is of course a breeze. Games known to work without a hitch are marked with green checkmark icons, games that require some extra effort (such as using the track pad to click some launcher with a mouse pointer) are marked with yellow exclamation point icons, and the rest are either unknown or not compatible.
Select your game, click install, and that's it. Windows-only games that aren't verified will require the extra step of selecting a compatibility tool, but that's a matter of a few button presses. It's really amazing to see how many games have those green and yellow exclamations! The fine folks that work on wine, proton, DXVK, VKD3D-Proton, and the rest of the ecosystem have moved mountains, this stuff has come such a long way since I first tried to run Diablo 2 with wine 1.X almost 15 years ago.
→ Non-Steam Games
The store experience is pretty slick, but what about using things from outside Valve's walled garden? How about using free software such as emulators? Well it's not as slick as what's described above, but it certainly isn't a pain and the results are fantastic.
→ Why AppImages?
First a note about how I'm obtaining software: I'm choosing to skip Flatpaks that are available and use AppImages instead - where none exist I'm building them myself. 3
It seems common to consider AppImages as an inferior alternative to Flatpak, or that they are just bad in general. I don't think either assessment is fair or true. Suggesting AppImage is not a condemnation of Flatpak; they can coexist just fine.
I actually don't consider AppImage an alternative to Flatpak at all. The way I see it, they solve different problems. AppImage provides a way to have effectively a single, reusable binary for many platforms. Flatpak aims to provide a more package manager-like experience, which has merits of its own.
I strongly feel that AppImage is an ideal packaging solution for things related to gaming, and it's important to give users a good experience that's free of OS-specific rituals such as using a package manager. Consider the following experience on Windows: 4
- The user finds out about some software, say for example OpenMW
- They visit the OpenMW website and find the downloads page
- They click the link to get a development build
- They extract a zip file and get an executable they can simply run
Contrast that to the experience for any Linux distro:
- The user finds out about some software, say for example OpenMW
- They visit the OpenMW website and find the downloads page
- There's several links for Linux builds; do you know if you need PPA or AUR or Flatpak or ???
- They click the development build link and get a tarball
- They extract that and run it, and it fails to do anything because it was linked against different versions of various dependencies (unless you're using the blessed version of Ubuntu)
If you go the Flatpak route, then you have to deal with features such as sandboxing that aren't really necessary for a game (and will add additional confusion to a user that may already be confused by an OS and environment that are new to them). Or there simply may not be a Flatpak available, if for example you want a development build and not a release. That's on top of the requirement that it's basically a package manager, so at some point you'll likely have to be aware of "package manager" as a concept when the abstraction leaks. 5
For a lot of software typically used on Linux systems, it's acceptable to say "hey, you should know about how this stuff works" or "do it right, do it securely". But to play a video game? I don't see why Linux users shouldn't have the same (or close to) experience as on Windows. AppImage is as close as we can get to that right now, I think. 6
Not only that, but going the AppImage route allows for easily going between versions - something that may be desireable with emulators for example.
Traditional package managers and Flatpak certainly have their place; I wouldn't advise using an Nginx or OpenSSH AppImage for example. But again for games, where users may not be systems administrators, requiring more steps than "download, run" is unnecessary. Okay, thanks for hearing me out, back to the fun stuff! 7
→ Windows Things On Steam Deck
...And really on Linux in general. Before I continue, a quick word about using Proton to run Windows things:
It was really painful to see recommendations to install Windows just so users could run one specific non-Steam thing on their Steam Deck. If you've never used Proton before then maybe installing an entire other OS seems like the easier route, but it really isn't. Provided there's no "anti-cheat" or similar required by the thing you want to run, the process is more or less this:
- Extract or install the thing onto your Steam Deck
-
Add the
.exe
of the thing as a non-Steam game - Force the usage of a compatibility tool 8
- Run the game
That's really it, much simpler than installing and booting into another OS. Of course, this isn't a guarantee that it will run or run without quirks, but running random executables with Proton need not be a mystery. Moving on!
→ Setting Up The Steam Deck
There's no setup required for the Steam Deck per se; it is fully usable out of the box. The setup I'm referring to is changes to adapt it to my preferred workflow. I want to be able to SSH into it from my laptop, and I want it to have access to my NFS share. I also don't want to leave glaring security holes in the process.
Note that what follows is not a recommendation, it's just what I did because I wanted to. Only do things that you're comfortable with and know about, don't just copy things from strangers on the internet. Before I went on to setting up all kinds of fun stuff, I made a couple of system tweaks for a workflow that I prefer:
- Enable SSH
- Automount my local NFS share
- Make a couple of security tweaks (since I opened security holes with SSH)
That's basically it. I wanted to keep the experience fairly out of the box and see what I can get away with, without needing to install packages and use it like "a real Linux" setup. The above steps enabled me to easily connect to the Steam Deck from my laptop and copy things from my file server. 9
→ OpenMW
OpenMW does not yet have full support for a gamepad, but it's still definitely enjoyable with one. As it turns out, all the mod lists that I maintain for OpenMW are playable on the Steam Deck, with some settings changes needed for the more graphically heavy lists in order to reduce RAM usage. 10
Playing Morrowind on Steam Deck via OpenMW is a great experience, but I wanted a way to be able to go between multiple setups with no hassle.
→ Portable Install
The latest (still in RC phase as of this writing) release of OpenMW adds a "portable" feature that lets you run out of an arbitraty directory, rather than out of the regular paths (e.g. $HOME/.config/openmw
). This is especially useful for setting up each of my mod lists as a separate entry in the Steam UI. My launcher script looks something like this:
#!/usr/bin/env sh
# This file is located at: $HOME/games/launchers/OpenMW-TotalOverhaul
$HOME/games/OpenMW.AppImage \
--replace=config \
--config=$HOME/games/openmw/total-overhaul \
--user-data=$HOME/games/openmw/total-overhaul
The $HOME/games/openmw/total-overhaul
directory is where config files, screenshots, and save files will be located. I simply add the above script as a non-Steam game and it's available in the UI. This pattern can of course be repeated to have multiple mod setups available as separate Steam UI entries. 11
→ Modding Games
It's worth mentioning that you can of course mod games on your Steam Deck. I'm happy to report that in addition to extremely modded Morrowind via OpenMW I've also successfully ran heavily modded Fallout 3, Fallout: New Vegas, and I've also ran moderately modded Skyrim: Special Edition (on the ultra quality setting).
The Fallout 3/New Vegas setups include a lot of high quality graphics replacers in addition to many other content and gameplay mods. Everything runs and looks great, I can even play these two games under-volted/clocked and still get a solid 60FPS.
I personally am not a fan of the various mod manager software that's out there. You'll see a lot of people struggling to get Mod Organizer 2 (MO2) working on Linux in general. In my opinion, it's less work to write a small script to approximate the functionality than it is to try and wrangle with it. Even if you can get MO2 running, it's an especially leaky abstraction over a system that's not too hard to understand. 12
Your mileage may vary, but writing a small script to replicate the core functionality of mod manager software has paid off for me. Of course there's nothing wrong with wanting to use mod manager software; I just am conviced it will always create more work than it saves in the long run. But not everyone is crazy like me and prefers to go out of their way to avoid things that they don't want.
→ Games From GOG.com
GOG.com provides native Linux games as well as Windows. Quite a few games worth playing on Steam Deck have native installers available, and those are quite easy to install via SSH. After installation completes, add the .desktop
file for the game as a non-Steam game and you're good to go.
Stuff that's strictly for Windows can be ran as well, but by default Steam Deck has no system wine to make installation doable in desktop mode. There might be a way to use Steam's Proton to install things on the Steam Deck itself, but I'm using this pattern:
- Install it with the system wine on my laptop
- Run it to make sure it works well enough
- Tar up the game data and copy that to my file server
- Untar the game data onto my Steam Deck
- Add the game executable as a non-Steam game
- Configure it to be ran with Proton
This does not universally work, however. I tried copying my existing modded Fallout New Vegas setup over and it wouldn't run. I guess some games expect registry values or other things to exist in the wine prefix. But more often than not, this is just enough to get the game onto the Steam Deck in a usable state. 13
→ Emulators
If you know me then you know I've got a really soft spot for classic games, so of course I wanted to see what the Steam Deck was capable of in terms of emulation. I'm happy to report that it's ran everything I've thrown at it up to Nintendo Switch (even if it didn't run flawlessly). Here's a look at what I'm using:
→ RetroArch (NES, SNES, more)
RetroArch is available in the Steam store and could well be the only thing you need to run a wide variety of classics. It's not yet listed (as of this writing) as known to work with Steam Deck but it sure does. There's no surprises here if you've used RetroArch before, though I did find strange bugs and performance issues when trying to run PS1 games so I took that as a cue to try other things. As of this writing, RetroArch is still what I use for SNES games. 14
→ Duckstation (PS1)
The project provides AppImages; that's where I get mine. In this case I don't add the AppImage itself as a non-Steam game, instead I make a small shell script and add that: 15
#!/usr/bin/env sh
cd $HOME/games
./duckstation.AppImage "${@}"
I do this because:
- The AppImage name may change if I update it; Steam won't use symlinks and I don't want to mess with changing the name to something general (and lose version information in the name)
- I can get a bit of flexibility to change things and not need to mess with the thing in Steam's UI (doing it with vim over SSH instead /me sighs in relief)
- Game-specific launchers could be managed this way too (arguably more easy for me, since again I'd avoid the Steam GUI)
In any case with that in place, Duckstation can now be ran from the Steam Deck UI! The main Duckstation UI does require a mouse to navigate, which is no big deal thanks to the track pads though it's less ideal than one that's actually driven by a gamepad. Dump your games and revisit classics such as Final Fantasy VII, Xenogears, and Castlevania Symphony of the Night with many nice options including my personal favorite: the scanlines shader!
→ PCSX2 (PS2)
Playstation 2 emulator PCSX2 kindly provide AppImages - specifically there are AppImages available for their "nightly" builds. Setup here is much the same as it was for Duckstation; create a small launcher script, add that to Steam, play it. 16
Performance is very good, even when I under volt/clock I'm still able to get a good framerate while doing 2x resolution scaling. Most PS2 games actually natively support 16:9, so you can take advantage of the extra screen space on the Steam Deck. It's great to revisit favorites of mine such as Katamari Damacy, Burnout 3, and Metal Gear Solid 3 Subsistence on a portable with upscaled visuals and excellent performance and power usage!
→ mGBA (GB, GBC, GBA)
The mGBA emulator as the name implies runs Gameboy Advance games, but it can also handle Gameboy and Gameboy Color too.
There's no official mGBA AppImage so I made my own. The only issue with it at the moment is that I don't have a good way to provide the builtin shaders mGBA is supposed to come with. I simply copy those over manually for now, but in the future I'd like to remedy this. 17
The experience is of course great. GBA games run percievably flawlessly and look fantastic on the Steam Deck screen. Some of the titles I've played include: Castlevania Aria of Sorrow, Mario Kart Super Circuit, and Mother 3 (with the fan translation patch).
→ Dolphin (GC, Wii)
The Dolphin emulator is how I run Gamecube and Wii games. They don't provide an AppImage, so I once again made my own.
Gamecube games perform very well, even when under-volting/clocking the hardware. As with PS2, I'm doing 2x upscaling and a 16:9 aspect ratio. I get no major problems with any game, including Wii games (except for those Wii games that use motion/gyroscopic input, but that's not a Steam Deck-specific issue per se). Replaying Metroid Prime, Legend of Zelda: Windwaker, Mario Kart: Double Dash, Geometry Wars: Galaxies, and more has been a really great experience.
→ PPSSPP (PSP)
I realized I wanted to try the PPSSPP emulator while I was writing this blog post! This project does not provide an AppImage but I was able to build one without any trouble.
PSP, being a portable console, saw much of its library made with portable play in mind. As such, many of its games are nice for a portable device such as the Steam Deck.
→ Xemu (Original Xbox)
Original Xbox emulation went under the radar for a long time, but as of this writing it's reasonably mature. The Xemu project can run a good chunk of the Xbox library, and a good chunk of those are reasonably playable.
The Xemu project does not provide an AppImage, but I did try to make one. I ended up shelving it when I ran into crashes involving icons in the UI, but I would like to resolve that eventually. For now I'm using the Flatpak provided by the project.
The experience here is shockingly good. It's really neat to watch the Xbox boot animation again after all these years, and I've been enjoying Halo and Grand Theft Auto: San Andreas with 2x scaling and excellent performance. As of right now I haven't tried too many other games, but what does run works extremely well!
→ Ryujinx/Yuzu (Switch)
Of course it is only natural to compare the Steam Deck to Nintendo's Switch console. And so of course I naturally wanted to see how Switch games run on Steam Deck, if at all! Oddly enough, there are two reasonably mature emulators for Nintendo Switch, which is still an active console. Ryujinx doesn't provide an AppImage but they do provide a standalone binary that just works, and Yuzu does provide AppImages of their nightly builds.
Setup was relatively easy, though it does require keys, firmware, and other data from an actual Switch console - and this can only be gotten on certain models that are exploitable. Thankfully, I've got such a model and can use keys and data from my own console.
Performance and compatibility is all over the place. Games that are effectively Wii U ports such as New Super Mario Bros. ran great, but other Switch-specific titles such as Xenoblade Chronicles were a bit more rough at best. In the end I've abandoned Switch emulation on my Steam Deck, but it was a very nice experiment and I look forward to these emulators maturing. I will revisit them in the future.
→ The End?
That's all, but is it? I absolutely have more plans for things I'd like to build and/or try, including:
- Experiment with more emulators, including Nintendo DS and 3DS, Xbox 360, PS3, and more
- Try some source ports such as: zelda3, Ship of Harkinian, sm64-port, re3/reVC, and more
- I'd like to polish my AppImages and publish them to AppImage Hub
- Check out AppImageUpdate
- Look at sandboxing with Firejail
Until then, happy gaming!
→ Footnotes And References
1 This is the Valve announcement about it, and here's a link to iFixit's Steam Deck page.
2 My gaming PC is connected to my TV and I play it while I'm on the couch.
3 So far, I've made AppImages for: OpenMW, mGBA, ares, Dolphin, and PPSSPP . I know OpenMW, Dolphin, and PPSSPP to work basically as intended, but ares and mGBA have some issues at the moment. They are available to download from here.
4 I don't mean to pick on OpenMW, but this does reflect the user experience as of this writing.
5 There are actually a few nice GUIs for Flatpak including Discover and Flatseal, but I'm not confident that they hide implementation details enough to give a good overall UX (nor am I convinced it should in the case of Flatseal...) - in fact I know it doesn't because I needed to tweak permissions for an Xbox emulator. This shouldn't be necessary, forget about how great you think package managers are (I do too, don't worry).
6 I personally avoid any game with so-called "anti-cheat" or "anti-tamper", or that has an online-only requirement, though I do "own" a few. Such games, or games that aren't trustworthy for some reason I guess, may warrant a sandbox. But maybe just don't run them if you can't trust them. It mostly boils down to preference and what you're willing to go through I suppose.
7 You can technically jail an AppImage with relative ease, so it's probably fine to use an Nginx AppImage for example. I'd also be using something like AppImageUpdate in this case, just as an easier way to get new versions without doing it manually.
8 I start with the latest Proton, if that doesn't work I go back one version at a time until I have success. It isn't unusual for things to just work
9 Okay I did actually have to enable "dev mode" and install packages via pacman to get NFS working since there's no support out of the box.
10 The Steam Deck has 16GB of system RAM and 1GB of swap out of the box, however running a lot of very pretty but also very unoptimized meshes and textures can cause RAM usage to bubble up past 20GB with ease. Thankfully OpenMW has many knobs for controlling this.
11 My OpenMW AppImages are available here: https://modding-openmw.com/files/appimages/.
12 I'd also argue that learning the system will take less time than learning MO2, so you can avoid learning the system, and then dealing with the inevitable MO2-induced problems.
13 I have New Vegas on both Steam and GOG.com, so it was easy to merge an install from the latter onto one from the former.
14 I really wanted to get ares working and I kind of did, but there's some weirdness with fullscreen (possibly related to XWayland, it doesn't happen on my X11-only setup) so it isn't quite usable yet. The Flatpak that's available for ares has the same problem.
15 Duckstation AppImages are provided for each release: https://github.com/stenzek/duckstation/releases
16 PCSX2 nightly AppImages can be found here: https://pcsx2.net/downloads/#nightly-anchor
17 Maybe I'm missing some detail in my AppImage build process, but the file chooser dialogue used for shaders won't be able to look inside the AppImage itself. Duckstation has a dropdown menu that you can select shaders from; I'm considering creating a patch for mGBA that adds something similar. ares would likely need a similar patch.