A macOS screensaver that displays live NetHack games from nethack.alt.org or hardfought.org.
It connects via SSH to a dgamelaunch server, picks a random active game that fits your screen, and renders the terminal output in a fullscreen window. When a game goes idle or ends, it automatically switches to another. If no live games are available, it plays back recorded games (ttyrec files) from the NAO archive.
The screensaver bundle (.saver) is the primary way to run NH Watcher. It hooks into the macOS screen-saver system, so it launches, exits, and locks the screen through the same mechanism as any other screensaver.
brew tap pneumaticdeath/nhwatcher
brew install --cask nhwatchermake installThen open System Settings > Wallpaper > Screen Saver and select NH Watcher.
There is also a small menu-bar app that adds a Watch now launcher — useful when you want to spectate a game without waiting for the screensaver to kick in. It does not auto-activate on idle (that is the screensaver's job).
make install-app # copies "NH Watcher.app" to /Applications
open "/Applications/NH Watcher.app"The tray icon has two items: Watch now and Quit. Any keypress or mouse movement exits the spectating window.
make runRuns the viewer in a single fullscreen window with no screensaver or menu-bar wrapping. S switches games, Q / Escape quits.
Requires Go and Xcode command line tools.
# Build the .saver bundle
make saver
# Build the menu-bar helper .app bundle
make app-bundle
# Build just the Go binary
make app
# Run tests
go test ./internal/nao/
# Uninstall
make uninstall # removes the .saver
make uninstall-app # removes the menu-bar .app- Connects via SSH to
nethack@alt.orgor one of thehardfought.orgservers (no credentials needed) - Navigates the dgamelaunch watch menu
- Parses the game list, filters to non-idle games that fit the terminal
- Selects one at random and streams the live terminal output
- Switches games after 2 minutes of inactivity or when the watched game ends
- Falls back to ttyrec playback when no live games are available

