* feat: experimental native userland that runs the Linux side without proot
* fix(native): keep the visible name of link2symlink binaries
* fix(ci): run the native hook build through bash
* fix(native): address review findings in the hook and the ctl fallback
* fix(ctl): use the broadcast fallback only when content is missing
* fix(native): survive Android's seccomp filter in ld.so, libc and posix_spawn children
* docs(native): how to test under Android's seccomp filter
* fix(session): hide an unlistable /sys/bus/pci/devices so libpci does not abort Chromium's GPU init
* fix(native): nested syscall() redirects no longer loop with libblsession's openat2
* fix(native): controllers reach Steam and the install-script evaluator no longer blocks game moves
* fix(native): write the hook's NUL character literals as escapes
* fix(native): proot fast path turns off and greys out while running without proot
* fix(native): D-Bus logins work and Xwayland still admits root once peers read as root
* fix(native): scripts on session mounts outside the rootfs run with the rootfs shell
* fix(native): games on the SD card library start in their own folder
* fix(native): Wine drive links proot made point at their real places
* fix(native): at-calls, uid lookups and relative programs follow the session's mounts
* fix(native): close-from in spawned programs covers what is open at the spawn
* fix(native): service names resolve and the DNS fallback answers what was asked
* build(native): the hook is built with its Go support and tracked by the preload recipe
* fix(native): drive links into identity mounts stay, and relink and seccomp patch failures are logged
* fix(native): seccomp-sim's filter holds every allowed call
* fix(ctl): the broadcast fallback only stands in for a missing content command
* fix(native): pre-2.33 glibc stat calls present owners as root too
* fix(native): res_init and res_ninit call glibc, so Steam's store resolves names
* fix(ci): a preload lock older than a new output rebuilds that group, and generated headers are not hashed
* fix(native): a second seccomp patch run leaves other system calls alone
* fix(native): the terminal and bottom desktop keep proot's environment in a native session
* fix(native): any number of session mounts, and openat2 relative to a mounted folder
* fix(agent): a native command's stdin is written beside its timeout
* fix(ctl): native rejects --env without = and timeouts outside 0-600 s
* fix(native): the resolver fallback has the network's IPv6 servers, and lookups keep the fallback's validation errors
* fix(native): a spawn whose dup2 source close-from closed fails with EBADF
* fix(native): __getcwd_chk checks its buffer, and seccomp-sim -a takes only call numbers
* feat(native): guests see the session hostname from uname and gethostname
* feat(native): the terminal and bottom desktop run without proot
* fix(components): an origin APK without a newer preload output still proves the rest
* fix(native): seccomp-sim -a rejects empty fields
* fix(native): gethostbyname no longer answers failed lookups with Ubuntu and Debian addresses
* feat(native): store installers, root helpers, Comet and Xodus run without proot
* fix(native): the hook finds libraries, preloads and itself through a sandbox's mounts, and ldconfig -C makes its cache
* feat(native): Flatpak sandboxes run without proot, and apply_extra runs without a runtime
* fix(native): remove, glob and nftw take guest paths, and links in a mount are followed as the guest sees them
* fix(native): Flatpak sandboxes get the session's mounts, their libraries' RUNPATHs, and no rootfs-only settings
* fix(native): gethostbyname asks the network's DNS servers, nftw of / gives single slashes, and the library path fits mapped directories
* fix(native): a native process starts in its working directory's real place
* fix(native): the library path given to ld.so holds whole directories only
* fix(native): Wine drive links keep their guest paths, so proot finds the library after a native session
* fix(native): droiddeckctl native prepares the rootfs with the setting off
* fix(native): a SysV segment stays while any process has it attached
* fix(native): DNS lookups ask the network's own servers before public ones
* fix(native): a program's own seccomp traps reach its own SIGSYS handler
* feat(native): run native sessions under a device's own app seccomp filter for testing
* fix(native): SysV attaches and collection take a lock, a failed mark fails the attach, and collection closes its directory
* fix(native): shmat fails when it cannot take the segment lock
* fix(native): the SysV segment lock is retried when a signal interrupts it
* fix(native): process tools see the session's processes as root's
* fix(native): native processes are named after their program, not ld.so
* fix(native): a session's helpers keep the mode the session started in
* fix(native): a keyed SysV segment stays until IPC_RMID
* fix(native): a rootfs link to an absolute guest path is followed in the guest, so Wine finds its z: drive
* fix(native): a sandbox whose loader can't be patched runs under proot
* fix(native): creating a private SysV segment also collects stale ones
* fix(native): a session stopped during startup forgets its mode
* fix(xbox): a native backend is authorized by its process ancestry
* fix(native): Wine's drive links are followed in the guest from any prefix
* fix(native): only the startup that owns the running session publishes its mode
* fix(native): a SysV segment stays until IPC_RMID even after its maker ends
* fix(native): a sandbox mount nested in another mount gets its own place
* fix(native): a sandbox whose mount places can't be made runs under proot
A process's status read for another process is served read-only, so
Chromium's ReadOnlyFile check no longer kills the browser. Chromium-based
AppImages without chrome-sandbox get --no-sandbox, and Flathub Chromium and
Electron apps skip zypak's spawn portal, which cannot work here.
An opt-in second Steam client (Steam settings, Steam client: x86-64): Valve's
x86-64 Linux client, unchanged, runs under FEX in its own home with its own
game library and the same sign-in. Linux builds run directly, so titles such
as Team Fortress 2 and Half-Life use their Linux versions; Windows games use
DroidDeck-Proton as on arm64. The arm64 client stays the default.
- droiddeck-steam-x64: FEX and the x86-64 rootfs from DroidDeck-Components
(sha256-pinned), client install and sync from Valve's CDN, sign-in shared
with the arm64 client, its web helper on the GPU (ANGLE GL over FEX's GL
thunk, zink, Turnip), Proton wrappers for the arm64 client's tools,
DroidDeck direct for Linux builds, SD-card library (x86-64/ beside the
arm64 one), repair.
- FEX 2610 built by build-fex.yml with thunks and three patches: an openat2
fallback without openat2 (proot), newer-clang thunkgen, MAP_32BIT
exhaustion returning ENOMEM. libblsession resolves RESOLVE_IN_ROOT paths
inside the root.
- Session: x86-64 gating, shortcuts and compatibility tools per client,
logs from the client that ran.
- App: client setting with the FEX version, an x86-64 chip on the Games
header, the active client's library, art, storage, downloads, repair,
Offline Mode, Decky, desktop mode, optional VAC diagnostics; per-client
state for art, the content log, repair and leftovers.
- Strings in every locale.
- Review fixes: the library cache is saved only by the newest scan; an
abandoned session's Steam logs come from the client it recorded; distinct
VAC console names; FEXInterpreter in CPU pinning; clearer VAC hint in
pl, ru, uk, cs and bg.
* feat: add Cardboard mode with side-by-side lens-distorted eyes and 3DoF head tracking
* fix: derive the Cardboard field of view from the panel and recentre fully when far from upright
* feat: share the Cardboard head pose with the guest and add a SteamVR driver for it
* feat: run SteamVR's compositor on Turnip/KGSL with a display-extension layer and a driver-direct HMD
* feat: show SteamVR frames in Cardboard mode through a driver-side presenter and a fake direct-mode display
* feat: install and start SteamVR for Cardboard mode from the session drawer
* docs: describe Cardboard mode and the SteamVR path
* feat: drive SteamVR hands from the game pad and keep the Cardboard headset out of standby
* docs: record where the SteamVR dashboard stops
* fix: map Cardboard head tracking to the screen's axes and keep turns about the real vertical as yaw
* fix: give Cardboard its previous picture back when SteamVR stops
* fix: report sem_otime from emulated SysV semaphores so SteamVR's web helper can start
* fix: bridge SteamVR's shared semaphores across processes and keep Steam alive while SteamVR runs
* feat: present SteamVR straight to DroidDeck's compositor at panel resolution
* docs: update Cardboard VR notes for the dashboard, semaphore bridge and direct presenter
* fix: keep Wine and FEX signal handlers in the VR layer; add semaphore tracing
* fix: clear a stale SteamVR active marker on status
* fix: clear only an old SteamVR active marker
* fix: unblock SteamVR clients on Turnip and keep Steam's web helper alive across SteamVR runs
* fix: judge shared waits before a submit's own signals and on Vulkan 1.0 devices
* docs: record VR games, SteamVR Home and OpenXR results on the Thor
* docs: add Cardboard VR learnings from the Thor bring-up
* docs: add Cardboard VR screenshots from the Thor
* fix: keep the VR layer's display stand-in to SteamVR runs and clear a leftover marker at session start
* fix: report SteamVR start and stop failures from the helper's exit code
Lifts Bannerlator's Linux/gamescope runtime out into an app of its own: the
Wayland compositor, the proot session, the runtime installer, the fake-evdev
controller path and the PulseAudio server, with none of the Wine, container or
store machinery around them.
One activity installs the runtime from the same winlator-contents catalog and a
second one runs the session: compositor on a SurfaceView, gamescope and Valve's
native arm64 client under proot, a physical pad republished into the fake-input
rings, and the session's milestones on screen until the first frame arrives.