Bannerlator 3.1.3
Run Windows apps and games on Android — no PC and no root required.
3.1.3 runs Valve's real Steam client inside Bannerlator. Valve makes a native ARM64 Linux version of Steam, and Bannerlator can now run it as an optional extra, the Steam (Linux) entry: sign in, browse, download and play your library in Big Picture or the desktop UI, with the overlay, friends and cloud saves, and games running through Valve's own ARM64 Proton. You can drive it with a controller or with your fingers on the touch screen. A new Components tab lets you swap FEX, DXVK and VKD3D per Proton. Proton is ready the first time you sign in, and the games from your Games tab show up in Steam with shared saves. For everyone else, 3.1.3 fixes the crash when adding an .exe to Shortcuts.
🧪 The Linux Steam client is EXPERIMENTAL and optional. Please read this before you download it.
- Nothing changes unless you turn it on. It is a separate download (Contents → Linux Runtime, about 755 MB). Your Wine containers, games and shortcuts work exactly as before, whether you get it or not.
- Adreno (Snapdragon) only. It draws with Turnip. On Mali, Xclipse and PowerVR phones you get sound over a black screen. Contents → Linux Runtime warns you before the download.
- Turn on "Disable child process restrictions" in Android's Developer options first. The Steam client runs dozens of processes. Without that switch, Android kills them at random and the session just dies. The Linux Runtime tab tells you when it is still on. Some phones don't have the switch at all, and on those the client won't stay up yet.
- Don't run the same game in the app and in the Steam client at the same time. With shared saves, both would write to the same folders.
- It was proven on one device, an AYANEO Pocket FIT. Reports from other phones, with the session folder from
Download/Bannerlator-LinuxSteam/, help most.
📘 New to LSFG Native? Read the plain-language guide: LSFG Native Made Simple — why Max FPS × multiplier has to fit your screen's refresh rate, why a steady base matters, a live checker, a cheat sheet and real-world fixes. The same rule applies to Win-FG Native, which always runs at 2×.
📖 Setting up the Linux Steam client — new install, or upgrading (tap to expand)
🆕 First time
- Install this APK over 3.1.2 (your data is kept) or fresh. Take standard unless you already use the pubg or ludashi build.
- Android Settings → Developer options → Disable child process restrictions → on. No Developer options? Go to Settings → About phone and tap Build number seven times.
- In the app: Contents → Linux Runtime → Download. One download, about 755 MB. When it finishes, a Steam (Linux) entry appears in your games list.
- Tap Steam (Linux). The first start takes a few minutes. A loading screen first downloads Proton Experimental (ARM64) (about 400 MB), then lets Steam download and update itself. There's a clock on screen so you know it's still working.
- Sign in. A password or the QR code with the Steam mobile app both work.
- Install a game and play. There's nothing to pick and no restart to wait for, because Proton is already there.
If the Proton download on the loading screen fails, the app skips it and Steam fetches Proton itself instead, the way the pre-releases did. In that case, watch for the Proton Experimental (ARM64) install box, let the client restart itself once, and only then install a game. A game installed before that restart fails to launch.
⬆️ Upgrading
- From 3.1.2: install over. Nothing else changes until you download the Linux Runtime.
- From a 3.1.3 pre-release: install over. You stay signed in, and your games, Proton and settings are kept.
- From the September 21 test build: install over, then open Contents → Linux Runtime once. That moves the Steam (Linux) entry out of its old Wine container and carries your settings over. Don't remove or re-download the runtime.
⚙️ Worth knowing
The ⚙️ next to Steam (Linux) holds its settings: resolution (720p by default, because Steam's own interface is the most expensive thing it draws), drivers, cores, audio, frame generation, the HUD, Touch, Components, Your games in Steam and the Steam client update channel. GE-Proton and proton-cachyos (ARM64 builds) can be downloaded in Contents → Linux Runtime and picked per game on Steam's own Compatibility page.
What's New — everything since 3.1.2
🐧 The real Steam client, on your phone
Bannerlator now runs Valve's own native ARM64 Linux Steam client. It runs inside a small Arch Linux ARM system under Valve's gamescope, drawn through the Wayland compositor that 3.1.2 introduced.
- ✅ It's the real client: sign-in (password, QR, Steam Guard), the library, the store, downloads with Steam's own resume and verify, cloud saves, the overlay, friends and chat, Big Picture and the desktop UI, controller setup and the shader pre-cache.
- ✅ Games run through Valve's ARM64 Proton. Wine, DXVK, VKD3D and FEX are Valve's own and matched to each other; only the Turnip driver is ours. Your owned games and the BattlEye / EAC anti-cheat runtimes are set to it automatically.
- ✅ No Wine container. Steam (Linux) is its own entry with its own settings, and it never touches your containers.
- ✅ One set of game folders. The app's game folders (phone and SD card) are Steam's library folders. A game the app installed shows as installed in Steam, a game Steam installs lands where the app would put it, and nothing is copied twice. Uninstalling in Steam frees the game in the app too.
- ✅ Games seen running on the Pocket FIT: the Source games, GTA V (Legacy), NFS Most Wanted and Payback, FlatOut 1 and 2, Brawlhalla, DiRT Showdown, Titanfall 2 and DOOM I Enhanced.
- ✅ Steam updates no longer fail with "Missing file privileges" when Steam left some of its own files read-only. Proven by updating Proton over 2,471 locked files: it finished with no error.
- ✅ Steam's interface draws on the GPU. A library call that can't work on Android was quietly crashing the interface's GPU process, so Steam fell back to drawing on the CPU. With that fixed, scrolling the Big Picture library went from about 44 fps to 85 on a OnePlus 15, and reads 117–138 fps on the Pocket FIT. (Found by maxjivi05 in WinNative.)
🧭 Ready to play at first sign-in
- ✅ Proton is ready before you sign in. On the first session the app downloads and places Proton Experimental (ARM64) (about 400 MB) on the loading screen. There's no install box, no storage question and no client restart. Steam keeps it updated afterwards. This also closes the old first-run trap, where a game installed too early pulled in about 1.7 GB of tools it couldn't use.
- ✅ A loading screen stays up until Steam draws its first frame. It shows what's happening, the download progress, a clock and a hint.
- ✅ Warnings before the 755 MB download: the Linux Runtime tab tells you if your GPU isn't an Adreno, or if Android's child-process limit is still on (with a button to Developer options where Android has one).
- ✅ A fresh install starts on Turnip. It used to start on a driver that shows a black screen. Opening the Steam (Linux) settings on a fresh install no longer crashes.
- ✅ No more instant death when the runtime's proot is missing. In that case the app falls back to the proot copy in the APK, but it was giving that copy an option it doesn't understand, so the session died with nothing on screen. That's fixed.
👆 Real touch in Big Picture
The Steam (Linux) settings have a new Touch setting in the Steam client block, and the same setting is live in the in-game drawer (Graphics tab, Steam client section):
- App setting (the Touchscreen switch): follows the app's usual touchscreen switch.
- Touchscreen: your fingers go straight to Steam, so you drag lists and tap buttons like on any touch app. It works with the on-screen controls showing too.
- Touchpad: the screen works like a laptop touchpad. A finger moves the pointer and a tap clicks. The drawer's Cursor to Touch now works in this mode and puts the pointer under your finger.
It uses a patched gamescope (3.16.29-p3, with DroidDeck's touch patches).
✅ Device-tested on the Pocket FIT: dragging and tapping through Big Picture's menus.
🧩 Components: swap FEX, DXVK and VKD3D per Proton
A new Components tab in the Steam (Linux) settings, plus a Components section in the in-game drawer (only in a Steam (Linux) session):
- Pick a FEX, DXVK or VKD3D-Proton for each Linux Proton: Proton Experimental (ARM64), GE-Proton (aarch64) or proton-cachyos (arm64). Only Protons a game can actually be set to are listed.
- Get them from the Nightlies (Check the Nightlies) or Import a .wcp… you already have.
- Each Proton's own files are kept as its Original, so you can always put them back.
- Your choices are re-applied every time a game starts, so they stick even after Steam updates Proton. A swap made while a game is running on that Proton waits until the game closes.
✅ Device-tested with FlatOut on GE-Proton, with FEX 2609 and DXVK 2.4.1 gplasync swapped in. Both were confirmed loaded in the game.
🎮 Your Games-tab games inside Steam
The games you added in the app's Games tab show up in Steam's library under Non-Steam, with artwork, and you can start them from Big Picture, the desktop UI or a controller.
- ✅ Shared saves. A game's Documents, AppData and Saved Games folders are shared with its container, so progress carries over both ways. Titanfall 2 loaded a save made in the app. A folder that already had something in it is renamed and kept, never deleted.
⚠️ They run with Valve's Proton, not the app's own Wine, FEX settings and preset, so not every game runs. DOOM I Enhanced and Titanfall 2 do. Insane 2 crashes, and DiRT Showdown and DiRT Rally 2.0 stop at their splash screen. All of them still run in the app as before.⚠️ Saves kept in the Windows registry aren't shared. Extra games folders are built but haven't been tried on a device.- On by default: Steam (Linux) settings → Your games in Steam, with Share saves with the app under it.
🔊 Sound: DirectAudio, and a microphone
- ✅ Games use DirectAudio, the same low-latency path Wine games use, with PulseAudio as a safety net. If a game can't load DirectAudio, it gets PulseAudio instead of no sound at all. (The first two pre-releases only said games used DirectAudio. A broken registry key meant they never did, and that's fixed now.) On GE-Proton, DirectAudio loads and Titanfall 2 plays with sound. On Proton Experimental, Titanfall 2 now starts with sound instead of crashing.
- ✅ Steam's own sounds (menus, the startup chime, Big Picture clicks) go through DirectAudio when it's chosen. They're clean on the Pocket FIT.
- ✅ A microphone for Steam (DirectAudioMic) with a working voice slider, proven in Steam's own voice tester.
⚠️ A game's very first start uses PulseAudio. Voice chat with real people hasn't been tested yet.
🎮 Controllers
- ✅ Steam sees a real Xbox 360 controller, including the Steam button, so Big Picture, the overlay and Steam Input work like on a PC. The on-screen pad appears when no controller is connected.
- ✅ Only the controllers you actually have are listed. It's one per connected pad plus one for the on-screen controls, and a pad plugged in mid-session still shows up.
- ✅ Steam gets its own input handling instead of sharing Wine's.
🕹️ Steam buttons and switches in the in-game drawer
The drawer's Graphics tab has a new Steam client section at the top. It saves to the same settings as the Steam (Linux) entry and applies live where it can:
- Steam menu and Quick Access buttons, On-screen Steam and Quick Access buttons in the corners (on by default), and Double Back opens Quick Access (on by default; a single Back still opens the drawer).
- Stretch games to fill the screen (on), the likely fix for FlatOut shrinking into a corner.
- Quake-engine games windowed (on).
- HDR output is now actually handed to gamescope and DXVK. Before, the switch did nothing.
- Troubleshooting switches: Xalia off, proot without seccomp (slower; for devices whose seccomp misbehaves) and Turnip sysmem (automatic for imported 710/720/722 drivers).
⚠️ Built, but not device-tested yet. The HDR part needs an HDR screen, and the Pocket FIT doesn't have one.
🖥️ Display, drivers and speed
- ✅ A patched gamescope (3.16.29) is carried in the APK. Night mode and the colour-temperature slider work, and the cursor follows the controller when a pad drives it. In this release it's the -p3 build with the touch patches above.
- ✅ Scaling mode (Auto, Integer, Fit, Fill, Stretch) and scaling filter (Linear, Nearest, Pixel, FSR, NIS, SGSR, Qualcomm's own upscaler for Adreno) in the Steam (Linux) settings.
- ✅ Two driver rows: the draw driver (the Turnip that draws Steam and its games) and the display driver (the one that puts frames on your screen). Contents → Drivers → import sends each Turnip zip to the list that can use it, including the new
-Linuxbuilds from Banners-Turnip. - ✅ Steam gets all eight cores, games get their own core list, sessions run at the screen's highest refresh rate, and the default resolution is 720p.
⚠️ Three experimental rendering switches (Threaded GL, Lazy descriptors, Skip GL error checks) are on by default but not measured yet.
🎛️ Steam Deck mode — still experimental, still off
A Steam Deck mode switch runs the client the way it runs on a Deck, with Steam's Quick Access Menu.
- ✅ No more Steam update that can't install: Deck mode uses the Steam Deck beta channel, where the ARM64 client exists. The battery shows in Steam's top bar, and there's a Steam client update channel setting.
⚠️ It still breaks game controllers. Steam's menus work, but games get no pad. It stays off by default and only turns on through a warning. Valve's performance overlay and NIS in Deck mode are built but haven't been tried on a device.
🧹 Clean sessions and safe-to-share logs
- ✅ Ending a session cleans up properly. Processes that proot lost track of could keep running and burn CPU in the background. They're now stopped when the session ends.
- ✅ One log folder per session in
Download/Bannerlator-LinuxSteam/, with the session log, a device and network report, controller and audio logs, and Steam's own logs. - ✅ Logs are private, so they're safe to post. Session tokens, Steam IDs and login files were already masked or left out. Now your public IP address, your Steam account and profile names and the device's own IP addresses are hidden too, in both Linux session logs and SteamLite logs.
⚠️ The session log is now capped at 256 MB, so a runaway log can't fill your storage. The cap is in place but hasn't been stress-tested.⚠️ If the last session was killed rather than closed, Steam's leftover crash marker and lock files are cleared before the next start. This is built but hasn't been seen on a device.
🩹 Fixes for everyone
- ✅ Adding an .exe to Shortcuts no longer crashes the app. Two parts of the app could reload the shortcut list at the same moment, and when the cover art arrived just as the screen came back, the app crashed. Reported on Discord for 3.1.3-pre3. Confirmed fixed on device.
- ✅ Messages in the game screen are readable again. Pop-up messages during a game used to show as an empty dark bar.
📦 New compatibility layers — versionCode 9: touch, ntsync and Wayland on Proton 10
All ten Proton / GE-Proton layers were rebuilt (proton-wine release build-bionic-layers-20260930-v9, now the in-app catalog default). They install into a new -arm64ec-9 slot (and -x86_64-9) next to the old ones, and a container on an older build of the same layer shows Update layer → v9 on its card — games, saves and settings are kept, and you can revert from the ⋮ menu.
- ✅ Proton 10.0-4 and GE-Proton 10.0-34 now run on Wayland. They were left out of v8 because Wine 10 is too different for a straight port; the Wayland work was rewritten for it. Two Proton-10-only problems were found on a device and fixed before release: the mouse cursor didn't show on the Wayland desktop, and 32-bit games stored on shared storage couldn't open their data files (Insane 2 said "Can't initialize file server").
- ✅ Touch on Wayland reaches the game as real fingers. Each finger now arrives as its own Windows touch point, so multi-touch and pinch can work in games that support touch. Before, the layers had no touch code at all.
- ✅ ntsync, off unless you turn it on. Add
WINENTSYNC=1to a container's or game's environment variables to switch a Wine 11 layer from esync to ntsync — userspace ntsync by Joshua Tam of GameNative (ntsync-android; Wine wiring after his962a379/d67ac1e), no kernel support needed. Without it, nothing changes.PROTON_NO_NTSYNC=1forces it off. - ✅ Two crash fixes in Wine's encryption code — one for games that ask for a hash Wine doesn't support, one for a race in Steam networking. Both from bl4ckh4ck5 (
b4fc579,a0d20d6); the second in a corrected form. - ✅ A Steam bridge is built in but switched off. It is groundwork for a future native-Steam launch option next to SteamLite, modelled on GameNative's integration by Joshua Tam (
dafe413); SteamLite, Goldberg and normal launches are unchanged. - Nothing else changed versus v8.
Device-tested on an AYANEO Pocket FIT (Adreno 750): Proton 11.0-2 with DiRT Showdown (esync and ntsync) and Counter-Strike: Source (SteamLite and Goldberg), Proton 10.0-4 on Wayland and X11 and GE-Proton 10.0-34 on Wayland with Insane 2; the other layers were launched and checked. Touch inside a Windows game has not been tried yet. Proton 9 and the older Nightlies Wine builds are not part of this set.
🔧 Smaller
- The in-game drawer and the HUD describe a Steam (Linux) session as what it is, instead of showing the container's leftover settings.
- The Steam (Linux) settings no longer offer Wine settings that don't apply to it, and each setting says who it affects.
- Steam (Linux) has its own tile and Steam's own art in the Games tab, and stays at the top of the list.
- Contents → Linux Runtime lists GE-Proton and proton-cachyos (ARM64) as downloads and says which entries in Steam's own list actually work.
- A competing Steam client on the device is named and stopped before a session starts, because it would take over your account's session.
- Settings → Internet in Steam works: a stand-in answers Steam's network questions.
- The Wayland soft keyboard now types capitals and symbols that need Shift.
- Wayland reports the screen's real refresh rate and colour information to gamescope. The colour fix is aimed at gamescope losing its connection on the Galaxy Z Fold 8. No device result for it has been recorded yet.
- The XMB view shows scraped cover art as a full portrait tile instead of a small icon.
- The APK's own proot copies memory in one go instead of eight bytes at a time (from maxjivi05's WinNative). This only matters when the runtime's own proot is missing.
- Nine proot speed-up patches from DroidDeck are now in the proot build recipe, but they're not active yet. The runtime still ships Termux's proot, so there's no speed change in this release.
- Compositor hardening against oversized cursors and malformed buffers.
What it can and cannot do right now
Can:
- Steam: sign in, browse, install, update, verify, cloud-sync and play your library, with the overlay, Big Picture or the desktop UI, on a controller or the touch screen.
- Components: swap FEX, DXVK and VKD3D-Proton per Linux Proton, and put the originals back.
- Your own games: Games-tab games in Steam's library, with artwork and shared saves.
- Sound: DirectAudio for games (with PulseAudio as the fallback), DirectAudio for Steam's own sounds, and a microphone.
- Also: frame generation, screen effects and the HUD in Steam sessions, gamescope scaling with FSR, NIS and SGSR, the battery in Steam's UI, and log folders you can post.
Cannot yet, or not proven:
- Mali, Xclipse and PowerVR: nothing works. The runtime's driver is Turnip.
- Phones without the "Disable child process restrictions" switch: Android kills the session at random.
- Steam Deck mode breaks game controllers. Steam Input's virtual controller (per-game layouts, gyro) doesn't reach games yet. Games read your pad directly, which works.
- Games-tab games that need the app's own Wine or FEX preset may not run from Steam (Insane 2, DiRT Showdown, DiRT Rally 2.0).
- DirectAudio for 64-bit games on Proton Experimental: not yet, so they get PulseAudio. GE-Proton gets DirectAudio.
- GTA V Enhanced doesn't run, Serious Sam Shatterverse is killed by Android for memory, and NFS Hot Pursuit Remastered faults inside FEX.
- Voice chat with people, Remote Play, streaming, family sharing, join-a-friend: not tested.
- The Linux Desktop entry has had far less testing than Big Picture.
- Leaving the app pauses the session. Come back and it resumes. That's by design.
Logs, if something goes wrong
Download/Bannerlator-LinuxSteam/session-<date>-<time>/holds the whole Steam (Linux) session:session.log,device.txt(every Steam (Linux) setting in effect, including the ARM64 Proton seed line),network.txt,fake-input.txt(controllers),audio.log,crash.logandsteam/with Steam's own logs. It's scrubbed, so post the whole folder.Download/Wayland-logs/wayland-<date>_<time>.logis the compositor's log.- For Wine games:
Download/bannerlator/<game name>/wine_debug.log(turn on Wine debug logging in Settings → Log Manager).
⚠️ Carried over — still open
- Linux Steam client:
- FlatOut shrinks to the top-left corner after Guide → Resume game. Stretch games to fill the screen is the likely fix but hasn't been tested on a device.
- Team Fortress 2 reports "insecure" on this client. The cause isn't found yet, and it isn't something the app sets. Don't expect VAC-secured servers to work until it is.
- After the device sleeps and resumes, Steam can need Guide pressed twice before the controller has focus again.
- Steam Deck mode's controller, Steam Input's virtual controller, Insane 2 and the DiRT hangs, and DirectAudio for 64-bit games on Proton Experimental, as listed above.
- The proot speed-up patches still need an A/B test before they replace Termux's proot in the runtime.
- Lock GPU to max clock makes the Fusion HUD's GPU usage freeze or go blank. The cause is found, but the fix isn't built yet.
- BannerHub running in the background can sign Steam out of a SteamLite game ("Session Replaced", then a black screen). Close BannerHub before playing through SteamLite.
- Everything listed as open in 3.1.2 is unchanged here:
- HDR helpers per engine, scRGB, the HDR boost on phones that don't brighten on their own;
- TV launch: Home and reopen, match resolution, the output-mode picker;
- real 710/720/722 testing of the bundled Wayland drivers; which a8xx build is best;
- Win-FG Native's limited device testing;
- the untested Steam Controller puck;
- cancelling a store download;
- Origin-era EA sign-ins, Need for Speed (2015), Rockstar Games Launcher titles;
- 64-bit titles launched directly by Steam;
- the Java Steam engine fallback.
📦 Where to get Proton 9 (tap to expand)
The APK does not bundle Proton 9 — Wine installs from the in-app catalog on first run. The Linux Steam client does not use these layers at all: its games run through Valve's own ARM64 Proton.
Proton 9.0 arm64ec — not bundled, download it if you want it:
https://github.com/The412Banner/Nightlies/releases/download/Proton/wine/proton-9.0-arm64ec.wcp
66.7 MB · sha256 f8a99fed387f1b097009129dc49368c8f500927640a9d4c7a192d850b1b2068c
Install it via Containers → download icon → install the .wcp. It also appears in the in-app catalog. (Compiled as a wcp by Xnick417x.)
📜 Every change since 3.1.2 — 218 merged, oldest first
- Build proot for the Linux runtime ·
ba0a5786 - Compositor: fullscreen configure, and seat events to every object ·
594943c7 - The Linux runtime rootfs and the job that builds it ·
a8110ffa - Linux runtime: the rootfs layout and the launcher that runs a program in it ·
6961f0d5 - Boot a container into gamescope instead of Wine ·
1a716976 - Build-linuxfs: run from the branch ·
3fae8292 - Build-linuxfs: meson from pip ·
4ccb4b09 - Linux runtime: the rootfs installer, and the progress log ·
7d8499af - Build-linuxfs: glslang, bison and flex for the Mesa build ·
2b782d00 - Contents: a Linux Runtime tab that installs it and adds Steam to the library ·
66560a1c - Build-linuxfs: the Wayland and X pieces Mesa cross-builds against ·
6b169fb1 - Linux runtime: keep the shortcut's Exec parseable, and the download progress in percent ·
fe6b1164 - Document the Linux runtime: what builds it, what the preload answers, how it is published ·
c33d4ca0 - Build-turnip: name the build-machine tools in a native file ·
5c8ffa12 - Compositor: the global versions gamescope and libdecor bind at ·
ebe412d7 - Linux runtime installer: getNextTarEntry ·
39c11fa3 - Build-linuxfs: retry every fetch ·
2d07c5de - Linux runtime: put the Steam entry in a gamescope container when one exists ·
07ef4e30 - Build-turnip: build the wayland-scanner Mesa wants on the build host ·
8072b875 - Build-linuxfs: pin the output path before changing directory ·
e282323b - Build-linuxfs: make the whole tree owner-readable before archiving ·
c3da71f1 - Linux runtime: per-launch debug logs under Downloads until the runtime is stable ·
e3cc9695 - Proot: run #! scripts through their interpreter, and trap execveat ·
45fe2a8a - Proot: take WinNative's tree whole instead of patching our older base ·
d4b538ab - Build-proot: build proot on its own with NDK 27 ·
b1ff2026 - Build-proot: build Termux's proot fork instead of the tree in cpp/ ·
1b76f471 - Build-linuxfs: seed xkeyboard-config and xkbcomp ·
6deed591 - Build-proot: absolute talloc paths and -I. (make -C changes directory; a command-line CPPFLAGS replaces the Makefile's) ·
54ff5126 - Linux runtime: run proot with -i uid:gid so set*id is answered in proot ·
bd4783b5 - Revert "Linux runtime: run proot with -i uid:gid so set*id is answered in proot" ·
776d3b3b - Build-proot: -include strings.h ·
2f23b94d - Revert "build-proot: -include strings.h" ·
cfe212bd - Reapply "build-proot: -include strings.h" ·
e2961484 - Reapply "Linux runtime: run proot with -i uid:gid so set*id is answered in proot" ·
e060ee5d - Build-proot: -include string.h and stop treating implicit declarations as errors ·
0328bf88 - Show the games the app downloaded to the native Steam client ·
455933fe - Build-proot: drop the forced includes ·
44b4f9c5 - Let the Steam client launch Windows games through Proton on FEX ·
07fc1d47 - Launch Windows games through the ARM64 Proton the client already has ·
c3711182 - Log the first game launch through the Linux Steam client ·
c8040209 - Repoint the per-app Proton mappings, not just the default ·
9dc41739 - Name the FEX rootfs, and let the debug hook take a full steam URL ·
de69f11f - Log the r2 cut and the native-Linux findings ·
8c8687b3 - Build the System V IPC shim for the guest architectures too ·
0321c604 - Use the x86 cross compilers, not gcc-multilib ·
3140db53 - Give the x86 cross compilers their target libc headers ·
b0c085f2 - Log Half-Life launching through its Windows build ·
0278708d - Log four games playable and the HUD frame-counter gap ·
eab98909 - Stop the guest shim loop from clobbering the tarball path ·
e3041ca2 - Count a presented frame whether or not the compositor could import it ·
03616a8c - Set every installed title to the ARM64 Proton, not just new ones ·
b219b5bc - Log the automatic Proton selection, the frame counter and the VAC state ·
ee3eb165 - Record the VAC verdict and the loopback-only local address ·
0fe0c91a - Put the guest shims beside the tarball from the script that knows where they are ·
28dfc003 - Log r3 going live and the staged APK ·
8ea4944f - Log the broken packaged proot as the fresh-user blocker ·
7d5a18ee - Define _GNU_SOURCE for proot, which is why no shipped APK could start ·
9e2b2c44 - Correct the record: _GNU_SOURCE did not fix proot ·
4e7835dd - Carry a working proot in the runtime instead of only in the apk ·
1af8703b - Ship our own build of the proot fork, under libtalloc's real SONAME ·
f06f2b61 - Log r4 going live with a working proot ·
a92caa38 - Name our compatibility tool so it cannot be confused with Valve's ·
9d67a401 - Give the Steam entry a tile in the Games tab ·
846e7e4e - Build proot against libandroid-shmem, and ship the binary that works meanwhile ·
19c3b86c - Keep the implicit-declaration suppression the fork's own tree needs ·
1f911f56 - Give the Steam entry Steam's own art, and keep it at the top of the list ·
f882260e - Linux runtime: recognise the Steam entry by its runtime, not its name ·
8ed1b1a8 - Linux runtime: give the Steam entry a card, not just a launch image ·
5f76ecc3 - Proot: build it the way the binary that works was built ·
256a166d - Fix the build: app is a constructor parameter, not a property ·
693cfd49 - Wayland: serve the output's image description instead of severing gamescope ·
6138d596 - Steam compat: define LIBRARY, so the per-app mappings actually get written ·
a6a3d09f - Wayland: report the panel's nominal refresh, not the measured one ·
e7eab1f7 - 3.1.2 stable release notes ·
de9f720f - Linux runtime: give gamescope the panel's refresh, and stop Zink naming the API ·
ec93d559 - Linux runtime: stop the app displacing the Linux client's Steam session ·
ca0f969b - Linux runtime: ship the libraries Proton's GStreamer plugins need ·
c5442bc1 - Linux runtime: an update must not delete the user's games and login ·
d13c20ef - Linux runtime: name a competing Steam client before the session starts ·
5a592825 - Linux runtime: detect the sign-out itself, not a process we cannot see ·
46c3443f - Linux runtime: make a first run reach a game without hand-holding ·
d2c2f953 - Linux runtime: remove the last three first-run obstacles ·
2f4b8529 - The first-run progress watcher resurrected the closed preloader ·
a05b6f89 - Linux runtime: give the Steam client a real controller ·
df127968 - Linux runtime: preload the fake-evdev reader from the app, not the session script ·
992d2bc8 - Linux runtime: create the evdev node before the client scans for controllers ·
5e1eb70a - Linux runtime: the SDL joystick hint was the SDL2 name, and udev had to go ·
004ce36e - Linux runtime: js0 is the node the Steam client looks for ·
596f8991 - Linux runtime: disabling udev was never needed, so stop doing it ·
830d7716 - Linux runtime: write controller diagnostics beside the session log ·
44d0da7e - Linux runtime: let the fake-input preload be turned off without a rebuild ·
3b428592 - Linux runtime: the off switch has to turn the whole feature off, not just the preload ·
fa272f39 - Linux runtime: the off switch also has to stop seeding the on-screen pad ·
858595f5 - Linux runtime: capture the two facts that tell a controller failure apart ·
85551df8 - Linux runtime: answer udev's netlink socket, and keep the shim locks out of forked children ·
15aeade5 - Linux runtime: take WinNative's fake evdev layer, bind the rings as /dev/input, and preload both shims by ld.so.preload ·
ee8b7b19 - Linux runtime: list SDL_HIDAPI_* in the controller diagnostics; both devices confirmed on ee8b7b1 ·
a11b84fb - Linux runtime: register Bannerlator Proton before the client starts, and ship the session scripts with the app ·
0309ed5e - Linux runtime: the rest of WinNative's session fixes, and the two libraries meeting in the middle ·
a49806e8 - Linux runtime: wire the network link, FEX preset, /dev/shm clearing, redist seeding and client-game entries into the session ·
e92e37da - Linux runtime: present every container's installs to the client, not the launching one's ·
77d947b7 - Linux runtime: bind a game's real folder, not the prefix link to it ·
d71739fe - Linux runtime: recover a game whose prefix link went stale ·
033c7cbe - Linux runtime: build the client's library from the store's database, not the prefix links ·
9ce0cf67 - Linux runtime: a folder that has never been launched has no steam_appid.txt ·
15952f1a - Linux runtime: the app's two game roots are the client's library folders ·
3613ba0a - Linux runtime: the client's main library is internal storage, like the app's ·
67bb8249 - Linux runtime: seed redists into the card library's prefixes too, drop the old library path ·
2b1f3163 - Linux runtime: retire the old library, reconcile removals, download onto the card ·
aff9d808 - Linux runtime: the fake-evdev hooks must not touch state they may not have yet ·
2afae914 - Controllers: let the Steam button reach the client ·
428fac48 - Linux runtime: StateFlags is a bit field, so read it as one ·
f9dae5c2 - Linux runtime: tell the client which depots a game was installed from ·
fbf5d4fb - Linux runtime: say which place is the phone and which is the card ·
68f01476 - Linux runtime: a library's name lives in two files, not one ·
dd270900 - Linux runtime: report the card library's free space, not the phone's ·
868dc007 - Linux runtime: variables settled after the script was queued were arguments, not environment ·
98d38931 - Linux runtime: take an install's size from its manifest, not by walking it ·
37d4f62a - Store: stamp an adopted install with the build the client put there ·
29093965 - Linux runtime: keep the build stamp in step with the manifest, not with adoption ·
ab0b75a9 - Controllers: give the Steam client its own interposer instead of sharing Wine's ·
28922e7c - Linux runtime: seed a prefix the client creates mid-session, not only those that exist at start ·
6ee86bff - Wayland: let a soft keyboard type the symbols that need Shift ·
31834421 - Wayland: a soft keyboard's capitals need the Shift this side makes ·
b1b46d8c - Linux client: GE-Proton and proton-cachyos selectable as compatibility tools ·
03867656 - Contents: Proton builds listed as downloads in the Linux runtime tab ·
ff5eb418 - The Proton builds card crashed the app on a runtime with no requests yet ·
12038d41 - Contents: say in the Proton card which entries in Steam's list actually work ·
1e524b34 - Linux session: ask proot to stop, then sweep what it left behind ·
4509d788 - Shortcut editor: stop offering Wine settings to a Linux entry ·
dd4cbb9a - Shortcut editor: say who each Linux setting actually affects ·
e429caf1 - Linux session: always wire PulseAudio, and carry the DirectAudio driver ·
0e85efad - PulseAudio: optional microphone, fed from a pipe ·
8a7aae0f - Proton wrappers: offer DirectAudio to a game, and refuse when it would be silent ·
6e265fd9 - DirectAudio: the selection, the helper, and the microphone ·
d3b520ba - PulseAudio: ship the pipe modules from our own 13.0 build ·
ed0b5905 - PulseAudio: stop telling configure bionic has no mkfifo ·
8e5eaf20 - PulseAudio bundle: replace the two pipe modules with our own 13.0 builds ·
997acba2 - Linux session: refresh the PulseAudio bundle every launch ·
980c4220 - PulseAudio: clear a stale microphone pipe before the daemon starts ·
135044c7 - PulseAudio: keep the daemon's own log in its working directory ·
9ce9f2e6 - DirectAudio: let the daemon make the microphone pipe before the helper runs ·
6db75ca9 - DirectAudio: helper that no longer creates the microphone pipe ·
aea6e395 - Linux library: release a game the client uninstalled even though its folder remains ·
f35d820b - Linux library: count a shader cache as leftover, not as a game ·
fe03c0ec - Restore Steam's overlay, and stop the app that takes the Steam login ·
334955ea - Linux session: run at the screen's highest refresh rate, never the frame cap ·
0fa751b2 - Linux session: separate core lists for the client and for its games ·
cfca3912 - Linux entry: split Processor Affinity into Steam client cores and Game cores ·
cd6a8e2c - Escape apostrophes in the new Linux help strings ·
77d5e59a - Turnip: stop advertising present timing without calibrated timestamps ·
0672dbef - Linux entry: bring back the display driver row, and name both drivers ·
653f88d3 - Linux entry: pick the driver the session draws with, and import them ·
e1701623 - Linuxfs: drop the app-asset copy of the driver ·
f380192b - Driver imports: send each zip to the list that can load it ·
def29231 - Linux draw driver: read the escaped path in the ICD manifest ·
17663f36 - In-game drawer: describe a Linux session as what it is ·
83f7fd1b - Fix the build: pass the new flag from Java explicitly ·
77ce1e2a - HUD: read a Linux session's own API instead of the container's leftovers ·
ba8851cb - Port three fixes from WinNative (maxjivi05, feature/wayland-gamescope) ·
20b1236e - Two more from WinNative: sessions that never start, and black ones ·
ba07c7c7 - Proot: terminals work under glibc 2.42 and later ·
acd54079 - Revert "proot: terminals work under glibc 2.42 and later" ·
63cf28c7 - Linux session: a proot probe that cannot run must not change anything ·
ecb8c093 - Linux session: run the proot probe the way the session runs proot ·
8d5ac999 - Linux entries: start at 720p by default, whatever the container is set to ·
bcd42c10 - Linux runtime: its own settings, no Wine container needed ·
20fc84dd - Linux runtime tab: move the Steam entry on open, not only after a download ·
aadf928f - Linux session: skip the Wine-prefix preparation it never needed ·
054ca547 - Linux settings: seed them from the container the entry came out of ·
a4aa12f2 - Linux entry editor: DirectAudio and frame generation are not gated on Wine ·
3d014a4c - Linux settings: remember where the entry came from, so the seed always has a source ·
39c02668 - Linux session: always hand the client its core list ·
61a41403 - Linux sessions: one log folder per session, reports, and scrubbed Steam logs ·
fb5e1f64 - Fix the build: the end-of-session diagnostics use the session folder too ·
f75a3127 - Session logs: collect on the close path, before the session is stopped ·
9512fa0c - Session logs: cheap pieces first, big Steam logs by their tail ·
8deba310 - The controller cursor work and XMB cover tiles —
try/cursor-and-xmb-covers·a6ecf16e - Linux client: drop the seccomp probe; map owned games and anti-cheat runtimes to the ARM64 tool ·
60f3a166 - Shortcut editor: survive a container with no Box64, FEX or emulator set ·
f9b57e2b - Linux runtime: start a fresh install on Turnip, not the v819 blob ·
bccf0322 - Linux session: a loading screen until the Steam client draws ·
be25f981 - Linux session: uncover on the first frame itself ·
2cc25217 - Linux session: ask for the ARM64 Proton again once the user has signed in ·
7f411dbc - Linux session: restart the client once when the compatibility layer lands ·
856ff6dd - 3.1.3 pre-release 1: notes and versionName ·
e0d1d00d - 3.1.3 pre-release 1 notes: what comes next - custom, GOG, Epic and Amazon games in the client ·
650adf0f - 3.1.3 pre-release 1: versionCode 87, and the upgrade steps at the top of the notes ·
0e9b7cbc - 3.1.3-pre1: plain-English install and upgrade steps, collapsed, in the README and the notes ·
32e13ae6 - Linux runtime: do not hand the apk's proot an option it does not have ·
fd8de64a - Fix the build: a statement-level concat needs the + at the end of the line ·
b8779999 - Linux session: performance switches you can change without a build ·
80d8828b - Steam (Linux) settings: the performance switches as toggles on the entry ·
7f2c7ce3 - Linux session: the Steam UI gets its frames back ·
8fb668d1 - Comments: whole sentences per line, as the rule says ·
e30dd4cc - Linux session: Deck mode without the restart loop it caused ·
38996ea1 - Linux session: check the client branch before every start, not once ·
252edc01 - Linux session: list only the pads a device holds ·
d59c78c9 - Steam (Linux) settings: gamescope's frame limit and scaling, and a warning on Deck mode ·
7443b667 - Steam (Linux) settings: frame limits this panel can show, marked when they pace evenly ·
3a1601c2 - Steam (Linux) settings: remove the frame limit again ·
4e904851 - 3.1.3 pre-release 2: notes, versionCode 88 and versionName ·
39d43ebf - Linux session: Deck mode's SteamOS helpers, a client update channel, and the battery ·
6d0144bb - Linux session: the Steam client's own sound through DirectAudio ·
d4c6c98c - Linux session: the patched gamescope, ready to stage once it is published ·
a343682b - Linux session: stage the patched gamescope from winlator-contents ·
d660bf04 - Linux session: clear what a killed session leaves, and NIS in Deck mode's scaling filters ·
729047c5 - Linux session: Deck mode's performance overlay through Valve's mangoapp ·
a9de8a35 - Linux session: PulseAudio behind DirectAudio, so a game never has no audio device ·
df6a0446 - Mali-report 2026-09-27T09-19-49-af6469: log wine_debug.log ·
aa83d82e - Mali-report 2026-09-27T09-19-49-af6469: data ·
8e016eec - Mali-report 2026-09-27T09-19-49-af6469: page ·
94ced9ec - Mali-report 2026-09-27T09-19-49-af6469: index ·
d5703d9d - Pull request #560 —
feat/linux-gamescope-runtime·2962066f - Linux Steam client: real touch in Big Picture, leftover-process kill and a log cap, Steam updates past read-only files, compositor guards —
feat/linux-gamescope-runtime·be669b88 - Components: list only the Protons a game here can be set to —
feat/linux-gamescope-runtime·bea8f733 - 3.1.3 stable release notes ·
304a02a1 - 3.1.3: versionCode 90, versionName 3.1.3; credit DroidDeck once (formerly the SteamDeck app) ·
b12b5365
🙏 Credits (tap to expand)
Thanks to snowflake on Discord for reporting the add-exe crash on 3.1.3-pre3 (AYN Odin 3), which led straight to the fix.
The Linux Steam client runtime is built on:
- Valve — the Steam client, gamescope, Proton and the ARM64 Proton depot, the Steam Linux Runtime;
- DroidDeck (formerly the SteamDeck app) — the Steam Deck mode helpers, the update channel, the battery, the client's DirectAudio output, the shared gamescope builds including real touch and its compositor side, the killed-session and leftover-process cleanup and log cap, Steam updates past read-only files, the Components manager, the Proton pre-seed, log privacy, the Steam and Quick Access buttons, fill-the-screen, HDR and the troubleshooting switches, and the nine proot speed-up patches (with maxjivi05 / MaxsTechReview);
- WinNative (maxjivi05 / MaxsTechReview,
feature/wayland-gamescope) — the session fixes ported here: the seccomp lesson, the NetworkManager stand-in, the fake-evdev controller layer, the Steam interface's GPU fix, the child-process check, the proot memory copy, and the library and library-folder work the runtime grew from; - Armada — the gamescope patches (four verbatim, two ported by hand);
- Termux's fork of proot (the unprivileged root the runtime runs in), Arch Linux ARM (the root filesystem), FEX-Emu (Valve's x86 translation on ARM64);
- Mesa / Turnip (the Freedreno and Mesa teams) — the glibc builds are from The412Banner's Banners-Turnip.
The bundled Wayland drivers are rebuilt from community work, all on top of Mesa / Turnip by the Freedreno and Mesa teams:
- the 710/720/722 recipe by Vauzi-17 (release 3.6);
- the Adreno 8xx Balanced and Performance recipes by the WinNative development team (WN-Turnip 1.15);
- the Gen8 V36 recipe by StevenMXZ;
- the Mainline v31 recipe and the gen8 patch stack by whitebelyash.
The plain driver, the Wayland WSI builds and the Proton integration are from The412Banner's Banners-Turnip and proton-wine forks.
The412Banner's original work:
- the Linux runtime's integration: the container-free session, the compatibility tool, the two libraries, the Games-tab games in the client with shared saves, DirectAudio and the microphone, the loading screen, the log bundles;
- the embedded Wayland compositor, with its pointer-lock, clipboard, text-input and multi-touch support;
- its HDR path;
- the Android-layer prototype;
- the AIO Graphics Test.
Built on the work of many open-source projects and their communities:
- Display — Wayland (the freedesktop.org community) and Wine's
winewayland.drv(WineHQ). - Graphics — DXVK (Philip Rebohle & contributors), VKD3D-Proton (Hans-Kristian Arntzen & contributors), Mesa / Turnip / Zink (the Freedreno & Mesa teams).
- Containers, launch & runtime — Wine (WineHQ) and Proton / GE-Proton (Valve & GloriousEggroll); box64 (ptitSeb) and FEXCore (the FEX-Emu team).
- Native Steam engine & SteamLite agent — derived from WinNative's GPL
wnsteamclient andwn-steam-launcher; protocol groundwork from SteamKit2. - Audio — Android AAudio, driven by our own DirectAudio endpoint.
Entirely app-side — no ImageFS reinstall. Install over 3.1.2; everything carries over. The Linux Steam client is an optional separate download.
