Private evidence archive for building an Android app with a Linux runtime and a Steam/gamepad-first experience, rather than a Windows/Wine container as the primary product model.
Status: evidence gathered through 2026-08-09.
No previous Android-app attempt has reached the actual Steam login/library on Android. The Nova lab now
reaches the pre-login Steam Gamepad UI and the live Steam DOM reaches /login. The latest device run
resolved the timeout-driven quiet-scene failure in the continuous Android AHardwareBuffer receiver:
Android and X11 remained usable through a quiet Steam scene and reached the same timezone page, but
login and frame-identity correlation are still unaccepted gates. The latest
manual lifecycle run also proves that Activity stop cancels a blocking AHB ACK
wait without waiting for the 15-second timeout. The current
ARM handheld Linux ecosystem has moved further than the earlier experiments:
Valve's ARM64 client and Steam runtime are directly reachable from live distribution endpoints, and
Armada/PockNix document complete native-ARM64 Steam + gamescope sessions on supported Snapdragon
handhelds.
The useful results are split across several projects:
- GameNative proves the Android product plumbing: storage, downloads, Steam data, containers, input, lifecycle, and practical rendering.
- deck-in-a-box proves that real FEX can execute x86 code inside an Android-managed Linux environment, but Steam crashes in the FEX+proot thread path.
- steam-droid proves Valve's ARM64 Android Steam libraries can be loaded, but the public package is not sufficient to boot the native service.
- steam-arm-findings proves the strongest display path so far: ARM64 Linux userspace, KGSL Turnip, AHardwareBuffer exchange, SurfaceControl presentation, and a gamescope Android backend capable of presenting 600 compositor frames.
- The attached Termux:X11 kit assessment is a useful simpler bring-up path for normal ARM64 Steam desktop mode, but its own README explicitly excludes Gamescope and Steam Deck Big Picture.
- The open Termux:X11-to-Android forwarding track is now being taken past the initial display/lifecycle ladder toward native Steam OOBE, login, and a QR-code view visibly rendered on the Android screen; its first partial display result has not yet reached a mapped synthetic window.
- Current ARM64 Steam research records the live Valve endpoints, Holo's ARM64 package/rootfs channel, and the current Armada/PockNix session implementations.
- Android/Linux/gamescope roadmap turns the evidence into a rooted MVP and a staged rootless target.
- Nova rooted bridge lab records the first real Android-app Surface/HardwareBuffer and rooted chroot smoke test.
- Nova Holo glibc/Vulkan probe records native ARM64 glibc success, the stock-Holo control failure, a working KGSL Turnip/offscreen command path, and a verified Vulkan DMA-BUF export/import handoff.
- Nova Android AHardwareBuffer probe records Android Vulkan import, a bidirectional Android-to-Holo DMA-BUF/GPU handoff, export-before-wait acquire-fence ordering, and a five-frame two-buffer SurfaceControl loop with release-fence backpressure.
- Nova stock gamescope control records the first gamescope run on the same KGSL Vulkan path: stock gamescope reaches the Adreno device, then stops because its DRM-device discovery contract is not available.
- Nova headless gamescope seam records a patched ARM64 headless gamescope compositor crossing that DRM-identity boundary, compositing 298 Wayland SHM frames on the Nova, and leaving persistent Android output as the next seam.
- Nova Gamescope Android output records the imported AHardwareBuffer output path from Gamescope through Android SurfaceControl, including sustained 60-frame and 960x540 acquire/release fence runs.
- Nova Xwayland Android AHardwareBuffer output records an animated ARM64 X11 client crossing Xwayland, Gamescope, and the same 960x540 Android fence loop.
- Nova native ARM64 Steam seed and startup records the live Valve seed/runtime, reproducible deployment, System V semaphore and loader ABI probes, and the first bounded native Steam launch.
- Nova native Steam Gamepad UI through Android AHardwareBuffer records the first live SteamUI WebSocket-ready Gamepad UI screen crossing the complete Nova presentation path, with software CEF rendering explicitly called out.
- Nova Gamescope libei input seam records the first live keyboard-event round trip through Gamescope's EIS socket while native Steam and Android presentation remain active; gamepad navigation is still open.
- Nova native Steam hardware GLX probe records the bounded negative result for the Holo
msmpath: Steam reaches neither CEF nor a hosted frame before the Nova's Mesa/SVE and GLX boundaries fire. - Nova rooted uinput gamepad smoke records the real Xbox evdev-to-virtual-gamepad relay while native Steam and Android presentation remain alive; Steam navigation is still the next gate.
- Nova Android input to rooted uinput bridge records Android controller enumeration and deterministic key dispatch through an abstract socket into the rooted virtual gamepad; Steam navigation is still the next gate.
- Nova physical controller dispatch records a rooted evdev event delivered to Android as a controller-class
KeyEventand forwarded through the rooted virtual gamepad bridge; Steam consumption is still the next gate. - Nova virtual gamepad udev visibility records Holo
libudevdiscovery and uid-501 access to the virtual event node; Steam's own HIDAPI acceptance is still open. - Nova Steam input process FD probe records the native Steam process holding an open FD for that virtual event node while the AHardwareBuffer smoke passes; UI navigation is still open.
- Nova controlled Steam Gamepad UI input combines that live FD observation with an exact physical BTN_SOUTH relay; the event reaches the virtual node, but the language-selector navigation region remains unchanged.
- Nova D-pad semantic Steam UI input repeats the live-session comparison with BTN_DPAD_DOWN; the lower-level path still passes, but the selector remains unchanged, rejecting a narrow A-button mapping explanation.
- Nova Android input bridge in Steam UI records the earlier key-only negative comparison; the corrected app-side acceptance is in doc 29.
- Nova SDL3 joystick event target-selection pitfall records why the first name-based SDL3 event result was superseded when duplicate virtual nodes were found.
- Nova SDL3 Gamepad semantic event delivery uses the exact relay-created event path and proves Valve's SDL3 Gamepad mapping receives D-pad press/release events.
- Nova Steam Gamepad UI D-pad navigation acceptance proves an exact rooted
BTN_DPAD_DOWNevent changes the live Steam Gamepad UI navigation panel while native Steam owns the matching event FD and Android presentation passes. - Nova Android input bridge Steam UI navigation acceptance proves the Android app dispatch/socket path changes the live Steam Gamepad UI navigation panel under a strict Steam-surface visual gate.
- Nova Android A-button mapping and feedback-loop checkpoint corrects the Nova ABXY semantic table, filters the virtual-device feedback loop, and proves Android
KEYCODE_BUTTON_Areaches SDL3 as Xbox button 0 / LinuxBTN_SOUTH; A-button UI activation remains open. - Nova Android touch → Gamescope libei and fullscreen presentation checkpoint proves the app touch socket, ARM64 libei helper, Gamescope touch events, and native Steam Gamepad UI visible on the fullscreen AHardwareBuffer presentation path; hardware CEF remains open.
- Nova live manual input diagnosis records the persistent-session workflow, Android overlay focus issue, and live D-pad/touch observations.
- Nova Steam font coverage open question records the missing-glyph symptom without making it a blocker for the input/network loop.
- Nova runtime harness lifecycle defines fresh run identity, exact cleanup, artifact provenance, and stale-evidence guardrails.
- Parent session process audit records Luna's last-two-hours audit of repeated process mistakes and the resulting harness repairs.
- Nova bounded acceptance profile defines the reproducible 1280×960 AHB/libei acceptance profile and clean-run evidence.
- Nova network and update compatibility boundary records Android-host network reachability, the research-only updater boundary, and the OOBE restart-branch isolation.
- Nova X11 presentation capture adds same-run upstream window captures for separating CEF/Xwayland, Gamescope, and Android presentation failures.
- Nova release-message stall records the first traced AHardwareBuffer release-wait boundary.
- Parent session process-audit follow-up records the next Luna audit and process repairs.
- Nova harness provenance/reset fixes records the linked-worktree and remote-shell cleanup hardening.
- Nova AHB trace stall records the fresh frame-level timezone-to-network reproducer.
- Parent session process-audit follow-up 2 records the latest two-hours Luna audit and remaining workflow risks.
- Nova AHB seqpacket experiment defines the one-variable transport hypothesis and acceptance gate.
- Nova AHB seqpacket result records the negative device result and the next socket-instrumentation gate.
- Parent session process-audit follow-up 3 records Luna's newest two-hour audit and the remaining preflight/capture/phase risks.
- Nova AHB socket-trace experiment predeclares syscall, ancillary-FD, inode, and poll evidence for the original stream baseline.
- Nova mandatory preflight manifest records and enforces the cleanup, reset, run-identity, and provenance gate repaired after the latest Luna audit.
- Nova AHB socket-trace result records the stream baseline's valid message/FD exchange and the frame-432 Android receive/release boundary.
- Parent session process-audit follow-up 4 records Luna's latest two-hour audit and the remaining capture, timeout, focus, and phase-serialization risks.
- Nova Android receive-wait experiment predeclares the next diagnostic-only app-side ACK wait boundary.
- Nova AHB transport observability result records stable peer identities, complete ACK/SCM_RIGHTS syscalls, and the reproduced frame-318 receive boundary.
- Parent session process-audit follow-up 5 records Luna's latest two-hour audit and the required timeout, path, polling, teardown, and phase-barrier repairs.
- Nova manual harness guards records the finite-timeout policy and fail-closed post-stop verifier added after Luna's audit.
- Nova AHB read-queue experiment predeclares the timed receive/FIONREAD boundary and blocked-thread evidence.
- Nova AHB read-queue result records the reproduced frame-133 ACK wait, absent receive-timeout return, and clean guarded teardown.
- Nova AHB receive-timeout observability experiment predeclares logging and readback of Android's
SO_RCVTIMEOsetup without changing transport behavior. - Nova AHB receive-timeout observability result records valid 15-second socket readback followed by the unchanged frame-273 blocking ACK boundary.
- Parent session process-audit follow-up 6 records the remaining hard-coded X11, stale-log correlation, teardown, and capture-status risks.
- Nova harness audit repairs records the run-scoped X11 manifest, PID-filtered boundary poll, aggregate capture status, and fail-closed teardown wrapper added after the audit.
- Nova AHB handshake-deadlock research synthesis incorporates the attached report's ACK-first causal conclusion, hypothesis ordering, and independent SurfaceControl correctness items.
- Nova AHB poll/recvmsg boundary experiment predeclares the property-gated finite ACK poll and queue-state observation.
- Nova manual-capture harness guards records the invalid pre-forward/X11-staging attempts and the fail-closed capture preconditions added before the replacement run.
- Nova AHB poll/recvmsg boundary result records the valid frame-109 timed poll with zero queued bytes, stable endpoint pairs, and the downstream EPIPE after diagnostic fail-closed behavior.
- Nova blocking-stream ACK correlation experiment predeclares the unchanged blocking receiver needed to correlate a full Gamescope ACK with the same Android wait frame.
- Nova blocking-stream ACK correlation result records the earlier paired ACK boundary and its downstream ring release timeout.
- Nova clock-correlated AHB socket trace experiment predeclares shared-clock and thread identity instrumentation for the original stream transport.
- Nova clock-correlated AHB socket trace result refines the deadlock ordering with a same-run 60-second frame-149 boundary.
- Nova AHB continuous-repaint A/B result rejects the global repaint trigger after an exact-stack device comparison and records the retained transport/UI result.
- Nova AHB repaint acceptance and Steam UI boundary records the current no-hunk acceptance, the visible Steam UI gate, and the test-bench report handoff repair.
- Nova latest UI, touch, and login boundary records the fresh controller/touch validation, OOBE login-state transition, stale Android presentation, and event-driven AHB next step.
- Nova AHB ancillary-data parser fix records the frame-188
__cmsg_nxthdrproducer stall, the bounded control-message parser, and a fresh 240-frame device pass. - Nova continuous AHB quiet-scene fix records the device validation that keeps the live receiver blocked through Gamescope quiet scenes while retaining the bounded probe timeout.
- Nova AHB explicit cancellation records the bounded regression and Activity-stop cancellation validation for the blocking native receiver.
- Nova Gamescope scheduler-trace integration makes the opt-in repaint/present diagnostic patch part of the reproducible Gamescope build sequence.
Use a layered strategy:
- Reuse GameNative's Android-side lifecycle, storage, download, controller, and session-management patterns.
- Use Armada/PockNix as the current reference for the Steam Deck-like session: native ARM64 Steam, gamescope, Xwayland, input, audio, Proton, and FEX for x86 games.
- Use Holo's aarch64 Arch package channel for compatible glibc/graphics/gamescope dependencies, while fetching the native Steam client from Valve's client/runtime channels.
- Prove the first Android product path with root: app-owned Linux userspace plus the existing AHardwareBuffer/SurfaceControl gamescope direction from
steam-arm-findings. - Keep the Termux:X11 kit as a desktop-mode diagnostic/fallback path, and keep FEX as the game-compatibility layer—not the native Steam-client runtime.
- Remove root only after the session, graphics, input, and lifecycle contracts are independently passing.
The first meaningful acceptance test is: native ARM64 Steam reaches its login or Gamepad UI screen,
with hardware steamwebhelper rendering and controller input, on one known Snapdragon/Adreno device.
The first Android-app acceptance test adds: the Android app starts/stops that Linux session and presents
the gamescope frames on its own surface.
When a technical blocker appears, perform a current internet search before treating it as a hard boundary. Prefer primary project documentation and source, record the relevant URLs, revisions, and search date in the experiment record, and compare more than one implementation path when practical.
Keep Armada, PockNix, and their ROCKNIX foundation as standing prior-art references for SteamOS-like ARM64 Steam sessions, gamescope, Xwayland, Proton/FEX, input, audio, display, boot, and lifecycle details. Use those projects to extract implementation ideas while explicitly separating their full Linux/DRM/KMS assumptions from this repo's Android/rootfs path.
The documentation is organized into browsable evidence bands. Start with the documentation map, then read the current roadmap and lifecycle contract before choosing work or running the device.
Current high-value records:
- Standalone runtime/product requirement
- SteamclientTermux comparison
- APK first-run provisioning requirement
- System-D-Bus QR-login result
- Signed-in interactive QR result
- Proton 11 Geometry Wars first-frame result
- Latest clean-device OOBE boundary
- Truthful SteamOS update adapter boundary
Use the folder indexes to browse historical experiment/result pairs without turning the root README into a second flat archive.
“Proven” means the repository contains concrete on-device output, test artifacts, or a documented build/run result. “Partial” means a lower-level prerequisite works but the target milestone does not. “Claimed/untested” means the artifact describes a path but does not include enough device evidence to verify it independently.
This archive records technical evidence, not a redistribution of Valve runtime binaries. The attached ZIP was inspected but is not copied into this repository. Its SHA-256 and original workspace path are recorded in the kit assessment.