Temporary remote session recovery
When a remote-only machine is stuck at the greetd TUI, run the Nushell helper from an SSH session
to start one complete PAM/logind Wayland session without changing the persistent NixOS
configuration:
sudo nu ./remote-session.nu
The helper validates its dependencies before changing the current session. It then stops the normal
greetd service, starts a transient systemd-managed greetd configuration on /dev/tty1, and runs
Niri directly. It returns after greetd, Niri, and Sunshine are ready. Tailscale is not affected.
The Virtual-1 output is created persistently by the vkms configuration in
hosts/idols-ai/hardware-intel.nix and configured by hosts/idols-ai/niri-hardware.kdl. It gives
Niri and Sunshine a capture target when both physical monitors attached to the NVIDIA GPU are off.
The output also exists during normal physical sessions; keeping an idle virtual framebuffer has
minor GPU and memory overhead.
Options:
-u USER session user (defaults to SUDO_USER)
-t TTY tty device, for example /dev/tty2
-c COMMAND Wayland session command (defaults to niri --session)
-f, --force replace an existing Niri session without confirmation
--check validate prerequisites without changing service state
A reboot or a manual restart of greetd.service restores the normal TUI configuration.
Clipboard bridge (client -> host paste)
Moonlight's Ctrl+Alt+Shift+V pastes by asking Sunshine to type the text back as
Ctrl+Shift+U <hex> <Enter> key events per character. Only GTK widgets interpret that sequence, so
pasting into a browser address bar or a terminal garbles the content (a URL turns into its literal
hex form). To paste reliably, set the real clipboard of the streamed session instead and then use
a normal Ctrl+V.
clipboard.nu(host side): reads text from stdin and writes it to the clipboard of the compositor Sunshine is currently streaming to. The streamed session is found via the runningsunshineprocess environment (WAYLAND_DISPLAY/XDG_RUNTIME_DIR), so this works for both thegreetd-sunshineremote session and a regular desktop session.send-clipboard.nu(client side, Linux): pipes the client clipboard to the host over SSH.
Host usage (input must be piped, not typed):
printf 'https://example.com/path?q=1' | nu ./clipboard.nu
Client usage, from the Moonlight client (requires key-based SSH to the host and wl-clipboard on
the client):
wl-paste -n | ssh ryan@ai "nu ~/nix-config/modules/nixos/desktop/networking/sunshine/clipboard.nu"
# or, from this repo:
nu ./send-clipboard.nu ryan@ai
--verify makes the host script read the clipboard back and fail on mismatch. An empty input, or a
host with no active sunshine process, exits with an error.