Skip to content

Instantly share code, notes, and snippets.

@stevesoltys
Last active December 1, 2025 23:43
Show Gist options
  • Select an option

  • Save stevesoltys/af4c5c45317c543fa3b88da7d08a7218 to your computer and use it in GitHub Desktop.

Select an option

Save stevesoltys/af4c5c45317c543fa3b88da7d08a7218 to your computer and use it in GitHub Desktop.
Steam on Asahi NixOS

Running Steam on NixOS Apple Silicon

This guide details how to run Steam on nixos-apple-silicon using Distrobox.

Tested on:

  1. MacBook Pro M2 Max
  2. NixOS channel 25.11 (unstable channel, at the time of writing)
  3. OpenGL core profile version string: 4.6 (Core Profile) Mesa 25.2.4
  4. Wayland / Sway / SDDM
  5. Kernel: 6.16.8-asahi
  6. NixOS Apple Silicon: github:tpwrules/nixos-apple-silicon/24ab28e47b586f741910b3a2f0428f3523a0fff3

Create a directory for your Distrobox container:

mkdir -p ~/Distrobox/steam
cd ~/Distrobox/steam
vim Dockerfile

Insert the following in the Dockerfile:

# Start with the minimal Fedora 42 image
FROM quay.io/fedora/fedora-minimal:42
WORKDIR /

# Install COPR plugin and enable Asahi repositories
RUN dnf install -y 'dnf5-command(copr)' && \
    dnf copr enable -y @asahi/mesa && \
    dnf copr enable -y @asahi/fedora-remix-scripts

# Add architecture-specific repositories for FEX mesa overlays

# i386 Repository
RUN echo '[copr:copr.fedorainfracloud.org:group_asahi:mesa-i386]' > /etc/yum.repos.d/group_asahi-mesa-i386.repo && \
    echo 'name=Copr repo for mesa owned by @asahi (i386)' >> /etc/yum.repos.d/group_asahi-mesa-i386.repo && \
    echo 'baseurl=https://download.copr.fedorainfracloud.org/results/@asahi/mesa/fedora-$releasever-i386/' >> /etc/yum.repos.d/group_asahi-mesa-i386.repo && \
    echo 'type=rpm-md' >> /etc/yum.repos.d/group_asahi-mesa-i386.repo && \
    echo 'skip_if_unavailable=True' >> /etc/yum.repos.d/group_asahi-mesa-i386.repo && \
    echo 'gpgcheck=1' >> /etc/yum.repos.d/group_asahi-mesa-i386.repo && \
    echo 'gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-group_asahi-mesa' >> /etc/yum.repos.d/group_asahi-mesa-i386.repo && \
    echo 'repo_gpgcheck=0' >> /etc/yum.repos.d/group_asahi-mesa-i386.repo && \
    echo 'enabled=1' >> /etc/yum.repos.d/group_asahi-mesa-i386.repo && \
    echo 'enabled_metadata=1' >> /etc/yum.repos.d/group_asahi-mesa-i386.repo && \
    echo 'priority=5' >> /etc/yum.repos.d/group_asahi-mesa-i386.repo && \
    echo 'includepkgs=mesa-fex-emu-overlay-i386*' >> /etc/yum.repos.d/group_asahi-mesa-i386.repo

# x86_64 Repository
RUN echo '[copr:copr.fedorainfracloud.org:group_asahi:mesa-x86_64]' > /etc/yum.repos.d/group_asahi-mesa-x86_64.repo && \
    echo 'name=Copr repo for mesa owned by @asahi (x86_64)' >> /etc/yum.repos.d/group_asahi-mesa-x86_64.repo && \
    echo 'baseurl=https://download.copr.fedorainfracloud.org/results/@asahi/mesa/fedora-$releasever-x86_64/' >> /etc/yum.repos.d/group_asahi-mesa-x86_64.repo && \
    echo 'type=rpm-md' >> /etc/yum.repos.d/group_asahi-mesa-x86_64.repo && \
    echo 'skip_if_unavailable=True' >> /etc/yum.repos.d/group_asahi-mesa-x86_64.repo && \
    echo 'gpgcheck=1' >> /etc/yum.repos.d/group_asahi-mesa-x86_64.repo && \
    echo 'gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-group_asahi-mesa' >> /etc/yum.repos.d/group_asahi-mesa-x86_64.repo && \
    echo 'repo_gpgcheck=0' >> /etc/yum.repos.d/group_asahi-mesa-x86_64.repo && \
    echo 'enabled=1' >> /etc/yum.repos.d/group_asahi-mesa-x86_64.repo && \
    echo 'enabled_metadata=1' >> /etc/yum.repos.d/group_asahi-mesa-x86_64.repo && \
    echo 'priority=5' >> /etc/yum.repos.d/group_asahi-mesa-x86_64.repo && \
    echo 'includepkgs=mesa-fex-emu-overlay-x86_64*' >> /etc/yum.repos.d/group_asahi-mesa-x86_64.repo

# Clean DNF cache before installing packages
RUN dnf clean all
RUN dnf upgrade --refresh -y

# Install the Asahi platform metapackage
RUN dnf install -y asahi-platform-metapackage-fex

# Install the rest of the required packages
RUN dnf install -y \
    fontconfig \
    dejavu-sans-fonts \
    dejavu-serif-fonts \
    dejavu-sans-mono-fonts \
    sudo \
    xz \
    ps \
    vim \
    xterm \
    ar \
    tar \
    bash \
    coreutils \
    util-linux \
    procps-ng \
    findutils \
    grep \
    sed \
    gawk \
    gzip \
    which \
    less \
    nano \
    passwd \
    shadow-utils \
    systemd \
    iproute \
    iputils \
    curl \
    wget \
    mesa-libGLU \
    ca-certificates \
    alsa-utils

# Enable the Asahi Steam COPR and install Steam
RUN dnf copr enable -y @asahi/steam && \
    dnf install -y steam

# Final cleanup to reduce image size
RUN dnf clean all && \
    rm -rf /var/cache/dnf/* /tmp/* /var/tmp/*

CMD ["/bin/bash"]

Build the Docker image locally:

docker build . --tag steam:latest

Create the Distrobox container:

distrobox-create --name steam --image steam:latest --home ~/Distrobox/steam

Enter the Distrobox container and start Steam:

distrobox enter steam
steam

That's it! Steam should start up and you should be able to install and run games right from Steam as you would on standard Asahi Linux.

@Sheepheerd
Copy link

RUN dnf upgrade --refresh
This should be
RUN dnf upgrade --refresh -y

@stevesoltys
Copy link
Author

RUN dnf upgrade --refresh This should be RUN dnf upgrade --refresh -y

Thanks, updated.

@GarrettGR
Copy link

I don't know if this is an issue with Distrobox or with my config, but when I tried to run it I got the following error:

qt.qpa.plugin: Could not load the Qt platform plugin "wayland" in "" even though it was found.
qt.qpa.plugin: From 6.5.0, xcb-cursor0 or libxcb-cursor0 is needed to load the Qt xcb platform plugin.
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: wayland-egl, wayland, eglfs, linuxfb, minimal, minimalegl, offscreen, vkkhrdisplay, vnc, xcb.

zsh: IOT instruction (core dumped)  steam

I have other qt programs running without an issue and I tried in both Hyprland and KDE Plasma 6. I'm going to keep looking for ways to solve this, but I thought that it couldn't hurt to throw a comment here in case anyone who's worked on this before might recognize the issue that I'm encountering.

Anyway I love the work you've done for this and thank you for any help you can provide!

@stevesoltys
Copy link
Author

@GarrettGR maybe try the solution here under KDE Plasma 6: nix-community/nixos-apple-silicon#237 (comment)

I would only be able to help out those who are using the exact configuration provided in the guide, since stability seems to vary on Asahi depending on the environment.

@parkers0405
Copy link

Hey @stevesoltys, I'm trying this guide on my M1 Max (NixOS/Asahi) and having trouble. Native games like Terraria run perfectly, but Proton games crash.

Terraria (Native) - WORKS Even though it shows pressure-vessel-wrap logs, it successfully launches and runs using OpenGL:

pressure-vessel-wrap[1611]: W: Cannot find ldconfig

FNA3D Driver: OpenGL
OpenGL Renderer: Apple M1 Max (G13C C0)
OpenGL Driver: 4.6 (Compatibility Profile) Mesa 25.2.4

Resolution changed to: 3456x2160.

Age of Empires IV (Proton Experimental 10.0) - CRASHES This fails with a vm.max_map_count warning and a page fault, even though my host and container are set to 1048576.

Console Log: pressure-vessel-wrap[1048]: W: Cannot find ldconfig

Proton Log:

WARNING: Low /proc/sys/vm/max_map_count: 65530 will prevent some games from working
  
Unhandled exception: page fault on read access to 0x0000000000000000 at address 0x00000146c881ba

Age of Empires IV (Proton 8.0-5) - ALSO CRASHES When I switch to Proton 8.0-5, the vm.max_map_count warning disappears, but it still crashes with the exact same page fault.

Console Log: pressure-vessel-wrap[1513]: W: Cannot find ldconfig

Proton Log:

Unhandled exception: page fault on read access to 0x0000000000000000 at address 0x00000146c881ba (thread 0134)

Disabling pressure-vessel fails, Launch options like stopping the sandbox are ignored. The pressure-vessel-wrap messages still appear.

env PROTON_NO_PRESSURE_VESSEL=1 %command% are ignored. The pressure-vessel-wrap messages still appear.

If I rename the pressure-vessel-wrap binary, Steam just re-downloads it:

[2025-10-21 06:00:54] BVerifyInstalledFiles: steamrt64/steam-runtime-steamrt/pressure-vessel/bin/pressure-vessel-wrap is -1 bytes, expected 753080
 [2025-10-21 06:00:55] Downloading update...

It seems like pressure-vessel is the common link for all these crashes, but I can't get rid of it. Has anyone seen this or know what could be causing the page fault even when the max_map_count is correct?

Not even sure if that is the issue but not sure what to do or try to get this working.

@stevesoltys
Copy link
Author

stevesoltys commented Oct 21, 2025

@parkers0405 I think you might not be trying the right games. I wouldn't expect games like that to run in the current state of gaming on Asahi. You can check this subreddit for more details.

I tried a bunch of games and they were hit or miss. Halo Reach, Dark Souls II SOTFS, The Forest, Title Pending, and Enshrouded launched and went in-game using Proton. Enshrouded had abysmal FPS but ran fine otherwise.

I don't know if that's the same experience on stock Asahi Fedora Remix as I've never tried.

@parkers0405
Copy link

Thanks @stevesoltys, let me know if you can think of anything been working hours trying to get this to launch but nothing is seeming to get it working, always crashing right about here

ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
Adding process 2523 for gameID 1466860
ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
Adding process 2524 for gameID 1466860
ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
Adding process 2525 for gameID 1466860
ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
fsync: up and running.
Adding process 2526 for gameID 1466860
ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
Adding process 2529 for gameID 1466860
ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
Adding process 2531 for gameID 1466860
ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
Adding process 2534 for gameID 1466860
ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
Adding process 2543 for gameID 1466860
ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
Adding process 2548 for gameID 1466860
ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
Adding process 2555 for gameID 1466860
ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
Adding process 2578 for gameID 1466860
ERROR: ld.so: object '/tmp/pressure-vessel-libs-PGEIE3/${LIB}/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
Adding process 2598 for gameID 1466860
Client 112 disconnected with error: ECONNRESET: Connection reset by peer
Client 132 disconnected with error: ECONNRESET: Connection reset by peer
pid 2527 != 2526, skipping destruction (fork without exec?)
Game Recording - game stopped [gameid=1466860]
Removing process 2598 for gameID 1466860
Removing process 2578 for gameID 1466860
Removing process 2555 for gameID 1466860
Removing process 2548 for gameID 1466860
Removing process 2543 for gameID 1466860
Removing process 2534 for gameID 1466860
Removing process 2531 for gameID 1466860
Removing process 2529 for gameID 1466860
Removing process 2526 for gameID 1466860
Removing process 2525 for gameID 1466860
Removing process 2524 for gameID 1466860
Removing process 2523 for gameID 1466860
Removing process 2440 for gameID 1466860
Removing process 2439 for gameID 1466860
Removing process 2438 for gameID 1466860

and this continues to happen

WARNING: Low /proc/sys/vm/max_map_count: 65530 will prevent some games from working     

@stevesoltys
Copy link
Author

Coming back to confirm that the crashes and performance issues I was experiencing using this guide are exactly the same on Asahi Fedora Remix. It even had the exact same logs, including the pressure-vessel ones.

So to me that means this is all working exactly as expected and it's just about waiting for fixes from the Asahi team.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment