9.1 KiB
SteamDeck 0.1
Valve's native ARM64 Linux Steam client, on an Android phone or handheld - and now a Linux desktop beside it. No Wine, and no x86 translation for the client itself: it is ARM code running as ARM code, under gamescope, presenting through an in-app Vulkan compositor onto your screen. Windows games it launches go through Valve's own ARM64 Proton, which is where FEX comes in.
This is the first release. One screen, one button: install the runtime, press Play, Big Picture comes up.
Early software. The Steam client and the desktop have both been run end to end on real hardware, but this is version 0.1 and a great deal of it has been exercised on one or two devices only. Where something has not been tested, this page says so rather than implying it works.
What it does
The Steam client, natively
Sign in, browse your library, install and play. The client is fetched from Valve's own manifest on the device at first use - no Valve software is redistributed here. Windows games run through the ARM64 Proton build Valve ships, downloaded by Steam itself.
Proven on device: sign-in, Proton ARM64 fetched automatically, a game installed from the store and launched - FlatOut rendering at 144 Hz.
A Linux desktop
A second thing the app can start: LXQt on labwc, in the same session and the same compositor, with Xwayland for X11 programs. Everything on it is downloaded on request from a catalog hosted beside the runtime, so the app stays small.
| Package | What it brings |
|---|---|
| Desktop (406 MB) | labwc, LXQt panel, file manager, terminal, text and image viewers, Firefox, mpv |
| Emulators (694 MB) | PPSSPP and RetroArch with 28 cores, plus ScummVM, DOSBox, Mednafen, Snes9x |
| RPCS3 · DuckStation · melonDS | PS3, PS1, DS - the projects' own ARM64 builds |
| PCSX2 · Dolphin · Cemu | PS2, GameCube/Wii, Wii U - no ARM64 Linux build exists upstream for any of these three, so they are compiled from source against the same glibc the runtime uses |
Between them: PS1, PS2, PS3, PSP, GameCube, Wii, Wii U, N64, SNES, NES, Game Boy/Color/Advance, DS, Genesis, Dreamcast, Saturn, PC Engine, arcade and DOS.
Proven on device: the desktop starts, panel and wallpaper and file manager all come up, at the panel's native resolution, and Firefox browses the live internet at 93 fps. Not yet run on device: the emulators themselves. They build, publish and install; none has been launched with a game yet.
Frame generation
Extra frames generated between the real ones inside the app's compositor, on gamescope's final
output - so it works for any game with nothing changed in the runtime. Win-FG is built in.
LSFG uses the shader chain from your own copy of Lossless Scaling: install it from the Steam
client in this app and the app reads its Lossless.dll out of the runtime's Steam library (parsed
as data, never executed; nothing of it is redistributed). Pick an engine and 2×/3×/4× on the main
screen - it applies immediately, mid-game included.
Proven on device: LSFG 2× generating in FlatOut - 30 → 61, 60 → 118 and 61 → 123 fps
observed, with the on-screen readout showing base → generated.
Controls, pointer and keyboard
A physical controller is republished into the session as a synthetic Xbox 360 pad - the identity SDL and Steam have a mapping for. With nothing attached an on-screen pad appears and writes into the same rings, so the client sees one pad either way; connect a controller and the on-screen one disappears, unplug it and it returns.
The app draws the pointer. On the desktop, touch is a touchpad: drag anywhere and the pointer moves from where it is, tap to click, a second finger tapping while one holds (or a two-finger tap) right-clicks, two fingers scroll, hold-then-drag drags. In Steam, touch is direct - the pointer jumps under your finger. A USB or Bluetooth mouse works as itself.
Keyboard in the drawer puts the soft keyboard over the session, turned into the key presses that would have typed it - Shift included, so capitals and the symbol row arrive as themselves.
Not yet tested on device: the soft keyboard.
Networking
The session uses the phone's network directly - proot creates no network namespace, so IPv4 and
IPv6 both pass straight through - and the app writes the runtime's /etc/resolv.conf from the
active network's own DNS servers every time the link changes.
Proven on device: name resolution and an HTTPS fetch over both IPv4 and IPv6 from inside the session, and Firefox loading live pages.
Starting Steam offline
Start offline on the main screen brings the client up without signing in to Valve. Installed games launch; Proton and the frame generation are local anyway. It lives on the main screen and not in the drawer for a reason: the client reads the keys that control this once, while it starts, so changing it mid-session would do nothing until the next launch. Without an earlier successful sign-in the button says so and stays disabled.
Not yet tested on device. Games with always-online DRM will not start offline, and nothing can be installed or updated while offline.
Compatibility tools
Compatibility tools installs GE-Proton or proton-cachyos - native ARM64 builds - beside the ARM64 Proton Valve ships. The runtime's registrar fetches a requested build at the next session start, patches it past pressure-vessel, and it appears in Steam under Properties → Compatibility for any game.
Not yet tested in this app.
Background, foreground and the drawer
A session belongs to a foreground service, not to the activity, so leaving Big Picture does not end it: perceptible priority, a partial wake lock so the guest's threads keep running, and a high-performance WiFi lock so a backgrounded download is not throttled to nothing. The notification is silent and brings the session back.
Back opens the drawer: the performance HUD, frame generation, on-screen controls (auto/always/never), touch mode, display shape, Send to background and Stop session. A session ends only when you say so.
Foldables and odd panels
The main screen scales to whatever panel and density it is given. In a session the display shape is either the panel's own or a fixed 16:9 - the default on a foldable, so opening or closing the device mid-session changes only the bars, never the picture.
Proven on device: unfolding and folding a Fold mid-session.
Installing
Download the APK below and install it. On first launch it downloads the Linux runtime (~790 MB, once). Then press Play.
If Bannerlator is already installed, the runtime image is the same one - the README shows how to copy it across with root and skip the download entirely. The two apps stay independent after that: separate Steam installs, separate logins, separate games.
Requirements: an arm64 Android device with an Adreno GPU (the compositor loads a Turnip driver), and roughly 3 GB free for the runtime before any games.
Known limits
- The desktop composites in software. wlroots allocates through gbm on a real DRM render node and the Adreno stand-in is not one, so labwc runs on pixman. Programs still reach the GPU themselves through Vulkan and Turnip - it is the desktop's own compositing that is on the CPU.
- Firefox's child-process sandboxes are turned off, because seccomp and namespace sandboxes cannot be set up under proot and its tabs crash otherwise. This is a real reduction in isolation: treat browsing here as less protected than on a normal desktop.
- Changing the display shape takes effect at the next session, not immediately - gamescope fixes its display size when it starts.
- No Switch emulator. Eden's repository was taken down in February and there is nothing to mirror or build from.
- PS3 (RPCS3) and Wii U (Cemu) are demanding even on desktop hardware; expect only light titles.
Credits (tap to expand)
- The412Banner - the app, the Wayland compositor, the runtime plumbing and the Steam session.
- maxjivi05 (Max) - the gamescope runtime this is built on: the proot session, the session shim, the fake-evdev interposer and the controller work, from WinNative.
- Winlator (brunodev85) - the PulseAudio-on-AAudio audio stack, the gamepad state model and the shape of a session's host-side components. WinNative and Bannerlator are both Winlator lineage.
GPL-3.0. gamescope, Mesa, Turnip, Xwayland, labwc, LXQt, PulseAudio, proot and Arch Linux ARM are their own authors'. Valve, Steam, Steam Deck and Proton are trademarks of Valve Corporation; this project is not affiliated with Valve, and no Valve software is redistributed - the client is fetched from Valve's own manifest on your device.
First release. Nothing to upgrade from.
APK SteamDeck-0.1.apk - 15832230 bytes
sha256 e181dfcc20957c3f824799ed3ef5ec73ddbf9957b7dbb2224c08b7e34ef8db11
Built from 05fc566 by run 35503326574. Signed with the AOSP test key (v1 + v2 + v3), so it installs over earlier test builds in place.