Create a Virtual Screen in KDE for Sunshine Streaming

Create a virtual screen in KDE to use a tablet as a secondary display via Sunshine streaming

Under Wayland, KDE does not yet support headless output. We can easily create virtual screens in Hyprland or sway, but in KDE, we can only create virtual displays with krfb-virtualmonitor, and even then, Sunshine cannot detect them. So, if we want to create a virtual display in software and stream it to a tablet or another device without buying a dummy plug, we can use kernel parameters and EDID to force set the display mode.

Update

Sunshine 2026.516.143833, released on May 16, 2026, added KWin capture support. We can now achieve the result described below directly with krfb-virtualmonitor. Refer to Create a Virtual Display with Krfb

Obtain the EDID File

EDID is a metadata format that describes a display device’s characteristics. We can obtain EDID data from a physical monitor or use publicly available configuration files.

To use an existing monitor’s EDID file directly:

ls /sys/class/drm/

You will see devices such as card1-eDP-1 and card1-HDMI-A-1, each representing an output port. Find the EDID file for the corresponding port:

cat /sys/class/drm/card1-eDP-1/edid > edid.bin

You can also find a wider selection of EDID files online

Place the File

sudo mkdir -p /usr/lib/firmware/edid
sudo cp edid.bin /usr/lib/firmware/edid/

Select an Output

List the display output ports:

ls -d1 /sys/class/drm/card*-*
/sys/class/drm/card1-HDMI-A-1
/sys/class/drm/card1-eDP-1

In this article, we use the HDMI output corresponding to card1-HDMI-A-1. The kernel parameters below use the connector name HDMI-A-1, without the card1- prefix. Replace it with the name of your actual output port.

Edit Kernel Parameters

Edit the kernel parameters for the output selected above. The instructions below cover GRUB and systemd-boot; for other boot loaders, refer to their documentation.

GRUB

Modify /etc/default/grub and add the following to GRUB_CMDLINE_LINUX:

GRUB_CMDLINE_LINUX="drm.edid_firmware=HDMI-A-1:edid/edid.bin video=HDMI-A-1:1920x1080@120e"

You can choose the resolution and frame rate. The final e in video=HDMI-A-1:1920x1080@120e tells the operating system to treat the GPU port as if a display were connected, even when no display is actually connected.

Then regenerate the GRUB configuration:

sudo grub-mkconfig -o /boot/grub/grub.cfg

Reboot and check KDE’s display settings. You should see a virtual display on HDMI-A-1.

systemd-boot

If you use a UKI, append the following to /etc/cmdline.d/root.conf:

drm.edid_firmware=HDMI-A-1:edid/edid.bin
video=HDMI-A-1:1920x1080@120e

Then regenerate the UKI with mkinitcpio: sudo mkinitcpio -P.

For regular boot entries, simply edit the options line in loader/entries/*.conf on the boot partition.

Notes

If your GPU driver requires early KMS, meaning it loads during the initramfs stage, make sure the custom EDID binary is included in the initramfs image. Refer to your distribution’s documentation for the exact steps. For example, on Arch Linux with mkinitcpio, append /usr/lib/firmware/edid/edid.bin to the FILES array in /etc/mkinitcpio.conf, then regenerate the initramfs.

Create a Virtual Display with Krfb

Install Krfb:

sudo pacman -S krfb

Create a virtual display of size WIDTH x HEIGHT:

krfb-virtualmonitor --resolution WIDTHxHEIGHT

This should create a screen whose connector name is Virtual-Monitor (you can check it by starting Sunshine in a terminal).

Then, in Sunshine’s settings, change the capture backend under Settings → Advanced → Force a Specific Capture Method to KWin Screencast, and set Settings → Audio/Video → Display ID to Virtual-Monitor.

Streaming

Start Sunshine in a terminal. You should see output like this in the logs:

[2025-07-11 18:31:17.267]: Info: Found display [wayland-0]
[2025-07-11 18:31:17.267]: Info: Found interface: zxdg_output_manager_v1(32) version 3
[2025-07-11 18:31:17.267]: Info: Found interface: zwp_linux_dmabuf_v1(57) version 5
[2025-07-11 18:31:17.267]: Info: Found interface: wl_output(65) version 4
[2025-07-11 18:31:17.267]: Info: Found interface: wl_output(66) version 4
[2025-07-11 18:31:17.267]: Info: Resolution: 1920x1080
[2025-07-11 18:31:17.267]: Info: Resolution: 1920x1080
[2025-07-11 18:31:17.267]: Info: Offset: 1920x0
[2025-07-11 18:31:17.267]: Info: Logical size: 1920x1080
[2025-07-11 18:31:17.267]: Info: Name: eDP-1
[2025-07-11 18:31:17.267]: Info: Found monitor: BOE eDP-1-0x0936
[2025-07-11 18:31:17.267]: Info: Offset: 0x0
[2025-07-11 18:31:17.267]: Info: Logical size: 1920x1080
[2025-07-11 18:31:17.267]: Info: Name: HDMI-A-1
[2025-07-11 18:31:17.267]: Info: Found monitor: AOC HDMI-A-1-28E850
[2025-07-11 18:31:17.267]: Info: -------- Start of KMS monitor list --------
[2025-07-11 18:31:17.267]: Info: Monitor 0 is eDP-1: BOE eDP-1-0x0936
[2025-07-11 18:31:17.267]: Info: Monitor 1 is HDMI-A-1: AOC HDMI-A-1-28E850
[2025-07-11 18:31:17.267]: Info: --------- End of KMS monitor list ---------

[2025-07-11 18:31:17.267]: Info: Monitor 1 is HDMI-A-1: AOC HDMI-A-1-28E850 tells us that Sunshine has detected the virtual display HDMI-A-1, with display number 1. Then open the Sunshine web UI, go to Configuration->Audio/Video->Display number, and set it to 1. Save and apply the configuration, then wait for Sunshine to restart. You should now be able to stream normally.