docs: PROGRESS_LOG (state, pipeline, 0.1→0.1.4 timeline, lessons, backlog) + the 0.1.1–0.1.4 release notes under docs/releases

This commit is contained in:
The412Banner committed 2026-09-22 04:37:16 -04:00
1 parent 8e58e8e3eb
commit 903c83718a
5 files changed
+564

No files matched your search

+108
View File
@@ -0,0 +1,108 @@
# SteamDeck — Progress Log
Running engineering log for the SteamDeck app (`com.steamdeck.launcher`). Newest state first, then
the timeline, then lessons and backlog. Companion to the README (what the app *does*) and to
`docs/releases/` (what each version said) — this is *how it got here and where it stands*.
---
## Current state (2026-09-22)
- **Latest release: 0.1.4** — private: https://github.com/The412Banner/SteamDeck/releases/tag/0.1.4
· public: https://github.com/The412Banner/winlator-contents/releases/tag/SteamDeck-0.1.4
`main` @ `8e58e8e`, CI run 35682844106, versionCode 5, APK sha256 `4b53ce6a…` (20,957,823 B).
- **Runtime:** `linuxfs-r9` on winlator-contents (790 MB), the only runtime release left; desktop
packages from `steamdeck-desktop-r1`. The app rewrites its own scripts (`bannerlator-*`), the
driver, `bannerlator-netmanager` and the DirectAudio pieces into the installed runtime at every
launch, so a fix in those reaches an installed runtime without a re-download.
- **Shipped feature set:** the native ARM64 Steam client under gamescope on the in-app Wayland
compositor; a LXQt-on-labwc desktop with Firefox and a shelf of emulators; Proton tools
(GE / CachyOS) as downloads; graphics drivers importable per mode; DirectAudio + microphone;
client/game core masks + four session switches; NetworkManager stand-in (Max's); overlay
restored; ROMs folder + Storage bound into the session's home; Bannerlator's File Manager;
a cog per launch mode (resolution, shape, HDR10, drivers, touch, OSC/audio, renderer); per-session
log folders that survive a crash; leftover-process sweep; frame generation (Win-FG, LSFG).
- **Verification level:** every release is CI-green and staged to the maintainer's device. Proven
on hardware (Pocket FIT / Fold): sign-in, store, install + launch (FlatOut 144 Hz), frame
generation, controllers + OSC, sound, desktop + Firefox, folding mid-session, driver import, the
log folder, the ANR fix, the network page. **Not yet proven:** everything 0.1.4 added (ROMs
folder inside an emulator, File Manager, resolution cap, HDR10, crash sweep, orphan sweep, the
drawer's Steam menu), DirectAudio *voice*, the core masks' effect, offline start, the soft
keyboard, any emulator with a game, Adreno 710.
- **Open field reports (Thor Pro, 8 Gen 2):** trackpad-mode tap does not click (code sends the
click; cause not found by reading); crash after 1–2 min in Ballionaire / Geometry Wars (no log
survived — 0.1.4's sweep will leave `crash.log`); a Fold's 10–20 fps client menus (Chromium →
ANGLE → Zink on an experimental A8xx Turnip); Fold crash loop (xalia ENOSYS storm — switches
shipped, untested); FlatOut shrinking after Resume (gamescope forcing the swapchain extent).
## Release pipeline (how every version is cut)
1. Work on `main`, pushed → `Build APK` runs `assembleRelease` (AOSP test key, v1+v2+v3 re-signed
by CI with zipalign + apksigner) → artifact `steamdeck-apk`. Dev builds keep the last release's
versionCode/versionName; a release bumps both in `app/build.gradle` in its own commit.
2. Verify: `gh run view <id> --json conclusion` (never trust a run listing's first row — a
`workflow_dispatch` run gets cancelled by concurrency in favour of the push-triggered one),
download the artifact, sha256 it.
3. Stage: `cp` to `/sdcard/Download/SteamDeck-rN.apk` (dev) or `SteamDeck-X.Y.Z.apk` (release).
Never `pm install` — the maintainer installs.
4. Private release `X.Y.Z` targeting the **full 40-char sha** (a short sha is refused), notes from
the draft in the session scratchpad, `--latest`. Public release `SteamDeck-X.Y.Z` on
winlator-contents with the README-style notes; one public release per version.
5. README ledger, this log, memory.
## Timeline
- **2026-09-19 — 0.1 groundwork.** Lifted out of Bannerlator's gamescope runtime on the user's
ask: one screen, one button. r2 reached Big Picture sign-in on the Pocket FIT. Package renamed to
`com.steamdeck.launcher` (r4), foreground service, test key, on-screen controls.
- **2026-09-20 — 0.1.** The Linux Steam client and a desktop; runtime r6→r9 in a day (Proton
self-selection, proot shipped, refresh rate, video, first run reaches a game). Public explainer
page for non-Linux users.
- **2026-09-21 — 0.1.1.** Catch-up with Bannerlator: driver selection (two lists, per mode),
overlay restored + GameHub force-stop, DirectAudio + microphone, core masks, four session
switches as toggles, per-session log folders with credentials scrubbed, Adreno 710 path via
Banners-Turnip r3.
- **2026-09-22 — 0.1.2.** The teardown ANR (log collection on the main thread) fixed; two
compositor log lines (frame-size change, window rename); README ledger.
- **2026-09-22 — 0.1.3.** Max's NetworkManager stand-in ported (the client's network page); shim
audit vs WinNative = zero functional drift.
- **2026-09-22 — 0.1.4.** ROMs folder + Storage in the session's home; Bannerlator's File Manager
ported whole; a cog per mode (railed settings window) with resolution cap, shape, HDR10 gated on
the panel, drivers, touch, OSC/audio/renderer; two-column main menu; crash-safe log folders +
Session logs toggle; OrphanReaper; drawer Steam menu. Public releases reorganised: one per
version, old `Steamdeck` release and runtimes r1–r8 deleted.
## Architecture (where things live)
- `MainActivity` / `ui/MainScreen.kt` — the main screen; `ui/ModeSettingsDialog.kt` the cogs;
`ui/*Dialog.kt` the rest.
- `SessionActivity` — the Surface, input (touch, touchpad, pads, keyboard), the drawer, the HDR
decision, the compositor start (`wayland/CompositorHost`, `wayland/WaylandCompositor`).
- `session/SessionService` — proot + gamescope/labwc + PulseAudio + DirectAudio relay + network
link; binds (`/root/Storage`, `/root/ROMs`); env for the guest; teardown; `OrphanReaper`;
`SessionArtifacts` + `CrashHandler` + `SessionPaths` for the log folders; `SessionPrefs`.
- `files/` — Bannerlator's File Manager (`FileManagerScreen.kt` and its helpers), the picker
activity and `InAppFilePicker` intent API.
- `gpu/` — Turnip (bionic, for the compositor) and Linux Turnip (glibc, for the runtime) managers.
- `tools/linuxfs/overlay/usr/local/bin/bannerlator-*` — the guest scripts, staged into the
runtime by `SessionFiles` at every launch (CI packages only `bannerlator-*` names).
- `app/src/main/cpp/waylandcomp/` — the compositor (shared lineage with Bannerlator).
## Lessons learned (don't repeat these)
- Nothing in teardown may do bulk filesystem work on the main thread (0.1.1's ANR).
- A CI closure check on a multi-line variable must flatten it first (`libaaudio.so` refusal).
- A runtime script must be named `bannerlator-*` or CI never packages it.
- `gh release create --target` needs the full sha.
- A proot bind is invisible to a program's "Computer" list; put what users need under home.
- The compositor decides its driver and its HDR gate once per app process — anything that changes
them applies after the app is fully closed, and the UI must say so.
- Bannerlator's File Manager ports mechanically (`port_fm.py` anchors) once the container hooks
are cut; do not hand-edit 2,500 lines.
- Deleting a release asset on GitHub can drop a sibling asset — re-list and restore.
## Backlog / next
- Device-prove 0.1.4 on the FIT (list above).
- Thor Pro: trackpad tap; the 1–2 min in-game crash once a `crash.log` arrives.
- Xfce as a second desktop shell (Max's branch runs XFCE 4.20 on labwc) — a catalog package + a
shell choice in the Desktop cog; comfort, not performance.
- Quick Access Menu for non-Deck pads — no confirmed chord; needs research, not a guess.
- FlatOut shrink: try `vk_wsi_force_swapchain_to_current_extent=false` via `steamdeck-env`.
- Max's stricter `winnative-directaudio` guards; `winnative-epic-launch` (a feature).
- Rename before anything truly public: "SteamDeck" is Valve's mark.
+189
View File
@@ -0,0 +1,189 @@
# SteamDeck 0.1.1
**A patch release, and mostly about the two things 0.1 could not do: change a driver, and tell you
what went wrong.** Install it over 0.1 — same key, same runtime, nothing to re-download.
Everything here came out of one day of reports from three devices, which is why so much of it is
about being able to *see* a fault rather than a new feature.
---
## 🧩 Graphics drivers — a new button on the main screen
Two lists, because a zip for one cannot serve the other:
- **Linux runtime driver** — the glibc Turnip everything *inside* the runtime renders on: the Steam
client's interface, every game it launches, and in desktop mode every program on the desktop.
Import a `-Linux` Turnip zip; an Android or `-Wayland` zip is refused with the reason rather than
becoming a black screen. The choice is **per mode**, so Steam and the desktop can run different
builds. Nothing inside the runtime is modified — the session is pointed at the imported driver
and the runtime's own Turnip is what a removed or unreadable import falls back to.
- **Display driver (Android)** — the bionic Turnip the app's compositor puts the frame on the panel
with. *Auto* keeps the GPU pick between the two bundled builds; an imported AdrenoTools zip can
be chosen instead. It applies after the app is fully closed and reopened, because the compositor
loads its driver once per process.
This is how a driver fix now reaches an installed runtime without a ~790 MB re-download.
✅ **Proven on device:** an imported Mesa 26.3.0 (Vulkan 1.4.363) glibc Turnip drawing a whole Steam
session — gamescope, the client, its UI helpers and Xwayland all on it — with an imported Android
Turnip in the compositor in place of the bundled build.
### 📱 Adreno 710 / 720 / 722
0.1 cannot start on these at all: Mesa has no entry for them and the session dies at
`device (chip_id = 7010000, gpu_id = 710) is unsupported`. There is now a path — import
`Turnip-…-710-720-Test.zip` as the **Display driver** and `…-710-720-Test-Linux.zip` as the **Linux
runtime driver**, from Banners-Turnip's `v26.3.0-20260921-r3` or newer. Those GPUs also want
sysmem rendering, which the app sets on its own when it sees that driver chosen.
⚠️ **Unverified on real hardware.** Nobody has run this runtime on a 710 yet. If you have one,
the session folder is the thing to send.
---
## 🔊 Sound, and the microphone
**DirectAudio for games** replaces Wine's audio driver *inside the games the client launches* with
one that talks straight to Android over a socket — no PulseAudio in between, and no resampling.
The client itself keeps PulseAudio either way; it is a native Linux program with no other way to
make a sound. It pairs only with a Wine 11 Proton (Valve's ARM64 builds, GE-Proton, proton-cachyos)
and stays off on anything else rather than play silence, saying so in the log.
**Microphone** is its own switch: the relay helper opens Android's input stream under the app's own
uid — which is what the recording permission is checked against — and PulseAudio exposes it to the
client as **DirectAudioMic**, for voice chat. With it off, nothing in the session can record and
Android's indicator stays off.
Both are under **Audio** on the main screen, both off by default, both applying at the next session
start. A game's first launch after enabling DirectAudio still uses Proton's own audio — the driver
is named in that game's prefix, which does not exist until then — and the second uses DirectAudio.
⚠️ Built and wired; the microphone reached `DirectAudioMic` only after a fix to the bundled
PulseAudio (0.1 shipped a 17.0 build of the module beside a 13.0 daemon, so it could never load).
Treat voice as ready to test rather than proven.
---
## 🎮 Steam's overlay, and the app that takes your login
Two deviations from a normal Steam launch, both removed rather than worked around.
The overlay used to be stripped from every game, because it sat in front of the controller reader.
That was an ordering problem — the interposer now goes first and the overlay loads as Valve intends.
Every difference between the launch Valve ships and what runs here is a difference this runtime
would otherwise have to account for.
And another Steam client on the same phone signs this one out seconds after every login. The app
now asks Android to stop it when a session starts and says so. ⚠️ Where that app restarts itself
through boot receivers, a background stop is a race it can win — if the client keeps signing out,
uninstall the other one.
---
## 🧮 Performance and session fixes
**Performance** on the main screen, all off by default, all applying at the next session start:
| | |
|---|---|
| **Steam client cores** | Steam pins its own interface to a subset of cores it chooses — on one device five of eight, leaving out the fastest — which suits a running game and makes the menus sluggish when the client is all there is. Overriding it pins the client, its UI helper and gamescope to the cores you tick, re-applied every few seconds because the UI keeps spawning helpers that inherit Steam's choice |
| **Game cores** | the cores a game may run on, applied by exec'ing it through `taskset` so every thread inherits the mask from its first instruction |
| **Skip Steam's xalia helper** | `xalia` is an x86 Windows program Proton starts for gamepad navigation. On some devices its system calls are refused in a way it cannot cope with and the session dies seconds after Big Picture appears. Turn this on if a session will not stay up |
| **Run proot without seccomp** | proot normally lets most system calls run untraced, which is most of its speed. Some kernels handle that badly and refuse calls that plainly exist. This traces everything instead: slower, but correct |
| **Turnip: sysmem rendering** | for an Adreno 8xx that looks glitchy or slow, and required on a 710/720/722 |
| **Zink: lazy descriptors** | the client's menus are drawn through Zink; the first thing to try when the menus are slow while games are fast |
Plus `Download/steamdeck-env`, a file of `KEY=VALUE` lines added to the session's environment, for
an experiment that would otherwise need a build per attempt.
---
## 🗂️ Logs worth sending
This is the change that will save the most time. Each session now gets **its own folder**:
```
Download/SteamDeck/session-20260921-161256/
device.txt what this device is, and every setting the session ran with
network.txt the link, the DNS the runtime was given, and what it means
app.log what the app itself decided and reported
crash.log Android's crash buffer, as it stood when the session ended
audio.log the PulseAudio daemon and the DirectAudio relay helper
session.log the guest session: proot, gamescope, the client's own output
wayland.log the compositor — what it presented, and how fast
steam.log + steam/ the client's own logs (Steam mode)
desktop.log labwc, the panel and the programs on it (desktop mode)
```
`device.txt` is written before the session starts, so a session that dies in its first second still
says what it ran on: model, SoC, Android and kernel, cores and their ceilings, RAM, the GPU as KGSL
names it, the panel, **which driver each half of the session chose**, and every switch in effect.
`crash.log` is where a session the *system* killed leaves its only trace.
**Credentials are scrubbed and nothing identifying is collected.** Steam's logs are filtered line by
line on the way in — session tokens, machine-auth GUIDs, WebAPI keys, Guard codes and e-mail
addresses are replaced, and a SteamID is masked to its last four digits so lines still correlate.
`loginusers.vdf`, `config.vdf` and the `ssfn` files are never copied. No serial number, no device or
advertising id, no account name, no network name. **A session folder is meant to be attached to a
report exactly as it is.**
---
## ⚠️ If Steam dies with nothing in the log
That is usually not Steam. **Android 12 and later kill the extra processes an app starts for
itself** once there are more than a few, and a session is made of dozens — proot, gamescope,
Xwayland, the client and its helpers, Wine, FEX. Where that is left on, the OS ends the session and
no log of ours says why, because nothing in the session did it.
Some phones expose it in Developer options as a **"restrict child processes"** switch — turn it off.
Otherwise, once per device:
```sh
adb shell settings put global settings_enable_monitor_phantom_procs false
```
`device.txt` records what your phone reports, and the Performance dialog says so when it is not
disabled.
---
## Still true from 0.1
VAC-protected games report insecure. Games that ship only a Linux build will not start — install
the Windows version instead. The desktop composites in software, and Firefox's child-process
sandboxes are off there. No Switch emulator. The emulator packages install but none has been run
with a game.
If a game launches and dies instantly, check **Properties → Compatibility** in the client: a game
pointed at the ARM64 Proton needs that depot to have finished downloading, and the session log says
so plainly when it has not.
---
## Credits
- **maxjivi05 (Max)** — the gamescope runtime this is built on: the proot session, the session shim,
the input interposer and the controller work, from WinNative. The `PROOT_NO_SECCOMP` fallback and
the phantom-process finding above are his too.
- **The412Banner** — the app, the Wayland compositor, the runtime plumbing and the Steam session.
- **Winlator (brunodev85)** — the PulseAudio-on-AAudio audio stack, the gamepad state model and the
shape of a session's host-side components.
- **Vauzi (Vauzi-17/710)** — the Adreno 710/720/722 device entries the experimental driver carries.
Frame generation: **Win-FG** is built in; **LSFG** uses the shader chain from *your own copy* of
Lossless Scaling, read on device and never redistributed, on groundwork from **lsfg-vk (PancakeTAS)**.
GPL-3.0. gamescope, Mesa, Turnip, Xwayland, labwc, LXQt, PulseAudio, proot and Arch Linux ARM are
their own authors'. **Not affiliated with Valve** — Steam, Proton and Steam Deck are Valve's, and no
Valve software is redistributed here: the client is fetched from Valve's own manifest on your device.
---
**APK** `SteamDeck-0.1.1.apk` — 15927028 bytes
`sha256 db4b0604ca53c4441bb66d0764ca7ff98b2a9f7bdfc48e3d52c6024b3a4bf78c`
versionCode 2, built from `2570562` by [run 35634795441](https://github.com/The412Banner/SteamDeck/actions/runs/35634795441).
Signed with the AOSP test key (v1 + v2 + v3), so it installs over 0.1 and the r24–r34 test builds in place.
+90
View File
@@ -0,0 +1,90 @@
# SteamDeck 0.1.2
**A fix release. 0.1.1 could hang the app when you left a session — that is fixed, and the two log
lines that would have explained it in the first place are in.** Install it over 0.1.1; same key,
same runtime, nothing to re-download.
---
## 🩹 Leaving a session could hang the app
0.1.1 collected a session's logs on the main thread as the session stopped — copying the
compositor's log, scrubbing every one of the client's logs line by line, then waiting on Android's
crash buffer. On a desktop session that was around four and a half seconds of frozen app, and
Android ended it as not responding. The collecting now happens on its own thread.
This was introduced by 0.1.1's own logging, and it is the whole reason for this release.
`crash.log` was wrong twice over in 0.1.1 as well: it waited for output that arrives on another
thread, so it declared the buffer empty every time, and it printed a process id where an exit
status belonged. It now waits for the dump to finish and says which of three things happened —
could not start, did not finish, or genuinely nothing has crashed.
## 🔍 Two log lines that were missing
Both came out of chasing a real report: a game that came back from the Steam menu as a small box in
the corner of the screen.
- **`changed its frame size: 1920x1080 -> …`** — a window that commits frames at a new size has
rebuilt its swapchain, and that is exactly what a game shrinking looks like from the compositor's
side. The size was previously nowhere in the logs and had to be guessed from a screenshot.
- **`renamed "Steam Big Picture Mode" -> "Flat-Out"`** — gamescope keeps one window and renames it
as the game takes the screen. That was silent, so the log showed a window *closed* under a name it
had never been logged as opening, which looked like a missing event and was really a rename.
## 📖 A README that matches the app
The README had grown a section per feature in the order they were written, and the parts describing
the whole had fallen behind. The feature ledger now covers the drivers, audio, cores, session fixes
and logs, with an honest state against each — including, in plain words, the several that set what
they claim but have never been measured on hardware. The architecture diagram shows the audio relay
and both Turnip slots. The session-log folder has a section of its own. And **Installing** now
mentions the one Android setting that decides whether a session stays up at all.
---
## Everything from 0.1.1 is here
Graphics drivers you can import and choose, per mode · Steam's overlay restored and a competing
client asked to stop · DirectAudio for games and the microphone · client and game core masks · four
session fixes (xalia, proot without seccomp, Turnip sysmem, Zink lazy descriptors) ·
`Download/steamdeck-env` · a folder of logs per session with credentials scrubbed and nothing
identifying collected · a path for Adreno 710 / 720 / 722 through imported drivers.
See the [0.1.1 notes](https://github.com/The412Banner/SteamDeck/releases/tag/0.1.1) for what each
of those does, and the README's ledger for what is proven versus merely wired.
## ⚠️ If the client dies with nothing in its log
That is usually not the client. **Android 12 and later kill the extra processes an app starts for
itself**, and a session is made of dozens. Some phones have a **"restrict child processes"** switch
in Developer options — turn it off. Otherwise, once per device:
```sh
adb shell settings put global settings_enable_monitor_phantom_procs false
```
`device.txt` in every session folder records what your phone reports, and the Performance dialog
says so when it is not disabled.
## Credits
- **maxjivi05 (Max)** — the gamescope runtime this is built on, from WinNative.
- **The412Banner** — the app, the Wayland compositor, the runtime plumbing and the Steam session.
- **Winlator (brunodev85)** — the audio stack, the gamepad model and the shape of a session.
- **Vauzi (Vauzi-17/710)** — the Adreno 710/720/722 device entries the experimental driver carries.
Frame generation: **Win-FG** is built in; **LSFG** uses the shader chain from *your own copy* of
Lossless Scaling, read on device and never redistributed, on groundwork from **lsfg-vk (PancakeTAS)**.
GPL-3.0. gamescope, Mesa, Turnip, Xwayland, labwc, LXQt, PulseAudio, proot and Arch Linux ARM are
their own authors'. **Not affiliated with Valve** — Steam, Proton and Steam Deck are Valve's, and no
Valve software is redistributed here: the client is fetched from Valve's own manifest on your device.
---
**APK** `SteamDeck-0.1.2.apk` — 15927028 bytes
`sha256 a761ba112fe97f4631d598f2a5d0b1898f9b81f4575771ded39c17b743f80825`
versionCode 3, built from `1f0292c` by [run 35674235857](https://github.com/The412Banner/SteamDeck/actions/runs/35674235857).
Signed with the AOSP test key (v1 + v2 + v3), so it installs over 0.1.1 in place.
+73
View File
@@ -0,0 +1,73 @@
# SteamDeck 0.1.3
**One thing, and it was owed: the client's network page works, and its connection indicator tells
the truth.** Install it over 0.1.2; same key, same runtime, nothing to re-download.
---
## 🌐 Settings → Internet works, and the header shows a connection
The Steam client builds its network page and its connection indicator on NetworkManager, and looks
for one on the system bus as it starts. This runtime had neither, so the page stopped with
*"StartScanningForNetworks is not a function"* under a header that showed no connection even while
downloads ran. A user on an Odin 2 reported exactly that in the first day.
The session now starts a small system bus and a **stand-in that answers for NetworkManager**. It
reports what is true and nothing more — one connection that is up while Android has a route out —
and refuses what it cannot do, since nothing in this runtime can scan for or join a network. The
session log says `network: system bus up, NetworkManager stand-in running` when it is working.
Both the stand-in and the bus configuration come from the app at every launch, so an installed
runtime gets this without a re-download; `dbus-daemon` and `python-gi` were already in it.
**The stand-in is maxjivi05's**, written for WinNative and carried by Bannerlator since; this app was
the only one of the three without it. Credit where it is due, and an apology to the Odin 2 reporter,
who was told it was cosmetic and unfixed when it had been fixed upstream for days.
## 🔍 Where the runtime stands against its sources
With this release the standalone's runtime scripts are level with Bannerlator's, and its sandbox
shims are byte-for-byte the same behaviour as Max's current branch — checked file by file today;
every difference is a deliberate rename or an attribution header. What remains on his side and not
here is a feature, not a fix: launching Epic games from the native client.
---
## Everything from 0.1.2 and 0.1.1 is here
The hang on leaving a session, fixed · the two compositor log lines that explain a shrinking game ·
graphics drivers you can import and choose, per mode · Steam's overlay restored and a competing
client asked to stop · DirectAudio for games and the microphone · client and game core masks · four
session fixes · `Download/steamdeck-env` · a folder of logs per session with credentials scrubbed ·
a path for Adreno 710 / 720 / 722 · a README with an honest ledger of what is proven and what is
merely wired.
## ⚠️ If the client dies with nothing in its log
Android 12 and later kill the extra processes an app starts for itself, and a session is made of
dozens. Some phones have a **"restrict child processes"** switch in Developer options — turn it off.
Otherwise, once per device: `adb shell settings put global settings_enable_monitor_phantom_procs
false`. `device.txt` in every session folder records what your phone reports.
## Credits
- **maxjivi05 (Max)** — the gamescope runtime this is built on, the sandbox shims, and the
NetworkManager stand-in in this release, from WinNative.
- **The412Banner** — the app, the Wayland compositor, the runtime plumbing and the Steam session.
- **Winlator (brunodev85)** — the audio stack, the gamepad model and the shape of a session.
- **Vauzi (Vauzi-17/710)** — the Adreno 710/720/722 device entries the experimental driver carries.
Frame generation: **Win-FG** is built in; **LSFG** uses the shader chain from *your own copy* of
Lossless Scaling, read on device and never redistributed, on groundwork from **lsfg-vk (PancakeTAS)**.
GPL-3.0. gamescope, Mesa, Turnip, Xwayland, labwc, LXQt, PulseAudio, proot and Arch Linux ARM are
their own authors'. **Not affiliated with Valve** — Steam, Proton and Steam Deck are Valve's, and no
Valve software is redistributed here: the client is fetched from Valve's own manifest on your device.
---
**APK** `SteamDeck-0.1.3.apk` — 15931221 bytes
`sha256 3f85118755234c5d8b1fb59640f817485d8360db7c63c142072c6b1025606542`
versionCode 4, built from `3aa0162` by [run 35676349317](https://github.com/The412Banner/SteamDeck/actions/runs/35676349317).
Signed with the AOSP test key (v1 + v2 + v3), so it installs over 0.1.2 in place.
+104
View File
@@ -0,0 +1,104 @@
# SteamDeck 0.1.4
**The main screen got its shape, the desktop can see the phone, the logs survive a crash, and the
file manager is Bannerlator's.** Install it over 0.1.3; same key, same runtime, nothing to
re-download.
---
## 🗂️ The desktop can see your files — and a ROMs folder
A file dialog inside the desktop (RPCS3's "Select Game Folder", say) showed only the runtime's own
tree. The phone's storage *was* mounted the whole time, at `/storage/emulated/0`; the dialogs
just could not show it — they list "Computer" from the mount table, where a proot bind never
appears, and open in the home folder, where nothing pointed at the phone.
The home folder now carries two entries every session: **`Storage`**, all of internal storage, and
**`ROMs`**, the folder chosen with the new **ROMs folder** tile — anywhere on the device, an SD
card included (it is a bind, not a link). Point an emulator at `/root/ROMs` once. Both are the
live folders: a save written next to a ROM lands on the phone.
## 📁 Files — Bannerlator's File Manager, whole
The **Files** tile is Bannerlator's File Manager carried over as it is: grid and list, sort,
search, multi-select, copy / cut / paste with conflict handling and a cancellable progress bar,
rename, delete, new folder, properties (read-only, hidden), favourites, and a locations rail with
every mounted card, Downloads, the ROMs folder and the session logs. Its pick mode is what chooses
the ROMs folder and imports a driver, in place of Android's document picker. Left out, because
they have no meaning without a Wine container: run, add to shortcuts, the C: / Z: drives and the
archive unpacker.
## ⚙️ A cog beside Play and beside Desktop
Everything that only matters for one mode moved behind that mode's cog — a settings window with
a rail of sections: **Display** (resolution up to 1080p by default, 900p, 720p or the panel's own;
the shape), **HDR**, the **runtime driver** for that mode, the **display driver**, **touch**, and
for Steam the on-screen controls and audio, for the desktop its renderer. The Graphics drivers and
Audio tiles are gone into them, and the main screen is a two-column grid: Play, Desktop and Start
offline on top, then Runtime · Desktop & apps · Frame generation · Compatibility tools ·
Performance · ROMs folder · Files · Session logs.
**HDR10 output** is a switch that is greyed out, with the reason, on a panel that does not list
HDR10. On, the compositor offers `wp_color_manager_v1` with BT.2020 + PQ and 10-bit buffers,
gamescope starts with `--hdr-enabled` and games get `DXVK_HDR=1`. The compositor decides this once,
when it starts, so like the display driver it applies after the app is fully closed and opened
again. ⚠️ Wired end to end; not yet seen on a device from this app.
## 🩹 Logs that survive a crash, and a session that always starts
A session's folder used to be finished only at a clean stop; an app crash or an Android kill left
it half-written — a user saw the toast name a log that was not there. The folder is now finished
three ways: the ordinary stop; the app's own crash handler, which writes `crash-app.txt` and
finishes the folder before the process dies; and a sweep at the next app start for any folder
without its `.complete` marker (a native crash, a kill), which gets `ended-without-teardown.txt`
and Android's crash buffer. **Session logs** on the main screen turns the folder off (it then
lives in the cache and is deleted with the session).
The same user had to force-stop the app before every launch or nothing started: when the app dies,
proot, gamescope and Steam outlive it, holding the rootfs, the GPU and Steam's lock. Every session
start now kills whatever of ours is still running from before, and `app.log` lists it.
## 🎮 Steam menu from the drawer
The in-session drawer has **Steam menu ◉** in Steam mode — the Guide button, for a device whose
own home button belongs to Android and a pad the client hides the on-screen controls for. (There is
no Quick Access chord on a non-Deck controller that I could confirm, so none is offered.)
---
## Everything from 0.1.3 and before is here
The client's network page · graphics drivers you can import and choose, per mode · Steam's overlay
restored and a competing client asked to stop · DirectAudio and the microphone · client and game
core masks · four session fixes · a folder of logs per session with credentials scrubbed · a path
for Adreno 710 / 720 / 722.
## ⚠️ If the client dies with nothing in its log
Android 12 and later kill the extra processes an app starts for itself, and a session is made of
dozens. Some phones have a **"restrict child processes"** switch in Developer options — turn it off.
Otherwise, once per device: `adb shell settings put global settings_enable_monitor_phantom_procs
false`. `device.txt` in every session folder records what your phone reports.
## Credits
- **maxjivi05 (Max)** — the gamescope runtime this is built on, the sandbox shims, the controller
work and the NetworkManager stand-in, from WinNative.
- **The412Banner** — the app, the Wayland compositor, the runtime plumbing, the Steam session and
the File Manager (from Bannerlator).
- **Winlator (brunodev85)** — the audio stack, the gamepad model and the shape of a session.
- **Vauzi (Vauzi-17/710)** — the Adreno 710/720/722 device entries the experimental driver carries.
Frame generation: **Win-FG** is built in; **LSFG** uses the shader chain from *your own copy* of
Lossless Scaling, read on device and never redistributed, on groundwork from **lsfg-vk (PancakeTAS)**.
GPL-3.0. gamescope, Mesa, Turnip, Xwayland, labwc, LXQt, PulseAudio, proot and Arch Linux ARM are
their own authors'. **Not affiliated with Valve** — Steam, Proton and Steam Deck are Valve's, and no
Valve software is redistributed here: the client is fetched from Valve's own manifest on your device.
---
**APK** `SteamDeck-0.1.4.apk` — 20957823 bytes
`sha256 4b53ce6a937f2b51a5b9d2639ea32b816993e4f7b2dc33dd0f3198b81f21e9d2`
versionCode 5, built from `8e58e8e` by [run 35682844106](https://github.com/The412Banner/SteamDeck/actions/runs/35682844106).
Signed with the AOSP test key (v1 + v2 + v3), so it installs over 0.1.3 in place.