fix(console): make a failed Steam session diagnosable, add shortcut tooling

Autologin into the gamescope Steam session does not take on the real
hardware; the television lands on ReGreet instead. The config side is
correct -- initial_session is present in the generated greetd.toml and
services.greetd.restart evaluates to false -- so the likely cause is the
session starting and then dying, which greetd answers by falling through
to default_session.

greetd hands a session the VT for its standard streams, so whatever the
session prints on its way down is erased as soon as the greeter repaints.
Run the launcher under systemd-cat so the reason survives in the journal
under the steam-session identifier.

Steam's non-Steam-game Browse dialog and its library-folder picker both
go through the XDG portal FileChooser interface and do not open here
(ValveSoftware/steam-for-linux#9447, #10415). Add steamtinkerlaunch,
which writes shortcuts.vdf without the dialog, and document
library_folder_add as the equivalent route for the library folder.

Docs also catch up with the host's actual state: hardware-configuration
.nix is a real scan now, standalone pcsx2 is installed, and the untested
claims become the list of open problems.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Emma Thorpe
2026-09-01 10:32:24 +01:00
co-authored by Claude Opus 5
parent 59d5d70221
commit 4e3347cb8c
2 changed files with 116 additions and 38 deletions
+16 -6
View File
@@ -61,6 +61,14 @@ let
"clonehero/backgrounds"
];
# greetd gives a session the VT for stdio, so a failed Steam session leaves no
# evidence once the greeter takes the VT back. Log to the journal instead:
# `journalctl -b -t steam-session`.
steamSession = pkgs.writeShellScript "steam-session" ''
exec ${pkgs.systemd}/bin/systemd-cat --identifier=steam-session \
/run/current-system/sw/bin/steam-gamescope
'';
# RetroArch and the cores this machine is expected to run. The wrapper already
# points RetroArch at the packaged assets, core info and joypad autoconfig
# profiles; `settings` here is merged on top of those.
@@ -178,13 +186,11 @@ in
# ask for it; Steam's Proton builds and most native titles do.
programs.gamemode.enable = true;
# Autologin into the Steam session. The launcher is not exposed as a package
# by the steam module -- it is built inside it and added to
# environment.systemPackages -- so reference it through the system profile.
# greetd's `restart` option defaults to false once initial_session is set,
# which is what stops a logout from looping straight back into autologin.
# Autologin into the Steam session. greetd's `restart` option defaults to
# false once initial_session is set, which is what stops a logout from looping
# straight back into autologin.
services.greetd.settings.initial_session = {
command = "/run/current-system/sw/bin/steam-gamescope";
command = "${steamSession}";
user = tvUser;
};
@@ -242,6 +248,10 @@ in
pkgs.clonehero
pkgs.pcsx2
pkgs.dualsensectl # DualSense LED/battery/mic control from the shell
# Writes shortcuts.vdf from the shell. Steam's own "Add a Non-Steam Game"
# dialog depends on a working portal file picker and frequently does not
# open; see docs/hosts/console.md.
pkgs.steamtinkerlaunch
pkgs.mangohud # FPS/frametime overlay; use `mangohud %command%` in Steam
pkgs.vulkan-tools # vulkaninfo, for checking the 32/64-bit ICDs Proton needs
];