feat(steamdeck): TV apps as Steam Game Mode tiles #1226

Open
lytedev wants to merge 2 commits from propose/steamdeck-tv-tiles into main
Owner

See the commit message.

🤖 Generated with Claude Code

https://claude.ai/code/session_0151nvUsqwL2BZWKs9dVxsia

See the commit message. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_0151nvUsqwL2BZWKs9dVxsia
feat(steamdeck): TV apps as Steam Game Mode tiles
All checks were successful
/ check-format (push) Successful in 10s
/ build (push) Successful in 10m32s
73f6d57503
The living-room Deck boots into Steam Game Mode, which the family
already knows, but everything TV-shaped (Hearth, Jellyfin, streaming,
a browser) lived behind "Switch to Desktop" in niri. This puts them on
tiles in Game Mode instead, where Steam Input makes the controller
work in every app and the Steam button always leads home.

Tiles reach Steam through the Steam ROM Manager "Manual" parser, set
up once by hand in its GUI against
~/.local/share/steam-tv-tiles/manifests. Nix owns the tile list and
the launcher; SRM owns its parser settings and the shortcuts it
writes, and leaves every other shortcut alone.

Alternatives not taken:
- Writing shortcuts.vdf directly: Steam rewrites it from memory on
  exit, and the launch id behind steam://rungameid can no longer be
  computed ahead of time (ValveSoftware/steam-for-linux#9463).
- NonSteamLaunchers (Decky): an imperative SteamOS installer with a
  background rescan that would fight Nix.
- A custom launcher inside niri: rebuilds what Steam Input already
  gives for free.

Web tiles open the Zen primary profile rather than per-tile profiles
so they keep its hand-installed uBlock Origin and logins. YouTube uses
VacuumTube, the YouTube TV interface with a built-in ad blocker.

Tested so far: evaluated and built for steamdeck. A copy pointing at
the Zen the Deck already has installed was placed by hand at the same
paths, because deploying main to the Deck is a three-month nixpkgs
jump that needs a reboot, and the newer Zen from main would upgrade
the profile past what the installed Zen accepts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151nvUsqwL2BZWKs9dVxsia
fix(steamdeck): start tiles from a static shell, YouTube in Zen
All checks were successful
/ check-format (push) Successful in 9s
/ build (push) Successful in 11m27s
cbbd071ee3
Every tile died before its script ran. Steam launches shortcuts with
its overlay (gameoverlayrenderer.so) in LD_PRELOAD, that library needs
libGL.so.1, and the launcher's dynamically linked bash could not find
one, so ld.so exited 127. Reproduced on the Deck by setting the same
LD_PRELOAD by hand; with it empty the launcher ran.

Steam now starts a static bash, which has no ld.so to fail in, and it
clears LD_PRELOAD before starting the real launcher. The in-app Steam
overlay is lost with it; Game Mode's own menus are drawn by gamescope
and do not need it. The alternative, "LD_PRELOAD= %command%" in the
launch options, would have tied the fix to Steam's launch-option
syntax and required rerunning Steam ROM Manager.

YouTube becomes a Zen tile on youtube.com, like the other sites, in
place of VacuumTube, and the program-tile option goes with it.

Tile titles, the target path and the launch options are unchanged, so
the shortcuts Steam ROM Manager already wrote still match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151nvUsqwL2BZWKs9dVxsia
All checks were successful
/ check-format (push) Successful in 9s
Required
Details
/ build (push) Successful in 11m27s
Required
Details
This pull request can be merged automatically.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin propose/steamdeck-tv-tiles:propose/steamdeck-tv-tiles
git switch propose/steamdeck-tv-tiles
Sign in to join this conversation.
No reviewers
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
lytedev/nix!1226
No description provided.