Published
- 9 min read
Persistent packages on Steam Deck using Nix
![Persistent packages on Steam Deck using Nix](/i/l/10/post_detail/Steam%20Deck%20-%20Nix.png)
The Steam Deck (and SteamOS) delivers a fantastic console-like experience on a Linux system. However, its immutable filesystem means that installing packages that persist across system upgrades isn’t straightforward. Fortunately, with a little Nix magic, you can work around that limitation.
Immutable systems offer many benefits—until you need to customize your filesystem by installing packages. While installing software isn’t difficult per se, SteamOS’s design means that most customizations are wiped during system upgrades. About a year ago, Valve added /nix
to the list of directories that remain intact during updates, and that’s where Nix stores all of its packages.
If you’re not familiar with Nix: it’s a package manager that uses declarative definitions for your software instead of commands like
apt install
ordnf install
. You simply list all your desired packages in a configuration file, and Nix takes care of installing them. Additionally, the handynix-shell
utility lets you spawn temporary shells with the packages you specify.
There are two primary ways to work with Nix comfortably: you can either run NixOS (which isn’t ideal on a Steam Deck) or use Home Manager.
Installing Nix
Switch to Desktop Mode and open Konsole for the following steps. First, install Nix itself using this command (see the official installation instructions):
sh <(curl -L https://nixos.org/nix/install) --no-daemon
This command installs Nix in single-user mode (--no-daemon
), which is a good fit for SteamOS since it may not require sudo
for most operations. (If it does ask for sudo, you’ll need to set up sudo on your Steam Deck.)
Next, load Nix into your current terminal session:
source .bash_profile
By default, Nix uses the unstable branch of packages. To switch to the stable channel, run:
nix-channel --add https://nixos.org/channels/nixos-24.11 nixpkgs
This command sets your nixpkgs
channel to the latest stable version (in this example, 24.11). In the future, check the current stable version on the NixOS homepage.
Nix is now installed—but without Home Manager, it isn’t very user-friendly.
Installing Home Manager
First, add the Home Manager channel to your Nix configuration:
nix-channel --add https://github.com/nix-community/home-manager/archive/release-24.11.tar.gz home-manager
Note: Ensure that the version for both Nix and Home Manager match. In this example, both are 24.11.
If you prefer the unstable branch, you can instead run:
nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
Update your channels to include these changes:
nix-channel --update
Before proceeding, back up your Bash configuration files:
mv .bash_profile .bash_profile.bckp
mv .bashrc .bashrc.bckp
If you choose not to back them up, you’ll need to remove them because Home Manager creates these files during installation and will fail if they already exist.
Now, run the Home Manager installation:
nix-shell '<home-manager>' -A install
Once the installation completes, create your Home Manager configuration file using a text editor:
kate ~/.config/home-manager/home.nix
Paste in the following configuration:
{ config, pkgs, ... }:
{
home.username = "deck";
home.homeDirectory = "/home/deck";
programs.bash = {
enable = true;
initExtra = ''
if [ -e $HOME/.nix-profile/etc/profile.d/nix.sh ]; then . $HOME/.nix-profile/etc/profile.d/nix.sh; fi
export NIX_SHELL_PRESERVE_PROMPT=1
if [[ -n "$IN_NIX_SHELL" ]]; then
export PS1="$PS1(nix-shell) "
fi
'';
};
home.stateVersion = "24.11"; # don't change this even if you upgrade your channel in the future, this should stay the same as the version you first installed nix on
home.packages = with pkgs; [
];
programs.home-manager.enable = true;
}
This configuration does the following:
- Sets your username to deck (the default on Steam Deck).
- Specifies the correct path to your home directory.
- Enables Home Manager to manage your Bash shell and ensures the Nix environment is loaded automatically—so you won’t have to source it manually each time.
- Adds a
(nix-shell)
suffix to your terminal prompt when you’re in a Nix shell, which is a subtle but useful improvement over the default behavior. - Defines the
home.stateVersion
, which should remain the same as when you first installed Nix (even if you later change your channels). You should never change it after the initial Nix installation - Enables Home Manager itself.
- Provides an empty list (
home.packages
) where you can later add your desired packages.
Apply your new configuration by running:
home-manager switch
This is the basic workflow for managing your environment with Nix: update your configuration file and then run home-manager switch
to apply the changes.
After closing and reopening your terminal, test the setup by running nix-shell
. If you see an error indicating that default.nix
is missing, everything is working as expected. (If the command isn’t found at all, something went wrong.)
Installing packages
To install packages, simply add them to the home.packages
list in your configuration file. For example, to install nmap
(for network scanning) and cowsay
(because a cow makes everything better), update your configuration as follows:
home.packages = with pkgs; [
nmap
cowsay
];
Keep the rest of the file unchanged, then apply the new configuration with home-manager switch
. You can test the setup by running:
echo "Hello from my Steam Deck!" | cowsay
You should see this beauty in your terminal:
___________________________
< Hello from my Steam Deck! >
---------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Running nmap
should display its usage instructions. If you decide to remove nmap
(you're keeping cowsay
, right?), just delete it from the configuration file and run home-manager switch
again.
Tips
- Create a desktop shortcut to your configuration file:
ln -s ~/.config/home-manager/home.nix ~/Desktop/Nix_Config
- Run
nix-collect-garbage
periodically to remove unused packages and free up space. - Install the
comma
package. This nifty tool lets you run any package on the fly by simply prefixing the command with a comma.- For example, instead of adding
nmap
to your configuration, you could run, nmap
to temporarily use it. (notice the comma in front of nmap)
- For example, instead of adding
- Nix can do much more than just manage packages—for instance, you can use it to create environment variables, shell aliases, systemd services, files, and more.
Cover image sources: Wikimedia Commons, NixOS