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
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
shortcuts they appear in Big Picture and inherit Steam Input, so the controller
works in them without further configuration.
RetroArch, PCSX2, Dolphin and Clone Hero are installed system-wide but are not
Steam titles. Added as Steam shortcuts they appear in Big Picture and inherit
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
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.
steamtinkerlaunch addnonsteamgame -an="RetroArch" -ep="$(command -v retroarch)"
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)"
```
@@ -221,11 +222,12 @@ cores lag on compatibility and are the first place to look when a GameCube, Wii
or PS2 title misbehaves.
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
the core and is what PS2 titles should be run through. `pkgs.dolphin-emu` is not
installed; add it the same way if GameCube or Wii turns out to need it.
practice. **`pkgs.pcsx2` and `pkgs.dolphin-emu` are both installed** in
`gaming.nix` alongside their cores, and are what PS2, GameCube and Wii titles
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
PS2 and Wii comfortably.
@@ -278,7 +280,7 @@ once, in their own UIs:
- **Steam** — Settings → Storage → the `+` control → add `/srv/games/steam` as a
library folder. Games installed there survive a reinstall of the OS. That
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
`steam -console`, pick the **CONSOLE** tab and run:
+4
View File
@@ -246,6 +246,10 @@ in
environment.systemPackages = [
retroarch
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.dualsensectl # DualSense LED/battery/mic control from the shell
# Writes shortcuts.vdf from the shell. Steam's own "Add a Non-Steam Game"