[Unit] Description=GNOME session on the headless Xorg (gives Sunshine something to capture) # Without a desktop running on :0, Sunshine's x11 capture grabs an empty black # X root window — pairing, NVENC, and input all work but the client sees only # black. This runs a full GNOME session on :0 so the stream shows a real # desktop. Only relevant to the X11/NVENC capture backend (capture = x11); the # wlr backend's compositor renders for itself. Requires=xorg-headless.service After=xorg-headless.service PartOf=graphical-session.target [Service] Type=simple # Force the X11 session path (not Wayland) onto the existing headless Xorg. # No dbus-run-session wrapper: GNOME integrates with the systemd *user* bus, # which this service already inherits — a fresh bus would break that. Environment=DISPLAY=:0 Environment=XDG_SESSION_TYPE=x11 Environment=XDG_CURRENT_DESKTOP=ubuntu:GNOME Environment=GNOME_SHELL_SESSION_MODE=ubuntu # Wait for the X server to accept connections before launching the session. ExecStartPre=/bin/sh -c 'for i in $(seq 1 20); do xset -display :0 -q >/dev/null 2>&1 && exit 0; sleep 0.5; done; exit 1' ExecStart=/usr/bin/gnome-session --session=ubuntu Restart=on-failure RestartSec=2s [Install] # Lingering user manager reaches default.target without a graphical login, # matching the headless-boot drop-in pattern used for Sunshine. WantedBy=default.target