Skip to content

Releases: Scrumpper/Steam-ARM

Steam ARM 2.2

Choose a tag to compare

@Scrumpper Scrumpper released this 07 Oct 01:26
23a0557

Steam ARM 2.2

Added support for Debian 13 and Raspberry Pi OS

sudo bash steam-arm-install.sh             # settings menu: Install / Setup
sudo bash steam-arm-install.sh --defaults  # recommended components, no questions
bash steam-arm-install.sh --detect         # GPU family and defaults, installs nothing

Upgrades 2.1 and 2.0 in place: client, game library, sign-in, component choices and title
profiles are kept (sudo bash steam-arm-install.sh --keep repeats earlier choices).

Assets

File What it is
Steam.ARM.2.2.zip Installer steam-arm-install.sh (settings menu steam-arm-config included) and documents
Steam.ARM.2.2.zip.sha256 SHA-256 of zip
README.md, CHANGELOG.md, COMPATIBILITY.md, GAMES.md Documents, also inside zip
steam-arm-fex-mesa-26.1.8-x86_64-i386.tar.zst, .sha256 Driver archive for gpu-in-emulation, unchanged from 2.0, and its SHA-256

Installer downloads driver archive from 2.0 release
(steam-arm-fex-mesa-26.1.8-x86_64-i386.tar.zst);
when that address fails, it tries same file name under releases/latest/download, which
this release serves. Both copies have same SHA-256, which installer checks.

New in 2.2

  • Debian 13 and Raspberry Pi OS. Outside Ubuntu family, setup writes FEX's PPA as apt
    source /etc/apt/sources.list.d/steam-arm-fex.sources with Ubuntu series matching Debian
    release (Debian 13: noble) and signing key /etc/apt/keyrings/steam-arm-fex.gpg, checked
    against pinned fingerprint. Earlier FEX source naming Debian release is renamed to
    .disabled. --remove deletes both files once no FEX build is installed. Ubuntu path
    unchanged.
  • Host package check first. Before any package or package source change, setup reads
    apt-cache policy and stops naming missing packages and minimum releases: Ubuntu 25.10,
    Debian 13. Ubuntu 24.04, Debian 12 and older have no SDL3 packages.
  • FEX from other sources. With FEX command not owned by fex-emu package and its x86
    binfmt entries registered, setup installs no FEX packages. Thunk folders come from FEX's
    own prefix (/usr or /usr/local); GL and Vulkan thunks turn off with warning when none
    is complete.
  • Close Steam in settings menu. Screens that need Steam closed (Install / Setup,
    Components, Controllers, Update / Repair, Uninstall, Remote Play, Restore settings) offer
    Close Steam, which runs steam-arm --shutdown; refused while game runs.
  • Tray menu. Open in Big Picture, Settings and View log entries. Stop runs
    steam-arm --shutdown; Stop and entries that restart client are greyed while game runs.
    Autostart entry names no desktops, so labwc (Raspberry Pi OS) and other desktops start
    tray at login.
  • Menu entries. "Steam ARM Settings" opens settings menu in terminal. .deb package adds
    "Steam ARM Setup"; package install over earlier setup names installed version and
    sudo steam-arm-setup --keep, and never runs setup.
  • Check for new version. Maintenance > Check for new version and
    steam-arm-config update-check compare newest GitHub release with installed version; by
    hand only, nothing downloads.
  • Godot rules. Godot 3 Linux titles get GL 3.3 report (MESA_GL_VERSION_OVERRIDE=3.3,
    log godot 3: GL 3.3 report); profile godot=vulkan leaves them as is. Engine version is
    also read from PCK embedded in executable and from .pck files in Godot's own order.
    Godot rules apply to Linux builds only. Godot 3 rule not run on test device without
    profile yet.
  • Download progress. Settings menu progress screen shows curl progress bar for client
    package (about 110 MB) and driver archive (about 75 MB).
  • Launcher checks. Page size at each start: 16K or 64K page kernel stops start with fix;
    STEAM_ARM_IGNORE_PAGESIZE=1 skips check, and setup keeps it in
    /etc/steam-arm/steam-arm.conf. Warning when no GPU render node is usable by account,
    naming group to join. steam-arm.log over 1 MiB moves to steam-arm.log.1. Warnings
    that need action also show desktop notification on menu starts.
  • Mali families. Mali-G615/G715 (arch v11) get mali-csf-v11 (gpu-in-emulation and
    glx-lax on, untested); Mali-G1 (arch v14) gets mali-csf-g1 (Mali components off, needs
    Mesa 26.2).
  • Hardware report. Adds last launcher log lines, start, update and error lines of
    client's bootstrap log, closing block of newest setup log, and game account groups.

Fixed

  • Ubuntu 24.04 and Debian 12: setup added FEX package source, then failed at host packages.
    Host package check now stops setup before any change.
  • Host package check and FEX package choice read apt-cache policy in C locale; under
    translated locale every package counted as missing.
  • First start: client that exited before its files were complete made launcher exit with no
    message. Launcher now says to start Steam ARM again, and starts client once more when
    bootstrap exited after updating itself.
  • Settings menu and tray counted Steam client of any account as running; now only game
    account's client counts.
  • steam-arm --help did not list --bigpicture and --desktop and refused to run as root.
  • Tray kept generic icon after client's first start until next login.
  • KDE Plasma 5 got no window rule; setup now writes and removes it with kwriteconfig5.
  • Settings menu Games and Graphics showed hand-installed GE-Proton* tools as Linux build;
    tool names containing proton now count as Windows build.
  • View logs: empty game and setup logs said launcher writes warnings only; logs not
    readable by menu account, and setup logs of sudo steam-arm-config runs, are now named.
  • Settings menu header on ARM systems without device tree (ACPI boards) printed
    /proc/device-tree/model error.
  • Dialog sentences no longer break into one-word lines on built-in screens.
  • Setup run from settings menu: closing summary no longer shows command line hints.
  • --remove summary names libgtk2.0-0 and libgtk2.0-0t64; PPA removal hint on Ubuntu
    only, when FEX package is installed.
  • Documents: Apple GPU notes say 16K page kernel is not supported (no muvm setup); Remote
    Play cause names ARM64 streaming client's V4L2 decoder path.
  • .deb package removal message: Steam ARM client and its files stay.

Known issues

  • Java (LWJGL 2) titles on Valve FEX tool FEX-2607: about half of first-start map loads
    fail (Java runtime crash, server thread stall or deadlock). Cause lies in FEX; Steam ARM
    settings and FEX options do not lower rate. FEX-2609.1 beta: 2 of 10 failed.
  • 32-bit Source engine titles, native Linux build: loading screen draws, then title hangs.
    Windows build through Proton reaches menu and plays on GPU; set it from
    Graphics > Route per game > windows.
  • Armv8.0 CPUs without LSE atomics (Cortex-A53, A57, A72: Raspberry Pi 4, Pi 3): current
    client builds crash there
    (steam-for-linux #13288);
    setup and launcher stop, as in 2.1.
  • Other 2.1 known issues still apply, except Debian FEX source step (fixed above).

Raspberry Pi

Raspberry Pi OS (Debian 13 base): setup writes FEX source as apt source file (New in 2.2);
tray autostart entry no longer excludes labwc. Both not yet run on Raspberry Pi hardware.
Page-size flow, Raspberry Pi graphics facts and performance tips: COMPATIBILITY.md.
Expectations per game type: GAMES.md.

Full list: CHANGELOG.md.

Test device: RK3588 board with Mali-G610 GPU.

This project is not affiliated with, endorsed by or sponsored by Valve Corporation. Steam,
Proton, Steam Deck and Steam Frame are trademarks of Valve Corporation.

Steam ARM 2.1

Choose a tag to compare

@Scrumpper Scrumpper released this 06 Oct 01:12

Steam ARM 2.1

Renderer check, FEX build per chip, display mode restore, MangoHud in x86 titles, first start progress, and other fixes.

added steam-arm --shutdown

sudo bash steam-arm-install.sh             # settings menu: Install / Setup
sudo bash steam-arm-install.sh --defaults  # recommended components, no questions
bash steam-arm-install.sh --detect         # GPU family and defaults, installs nothing

Upgrades 2.0 in place: client, game library, sign-in, component choices and title profiles
are kept (sudo bash steam-arm-install.sh --keep repeats earlier choices).

Assets

File What it is
Steam.ARM.2.1.zip Installer steam-arm-install.sh (settings menu steam-arm-config included) and documents
Steam.ARM.2.1.zip.sha256 SHA-256 of zip
README.md, CHANGELOG.md, COMPATIBILITY.md, GAMES.md Documents, also inside zip
steam-arm-fex-mesa-26.1.8-x86_64-i386.tar.zst, .sha256 Driver archive for gpu-in-emulation, unchanged from 2.0, and its SHA-256

Installer downloads driver archive from 2.0 release
(steam-arm-fex-mesa-26.1.8-x86_64-i386.tar.zst);
when that address fails, it tries same file name under releases/latest/download, which
this release contains below. Both copies have same SHA-256, which installer checks.
You don't need to download them :-)
They are board specific.

New in 2.1

  • Renderer check. Launch handler logs which device title draws on:
    renderer: GPU (<driver> <node>), forwarding to host driver, or
    renderer: warning: GPU forwarding not active: rendering on CPU (llvmpipe) with reason.
    GPU counts once title allocates GPU memory on it; CPU verdict comes after 30 s. Hardware
    report lists renderer lines of five newest starts. STEAM_ARM_RENDERER_CHECK=0 turns it
    off per title.
  • Page size up front. Settings menu title bar starts with page size state
    (pages 4K ok, pages 4K (setup kernel switch), pages 16K: reboot for 4K,
    pages 16K: needs 4K); setup and removal banners name page size and what page-size
    component does about it.
  • FEX build matches CPU. Setup picks fex-emu-armv8.0, fex-emu-armv8.2 or
    fex-emu-armv8.4 from CPU features, same rule as FEX's own installer, and names chosen
    build in setup log.
  • Display mode restore. X11 session: launcher saves mode and position of each output
    when title starts and puts them back once no title runs, and when Steam closes.
    STEAM_ARM_MODE_RESTORE=0 turns it off.
  • steam-arm --shutdown. Asks client to exit, sends SIGTERM after 20 s, never
    SIGKILL. --desktop and --bigpicture switch running client through it.
    steam-arm --help prints launcher usage.
  • MangoHud in x86 Linux titles. mangohud %command%, MANGOHUD=1 %command% and
    profile mangohud=on draw HUD in 64-bit titles.
  • kde-input-prompt component, off by default. KDE Plasma (Wayland): no "Remote
    control requested" prompt when controller drives desktop. Trade-off: every X11 program
    may then send input without asking. Turning it off or --remove puts earlier value back.
  • Profile key multiblock=on|off. FEX Multiblock per title. Test device, one 32-bit
    Unity title: 5 to 9 % higher frame rate, first frame 2 to 4 s later.
  • Log lines. compat: warning when Steam's saved Proton choice and started build
    differ; goldsrc: note on OpenGL or Software renderer in GoldSrc (Half-Life engine)
    titles.
  • Information. OpenGL line (host renderer and versions) and CPU governor line with
    governor and max clock per CPU cluster.
  • Help page Fixing a game. Entries "Game is slow (CPU-bound)" and "Proton version
    keeps changing back".
  • steam:// links. Menu entry declares x-scheme-handler/steam; links open in
    Steam ARM.
  • Update / Repair asks first. Maintenance > Update / Repair shows Run / Back
    (Back by default) before setup runs.
  • First start progress. Desktop notification from first click until client opens:
    download percentage of client files, then unpacking and installing; later starts show none.
    Test device: first start took 102 s, previously with nothing on screen.
  • Icons before first start. Menu and desktop entries show plain disc icon until client
    has downloaded its files, then client's own icon.
  • CPU check. Setup and launcher stop with clear message on Armv8.0 CPUs without LSE
    atomics (Cortex-A53, A57, A72: Raspberry Pi 4, Pi 3): current client builds crash there
    (steam-for-linux #13288). STEAM_ARM_ALLOW_ARMV80=1 skips check.

Fixed

  • CPUs without Armv8.2 features: setup stopped because fex-emu-armv8.2 has no install
    candidate there. Setup now installs fex-emu-armv8.0.
  • Information showed FEX package string, not FEX version, with FEX 2608 and later.
  • MangoHud never loaded in x86 titles: handler now loads root filesystem's MangoHud from
    client folder. 32-bit titles get no MangoHud (root filesystem has no 32-bit build).
  • Launch option mangohud %command% failed (no host mangohud command); setup adds small host shim where MangoHud package is absent.
  • Title that switched refresh rate (for example 1080p at 24 Hz) left it switched after exit.
  • Client that stopped acting on forwarded command lines kept running on --desktop and
    --bigpicture.
  • Settings restore: Proton/tool per game from backup replaced choice made since; choice
    made now wins.
  • Settings menu: restore summary button read Back but led on to confirm screen (now Next);
    Install / Setup Back from parts could skip Vulkan screen; Information showed governor of
    first CPU only.
  • Included profile 248570 overlay=off (custom OpenGL engine title that stops when Steam
    overlay attaches), absent since 1.2, restored.
  • Client in SteamOS mode switched host Bluetooth adapter off at every start. Launcher now
    writes host adapter state to System/Bluetooth/Enabled in config.vdf before start,
    and at exit powers adapter on again when client left it off.
  • Components checklist cut off kde-input-prompt label; label now fits.
  • Setup started from folder game user cannot enter (for example /root) stopped with
    "client program missing after unpacking"; steps that run as game user now start in that
    user's home folder.
  • Maintenance > View logs: empty launcher log showed blank page; menu now says log is empty (launcher writes warnings only).

Known issues

  • MangoHud draws no HUD in Unity titles on Vulkan renderer.
  • Custom OpenGL engine title with included overlay=off profile (app 248570) stops about
    20 s in when MangoHud is loaded; leave MangoHud off for it.
  • steam://rungameid/<appid> for title not in library can leave install dialog over games
    started later; restart Steam to clear it.
  • powerprofilesctl launch -p performance -- %command% holds profile only when Steam was
    started from desktop session (menu or autostart); started from other context, hold is
    refused and title does not start.
  • Raspberry Pi OS and other Debian systems: setup adds FEX package source with
    add-apt-repository ppa:fex-emu/fex, which works on Ubuntu only; on Debian, FEX step
    fails. Fix planned for 2.2.

Raspberry Pi 5

Page-size flow, renderer line, Raspberry Pi graphics facts and performance tips:
COMPATIBILITY.md, sections Raspberry Pi and Raspberry Pi 5 performance tips. Expectations
per game type and community reports: GAMES.md, section Raspberry Pi 5. Read
renderer line in title's log first: CPU warning there means GPU forwarding is not active.

Full list: CHANGELOG.md.

Test device: RK3588 board with Mali-G610 GPU.

This project is not affiliated with, endorsed by or sponsored by Valve Corporation. Steam,
Proton, Steam Deck and Steam Frame are trademarks of Valve Corporation.

steam-arm-v2.0

Choose a tag to compare

@Scrumpper Scrumpper released this 02 Oct 01:28
7e5e47d

Steam Frame's Client Installer for ARM64 Systems

New in v2.0 :

  • GPU family detection
  • settings menu steam-arm-config
  • PhysX install step skip
  • Full uninstaller
  • Graphics route per game title with Mali* drivers inside emulation
    *if applicable
sudo bash steam-arm-install.sh             # settings menu: Install / Setup
sudo bash steam-arm-install.sh --defaults  # recommended components, no questions
bash steam-arm-install.sh --detect         # GPU family and defaults, installs nothing

Upgrades 1.2 in place: existing client, game library, sign-in, component choices and local
title profiles are kept.

Refreshed interface:

1 image 2

Assets

Tag steam-arm-v2.0. Installer downloads driver archive from this release; when that
address fails, it tries same file name under releases/latest/download.

File What it is
Steam.ARM.2.0.zip Installer steam-arm-install.sh (settings menu steam-arm-config included) and documents
README.md, HOW-IT-WORKS.md, CHANGELOG.md, FEATURES.md, COMPATIBILITY.md, GAMES.md, RESEARCH.md, COMPARISON.md, CREDITS.md Documents, also inside zip
steam-arm-fex-mesa-26.1.8-x86_64-i386.tar.zst Driver archive for gpu-in-emulation component: Mesa 26.1.8 (Panfrost, PanVK) built for x86-64 and i386. Installer downloads it when component is selected (default on Mali GPUs)
steam-arm-fex-mesa-26.1.8-x86_64-i386.tar.zst.sha256 SHA-256 of driver archive; installer checks same value

Highlights

  • GPU family detection.

    Example:
    Installer reads kernel driver, Mali GPU id, device tree and PCI
    vendor of each render node and picks one of 27 GPU families (Mali, Adreno, Apple,
    Raspberry Pi, Vivante, PowerVR, AMD, NVIDIA, Intel, virtual GPU), or none or unknown.
    Family sets default state of vk-spoof, gpu-in-emulation and glx-lax: Mali
    components on by default on Mali GPUs, off elsewhere. --detect prints family, drivers,
    page size and defaults without installing; GPU_FAMILY=id sets family by hand.

  • Settings menu steam-arm-config.

  • Ten sections: Information, Install / Setup,
    Components, Graphics, Games, Controllers, Remote Play, Maintenance, Uninstall,
    Help / About. Installer opens it when started in terminal with no options. Subcommands
    for scripts: info, report, gfx, gfx-default, profile, compat, components,
    help fixing.

  • Graphics route per title.

  • Forwarding (OpenGL and Vulkan calls to system Mesa) for
    most titles;
    Example: Mali drivers inside emulation for Java titles, and for 32-bit titles started
    with -vulkan or -force-vulkan on Mali-G610 class and Mali 5th gen. Profile key
    gfx=a or gfx=b overrides per title; GFX_DEFAULT=auto|a|b sets default.

  • Custom driver archive.

  • Opt-in for advanced users: own Mesa build for
    gpu-in-emulation through STEAM_ARM_PROVIDER_TARBALL and STEAM_ARM_PROVIDER_SHA256.
    GitHub source includes build recipe tools/build-driver-archive.sh and Actions workflow
    "Build driver archive". Results depend on Mesa and kernel versions.

  • Fixing a game help page. In menu and steam-arm-config help fixing: launch options
    that work, what to avoid, what cannot be fixed, and how to read handler's log lines
    (launch option kept, title setting kept).

  • PhysX install step. Launcher marks legacy PhysX install step done in title's Proton
    prefix; before prefix exists, PhysX installer running over 60 seconds gets SIGTERM(configurable).

  • Uninstaller. --remove removes everything installer added and restores changed
    system settings; installed games stay unless deletion is confirmed by typing DELETE.
    --remove --purge also deletes client folder and root filesystem setup downloaded.

  • Controllers. Valve's steam-devices rules, plus 241 pads from kernel xpad table
    that Valve's list lacks; Sony and Nintendo pads matched by kernel pad driver.

Graphics route per title

gpu-in-emulation component, on by default on Mali GPUs, provides Mali drivers inside
emulation: x86-64 and i386 Mesa 26.1.8 in second copy of root filesystem, same layout
Valve uses on Steam Frame, about 330 MB extra disk. Root filesystem used for forwarding
stays unchanged. STEAM_ARM_PROVIDER_TARBALL=file points installer at downloaded archive
in place of its download; other steps still need network. When release file answers HTTP
404 at both addresses, setup stops with message naming that file and
STEAM_ARM_PROVIDER_TARBALL.

Custom driver archive, for advanced users: STEAM_ARM_PROVIDER_TARBALL=/path with
STEAM_ARM_PROVIDER_SHA256=<sha256>. Setup checks checksum and layout, prints warning,
and keeps archive across repair and update; --provider-default switches back. With it,
gfx=b and GFX_DEFAULT=b apply on any GPU; automatic rules stay Mali-only, and on
published archive gfx=b on non-Mali GPU means forwarding plus warning.

BYOD(build your own driver):
tools/build-driver-archive.sh (x86-64 Linux PC, about 25 GB disk, network, no root)

Other changes

  • Settings menu: built-in full-screen screens with textured background and light dialog
    box, falling back to dialog, whiptail or plain prompts
    (STEAM_ARM_DIALOG=builtin|dialog|whiptail|read); cursor returns to item chosen last;
    setup summary leaves out download line when client is present.
  • Launcher starts client again when it exits after applying its own update, at most
    twice.
  • Launch handler log names values in effect for Unity and Godot (renderer, GL version);
    only FEX_APP_CONFIG launch option counts as user choice for Multiblock, so Steam's
    per-title FEX setting does not stop Java 21+ rule.
  • GPU_FAMILY=<unknown id> --detect warns, lists valid ids and exits with status 0;
    install still stops.
  • page-size component listed only on Raspberry Pi 5 class boards, or on Pi with page
    size other than 4K.
  • Unfinished x86 root filesystem extraction from stopped earlier run discarded, or
    extracted again from downloaded .sqsh.
  • --password-stdin: password of account setup creates, from standard input; never
    printed or logged.
  • Package-install guard: apt, apt-get and dpkg inside x86 emulation refuse and
    change nothing, since FEX writes reach host system; original kept as
    <tool>.steam-arm-real.
  • --remove also removes settings menu and installer copy, restores Valve's streaming
    client and package tools of root filesystem, turns lingering off only when setup turned
    it on, saves game profiles to /var/backups, and prints sudo userdel -r <name> for
    account setup created. .deb removal prints how to remove installed client.
  • Security hardening: writes in game account's home done as that account, client folder
    path validated, sudo rule checked with visudo, Valve's files and settings edited
    through new file renamed over old one, temporary files removed on exit, client package
    and driver archive checked against checksums.
  • --replace-other retires other variant of this installer before setup: system files to
    /var/backups/steam-arm-replaced-<date>.tar, files from its account's home to
    steam-arm-replaced-<date>-<user>.tar, restored with
    sudo -u <user> tar -xpf <archive> -C /.
  • Setup refuses to run twice at once, and install, repair and component changes refuse
    while Steam ARM runs for game account (Steam is running for '<user>'). steam-arm
    refuses to run as root.
  • --remove deletes client folder only when it holds marker .steam-arm-client, which
    setup writes from 2.0 on, only into folder that was new, empty, already marked or
    earlier Steam ARM client folder; folder with steamapps or ubuntu12_32 at top level
    is refused, older client folder without marker kept. /dev/shm line goes out of
    /etc/fstab only when setup added it; kept line is reported.
  • GPU components follow GPU family change, except those set by hand.
  • steam-arm-compatmap refuses while Steam runs and on bad input, and keeps first
    original as config.vdf.bak-steam-arm.
  • glx-lax rebuilds itself after every Mesa upgrade through apt hook.
  • FEX tool 2609 and later needs no ThunksDB.json edit; FEX logging off.
  • First client download from Valve's stable ARM64 channel; publicbeta no longer written.
  • Fixed: GLX copy and Vulkan layer enabled when deselected; sudo rule written without
    pad-xbox; account creation on systems without render group; no notice when account
    gained groups; Vulkan titles with Steam overlay hung at start when overlay layer was
    registered twice; steam-arm run from account other than setup account, or before setup
    finished, printed file errors instead of naming fix.

Known issues

  • Direct3D 12, Unreal Engine 5, Unreal Engine 4 Direct3D 11 and Unity HDRP titles do not
    run on Mali: PanVK lacks features they need. Details in COMPATIBILITY.md.
  • 32-bit Linux title that includes DXVK Native: device on Mali, title then stops at loading
    screen, as with its OpenGL renderer.
  • Godot 3 titles need profile
    env=MESA_GL_VERSION_OVERRIDE=3.3;MESA_GLSL_VERSION_OVERRIDE=330.
  • Client can stay on "Starting launch" or black "Abort game" screen after title exits;
    exiting client and starting it again clears it.
  • Proton ARM64 titles: MangoHud and Steam overlay each crash title at start.
  • Remote Play: Shift+Tab goes to host PC; use controller Steam button.

Full list: CHANGELOG.md.

Test device: RK3588 board with Mali-G610 GPU.

This project is not affiliated with, endorsed by or sponsored by Valve Corporation. Steam,
Proton, Steam Deck and Steam Fr...

Read more

steam-arm v1.2

Choose a tag to compare

@Scrumpper Scrumpper released this 29 Sep 14:58
6908e1a

steam-arm 1.2

sudo bash steam-arm-install.sh

Upgrades 1.1 in place: existing client, game library, sign-in, component choices and local
title profiles are kept. Re-run of 1.1 over 1.2 goes back cleanly as well.

Memory leak fixed

Steam overlay leaves two 25 MB frame buffers in /dev/shm for every game session, and client's
web helper keeps them mapped until client restarts. Memory shrank with each game started, and
1.1 advised restarting client after long run of sessions. 1.2's launcher frees their pages
within about 2 minutes of last game ending (hole punched; files and mappings stay valid). Test:
/dev/shm back from 205 MB to 55 MB one minute after third session; client kept running and
next game started normally.

32-bit titles

  • Handler removes -vulkan and -force-vulkan from 32-bit titles. FEX forwards Vulkan for
    64-bit code only, so these options put 32-bit title on CPU renderer. Profile key vk32=keep
    keeps them.
  • Titles started through start script (Source engine style) are detected by binary script starts,
    so 32-bit, Unity and Godot rules apply to them.
  • New profile key gl32=off: title not detected as 64-bit runs on x86 Mesa inside
    emulation instead of forwarded host Mesa. Slower; for titles forwarding breaks.
  • New keys are documented in README and RESEARCH.md; existing /etc/steam-arm/titles.conf
    keeps its header, installer writes that file only when absent.

Other

  • Profile args count for Unity and Godot renderer rules: profile's own -force-glcore or
    --rendering-driver wins, handler adds no second renderer option.
  • Source 2 titles get warning in log; launch unchanged.
  • Installer started with no controlling terminal in desktop session shows component
    checklist as dialog.
  • RESEARCH.md: researched, untested settings per GPU family, engine and title, each with what
    to change. Research AI-assisted; file says how it was done and what was tested.

Known issues

  • Proton ARM64 titles: MangoHud and Steam overlay each crash title at start.
  • 32-bit Source engine title, native Linux build: deadlocks at loading screen, all threads waiting.
    Same with gl32=off, FEX Multiblock off, -nosound and TSO forced on; GL forwarding is not
    cause. Proton build runs, slowly.
  • Remote Play: Shift+Tab goes to host PC; use controller Steam button.

Full list: CHANGELOG.md.

This project is not affiliated with, endorsed by or sponsored by Valve Corporation. Steam,
Proton, Steam Deck and Steam Frame are trademarks of Valve Corporation.

steam-arm v1.1

Choose a tag to compare

@Scrumpper Scrumpper released this 29 Sep 02:52
c0ec5a6
sudo bash steam-arm-install.sh

Installer is now one script. Same options as v1.0
(--help, --list, --select, --skip); .deb still builds from source with build-deb.sh.

image

Upgrades 1.0 in place: existing client, game library, sign-in and component choices are kept.
1.0 package can stay, or sudo apt remove steam-arm-setup removes installer package only;
Steam client, games and settings stay.

Steam overlay and MangoHud in x86 titles

Valve's FEX compatibility tool removes LD_PRELOAD before every x86 title, which takes Steam
overlay and MangoHud with it. 1.1 replaces that step with launch handler that decides per title,
with no launch options:

  • Steam overlay on for Linux x86 titles. OpenGL titles: Shift+Tab.
  • Vulkan titles: title
    profile overlay=vulkan adds arm64 overlay layer; controller Steam button opens it.
  • MangoHud: mangohud %command% or MANGOHUD=1 %command%, OpenGL and Vulkan.
  • Godot 4 titles run on OpenGL renderer; Vulkan renderer freezes on splash on PanVK.
  • Unity titles: Vulkan renderer (-force-vulkan) where player carries it, else GL 4.5 report, since Unity's OpenGL core context asks for more than Panfrost's 3.1; 32-bit Unity players with Steam overlay off, as title stops when overlay attaches.
  • Direct3D 8 titles under Proton run through DXVK's d3d8; wined3d draws them wrong on Mali.
  • Title profiles in /etc/steam-arm/titles.conf; if handler fails, Valve's behaviour applies.

Fixed

  • Every title failed to start, with Bus error, after many game sessions: /dev/shm filled with
    segments Steam overlay left behind. Launcher now clears unmapped ones at start and every minute;
    segments steamwebhelper still maps are reclaimed at next client start, so restart client
    after long run of sessions.
  • Titles drew on CPU renderer after fresh install until next client start: GL and Vulkan
    forwarding is now applied within one second of client downloading its FEX tool.
  • Steam overlay UI crashed on every start: launcher puts client's directory on library path.
  • Desktop windows had no title bar until next login; menu icon missing on fresh install.
  • Installer created account from saved setting naming account absent on system. Such setting now
    gets ignored with warning, and installer picks desktop user.

Known issues

  • Proton ARM64 titles: MangoHud and Steam overlay each crash title at start. Leave MANGOHUD
    unset for them.
  • 32-bit x86 titles get GPU through OpenGL only; Vulkan in 32-bit titles falls back to CPU
    renderer, so avoid -vulkan launch option for them.
  • Half-Life: Source, native Linux build: stops on loading screen on Mali-G610 test board under
    every OpenGL setting tried. Proton build runs, slowly.
  • Remote Play: Shift+Tab goes to host PC; use controller Steam button.

Page size

Emulation half needs 4K pages: x86 code assumes them, and emulator refuses to start on 16K or
64K kernel. 1.0 installed everything on such system and failed at first title. 1.1 checks
getconf PAGESIZE before it installs anything.

System Page size 1.1 does
Most ARM64 boards 4K continues as before
Raspberry Pi 5 16K by default page-size component selects firmware's 4K kernel, then asks for reboot and second run
Apple Silicon under Asahi 16K stops: kernel stays 16K there, x86 side needs 4K virtual machine such as muvm, which this installer does not set up
Servers such as Grace 64K stops: boot 4K page kernel from distribution first

STEAM_ARM_IGNORE_PAGESIZE=1 skips check, for system that runs x86 side inside its own 4K
environment.

page-size component

On by default, no effect outside Raspberry Pi. On Pi with 16K page kernel it:

  1. stops if config.txt already sets kernel=, or if kernel8.img is missing, and says what to change
  2. keeps copy of config.txt as config.txt.steam-arm.bak
  3. adds kernel=kernel8.img under [all], in block marked with comment
  4. stops and asks for reboot; second run of installer installs

Deselecting page-size on later run removes block again. Pi path is written against Raspberry
Pi firmware layout and has not run on Pi hardware; check and file edit are tested with
simulated systems, and 4K path on RK3588 board.

Desktop interface

  • Power menu's Switch to Desktop runs steamos-session-select. 1.1 provides that command; it restarts client in desktop interface.
  • New desktop-mode component: menu entry "Steam ARM (Desktop mode)", found by searching "desktop" or "sign in". Opening it while Big Picture runs restarts client in desktop interface.
  • Desktop icons and tray icon are components of their own: icon-bigpicture, icon-desktop, tray. Pick either icon, both or none.
  • Main entry's right-click menu opens either interface.

Icons and tray

  • 1.0 made menu icon by inverting x86 Steam icon from rootfs, which fresh rootfs does not carry, so fresh install had no icon. 1.1 draws them from client's own steam_tray.ico during first start, once client has downloaded it: dark, grainy green disc with small squares of vivid colour, chartreuse logo for Big Picture, bone logo for desktop mode. Nothing is bundled.
  • Tray icon starts with client, not only at next login.
  • Desktop windows get window manager's title bar at once: setup tells KWin to reload its rules after writing frame rule. 1.0 left windows without frame until next login.

Other

  • Component checklist shows all twelve components without scrolling.
  • Installed games are kept: installing, re-running, changing components and upgrading leave game library, sign-in and settings untouched.

Full list: CHANGELOG.md.

This project is not affiliated with, endorsed by or sponsored by Valve Corporation. Steam,
Proton, Steam Deck and Steam Frame are trademarks of Valve Corporation.

steam-arm-v1

steam-arm-v1 Pre-release
Pre-release

Choose a tag to compare

@Scrumpper Scrumpper released this 26 Sep 01:24
2c43990

Steam-ARM · ARM64 Steam Client Installer

Feature list :
The Steam Frame's ARM64 (VR) client · runs on host GPU as ARM program · x86 titles through emulation with graphics forwarded to native drivers · Windows titles through ARM64 Proton · Remote Play with software decode · controller access rules

This is an ARM64 Steam client installer.

Provides:

Component Scope Note
glx-lax Mesa specific Addresses Mesa client library limit with titles that bind one OpenGL context from several threads.
vk-spoof Mali specific Written for PanVK Vulkan driver on Mali; not needed on other Vulkan drivers.
map-count Generic Raises vm.max_map_count; applies to any Linux system running Proton.
xpad-dedup Generic Applies to any system where kernel exposes duplicate joystick node for pad.
pad-hidraw Generic Applies to any system using kernel xpad driver's device list.
pad-xbox Generic Applies to any XInput pad from maker other than Microsoft.
desktop Generic Application menu entry and desktop icon; no hardware dependency.

Client

  • Native ARM64 build of Steam client; Produced by Valve for the Steam Frame ARM based VR headset.
  • Client package downloads from Valve on first start, then client restarts itself; sign in from Big Picture or click the power button in big picture mode and go to Desktop Mode.
  • Installs into desktop user account, not root: first regular account on system (uid 1000) by default, GAMEUSER to choose another; account is created only when none exists, with generated password printed once
  • Own home directory under game user's account (.local/share/steam-arm by default, ARMHOME_DIR in /etc/steam-arm/steam-arm.conf) and own library, so it coexists with x86 client from other routes; run one at time
  • steam-arm launches Deck interface; steam-arm --desktop launches desktop interface, --bigpicture forces Deck interface, STEAM_ARM_UI=desktop in /etc/steam-arm/steam-arm.conf makes desktop default
  • steam-arm-tray: Steam icon in panel tray with Open, Open in desktop mode, Stop and Quit, started with session through autostart entry; this client build registers no tray item of its own
  • Window rule for KDE: client draws its own frame and asks window manager for none, and this build does not move window when that frame is dragged; rule gives client's normal windows manager's frame so they move and resize like any other window; Big Picture is fullscreen and unaffected

Games

  • x86 Linux titles run through emulation tool client downloads, against x86-64 Ubuntu 24.04 root filesystem installer prepares at /opt/fex-rootfs
  • Windows titles run through ARM64 Proton build client downloads; Direct3D through DXVK
  • steam-arm-compatmap <appid> <tool>: pins title to compatibility tool in client's stored configuration, for title with Linux build on record but Windows files installed
  • Titles protected by anti-cheat do not run: anti-cheat and DRM components require system call filter emulator does not implement

Graphics

  • OpenGL and Vulkan calls from emulated guest forwarded to host's native Mesa libraries through FEX thunks, not emulated; host thunks at /usr/lib/aarch64-linux-gnu/fex-emu/HostThunks, guest thunks at /usr/share/fex-emu/GuestThunks, root filesystem linked as /usr/share/guestos/fex-mesa
  • FEX Multiblock enabled in game user's FEX configuration
  • glx-lax component: private copy of Mesa GLX client library, libGLX_steamarmlax.so.0, with one check relaxed, for titles that bind single OpenGL context from more than one thread; rebuilt against system Mesa when that library changes, own library name through patchelf so system copy is untouched
  • vk-spoof component: implicit Vulkan layer VK_LAYER_STEAM_ARM_feature_spoof, built from source at install, reports device features DXVK lists as mandatory and Mali driver does not expose, then removes them again from device creation; self-check through vulkaninfo when present
  • map-count component: vm.max_map_count = 2147483642 in /etc/sysctl.d/zz-steam-arm.conf, value Proton expects; zz- name so it is read after /etc/sysctl.conf

Remote Play

  • Streaming runs package's x86-64 streaming client under system emulator, with software decoding
  • steam-arm-remoteplay pins hardware decoding off and HEVC off in client's stored configuration, so host keeps to H.264 and software decoder; streaming client decodes through Vulkan Video, which Mali driver does not provide, and with hardware decoding advertised session can sit on launch screen and never finish negotiating
  • Launcher applies setting before every start, including first; --check reports without changing anything
  • Game window in background on host renders nothing new, so stream shows one frame and takes no input; keep game in foreground on host

Controllers

  • pad-hidraw component: /etc/udev/rules.d/60-steam-arm-gamepad-hidraw.rules hands pad's /dev/hidraw node and /dev/uinput to logged-in user, so client reads pad directly for rumble and battery level; covers every pad kernel xpad driver recognises, 243 devices, matched on vendor and product so keyboards and mice from same makers stay excluded
  • xpad-dedup component: /etc/udev/rules.d/71-steam-arm-xpad-dedup.rules unbinds driver from headset interface some third-party Xbox 360 style pads expose, so one pad is one joystick and two-player game does not hand player 2 copy of player 1; steam-arm-xpad-dedup does same for pads already connected
  • pad-xbox component, off by default: steam-arm-pad-xbox.service presents XInput pads from other makers as Xbox 360 pads through uinput; off because client's own Steam Input re-identifies pads, and launcher pauses service while client runs in case another route enabled it

Emulation

  • FEX-Emu installed from project's PPA: fex-emu-armv8.2, 32-bit and 64-bit binfmt
  • steam-arm-fex-binfmt.service: FEX owns x86 execution persistently; box64 and box32 binfmt registrations off while it runs
  • x86-64 root filesystem: Ubuntu 24.04, prepared by installer at /opt/fex-rootfs/Ubuntu_24_04; about 2 GB
  • Client's runtime container built through bubblewrap

Installer

  • Package: steam-arm-setup_1.0_arm64.deb, installs command steam-arm-setup and installer script; nothing downloads at package install
  • sudo steam-arm-setup installs core (host packages, root filesystem and graphics provider, client package, launcher) and offers optional components: glx-lax, vk-spoof, map-count, xpad-dedup, pad-hidraw, pad-xbox, desktop
  • Component choice through keyboard checklist, or --select a,b, --skip a,b, --defaults; --list prints components
  • Idempotent: re-running refreshes every file, and component deselected on re-run is removed again
  • desktop component: application menu entry and desktop icon for account client installs into
  • Header names no board; same script runs on its own or from units, TTY gated, NO_COLOR honoured
  • Removal: re-run with components deselected, or delete client's directory in account it installed into; apt purge steam-arm-setup removes package

Requirements

  • ARM64 system with working Vulkan driver; Debian or Ubuntu family distribution, since installer uses apt
  • Mesa graphics stack for glx-lax; vk-spoof written for PanVK on Mali
  • Ubuntu family system for FEX PPA; other systems need FEX from another source
  • No hardcoded GPU render node, card index or board detection

Compatibility

  • Tested on one device: H96 Max V58, RK3588 board with Mali-G610 GPU
  • COMPATIBILITY.md records what has and has not been tested, per device class and per driver

How routes compare

Legend: ✅ yes ⚠️ partly, or with conditions ❌ no ❓ not publicly verified

Route Client itself is native ARM Installs onto your system Mali and PanVK Adreno Apple GPU Remote Play handled
This package ✅ ✅ host, no sandbox ✅ tested on one RK3588 board ⚠️ untested, skip vk-spoof ⚠️ untested, needs 4K page environment ✅ decode pinned before first start
Canonical arm64 Steam snap ❌ x86 client under FEX ⚠️ snap confinement ❌ open issue #471 since 2026-01-10 ⚠️ other driver loading bugs open ❓ ❓
Box86 and Box64 ❌ x86 client under Box64 ✅ host ✅ long standing SBC route ✅ ❓ ❓
steamclienttermux, Android ✅ ⚠️ Termux and PRoot ❌ Adreno only ✅ Turnip ❌ ❓
ROCKNIX and pocknix-os ✅ ❌ replaces OS ❌ Snapdragon only ✅ ❌ ❓
UbuntuAsahi steam-arm64 ✅ ✅ host, in microVM ❌ ❌ ✅ Honeykrisp ❓
Windows on ARM, Prism ❌ x86 under Prism ✅ host ❌ ✅ Snapdragon X ❌ ✅ native to Windows
macOS on Apple Silicon ✅ since 2025-06 beta ✅ host ❌ ❌ ✅ ✅

Reading table: routes that run native client are this package, Android and
handheld projects, UbuntuAsahi, and macOS. Of those, everything except this one targets
Adreno or Apple GPUs. Routes that cover Mali at all run x86 client under
emulation, or fail on driver.

Not included

  • Anti-cheat titles
  • VR runtime; Steam Frame's runtime is not part of this package
  • Steam client, emulation tool, root filesystem, Proton: all downloaded at run time from their own sources, none bundled

This project is not affiliated with, endorsed by or sponsored by Valve Corporation. Steam, Proton, Steam Deck an...

Read more