Sunshine
The Sunshine extension adds Sunshine, a self-hosted game streaming host for Moonlight, to a Frostyard desktop image. Use it to stream your desktop to a Moonlight client. Every image carries the extension’s definition, switched off. The extension itself is not in the image: Updex turns it on and downloads it.
Before you start
Section titled “Before you start”You need:
- A Frostyard desktop image (Snow, Snowfield, or Sundog). The extension is built on the desktop base, so it is not for Floe.
- Root access to enable, update, and remove the extension.
- Network access to
https://repository.frostyard.org/ext/sunshine/. - Free space in
/varfor the image.
Sunshine has no published test results on Frostyard images yet. Try it on a machine you can spare first.
Enable Sunshine
Section titled “Enable Sunshine”See what Updex found, then enable the feature and download it now:
updex features list --component=sunshinesudo updex features enable sunshine --nowsunshine appears as a component, with its feature disabled. The enable command
downloads the image, checks its checksum and signature, links it, and refreshes
the merge.
Check the merge and the program and its helper unit:
systemd-sysext statuscommand -v sunshinegetcap /usr/bin/sunshinesystemctl status snosi-sysext-udev-reload.servicesystemd-sysext status lists sunshine. command -v sunshine prints /usr/bin/sunshine. getcap shows cap_sys_admin,cap_sys_nice=p. snosi-sysext-udev-reload.service is active.
If enable --now exits with a refresh error (refresh_error in JSON), the
download worked, but the activation did not. If the output says
activation did not finish, the extension is merged, but users and groups can
be missing: reboot. Otherwise the merge state is unknown: reboot. A
sudo systemd-sysext refresh by hand does not create users and groups. Then run
the checks above again.
Use Sunshine
Section titled “Use Sunshine”Start Sunshine from your applications (the Sunshine launcher), or from a terminal as your own user:
systemctl --user start app-dev.lizardbyte.app.Sunshine.serviceNothing starts the user service for you. Frostyard adds no user preset and no boot-time drop-in for it.
Sunshine keeps the upstream defaults. Open the web UI at https://localhost:47990. Streaming uses TCP ports 47984, 47989, and 48010, and UDP ports 47998 to 48000.
The extension also adds the uhid kernel module entry and the udev rules in /usr/lib/udev/rules.d/60-sunshine.rules for virtual input devices. udev reads its rules before the extension merges, so snosi-sysext-udev-reload.service loads them again after the merge. It runs at boot, and no test shows that it runs on a live merge. Reboot after enable --now.
/usr/bin/sunshine carries the file capabilities cap_sys_admin and cap_sys_nice. The build fails if they differ.
Update, roll back, and remove
Section titled “Update, roll back, and remove”Check for an update, then install it:
updex features check --component=sunshinesudo updex features update --component=sunshineUpdex downloads and verifies the new image, switches the link, deletes older versions, and refreshes the merge. See Manage system extensions for --no-vacuum, --dry-run, and the update timer. The refresh swaps /usr under the running system. Stop any stream first.
Roll back with sudo updex features rollback sunshine. It takes effect at the next boot. See Roll back.
Remove Sunshine:
sudo updex features disable sunshine --now --forceUpdex unmerges all extensions on the host, deletes the image, and merges the rest again. The program, its launcher, and its udev rules go. Reboot when the command finishes. Without --force, Updex refuses while the image is merged.
What ships
Section titled “What ships”| Item | What you get |
|---|---|
| Package | sunshine, the upstream Debian Trixie package, installed into the image with dpkg. The build checks the download against a pinned checksum |
| Support packages | debianutils, libcap2, libcurl4t64, libdrm2, libevdev2, libgbm1, libglib2.0-0t64, libicu76, libminiupnpc18, libnuma1, libopus0, libpipewire-0.3-0t64, libpulse0, libqt6core6t64, libqt6gui6, libqt6svg6, libqt6widgets6, libssl3t64, libva2, libva-drm2, libvulkan1, libwayland-client0, libx11-6, libxtst6, miniupnpc, qt6-qpa-plugins, qt6-wayland |
| Program | /usr/bin/sunshine, with cap_sys_admin,cap_sys_nice capabilities |
| Launcher and files | dev.lizardbyte.app.Sunshine.desktop, its icon, /usr/share/sunshine/apps.json, and /usr/share/sunshine/web/ |
| Input setup | /usr/lib/modules-load.d/60-sunshine.conf and /usr/lib/udev/rules.d/60-sunshine.rules |
| Version | The image file name carries the sunshine package version, plus a +rN snosi revision when one is set |
| Image file | sunshine_<version>_<os>_<arch>.raw.zst; .raw.xz, .raw.gz, and .raw also work |
| Download | From https://repository.frostyard.org/ext/sunshine/, signature required (Verify=true), into /var/lib/extensions.d/ |
| Services | User unit app-dev.lizardbyte.app.Sunshine.service, started by hand. System unit snosi-sysext-udev-reload.service, on at boot |
The image is built on the desktop base. Each build checks the program, the user unit, the launcher, the icon, the web files, the udev and modules-load files, and the reload unit. A build that is missing one fails.
See also
Section titled “See also”Sources
Section titled “Sources”Reviewed 2026-10-27; Updex facts reviewed 2026-10-30. snosi commit
b2858ca0222814c395cf8248db98f3e096d57dc9;
Updex v2.1.3 commit
2661e987faac986f2594d1d9bbbadf1bf3053f5b.
-
mkosi.images/sunshine/mkosi.extra/usr/lib/systemd/system/multi-user.target.d/10-sunshine.conf -
mkosi.images/base/mkosi.extra/usr/lib/sysupdate.sunshine.d/sunshine.feature -
mkosi.images/base/mkosi.extra/usr/lib/sysupdate.sunshine.d/sunshine.transfer -
Updex
docs/adr/0019-apply-merged-sysusers-and-tmpfiles-on-a-live-refresh.md(a live refresh runssystemd-sysusersandsystemd-tmpfiles --create; when the last refresh fails, the merge state is unknown; a refresh by hand does not runsystemd-sysusers)