Share a dedicated screen through Sunshine without an HDMI or DisplayPort dummy plug.
Virtual Display was created for people who use Sunshine to stream their desktop and games but do not want to keep a physical dummy dongle connected to the GPU. It gives you a friendly tray control for an existing software-provisioned monitor: turn the streaming display on when you need it, then remove it from your desktop when the session is over.
No dummy plug. No extra cable. No permanently extended desktop.
A dedicated virtual monitor lets Sunshine capture a predictable output without sharing your physical screen or changing its resolution. Virtual Display keeps that output out of the way until it is actually needed.
- Enable or disable the virtual output from the system tray.
- Keep the physical display primary.
- Start automatically after login while the virtual output remains disabled.
- Open GNOME Display Settings directly from the app.
- Avoid buying and maintaining an HDMI or DisplayPort dummy plug.
- Use the display with Sunshine, screen recorders, test tools, or any other app.
Virtual Display is independent from Sunshine. It does not change Sunshine's configuration and can be used with any software that benefits from a separate monitor.
- On GNOME, the operating system exposes a virtual DRM connector using EDID firmware or another platform-specific virtual display driver. On Hyprland, Virtual Display creates a compositor headless output when enabled.
- Virtual Display discovers the physical and virtual connectors.
- The tray menu applies a safe GNOME layout through
gdctlwhen you choose Enable Virtual Display or Disable Virtual Display.
The application intentionally does not install a display driver. Provisioning is hardware- and operating-system-specific, and forcing the wrong connector can make a login screen inaccessible.
- Linux with GNOME, Wayland, and
gdctl, or Hyprland withhyprctl. - GNOME requires a virtual DRM connector supplied through the kernel's
drm.edid_firmware=CONNECTOR:FILEargument. Hyprland uses aVIRTUAL-1headless output and does not require EDID firmware. - Exactly one active physical monitor.
If multiple physical monitors are active, the app refuses to change the layout rather than risk disabling or rearranging them. Windows and macOS backends are planned but not implemented yet.
Download the latest packages from GitHub Releases.
Use the AppImage. It runs without layering an RPM into the immutable system and does not require a reboot.
For the smoothest desktop integration, open the downloaded AppImage with Gear Lever and choose Move to the app menu. Alternatively, run it directly:
chmod +x virtual-display-*-x86_64.AppImage
./virtual-display-*-x86_64.AppImagesudo apt install ./virtual-display-*-x86_64.debsudo dnf install ./virtual-display-*-x86_64.rpmUse the AppImage instead of the RPM on Bazzite, Silverblue, Kinoite, and other immutable Fedora variants.
Download the .pacman package from the latest
GitHub Release
and install it with:
sudo pacman -U ./virtual-display-*.pacmanThe package is also suitable for Manjaro, EndeavourOS, and other Arch-based distributions. It installs the application, desktop entry, icon, and required runtime dependencies without requiring AppImage/FUSE support.
The .tar.gz release contains the unpacked application and is useful when
AppImage, DEB, and RPM installation are unavailable.
Every release includes SHA256SUMS. Verify files downloaded into the same
directory with:
sha256sum --check SHA256SUMS --ignore-missingLaunch Virtual Display once after installing it. The app creates its login autostart entry and remains available from the system tray.
Node.js 22.12 or newer is required. On immutable Bazzite systems, Node can be installed through Linuxbrew without changing the base image.
brew install node
npm ci
npm test
npm run distnpm run dist creates the x86_64 AppImage. To build every Linux release format:
npm run dist:linuxFor a local source build, the helper below installs the generated AppImage under
~/.local/lib, creates a desktop launcher, and starts it:
./scripts/install.shThe helper does not modify kernel arguments, GDM, Sunshine, Steam, or existing monitor configuration files.
The monitor icon appears in GNOME's top bar through the AppIndicator extension.
- Open Virtual Display opens the status window.
- Enable Virtual Display adds the virtual monitor to the desktop.
- Disable Virtual Display removes it while keeping the physical display.
- Refresh checks the current GNOME display state.
- Quit stops the tray application.
Closing the status window keeps the tray process running.
./scripts/rollback.shUninstall removes only the application, launcher, icon, and autostart entry. It intentionally leaves virtual-display drivers and kernel provisioning alone.
build/generic-4k60.bin is the EDID used while developing the Linux backend.
It advertises common modes up to 4K at 60 Hz, HDR10, 10-bit color, and stereo
audio. Rebuild and validate it with:
./scripts/generate-edid.shDo not deploy an EDID unless edid-decode --check reports
EDID conformity: PASS.
Windows and macOS need their own implementations behind the existing platform backend boundary. Contributions for additional compositors, virtual display drivers, packaging formats, and safer multi-monitor preservation are welcome.
app/: Electron main process, renderer, preload bridge, and OS backends.test/: backend parser and safety tests.scripts/: application installation, removal, screenshot, and EDID tooling.vendor/edid-generator/: required EDID generator modules and original license.
Virtual Display is released under the MIT License. See LICENSE and
THIRD_PARTY_NOTICES.md.
