Summary
Valve's Lepton compat tool (Steam app 3029110) is selected correctly by the Steam client on
our image, but cannot launch anything: Lepton drives its Android container entirely through
podman, and our rootfs ships no container runtime at all.
Measured on an AYANEO Pocket ACE (SM8550), dev build 9bde3fe / BUILD_ID=20260822T094920Z,
kernel 7.2.0.
Symptom
Launching an Android title (AOG.apk, app 4545850) starts the tool and dies ~5s later:
[18:13:26] AppID 4545850 adding PID 2345 as a tracked process
... reaper SteamLaunch AppId=4545850 -- '.../Lepton'/lepton waitforexitandrun -- '.../AOG.apk'
[18:13:31] AppID 4545850 no longer tracking PID 2349, exit code -1
[18:13:31] AppID 4545850 no longer tracking PID 2348, exit code -1
[18:13:31] Remove 4545850 from running list
steamapps/compatdata/4545850/ contains only baked/data_overlay — it never got as far as
building a container.
Root cause
Lepton calls podman for every container operation, resolved from PATH, and does not vendor a
copy (find over the whole installed tree returns no podman, crun, or steamvr binary):
liblepton/liblepton.sh — podman run / start / wait / exec / stop / rm / ps /
events / inspect
liblepton/liblepton.sh:356 — env -i PATH="..." $(which podman) exec ... lepton-${LEPTON_CONTEXT}
liblepton/mounting.sh — builds PODMAN_CMDLINE[@], mounts via podman_mount_entry
Dependency state on the device
| dependency |
state |
podman |
MISSING |
crun / runc |
MISSING |
pasta / passt |
MISSING |
fuse-overlayfs |
MISSING |
newuidmap / newgidmap |
present |
/etc/subuid, /etc/subgid for deck |
present (100000:65536) |
overlay, fuse in /proc/filesystems |
present |
/proc/sys/user/max_user_namespaces |
30436 |
pasta (not slirp4netns) is the one it wants — liblepton/networking.sh builds
-I eth0, --ipv4-only, --no-ndp, --no-dhcp, --no-dhcpv6, which are passt/pasta flags.
A repo-wide grep for podman|pasta|passt|crun|fuse-overlayfs matches nothing: we have never
shipped a container runtime, so this is a gap, not a regression.
The rootless prerequisites are otherwise already in place (subuid/subgid, userns, overlay, fuse),
so this may be purely a matter of adding packages.
What already works — do not chase it
The Steam-side integration is fine. compat_log.txt shows the tool registered and selected:
Registering tool lepton, AppID 3029110
Skip mapping AppID 4545850 to tool "native" with priority 75:
mapping to tool "lepton" with priority 250 already exists.
Posting tool registration callback 3029110 lepton
Loaded manifest for tool 3029110.
This is not the account-gating situation seen with the FEX compat tool (3127680) — selection
works, the runtime is simply absent. Note 3127680 is registered but not installed; 3029110 is
installed.
Also ruled out: binder is irrelevant here. Lepton has zero binder/ashmem references and its
README states it "runs as a non-root user without requiring any rootful setup or helpers" — it
avoids binder by design. Our CONFIG_ANDROID_BINDER_IPC is not set does not affect this.
Secondary defect: Lepton is silent on our image
Worth fixing alongside, because it is why this left no diagnostic trail:
liblepton/utils.sh:85: STEAMVR_LOGS_DIR="$(steamvr logpath || true)"
liblepton/utils.sh:103: print "${1:-/${STEAMVR_LOGS_DIR}/lepton-${CONTEXT}.log}"
We ship no steamvr binary, and || true swallows that, so STEAMVR_LOGS_DIR is empty and the
log path collapses to /lepton-.log — on a root mounted ro,relatime (btrfs). log_to_file's
tee then fails into its own || true and all output is discarded.
The same empty variable also disables:
logcat_debug_dir() (liblepton/performance_debugging.sh:3)
- the
EARLY_SHUTDOWN automatic logcat dump (lepton:205), which fires on any exit under 30
seconds and would have caught this run
Pointing STEAMVR_LOGS_DIR at a writable path before launch should restore diagnostics.
Scope decision needed before this is worked
Adding podman + crun + pasta + fuse-overlayfs is a non-trivial addition to an image we have been
actively trimming, in exchange for Android-game support that is not currently a committed feature.
That is a product call, not a bug fix — hence P3. Re-label if Android titles become in-scope.
Closing criteria (hw-gate)
Cannot be closed on a build-time check. Closing requires an Android title actually launching and
rendering through Lepton on real hardware, plus a Lepton log written to a real path.
Summary
Valve's Lepton compat tool (Steam app
3029110) is selected correctly by the Steam client onour image, but cannot launch anything: Lepton drives its Android container entirely through
podman, and our rootfs ships no container runtime at all.Measured on an AYANEO Pocket ACE (SM8550), dev build
9bde3fe/BUILD_ID=20260822T094920Z,kernel 7.2.0.
Symptom
Launching an Android title (
AOG.apk, app4545850) starts the tool and dies ~5s later:steamapps/compatdata/4545850/contains onlybaked/data_overlay— it never got as far asbuilding a container.
Root cause
Lepton calls
podmanfor every container operation, resolved fromPATH, and does not vendor acopy (
findover the whole installed tree returns nopodman,crun, orsteamvrbinary):liblepton/liblepton.sh—podman run/start/wait/exec/stop/rm/ps/events/inspectliblepton/liblepton.sh:356—env -i PATH="..." $(which podman) exec ... lepton-${LEPTON_CONTEXT}liblepton/mounting.sh— buildsPODMAN_CMDLINE[@], mounts viapodman_mount_entryDependency state on the device
podmancrun/runcpasta/passtfuse-overlayfsnewuidmap/newgidmap/etc/subuid,/etc/subgidfordeck100000:65536)overlay,fusein/proc/filesystems/proc/sys/user/max_user_namespacespasta(notslirp4netns) is the one it wants —liblepton/networking.shbuilds-I eth0,--ipv4-only,--no-ndp,--no-dhcp,--no-dhcpv6, which are passt/pasta flags.A repo-wide grep for
podman|pasta|passt|crun|fuse-overlayfsmatches nothing: we have nevershipped a container runtime, so this is a gap, not a regression.
The rootless prerequisites are otherwise already in place (subuid/subgid, userns, overlay, fuse),
so this may be purely a matter of adding packages.
What already works — do not chase it
The Steam-side integration is fine.
compat_log.txtshows the tool registered and selected:This is not the account-gating situation seen with the FEX compat tool (
3127680) — selectionworks, the runtime is simply absent. Note
3127680is registered but not installed;3029110isinstalled.
Also ruled out: binder is irrelevant here. Lepton has zero
binder/ashmemreferences and itsREADME states it "runs as a non-root user without requiring any rootful setup or helpers" — it
avoids binder by design. Our
CONFIG_ANDROID_BINDER_IPC is not setdoes not affect this.Secondary defect: Lepton is silent on our image
Worth fixing alongside, because it is why this left no diagnostic trail:
We ship no
steamvrbinary, and|| trueswallows that, soSTEAMVR_LOGS_DIRis empty and thelog path collapses to
/lepton-.log— on a root mountedro,relatime(btrfs).log_to_file'steethen fails into its own|| trueand all output is discarded.The same empty variable also disables:
logcat_debug_dir()(liblepton/performance_debugging.sh:3)EARLY_SHUTDOWNautomatic logcat dump (lepton:205), which fires on any exit under 30seconds and would have caught this run
Pointing
STEAMVR_LOGS_DIRat a writable path before launch should restore diagnostics.Scope decision needed before this is worked
Adding podman + crun + pasta + fuse-overlayfs is a non-trivial addition to an image we have been
actively trimming, in exchange for Android-game support that is not currently a committed feature.
That is a product call, not a bug fix — hence
P3. Re-label if Android titles become in-scope.Closing criteria (
hw-gate)Cannot be closed on a build-time check. Closing requires an Android title actually launching and
rendering through Lepton on real hardware, plus a Lepton log written to a real path.