Skip to content

Instantly share code, notes, and snippets.

@fsmv
Last active August 30, 2026 02:29
Show Gist options
  • Select an option

  • Save fsmv/c9e1365540a4dfda55c56a5dc68ea39f to your computer and use it in GitHub Desktop.

Select an option

Save fsmv/c9e1365540a4dfda55c56a5dc68ea39f to your computer and use it in GitHub Desktop.
Custom steamos steam machine setup on a regular arch linux install
  1. Make a user account named steam, give it a home directory for games and probably don't put it in the sudoers file
    • Add it to the groups input video seat gamemode. seat is for seatd and gamemode will be installed later.
  2. Install and enable greetd as the login manager and set up the provided config in /etc/greetd/config.toml (this launches plasma which then autoruns gamescope steam)
    • This config sets it to auto login to the steam user with no password prompt and call the script which boots straight to steam (which can have lock screen optionally built in to steam)
  3. Install and enable gamescope seatd (two separate services to enable)
    • gamescope is a fast compositor steam uses in steamos mode (there are several aur packages with built in extras but I use the base package)
    • seatd is used by gamescope as a dependency to manage input device access
  4. Install KDE Plasma as the desktop environment, steamos doesn't really work well with GNOME.
    • I went with the plasma-desktop package then any applications you want
    • dolphin konsole plasma-systemmonitory are the file manager and commandline console for kde and the system monitor
    • You probably want kwalletmanager kwallet-pam to stop password prompts https://wiki.archlinux.org/title/KDE_Wallet
    • You might want steamos-add-to-steam from AUR to get an add game to steam context menu item
  5. Install steam which needs multilib.
  6. Install (and enable) other dependencies inotify-tools bash ffmpeg qt6-tools mangohud lib32-mangohud gamemode gamemode-lib32. You need to enable the gamemode service.
    • mangohud is needed for the steam overlay
    • GameMode is used by steam to request priority etc for games. Don't forget to enable the service.
    • inotify is for watching for file changes and bash is used in some scripts
    • qt6-tools is used for the switch to game mode script
    • ffmpeg is used to play a splash screen video with ffplay in the session switcher script
    • You might also want to install protontricks which is a utility for configuring proton games
  7. Move session-switcher.sh to /usr/bin/session-switcher and steamos-session-select.sh to /usr/bin/steamos-session-select and logout-plasma.sh in /home/steam/bin/logout-plasma
    • Make sure you chmod +x them. The /usr/bin files are root owned and the /home/steam/bin is steam owned
    • launches plasma if /home/steam/.launch-plasma exists and deletes it
    • launches steam in gamescope otherwise
    • /usr/bin/steamos-session-select makes the flag file, steam runs that scripts when you select switch to desktop
    • There are more scripts steam can run for various situations but I only have the one on my system. Check out https://github.com/shahnawazshahin/steam-using-gamescope-guide for examples.
  8. Place gamemode.desktop on your desktop (/home/steam/Desktop/gamemode.desktop) and use it to switch to steam. Also set up steam to auto run in the KDE settings because steam on desktop loads extra controller drivers.
    • You can turn on the steam lock screen in the steamos settings under security. It can be operated with a controller or keyboard and it will prevent people from switching to desktop until you log in
  9. Optional: turn off boot messages so you get a blank screen not text before the animation. Add these kernel parameter options to your bootloader: quiet systemd.show_status=false
  10. Optional: You could install Plymouth to configure boot splash screens but it didn't work out nicely on my machine and I ended up preferring the board logo and a blank screen before steam starts. There's a plymouth-theme-steamos package too.
[Desktop Entry]
Exec=bash -c "/home/steam/bin/logout-plasma"
Icon=steam
Name=gamemode
StartupNotify=true
Terminal=false
Type=Application
[terminal]
# The VT to run the greeter on. Can be "next", "current" or a number
# designating the VT.
vt = 1
#[initial_session]
#command = "gamescope -e -- steam -steamdeck -steamos3"
#user = "steam"
[default_session]
command = "/usr/bin/session-switcher"
user = "steam"
# Place this file in /home/steam/bin/logout-plasma
alias qdbus=/usr/lib/qt6/bin/qdbus
#qdbus org.kde.ksmserver /KSMServer org.kde.KSMServerInterface.closeSession
#qdbus org.kde.KSMServer /KSMServer org.kde.KSMServer.logout 0 3 3
#loginctl terminate-session $XDG_SESSION_ID
qdbus org.kde.Shutdown /Shutdown org.kde.Shutdown.logout
#!/bin/bash
# Place this file at /usr/bin/session-switcher to be run by greetd
# - launches plasma if /home/steam/.launch-plasma exists and deletes it
# - launches steam in gamescope otherwise
FLAG_FILE="/home/steam/.launch-plasma"
# This config file is for the script to edit automatically
# Steam/gamescope creates this config file automatically and edits it automatically when you turn on the performance overlay levels in the UI
export MANGOHUD_CONFIGFILE="$HOME/.config/MangoHud/MangoHud.conf"
MANGOHUD_CONFIGDIR=$(dirname "$MANGOHUD_CONFIGFILE")
MANGOHUD_CONFIGFILENAME=$(basename "$MANGOHUD_CONFIGFILE")
PID_FILE="/tmp/mangohud_watcher.pid"
# The script watches for config file changes to refresh mangohud and writes fist config A the config B shortly after
# So you could add configs to the B string if you like
MANGOHUD_CONFIG_A="font_scale=1.8"
MANGOHUD_CONFIG_B="font_scale=1.85"
configure_mangohud() {
# This is a workaround for an issue I had with the scale breaking badly
if ! grep -q "$MANGOHUD_CONFIG_A\|$MANGOHUD_CONFIG_B" "$MANGOHUD_CONFIGFILE" 2>/dev/null; then
sed -i "\$ a $MANGOHUD_CONFIG_A" "$MANGOHUD_CONFIGFILE"
sleep 0.1
sed -i -e "s/$MANGOHUD_CONFIG_A/$MANGOHUD_CONFIG_B/" "$MANGOHUD_CONFIGFILE"
fi
}
# Inspired by https://github.com/Gawah/MangoPeel/blob/main/main.py
# need to sudo pacman -S inotify-tools
mangohud_watcher() {
echo $$ > "$PID_FILE"
trap "rm -f '$PID_FILE'; exit" INT TERM EXIT # Clean up the PID file on exit
configure_mangohud
inotifywait -m -e modify "$MANGOHUD_CONFIGDIR" | while read -r directory event filename; do
if [ "$filename" = "$MANGOHUD_CONFIGFILENAME" ]; then
sleep 0.1 # Delay to prevent inotify race conditions
configure_mangohud
fi
done
}
# Switch between plasma and steam in steamos mode based on the presence of the flag file
if [ -f "$FLAG_FILE" ]; then
rm "$FLAG_FILE"
exec /usr/lib/plasma-dbus-run-session-if-needed /usr/bin/startplasma-wayland >/dev/null 2>&1
else
IS_RUNNING=0
if [ -f "$PID_FILE" ]; then
if ps -p $(cat "$PID_FILE") > /dev/null 2>&1; then
IS_RUNNING=1
else # Process is dead. Remove the stale PID file.
rm -f "$PID_FILE"
fi
fi
if [ $IS_RUNNING -eq 0 ]; then
(mangohud_watcher >/dev/null 2>&1) &
disown
fi
#export MANGOHUD_CONFIG="font_scale=1.85"
export STEAM_GAMESCOPE_FANCY_SCALING_SUPPORT=1
export STEAM_GAMESCOPE_VRR_SUPPORTED=1
export STEAM_USE_DYNAMIC_VRS=1
export STEAM_GAMESCOPE_HAS_TEARING_SUPPORT=1
export STEAM_GAMESCOPE_TEARING_SUPPORTED=1
export STEAM_GAMESCOPE_HDR_SUPPORTED=1
# I did a lot of trial and error, maybe one of these others will suit you
# I was trying really hard to find a way to play the startup movie so it wouldn't get the first second or so cut off on boot on my machine
# I ended up with a solution that lets steam play the startup movie but some of these options play it with ffplay so you would turn off the startup movie in steam
# I'm not 100% sure all of these flags to steam are necessary or good but I cobbled them together from various sources and it works out in my experimentation on my machine
#exec gamescope --steam --mangoapp --adaptive-sync --hdr-enabled --hdr-itm-enabled -F fsr -- ffplay -fs -autoexit /home/steam/.steam/steam/config/communityitemscache/startupmovies/yourmovie.webm; steam -steamdeck -steamos3 -gamepadui -steampal -noverifyfiles -nobootstrapupdate -skipinitialbootstrap -norepairfiles -overridepackageurl -inhibitbootstrap >/dev/null 2>&1
#exec gamescope --steam --mangoapp --adaptive-sync --hdr-enabled --hdr-itm-enabled -F fsr -- steam -steamdeck -steamos3 -gamepadui -steampal -noverifyfiles -nobootstrapupdate -skipinitialbootstrap -norepairfiles -overridepackageurl -inhibitbootstrap >/dev/null 2>&1
# This one uses ffplay to display an image which shows during the switch between desktop and game mode sometimes if its slow to load steam, so you'll have to put an image or animation there
exec gamescope --steam --mangoapp --adaptive-sync --hdr-enabled --hdr-itm-enabled -F fsr -- bash -c "/home/steam/bin/gamescope-fg ffplay -fs -t 0.5s -autoexit /home/steam/splash.webm; steam -steamdeck -steamos3 -gamepadui -steampal -noverifyfiles -nobootstrapupdate -skipinitialbootstrap -norepairfiles -overridepackageurl -inhibitbootstrap" >/dev/null 2>&1
#exec gamescope --steam --mangoapp --adaptive-sync --hdr-enabled --hdr-itm-enabled -F fsr >/dev/null 2>&1
#sleep 5
#export DISPLAY=:0
#export STEAM_GAME_DISPLAY_0=:0
#export GAMESCOPE_WAYLAND_DISPLAY=gamescope-0
#/home/steam/bin/gamescope-fg ffplay -fs /home/steam/.steam/steam/config/communityitemscache/startupmovies/yourmovie.webm
#sleep 5
#/home/steam/bin/gamescope-fg ffplay -fs /home/steam/.steam/steam/steamui/movies/oled_startup.webm
#/home/steam/bin/gamescope-fg ffplay -fs -autoexit /home/steam/.steam/steam/steamui/movies/oled_startup.webm
#steam -no-splash -steamdeck -steamos3 -gamepadui -steampal -noverifyfiles -nobootstrapupdate -skipinitialbootstrap -norepairfiles -overridepackageurl -inhibitbootstrap >/dev/null 2>&1
fi
# Place this file at /usr/bin/steamos-session-select (steam runs this when you switch to desktop)
touch /home/steam/.launch-plasma
steam -shutdown
# if you wanted to make this script start kde instead
#/usr/lib/plasma-dbus-run-session-if-needed /usr/bin/startplasma-wayland
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment