- 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.
- Add it to the groups
- 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)
- Install and enable
gamescope seatd(two separate services to enable) - Install KDE Plasma as the desktop environment, steamos doesn't really work well with GNOME.
- I went with the
plasma-desktoppackage then any applications you want dolphin konsole plasma-systemmonitoryare the file manager and commandline console for kde and the system monitor- You probably want
kwalletmanager kwallet-pamto stop password prompts https://wiki.archlinux.org/title/KDE_Wallet - You might want
steamos-add-to-steamfrom AUR to get an add game to steam context menu item
- I went with the
- Install steam which needs multilib.
- You might need the fonts too.
- You might also need lib32-pipewire https://wiki.archlinux.org/title/Steam/Troubleshooting#Configure_PulseAudio (on some platforms you need sof-firmware too and wireplumber)
- 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
- Move
session-switcher.shto/usr/bin/session-switcherandsteamos-session-select.shto/usr/bin/steamos-session-selectandlogout-plasma.shin/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-plasmaexists and deletes it - launches steam in gamescope otherwise
/usr/bin/steamos-session-selectmakes 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.
- Place
gamemode.desktopon 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
- 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 - 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-steamospackage too.
Last active
August 30, 2026 02:29
-
-
Save fsmv/c9e1365540a4dfda55c56a5dc68ea39f to your computer and use it in GitHub Desktop.
Custom steamos steam machine setup on a regular arch linux install
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| [Desktop Entry] | |
| Exec=bash -c "/home/steam/bin/logout-plasma" | |
| Icon=steam | |
| Name=gamemode | |
| StartupNotify=true | |
| Terminal=false | |
| Type=Application |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| [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" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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