feat(console): add the standalone Dolphin emulator

The libretro dolphin core lags upstream on compatibility in the same way
LRPS2 does, so install pkgs.dolphin-emu next to pkgs.pcsx2 and run
GameCube and Wii titles through it. The cores stay for the sake of a
single frontend and a shared save/state layout.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Emma Thorpe
2026-09-01 10:08:56 +01:00
co-authored by Claude Opus 5
parent f35cc58bbb
commit 0e10083ea4
3 changed files with 65 additions and 9 deletions
+50
View File
@@ -0,0 +1,50 @@
{
"permissions": {
"allow": [
"Read(//tmp/claude/**)",
"WebFetch(domain:github.com)",
"WebFetch(domain:codeload.github.com)",
"WebFetch(domain:channels.nixos.org)",
"WebFetch(domain:raw.githubusercontent.com)",
"Read(//mnt/c/Users/**)",
"Bash(wsl.exe --version)",
"Bash(ps -eo pid,pcpu,comm)",
"Bash(powershell.exe -NoProfile -Command \"Get-Process vmmemWSL,vmmem,wslservice,msrdc -ErrorAction SilentlyContinue | Select-Object Name,CPU,WorkingSet | Format-Table -AutoSize\")",
"Read(//nix/store/**)",
"Bash(zsh -ic 'bindkey | grep -Ei \"substring|up-line|down-line|\\\\^\\\\[\\\\[A|\\\\^\\\\[OA|\\\\^\\\\[\\\\[B|\\\\^\\\\[OB\"; echo \"--- widgets exist? ---\"; zle -la 2>/dev/null | grep substring || echo \"\\(zle -la only works interactively\\)\"')",
"Read(//home/emmathorpe/.vscode-server/**)",
"Bash(python3 *)",
"Bash(command -v gh)",
"Bash(gh auth *)",
"Bash(tea login *)",
"Read(//home/emmathorpe/.ssh/**)",
"Read(//tmp/**)",
"Bash(/nix/store/kjnr6lh4r8vcf9wr38zylgj1s5a9hl6q-probe2/bin/bat --paging=never -n f1.txt)",
"Bash(/nix/store/kjnr6lh4r8vcf9wr38zylgj1s5a9hl6q-probe2/bin/bat --paging=never -A f1.txt)",
"Bash(timeout 25 curl -sS -o /dev/null -w \"%{http_code}\\\\n\" https://docs.lyrapup.pet/)",
"Bash(timeout 25 curl -sS -o /dev/null -w \"%{http_code}\\\\n\" https://docs.lyrapup.pet/nixfiles/)",
"Bash(timeout 40 tea pr 96 --login code.emmathe.dev --repo lyrathorpe/nixfiles)",
"Bash(sort -t' ' -k3)",
"Bash(tea pr *)",
"Bash(tea repo *)",
"Bash(command -v wsl.exe)",
"Bash(wsl.exe -l -q)",
"Bash(wsl.exe -u root -d NixOS -- id)",
"Bash(docker build *)",
"WebSearch",
"WebFetch(domain:www.last.fm)",
"WebFetch(domain:wiki.servarr.com)",
"Bash(docker run *)",
"Bash(tea repos *)",
"Bash(curl -s -H 'Authorization: token __CMDSUB_OUTPUT__' https://code.emmathe.dev/api/v1/repos/lyrathorpe/music-mirror)",
"Bash(curl -s -H 'Authorization: token __TRACKED_VAR__' https://code.emmathe.dev/api/v1/user)",
"Bash(curl -s -H 'Authorization: token __CMDSUB_OUTPUT__' https://code.emmathe.dev/api/v1/repos/lyrathorpe/music-curator/actions/tasks?limit=3)",
"Read(//home/emmathorpe/.config/tea/**)",
"Bash(curl -s -H 'Authorization: token __CMDSUB_OUTPUT__' https://code.emmathe.dev/api/v1/repos/lyrathorpe/music-curator/actions/secrets)",
"Bash(curl -s -H 'Authorization: token __CMDSUB_OUTPUT__' https://code.emmathe.dev/api/v1/repos/lyrathorpe/music-curator/actions/jobs/2629/logs)",
"Bash(gh search *)"
]
},
"enabledMcpjsonServers": ["jenkins-uce", "jenkins-stf"],
"disabledMcpjsonServers": ["grafana"]
}
+11 -9
View File
@@ -124,11 +124,11 @@ The greeter is **Dvorak**, like every other host here (`modules/sway.nix` forces
`XKB_DEFAULT_VARIANT=dvorak` on cage). Only relevant if someone else has to type `XKB_DEFAULT_VARIANT=dvorak` on cage). Only relevant if someone else has to type
a password. a password.
### Adding RetroArch, PCSX2 and Clone Hero to Big Picture ### Adding non-Steam titles to Big Picture
All three are installed system-wide but are not Steam titles. Added as Steam RetroArch, PCSX2, Dolphin and Clone Hero are installed system-wide but are not
shortcuts they appear in Big Picture and inherit Steam Input, so the controller Steam titles. Added as Steam shortcuts they appear in Big Picture and inherit
works in them without further configuration. Steam Input, so the controller works in them without further configuration.
Steam's own **Games → Add a Non-Steam Game** is the documented route and is also Steam's own **Games → Add a Non-Steam Game** is the documented route and is also
the one that tends not to work. Both that dialog's **Browse** button and the the one that tends not to work. Both that dialog's **Browse** button and the
@@ -156,6 +156,7 @@ Independent of the dialog, `steamtinkerlaunch` writes `shortcuts.vdf` directly:
# Steam must be closed -- it rewrites shortcuts.vdf on exit. # Steam must be closed -- it rewrites shortcuts.vdf on exit.
steamtinkerlaunch addnonsteamgame -an="RetroArch" -ep="$(command -v retroarch)" steamtinkerlaunch addnonsteamgame -an="RetroArch" -ep="$(command -v retroarch)"
steamtinkerlaunch addnonsteamgame -an="PCSX2" -ep="$(command -v pcsx2-qt)" steamtinkerlaunch addnonsteamgame -an="PCSX2" -ep="$(command -v pcsx2-qt)"
steamtinkerlaunch addnonsteamgame -an="Dolphin" -ep="$(command -v dolphin-emu)"
steamtinkerlaunch addnonsteamgame -an="Clone Hero" -ep="$(command -v clonehero)" steamtinkerlaunch addnonsteamgame -an="Clone Hero" -ep="$(command -v clonehero)"
``` ```
@@ -221,11 +222,12 @@ cores lag on compatibility and are the first place to look when a GameCube, Wii
or PS2 title misbehaves. or PS2 title misbehaves.
That has already happened for PS2: the LRPS2 core was not good enough in That has already happened for PS2: the LRPS2 core was not good enough in
practice, so **standalone `pkgs.pcsx2` is installed** in `gaming.nix` alongside practice. **`pkgs.pcsx2` and `pkgs.dolphin-emu` are both installed** in
the core and is what PS2 titles should be run through. `pkgs.dolphin-emu` is not `gaming.nix` alongside their cores, and are what PS2, GameCube and Wii titles
installed; add it the same way if GameCube or Wii turns out to need it. should be run through. The cores stay for the sake of a single frontend and a
shared save/state layout.
Both are controller-driven and can be added to Big Picture the same way as Both are controller-driven and are added to Big Picture the same way as
RetroArch. The hardware is not the limit here — a GTX 1070 and a Haswell i7 run RetroArch. The hardware is not the limit here — a GTX 1070 and a Haswell i7 run
PS2 and Wii comfortably. PS2 and Wii comfortably.
@@ -278,7 +280,7 @@ once, in their own UIs:
- **Steam** — Settings → Storage → the `+` control → add `/srv/games/steam` as a - **Steam** — Settings → Storage → the `+` control → add `/srv/games/steam` as a
library folder. Games installed there survive a reinstall of the OS. That library folder. Games installed there survive a reinstall of the OS. That
picker is the broken one described under picker is the broken one described under
[Adding RetroArch, PCSX2 and Clone Hero to Big Picture](#adding-retroarch-pcsx2-and-clone-hero-to-big-picture); [Adding non-Steam titles to Big Picture](#adding-non-steam-titles-to-big-picture);
when it comes up blank, use Steam's own console instead — open Steam with when it comes up blank, use Steam's own console instead — open Steam with
`steam -console`, pick the **CONSOLE** tab and run: `steam -console`, pick the **CONSOLE** tab and run:
+4
View File
@@ -246,6 +246,10 @@ in
environment.systemPackages = [ environment.systemPackages = [
retroarch retroarch
pkgs.clonehero pkgs.clonehero
# Standalone GameCube/Wii and PS2, alongside the libretro cores of the same
# name: upstream effort goes into these builds, so they are what the two
# heaviest systems should actually be run through.
pkgs.dolphin-emu
pkgs.pcsx2 pkgs.pcsx2
pkgs.dualsensectl # DualSense LED/battery/mic control from the shell pkgs.dualsensectl # DualSense LED/battery/mic control from the shell
# Writes shortcuts.vdf from the shell. Steam's own "Add a Non-Steam Game" # Writes shortcuts.vdf from the shell. Steam's own "Add a Non-Steam Game"