The Manual

Gaming

Omarchy ships Steam and RetroArch, Battle.net, Lutris and Heroic, Moonlight for streaming from a PC, Xbox Cloud Gaming and GeForce NOW for the cloud, and Minecraft. All of it is under Install > Gaming in the Omarchy menu (Super + Space) here too, and Remove > Gaming undoes it. Proton and the Steam Deck are the same story on any Linux; see upstream’s page for that part.

What changes is how each row installs. Some are plain packages, some are NixOS modules, and two go through scripts that need a line in your configuration first. The table is the whole page in short:

Row What it does here Unfree?
Steam enables programs.steam yes
RetroArch nixarchy’s retroarch, 13 free cores no
Xbox Controllers enables hardware.xpadneo no
Lutris pkgs.lutris no
Heroic (Epic Games) pkgs.heroic no
Minecraft pkgs.prismlauncher no
Xbox Cloud Gaming a web app, no package at all
Battle.net needs pkgs.umu-launcher in your config
NVIDIA GeForce NOW needs services.flatpak.enable in your config

The rows marked as packages or modules go into ~/.config/nixarchy/apps.nix like every other app, and Install > Apply changes rebuilds with them. Some rows are unfree; nixarchy allows unfree packages by default, so they just work.

Steam

Steam is a NixOS module, not a package, and this is the one to understand because it is the pattern. Steam’s own binaries and every game it downloads are built for a normal Linux filesystem layout: /lib, /usr/lib, libraries where the FHS says they are. NixOS has none of those paths, so a bare steam package starts and immediately fails to find its libraries. programs.steam.enable builds an FHS environment — a private root with the expected layout — and runs Steam inside it. That is why the row enables an option rather than adding a package, and why installing pkgs.steam by hand would not run.

The 32-bit half of the graphics stack, which upstream adds with omarchy-install-gaming-gpu-lib32, is one option on NixOS instead of a per-driver package:

hardware.graphics.enable32Bit = true;

Steam still takes 10–20 seconds to start with no feedback, as upstream warns.

RetroArch

nixpkgs’ retroarch is retroarch-with-cores built with an empty core list: it installs cleanly and emulates nothing. The obvious fix, retroarch-full, pulls in unfree cores — and an unfree package aborts the entire rebuild rather than failing on its own, for anyone who has turned nixarchy’s allowUnfree default back off.

So nixarchy builds its own retroarch: every core Omarchy’s picker offers that nixpkgs ships under a free licence, minus the two largest. Thirteen cores — bsnes for SNES, mesen for NES, gambatte and mgba for Game Boy, blastem for Mega Drive, beetle-pce-fast, beetle-psx-hw, parallel-n64, desmume, flycast, ppsspp, puae for Amiga and vice-x64 for the C64. snes9x and genesis-plus-gx are unfree in nixpkgs, which is why bsnes and blastem cover those systems.

If you want the unfree ones — snes9x, genesis-plus-gx, mame, dolphin — override the package in your nixarchy-apps.nix:

programs.nixarchy.apps.retroarch.package =
  pkgs.retroarch.withCores (c: [ c.snes9x c.mame c.dolphin ]);

That replaces the core list rather than adding to it, so name everything you want.

Two things differ from upstream’s walkthrough. RetroArch loads cores from /usr/lib/libretro on Arch; here they live inside the package, and omarchy-retroarch-cores prints the current directory if you need it. And ~/Games/roms and ~/Games/bios, along with the CRT Royale shader preset, are written by upstream’s omarchy-install-gaming-retroarch script, whose first step is a package install that stops here — so set your ROM and BIOS directories in RetroArch’s own settings after the first launch. The RetroArch Game Launcher row, which gives one game its own launcher entry, works.

Xbox controllers

Bluetooth Xbox controllers need the xpadneo kernel driver. On Arch that is a DKMS package; on NixOS an out-of-tree module has to be built against the running kernel and loaded, which is what hardware.xpadneo.enable does, so the row enables that option. Pair with Super + Ctrl + B afterwards. A controller on a USB-C cable does not need it.

Battle.net and GeForce NOW

These two run upstream’s install scripts unchanged, and each begins by asking omarchy-pkg-add for a package, which prints the declarative route and stops. The route in each case is one line:

environment.systemPackages = [ pkgs.umu-launcher ];   # Battle.net
services.flatpak.enable = true;                       # GeForce NOW

Battle.net is a Windows installer run under umu-launcher; the wine prefix it builds lives under $HOME and the rest of the script works once the launcher exists. GeForce NOW ships only as a Flatpak, and Flatpak on NixOS is a service rather than a package — without it there is nowhere for the app to be installed. After the rebuild: flatpak install flathub com.nvidia.geforcenow.

Xbox Cloud Gaming

A web app. It touches no package manager, so the row works exactly as upstream describes.

Minecraft

nixpkgs removed its minecraft launcher as broken, and its own removal message points at Prism Launcher, so that is what the row installs — nixpkgs’ recommendation rather than a substitution invented here. Sign in with your Microsoft account inside it.

Moonlight and Sunshine

Moonlight is preinstalled and streams from a Windows PC running Sunshine exactly as upstream says.

Hosting from this machine is different. Upstream’s omarchy install service sunshine installs Sunshine with pacman and opens its ports with ufw; here the package step stops and there is no ufw. Add the package yourself and open the ports where the rest of the firewall lives:

environment.systemPackages = [ pkgs.sunshine ];
networking.firewall.allowedTCPPorts = [ 47984 47989 48010 ];
networking.firewall.allowedUDPPorts = [ 47998 47999 48000 48002 48010 ];

Those are the ports upstream’s script opens, minus 5353, which services.avahi already has open. Upstream restricts them to private LAN ranges and the Tailscale interface; networking.firewall.interfaces.<name> does the same job if you want it.

Lutris and Heroic

Plain packages, and upstream’s advice applies: both look like nothing is happening while a game installs. Give them time.