Steam Deck-style Gaming Mode for Linux + Hyprland (Omarchy). Press Super+Shift+S for Steam Big Picture in Gamescope; Super+Shift+R back to desktop.
Find a file
28allday 74b1a5bb6b fix: restart Walker/elephant in portal recovery to fix clipboard
After v0.1.4 fixed the portal race, a user reported that the clipboard
also broke after returning from Gaming Mode. Symptom: paste does
nothing, Walker's clipboard history is empty.

Same root cause as the portal stack: Walker's elephant backend holds
the wl-clipboard listener, which is bound to the dead Hyprland's
Wayland socket after the SDDM restart. Fixed by appending a Walker
restart to deckshift-portal-recovery, using the existing
omarchy-restart-walker helper when present and falling back to direct
systemctl --user restart of elephant.service +
app-walker@autostart.service when not (keeps the helper portable for
the planned non-Omarchy targets).

Reported and validated by the same user as the v0.1.4 fix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 20:56:36 +01:00
applications Initial commit — DeckShift v0.1.0 2026-05-05 19:54:52 +01:00
bin v0.1.2 — TUI hardening, hybrid PRIME offload, installer cleanup 2026-05-06 08:29:53 +01:00
deckshift.sh fix: restart Walker/elephant in portal recovery to fix clipboard 2026-05-12 20:56:36 +01:00
README.md fix: restore xdg-desktop-portal after returning from Gaming Mode 2026-05-09 22:11:10 +01:00

DeckShift

Version 0.1.3 — Steam Deck-style gaming mode for Linux + Hyprland. Press Super+Shift+S to enter Gaming Mode (Steam Big Picture in Gamescope), Super+Shift+R to return to your desktop.

Lineage: forked from Super-Shift-S-Omarchy-Deck-Mode, briefly renamed Omarchy Deck, then renamed DeckShift as the project moves toward distro-portability.

Current status: targets Omarchy (Arch + Hyprland + SDDM + iwd). Works on other Arch + Hyprland setups with minor manual tweaks. Cross-distro support (Fedora / openSUSE / Cachy) is the next direction.

DeckShift demo

What's New

v0.1.3 — power-state save/restore + reliable exit

  • Saves your real pre-Gaming-Mode state (CPU governor + power profile) on entry to ~/.cache/deckshift/saved-state and restores those exact values on exit. No more guessing powersave/balanced.
  • Synchronous restore in switch-to-desktop — runs before SDDM is restarted, so the restore can't be SIGKILL'd mid-write by session teardown.
  • switch-to-desktop now uses an atomic systemctl restart sddm instead of a racy stop+disowned-start that could leave the display manager stopped (= black screen).
  • powerprofilesctl is now in the NOPASSWD allowlist so the restore call can succeed without a polkit auth agent.

v0.1.2 — TUI hardening + hybrid PRIME offload

  • Hybrid GPU support in the Settings TUI. Two new GPU modes:
    • [hybrid-nvidia] — for laptops with NVIDIA dGPU + AMD/Intel iGPU where the laptop screen (eDP-1) is wired to the iGPU. Sets __NV_PRIME_RENDER_OFFLOAD=1 + friends so Gamescope runs on the iGPU but games inside still render on the NVIDIA dGPU via PRIME render offload. Tested working on Acer Nitro (AMD APU + RTX 3050) playing Homeworld 3 with NVIDIA acceleration on the laptop screen.
    • [hybrid-amd] — for AMD dGPU + AMD/Intel iGPU laptops. Asks which GPU is the dGPU, then sets DRI_PRIME + MESA_VK_DEVICE_SELECT so games offload to the AMD dGPU.
  • Settings TUI no longer crashes on stale OUTPUT_CONNECTOR. When the saved monitor is currently unplugged the TUI falls back gracefully instead of tripping pipefail.
  • Installer no longer preselects monitor / resolution / refresh rate. Display selection is now exclusively the TUI's job; the installer writes only GPU and static keys to gamescope-session-plus.conf.
  • Conf writer is now per-key set/unset (sed-based), idempotent — re-running the installer preserves user-set display values from the TUI instead of clobbering them.

v0.1.1 / v0.1.0 — original deckshift fork

  • Settings TUI launched from Walker (Super+Space → "DeckShift Settings").
  • NVIDIA driver branch auto-pick (Pascal/Maxwell/Volta → nvidia-580xx-utils, Turing+ → nvidia-utils) via Omarchy's omarchy-hw-nvidia-gsp.
  • Idempotent package installs via omarchy-pkg-add.
  • Optional Xbox Bluetooth controller support (xpadneo-dkms, opt-in).
  • Intel GPU support (Iris Xe, Arc) with a generation warning for older Gen8/9.
  • Multilib check removed (Omarchy ships with multilib enabled).

Settings TUI

After install, launch DeckShift Settings from Walker (or run deckshift-settings directly) to change Gaming Mode display settings without editing config files:

Option What it sets in gamescope-session-plus.conf
Monitor OUTPUT_CONNECTOR (auto-detected from connected DRM outputs; pick or clear)
Resolution SCREEN_WIDTH / SCREEN_HEIGHT (offers monitor's native modes + common presets)
Refresh rate CUSTOM_REFRESH_RATES (parsed from EDID, plus common rates as fallback)
GPU — direct VULKAN_ADAPTER + GBM_BACKEND (NVIDIA) or DRI_PRIME (AMD/Intel) — single-GPU desktops
GPU — [hybrid-nvidia] __NV_PRIME_RENDER_OFFLOAD=1, __VK_LAYER_NV_optimus=NVIDIA_only, __GLX_VENDOR_LIBRARY_NAME=nvidia — hybrid laptops with NVIDIA dGPU + iGPU-attached eDP
GPU — [hybrid-amd] DRI_PRIME=pci-… + MESA_VK_DEVICE_SELECT=<vendor:device> + MESA_VK_DEVICE_SELECT_FORCE_DEFAULT_DEVICE=1 — hybrid laptops with AMD dGPU + iGPU
(clear) Removes all GPU keys; gamescope auto-picks at runtime

The [hybrid-*] options only appear when the relevant GPU pair is detected.

The TUI launches as a floating window via Omarchy's TUI.float pattern. Selections are buffered — nothing is written to disk until you pick Save and exit. Cancel discards unsaved changes. Saved changes apply next time you enter Gaming Mode (Super+Shift+S).

What It Does

This installer transforms your desktop into a dual-mode system:

  • Desktop Mode — your normal Hyprland session.
  • Gaming Mode — full-screen Steam Big Picture running inside Gamescope (the same compositor used by the Steam Deck), with automatic performance tuning, controller support, and external drive mounting.

Switching between modes is seamless — SDDM handles session transitions, and your network, audio, and peripherals carry over automatically.

Requirements

  • OS: Omarchy (Arch Linux + Hyprland + SDDM)
  • GPU: AMD (discrete or APU), NVIDIA (discrete), or Intel (Arc / Iris Xe), or any hybrid combo of the above
    • Intel Arc (Alchemist, Battlemage): well-supported
    • Tiger Lake / Alder Lake Iris Xe: playable for indies / older AAA
    • Older Gen8/9 Intel (Skylake, Kaby Lake): expect slow/glitchy — installer warns and asks before continuing
    • Hybrid laptops (NVIDIA + iGPU, AMD dGPU + iGPU): use the corresponding [hybrid-*] GPU mode in the Settings TUI
  • AUR Helper: yay or paru (for ChimeraOS session packages)

Note

: This script targets Omarchy and its stack (Hyprland, SDDM, iwd, UWSM, PipeWire). It works on other Arch + Hyprland setups with light tweaks, but isn't tested there.

Quick Start

git clone https://git.no-signal.uk/nosignal/deckshift.git
cd deckshift
chmod +x deckshift.sh
./deckshift.sh

The installer is fully interactive and walks you through each step.

After install, open DeckShift Settings from Walker and pick:

  • A monitor
  • A resolution / refresh rate
  • A GPU mode — for hybrid laptops, prefer [hybrid-nvidia] or [hybrid-amd] over the direct options

Save, then Super+Shift+S to launch Gaming Mode.

Usage

Action How
Enter Gaming Mode Super + Shift + S
Return to Desktop Super + Shift + R (global keybind monitor catches it inside Gamescope)
Return to Desktop (alternative) Steam → Power → Switch to Desktop
Open settings Walker → DeckShift Settings, or run deckshift-settings

Command-Line Options

./deckshift.sh              # Full installation
./deckshift.sh --verify     # Verify installation only
./deckshift.sh --version    # Show version
./deckshift.sh --help       # Show help

Recovery from a Black Screen

If Gaming Mode (or anything else) leaves you on a black screen, here's the order of escalation:

  1. Super + Shift + R — the keybind monitor inside Gamescope still works on a black screen as long as the kernel is processing input.
  2. Wait 10 seconds. Sometimes the display is just renegotiating EDID after a session swap; give it a beat.
  3. Switch to a TTY: press Ctrl + Alt + F2 (try F3 / F4 if F2 is blank). You'll get a text login prompt.
  4. Log in as your user, then run one of:
    • Cleanest — log the graphical session out cleanly and bounce back to SDDM:
      loginctl terminate-user $USER
      
    • Heavier — restart the whole display manager:
      sudo systemctl restart sddm
      
  5. From SSH (from another machine on the network) the same commands work — handy if the box is wedged but its network is alive.
  6. Last resort: hold the power button. Safe in this situation; you didn't cause the freeze, gamescope did.

If you keep ending up on a black screen, see Troubleshooting — most often it's a GPU↔connector mismatch on hybrid laptops (e.g. NVIDIA mode targeting eDP-1, which on a hybrid is wired to the iGPU). Switch the GPU mode in DeckShift Settings to [hybrid-nvidia] and pick eDP-1 for the monitor.

What Gets Installed

Packages

The installer checks for and offers to install:

Core Steam Dependencies

  • steam, gamescope, mangohud, gamemode
  • Vulkan loaders and Mesa libraries (32-bit and 64-bit)
  • Audio libraries (lib32-alsa-plugins, lib32-libpulse, lib32-openal)
  • Networking (networkmanager, lib32-libnm)
  • Fonts (ttf-liberation)

GPU-Specific Drivers

  • NVIDIA (Turing+ / GSP firmware — GTX 16xx, RTX 2050xx, etc.): nvidia-utils, lib32-nvidia-utils, nvidia-settings, libva-nvidia-driver
  • NVIDIA (legacy Maxwell/Pascal/Volta — GTX 9xx/10xx, Quadro P/M): nvidia-580xx-utils, lib32-nvidia-580xx-utils, nvidia-settings, libva-nvidia-driver
  • AMD: vulkan-radeon, lib32-vulkan-radeon, libvdpau, lib32-libvdpau
  • Intel: vulkan-intel, lib32-vulkan-intel, intel-media-driver

The correct NVIDIA driver branch is auto-selected via Omarchy's omarchy-hw-nvidia-gsp / omarchy-hw-nvidia-without-gsp helpers — no manual override needed. Intel-only systems get a generation warning + Y/N prompt before continuing (Skylake/Kaby Lake era is slow; Tiger Lake / Arc is fine).

AUR Packages (via yay/paru)

  • gamescope-session-git — ChimeraOS base session framework
  • gamescope-session-steam-git — ChimeraOS Steam session with compatibility scripts
  • proton-ge-custom-bin (optional)

Other Requirements

  • python-evdev — for the keyboard shortcut monitor
  • gum, jq — for the Settings TUI
  • ntfs-3g — for mounting NTFS game drives
  • udisks2 — for external drive auto-mounting
  • xcb-util-cursor, libcap, curl, pciutils

Optional: Xbox Bluetooth Controllers

  • xpadneo-dkms, linux-headers — wireless Xbox pad button mapping & rumble for Big Picture / RetroArch (wired pads work without this)
  • Prompted opt-in during install; pair with Super+Ctrl+B

Package installs use Omarchy's omarchy-pkg-add (idempotent, double-checks pacman actually installed each package).

Files Created

Session Scripts

Path Purpose
/usr/local/bin/switch-to-gaming Hyprland → Gaming Mode
/usr/local/bin/switch-to-desktop Gaming Mode → Hyprland (synchronous power-state restore + atomic SDDM restart)
/usr/local/bin/gamescope-session-nm-wrapper Main session wrapper (performance mode, NM, drive mounting, saves pre-Gaming-Mode state)
/usr/local/bin/gaming-session-switch Helper that toggles SDDM autologin between Hyprland and Gamescope
/usr/local/bin/gaming-keybind-monitor Python evdev daemon catching Super+Shift+R inside Gamescope
/usr/lib/os-session-select Handler for Steam's "Exit to Desktop" button
/usr/local/lib/gamescope-nvidia/gamescope NVIDIA wrapper that adds --force-composition

NetworkManager Integration

Path Purpose
/usr/local/bin/gamescope-nm-start Starts NetworkManager on gaming session entry
/usr/local/bin/gamescope-nm-stop Stops NetworkManager and restores iwd on session exit
/etc/NetworkManager/conf.d/10-iwd-backend.conf Configures NM to use iwd backend (if iwd is detected)
/etc/NetworkManager/conf.d/20-unmanaged-systemd.conf Prevents NM/systemd-networkd conflicts (if networkd is detected)

External Drive Support

Path Purpose
/usr/local/bin/steam-library-mount Auto-detects and mounts drives with Steam libraries

Session & Display Manager

Path Purpose
/usr/share/wayland-sessions/gamescope-session-steam-nm.desktop SDDM session entry for Gaming Mode
/etc/sddm.conf.d/zz-gaming-session.conf SDDM autologin session switching config

Permissions & Security

Path Purpose
/etc/sudoers.d/gaming-session-switch NOPASSWD: session switching, NM, bluetooth, powerprofilesctl set *
/etc/sudoers.d/gaming-mode-sysctl NOPASSWD: performance sysctl tuning
/etc/polkit-1/rules.d/50-gamescope-networkmanager.rules Polkit rules for NM D-Bus access
/etc/polkit-1/rules.d/50-udisks-gaming.rules Polkit rules for external drive mounting
/etc/udev/rules.d/99-gaming-performance.rules Udev rules for CPU/GPU performance control
/etc/security/limits.d/99-gaming-memlock.conf Memory lock limits (2 GB) for gaming

Performance & Environment

Path Purpose
/etc/environment.d/99-shader-cache.conf Shader cache optimisation (12 GB Mesa/DXVK cache)
/etc/environment.d/90-nvidia-gamescope.conf NVIDIA Gamescope environment variables
/etc/pipewire/pipewire.conf.d/10-gaming-latency.conf PipeWire low-latency audio config

User Config

Path Purpose
~/.config/environment.d/gamescope-session-plus.conf Gamescope session config (display + GPU keys) — managed via the Settings TUI
~/.config/hypr/bindings.conf Hyprland keybind for Super+Shift+S (appended)
~/.cache/deckshift/saved-state Pre-Gaming-Mode CPU governor + power profile (created on entry, cleaned up on exit)

Settings TUI

Path Purpose
/usr/local/bin/deckshift-settings Gum-based TUI for Gaming Mode display + GPU settings
/usr/share/applications/deckshift-settings.desktop Walker launcher (floats via Omarchy's TUI.float windowrule)

How It Works

Session Switching Flow

Desktop Mode (Hyprland)
    │
    ├─ Super+Shift+S pressed
    │   └─ switch-to-gaming runs:
    │       ├─ Masks suspend targets (prevents sleep during switch)
    │       ├─ Updates SDDM config to gaming session
    │       └─ Restarts SDDM → boots into Gaming Mode
    │
Gaming Mode (Gamescope + Steam Big Picture)
    │
    ├─ On session start (gamescope-session-nm-wrapper):
    │   ├─ Saves current CPU governor + power profile to ~/.cache/deckshift/saved-state
    │   ├─ Enables performance mode (CPU governor → performance, GPU max power, PPD → performance)
    │   ├─ Starts NetworkManager (for Steam network access)
    │   ├─ Launches steam-library-mount (external drive detection)
    │   ├─ Starts gaming-keybind-monitor (Super+Shift+R listener)
    │   └─ Launches gamescope-session-plus with Steam
    │
    ├─ Super+Shift+R pressed (or Steam → Power → Switch to Desktop)
    │   └─ switch-to-desktop runs:
    │       ├─ Reads ~/.cache/deckshift/saved-state and restores CPU governor + PPD synchronously
    │       ├─ Unmasks suspend targets
    │       ├─ Restores Bluetooth
    │       ├─ Shuts down Steam gracefully
    │       ├─ Kills gamescope
    │       ├─ Updates SDDM config to Hyprland session
    │       └─ Atomic systemctl restart sddm → boots into Desktop Mode
    │
    └─ On session cleanup (trap handler — backup path):
        ├─ Kills steam-library-mount and keybind-monitor
        ├─ Stops NetworkManager, restores iwd WiFi
        └─ Re-applies saved CPU governor + power profile (idempotent if switch-to-desktop already ran)

Performance Mode

When Gaming Mode starts, the session wrapper saves your current CPU governor and power-profiles-daemon profile to ~/.cache/deckshift/saved-state, then:

  • Sets CPU governor to performance on all cores
  • NVIDIA: enables persistence mode, sets power limit to maximum, disables runtime suspend
  • AMD: sets GPU to high performance via power_dpm_force_performance_level
  • Sets the power profile to performance (when power-profiles-daemon is available)

On exit, both switch-to-desktop (synchronous, runs first) and the wrapper's trap (backup) read the saved file and restore the exact values that were set before Gaming Mode.

Caveat — Omarchy + AC: Omarchy's omarchy-powerprofiles-init autostarts on every Hyprland session and sets the power profile to performance whenever the laptop is on AC. So even after a perfect deckshift restore, the next Hyprland session will reset to performance if you're plugged in. This is Omarchy's intended behaviour, not a deckshift bug — it'd happen to any program that tries to set balanced and then a Hyprland session restarts. To opt out, comment exec-once = omarchy-powerprofiles-init in ~/.config/hypr/autostart.conf. On battery the deckshift restore lands at the saved value and stays there.

GPU Detection

The installer detects:

  • AMD dGPU: PCI device names (Navi, RDNA, Vega discrete cards)
  • AMD APU: integrated GPU codenames (Phoenix, Rembrandt, Van Gogh, etc.)
  • NVIDIA: lspci, configures nvidia-drm.modeset=1 if missing, picks nvidia-utils vs nvidia-580xx-utils via Omarchy's GSP-firmware detection
  • Intel (Arc / Iris Xe / iGPU): i915 / xe kernel drivers
  • Hybrid combinations: detected by the Settings TUI, which surfaces the appropriate [hybrid-*] GPU mode

The installer itself no longer picks a monitor / resolution / refresh / GPU — those are user choices, made via the Settings TUI after install.

NetworkManager Integration

Many systems running Hyprland use iwd or systemd-networkd instead of NetworkManager. Since Steam requires NetworkManager for its network settings UI, the installer creates a managed handoff:

  1. On Gaming Mode entry: NetworkManager starts, takes over networking.
  2. On Gaming Mode exit: NetworkManager stops, iwd/networkd resumes.

This avoids conflicts and ensures both desktop and gaming sessions have network access.

External Drive Auto-Mount

The steam-library-mount daemon runs during Gaming Mode and:

  1. Scans all connected drives for Steam library folders.
  2. Mounts drives containing steamapps/ directories via udisks2.
  3. Monitors udev for hot-plugged drives.
  4. Unmounts non-Steam drives to avoid clutter.

Supports ext4, NTFS, btrfs, xfs, exfat, f2fs, and vfat filesystems.

Configuration

Config File

The installer reads from /etc/gaming-mode.conf (or ~/.gaming-mode.conf if it exists):

PERFORMANCE_MODE=enabled   # Set to "disabled" to skip performance tuning

Gamescope Session Config

The installer only writes GPU + static keys to ~/.config/environment.d/gamescope-session-plus.conf:

# Static — every install:
STEAM_ALLOW_DRIVE_UNMOUNT=1
FCITX_NO_WAYLAND_DIAGNOSE=1
SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS=0

# GPU-specific (NVIDIA shown):
VULKAN_ADAPTER=10de:25ac
GBM_BACKEND=nvidia-drm

Display keys (SCREEN_WIDTH, SCREEN_HEIGHT, CUSTOM_REFRESH_RATES, OUTPUT_CONNECTOR) and hybrid-PRIME env vars are owned exclusively by the Settings TUI. Re-running the installer preserves your TUI choices.

NVIDIA note: Gamescope on NVIDIA is currently capped at 2560×1440. The TUI flags any higher resolution as unsupported.

Shader Cache

The installer configures a 12 GB shader cache by default in /etc/environment.d/99-shader-cache.conf:

MESA_SHADER_CACHE_MAX_SIZE=12G
__GL_SHADER_DISK_CACHE_SIZE=12884901888
DXVK_STATE_CACHE=1

NVIDIA-Specific Notes

  • Kernel parameter: nvidia-drm.modeset=1 is required. The installer can configure this for Limine, GRUB, or systemd-boot.
  • Resolution cap: Gamescope on NVIDIA is limited to 2560×1440 maximum.
  • Force composition: the NVIDIA wrapper automatically adds --force-composition if your Gamescope version supports it.
  • Environment: GBM_BACKEND=nvidia-drm and related vars are set automatically.
  • Persistence mode: enabled during gaming, disabled on exit.

Hybrid laptop note

On a hybrid laptop (NVIDIA dGPU + AMD/Intel iGPU), the laptop screen (eDP-1) is wired to the iGPU. NVIDIA cannot scan out directly to it — pointing the direct [nvidia] mode at eDP-1 will black-screen.

Use [hybrid-nvidia] in the Settings TUI instead. Gamescope will run on the iGPU (which owns eDP-1) and games inside will render on NVIDIA via PRIME render offload, with the rendered frames flowing back through DMA-BUF for scanout. This is the same architecture Steam Deck uses (just with one GPU).

Bootloader Support

The installer can automatically configure nvidia-drm.modeset=1 for:

  • Limine — appends to cmdline: in /boot/limine.conf
  • GRUB — adds to GRUB_CMDLINE_LINUX_DEFAULT and regenerates config
  • systemd-boot — provides manual instructions for /boot/loader/entries/*.conf

A backup is created before any bootloader modification.

Troubleshooting

Verify Installation

Run the built-in verification to check all files, permissions, packages, and services:

./deckshift.sh --verify

Common Issues

Gaming Mode shows a black screen on eDP-1

Most likely a hybrid-laptop GPU↔connector mismatch — NVIDIA can't drive the iGPU's display.

  • Switch the GPU mode to [hybrid-nvidia] (or [hybrid-amd] for AMD-only hybrids) in DeckShift Settings.
  • If you only have the laptop screen, that's the only working path — direct NVIDIA mode requires an external display plugged into the dGPU's HDMI/DP output.

See Recovery from a Black Screen for how to get out of the black-screen state.

Gaming Mode doesn't start

  • Check NVIDIA kernel params: cat /proc/cmdline | grep nvidia
  • Verify gamescope works: gamescope -- steam
  • Check session logs: journalctl --user -u gamescope-session -n 50

No network in Gaming Mode

  • Test NM manually: sudo systemctl start NetworkManager && nmcli general
  • Check polkit rules: ls -la /etc/polkit-1/rules.d/50-gamescope-*
  • Check logs: journalctl -t gamescope-nm -n 20

Super+Shift+R doesn't work in Gaming Mode

  • Ensure python-evdev is installed: pacman -Qi python-evdev
  • Ensure user is in input group: groups | grep input
  • Check the keybind monitor: journalctl -t gaming-keybind-monitor -n 20
  • Fallback: Steam → Power → Switch to Desktop

External drives not mounting

  • Ensure udisks2 is installed: pacman -Qi udisks2
  • Check polkit rules exist: ls /etc/polkit-1/rules.d/50-udisks-gaming.rules
  • Check mount logs: journalctl -t steam-library-mount -n 20

Audio stuttering in Gaming Mode

  • Check PipeWire config exists: cat /etc/pipewire/pipewire.conf.d/10-gaming-latency.conf
  • Try lower quantum: edit the config and set default.clock.min-quantum = 128

Screen sharing in Chromium / Firefox is broken after returning from Gaming Mode (only "Share a tab" works)

xdg-desktop-portal-hyprland is bound to the killed Hyprland instance — tab capture works because it bypasses the portal, but desktop/window capture goes through it and fails silently.

DeckShift handles this automatically via /usr/local/bin/deckshift-portal-recovery (autostarted from ~/.config/hypr/autostart.conf). If you installed before this fix or the autostart hook didn't get added, run:

systemctl --user restart xdg-desktop-portal-hyprland xdg-desktop-portal pipewire pipewire-pulse wireplumber

then re-open the browser tab.

Suspend fails with "Access denied" after returning from Gaming Mode

The runtime mask on suspend.target from the gaming switch wasn't cleared. DeckShift now handles this in switch-to-desktop. For older installs, the one-time fix is:

sudo systemctl unmask --runtime sleep.target suspend.target hibernate.target hybrid-sleep.target
sudo systemctl daemon-reload

Power profile stays on performance after Gaming Mode exit

If you're on AC and using Omarchy, this is expected — see the Performance Mode caveat above. The deckshift restore is correctly running; Omarchy's session-init policy is overriding it on the next Hyprland start.

Intel-only system, Gaming Mode is laggy

  • Older Gen8/9 Intel iGPUs (Skylake, Kaby Lake) struggle with Vulkan workloads. Lower the launch resolution via the Settings TUI (deckshift-settings) — 720p / 1080p makes a big difference.
  • If you have a discrete GPU that should take over, check its driver is loaded: lspci -k | grep -A2 VGA

Log Locations

Component Command
Gaming session journalctl --user -u gamescope-session
NetworkManager journalctl -t gamescope-nm
Drive mounting journalctl -t steam-library-mount
Keybind monitor journalctl -t gaming-keybind-monitor
Session wrapper journalctl -t gamescope-wrapper
Installation journalctl -t gaming-mode

Uninstalling

To completely remove DeckShift:

# Stop any running gaming-mode bits
sudo pkill -f gamescope
sudo pkill -f gaming-keybind-monitor
sudo pkill -f steam-library-mount

# Remove scripts
sudo rm -f /usr/local/bin/{switch-to-gaming,switch-to-desktop,gamescope-session-nm-wrapper,\
gaming-session-switch,gaming-keybind-monitor,gamescope-nm-start,gamescope-nm-stop,\
steam-library-mount,deckshift-settings}
sudo rm -f /usr/lib/os-session-select
sudo rm -rf /usr/local/lib/gamescope-nvidia

# Remove SDDM session entry
sudo rm -f /usr/share/wayland-sessions/gamescope-session-steam-nm.desktop
sudo rm -f /usr/share/wayland-sessions/gamescope-session-steam.desktop
sudo rm -f /usr/share/wayland-sessions/gamescope-session.desktop

# Remove permissions
sudo rm -f /etc/sudoers.d/gaming-session-switch
sudo rm -f /etc/sudoers.d/gaming-mode-sysctl
sudo rm -f /etc/polkit-1/rules.d/50-gamescope-networkmanager.rules
sudo rm -f /etc/polkit-1/rules.d/50-udisks-gaming.rules
sudo rm -f /etc/udev/rules.d/99-gaming-performance.rules
sudo rm -f /etc/security/limits.d/99-gaming-memlock.conf

# Remove configs
sudo rm -f /etc/sddm.conf.d/zz-gaming-session.conf
sudo rm -f /etc/environment.d/99-shader-cache.conf
sudo rm -f /etc/environment.d/90-nvidia-gamescope.conf
sudo rm -f /etc/pipewire/pipewire.conf.d/10-gaming-latency.conf
sudo rm -f /etc/NetworkManager/conf.d/10-iwd-backend.conf
sudo rm -f /etc/NetworkManager/conf.d/20-unmanaged-systemd.conf

# Remove user files
rm -f ~/.config/environment.d/gamescope-session-plus.conf
rm -rf ~/.cache/deckshift
sudo rm -f /usr/share/applications/deckshift-settings.desktop

# Strip the Hyprland keybind line
sed -i '/switch-to-gaming/d' ~/.config/hypr/bindings.conf

# Reload polkit/udev
sudo systemctl restart polkit
sudo udevadm control --reload-rules

# Optionally remove AUR packages
yay -Rns gamescope-session-git gamescope-session-steam-git

Credits

  • Omarchy — the Arch Linux distribution this was built for
  • ChimeraOS — gamescope-session packages
  • Valve — Steam, Gamescope, and the Steam Deck inspiration
  • Hyprland — Wayland compositor

License

This project is provided as-is for the Omarchy community.