colinmarc / magic-mirror

A magical game streaming and remote desktop tool for Linux
70 stars 0 forks source link

server download: linux-amd64 client download: linux-amd64 ā€¢ darwin-arm64

Magic Mirror šŸŖžāœØ

This is a game streaming and remote desktop tool for Linux, featuring:

[!WARNING]
Alpha software! Please submit any issues you encounter. Run the server with --bug-report to generate detailed logs and record videos to attach to your report.

Quickstart

Grab the latest release (link above), and run it on a server with a GPU:

$ cat > steam-bigpicture.toml <<EOF
command = ["steam", "-steamos", "-gamepadui"]
xwayland = true
EOF
$ ./mmserver --bind "<your local ip>:9599" -i steam-bigpicture.toml

You can replace steam with your app of choice, or even a full nested desktop environment like Sway.

And then on the client (after installing ffmpeg):

$ ./mmclient "<ip>:9599" steam-bigpicture --codec h265 --resolution 1080

This will work over the local network, or a private IP space like Tailscale. To serve over the public internet, TLS is required. See mmserver.default.toml for more detail on that and other configuration options.

For instructions on building the server and/or client yourself, see BUILD.md.

System Requirements

The following is required to run the server:

The following is required to run the client:

Encoder support

Hardware encoding, based on Vulkan Video, is needed to get the best performance and latency. CPU-based encode is available as a fallback, but it's much slower.

To see if your GPU supports video encoding, see the following matrix for your vendor: AMD ā€¢ NVIDIA

Note that with the ffmpeg feature, linking against a system-installed ffmpeg is supported, which may allow you to use specific CPU-based codecs not considered in this table.

Codec CPU AMD NVIDIA Intel[^1]
H.264 āŒ āœ”ļø āœ”ļø ā”
H.265 āœ”ļø āœ”ļø āœ”ļø ā”
AV1 āœ”ļø āŒ āŒ āŒ

[^1]: I don't have an Intel GPU available to test, and it's difficult to find information online about driver/card support for hardware encode. Please let me know how it goes!