# steam-frame-nix [Home Manager](https://github.com/nix-community/home-manager) modules for the Valve Steam Frame (SteamOS, `aarch64-linux`, standalone home-manager). They work around quirks of the Frame's [two graphical sessions](#two-sessions) (portal, keyboard layout, clipboard, Firefox), enable hardware video decoding in Jellyfin, and extend Steam's and SteamVR's UIs at runtime (VR keyboard, "+" menu, dashboard windows, Steam close button, window curvature, window controls). Everything is declarative: files are links into the Nix store, UI patches live in memory. The few things that have to be written elsewhere at runtime are listed under [Changes outside Nix](#changes-outside-nix-exceptions), with their lifetime and what removes them; `steam-frame-nix-cleanup` removes every one of them (on each switch what the configuration no longer uses, `--all` for everything). All options live under `steamFrame.*`. The portal fix and clipboard sync are on by default; everything else is opt-in. - [Features](#features) · [Install](#install) · [Two sessions](#two-sessions) · [Usage](#usage) · [Options](#options) - [Fixes in detail](#fixes-in-detail): [session](#session-settings-and-background-services-sessionnix), [portal](#portal-sessionportalfix), [keyboard layout](#keyboard-layout-keyboardlayout-keyboardvariant), [VR keyboard extra keys](#steam-keyboard-patch-keyboardvrextrakeysenable), [swipe and suggestions](#vr-keyboard-swipe-and-suggestions-keyboardvr), [launcher menu](#launcher-menu-launchermenu), [hidden apps](#hidden-apps-launchermenuhiddenapps), [icon fallbacks](#icon-fallbacks-launchermenuiconfallbacks), [dashboard windows](#dashboard-windows-dashboardwindows), [Steam close button](#steam-close-button-dashboardsteamclosebuttonenable), [window curvature](#window-curvature-dashboardwindowcurvature), [window control bar](#window-control-bar-dashboardframecontrols), [SteamVR debugger](#steamvr-debugger-steamvrdebuggerenable), [clipboard sync](#clipboard-sync-clipboardsyncenable), [Firefox](#firefox-firefox), [Jellyfin hardware decoding](#jellyfin-hardware-decoding-jellyfinhardwaredecoding) - [UI patches](#ui-patches-uipatchespatches): [DevTools on the LAN](#devtools-on-the-lan), [after a Steam update](#after-a-steam-update) - [Changes outside Nix](#changes-outside-nix-exceptions) · [Rollback](#rollback) · [Uninstall](#uninstall) Technical documentation (how the patches work, writing your own, fixing them after a Steam update): [`docs/`](docs). ## Features Session and desktop: - [Portal fix](#portal-sessionportalfix) (`session.portalFix`, on): apps in the Steam session can open links. - [Clipboard sync](#clipboard-sync-clipboardsyncenable) (`clipboardSync`, on): one clipboard for the Steam session and the nested desktop. - [Session settings](#session-settings-and-background-services-sessionnix) (`session.*`): outer bus and user services, for launchers and the other modules. Keyboard: - [Keyboard layout](#keyboard-layout-keyboardlayout-keyboardvariant) (`keyboard.layout`, `keyboard.variant`): XKB layout for the Steam session. - [Extra keys](#steam-keyboard-patch-keyboardvrextrakeysenable) (`keyboard.vr.extraKeys`): Esc/Ctrl/Alt, arrows, Delete, real chords and AltGr/non-ASCII characters on the VR keyboard. - [Swipe and suggestions](#vr-keyboard-swipe-and-suggestions-keyboardvr) (`keyboard.vr`): swipe typing, corrections, completions, Backspace drag. VR "+" menu: - [Launcher menu](#launcher-menu-launchermenu) (`launcherMenu.*`): sorted, Desktop pinned, closes on launch, no double launches, grid of tiles, all programs without Developer Mode. - [Hidden apps](#hidden-apps-launchermenuhiddenapps) (`launcherMenu.hiddenApps`) and [icon fallbacks](#icon-fallbacks-launchermenuiconfallbacks) (`launcherMenu.iconFallbacks`, on) for Konsole and KDE System Settings. SteamVR dashboard (turns on the [SteamVR debugger](#steamvr-debugger-steamvrdebuggerenable) automatically): - [Dashboard windows](#dashboard-windows-dashboardwindows) (`dashboard.windows`): larger max scale and push-back distance. - [Steam close button](#steam-close-button-dashboardsteamclosebuttonenable) (`dashboard.steamCloseButton`): an X that hides the Steam window. - [Window curvature](#window-curvature-dashboardwindowcurvature) (`dashboard.windowCurvature`): adjustable curvature per window. - [Window control bar](#window-control-bar-dashboardframecontrols) (`dashboard.frameControls`): move controls between bar and three-dot menu. Apps: - [Firefox](#firefox-firefox) (`firefox`): launcher for the Flatpak with a VR fullscreen fix, optional AV1 off, a separate desktop profile. - [Jellyfin](#jellyfin-hardware-decoding-jellyfinhardwaredecoding) (`jellyfin.hardwareDecoding`): hardware video decoding in the Jellyfin Desktop Flatpak. Your own patches of Steam's UI: [UI patches](#ui-patches-uipatchespatches). ## Install On the Frame (or a Steam Deck), in a terminal (Konsole in desktop mode or the nested desktop): ```sh curl -fsSL https://steam-frame-nix.lhns.de | bash -s -- install ``` The short link redirects to [`install.sh`](https://raw.githubusercontent.com/lhns/steam-frame-nix/main/install.sh) on `main`. `sudo` needs a password: run `passwd` first if you never set one. The installer: 1. installs Nix with the [NixOS nix-installer](https://github.com/NixOS/nix-installer) (`steam-deck` planner: store in `/home/nix`, survives SteamOS updates; flakes on), unlocking the read-only root only for the install. Skipped if Nix already works; 2. uses `~/.config/home-manager` or `--flake `; if there is none, creates `~/nix-config` (a git repo, linked to `~/.config/home-manager`) from the [template](template) with your user name; 3. runs `home-manager switch`; conflicting dotfiles are renamed to `*.hm-backup-