Configuration

@admonition{ Host authority | @htmlonly By providing the host authority (URI + port), you can easily open each configuration option in the config UI.

Host authority: @endhtmlonly }

Sunshine will work with the default settings for most users. In some cases you may want to configure Sunshine further.

The default location for the configuration file is listed below. You can use another location if you choose, by passing in the full configuration file path as the first argument when you start Sunshine.

Example

sunshine ~/sunshine_config.conf

The default location of the apps.json is the same as the configuration file. You can use a custom location by modifying the configuration file.

Default Config Directory

OS

Location

Docker

@code{}/config@endcode

FreeBSD

@code{}~/.config/sunshine@endcode

Linux

@code{}~/.config/sunshine@endcode

macOS

@code{}~/.config/sunshine@endcode

Windows

@code{}%ProgramFiles%\Sunshine\config@endcode

Although it is recommended to use the configuration UI, it is possible manually configure Sunshine by editing the conf file in a text editor. Use the examples as reference.

General

locale

Description The locale used for Sunshine's user interface.
Default @code{} en @endcode
Example @code{} locale = en @endcode
Choices bg Bulgarian
cs Czech
de German
en English
en_GB English (UK)
en_US English (United States)
es Spanish
fr French
it Italian
ja Japanese
ko Korean
pl Polish
pt Portuguese
pt_BR Portuguese (Brazilian)
ru Russian
sv Swedish
tr Turkish
uk Ukranian
zh Chinese (Simplified)
zh_TW Chinese (Traditional)

sunshine_name

Description The name displayed by Moonlight.
Default PC hostname
Example @code{} sunshine_name = Sunshine @endcode

min_log_level

Description The minimum log level printed to standard out.
Default @code{} info @endcode
Example @code{} min_log_level = info @endcode
Choices verbose All logging message. @attention{This may negatively affect streaming performance.}
debug Debug log messages and higher. @attention{This may negatively affect streaming performance.}
info Informational log messages and higher.
warning Warning log messages and higher.
error Error log messages and higher.
fatal Only fatal log messages.
none No log messages.

global_prep_cmd

Description A list of commands to be run before/after all applications. If any of the prep-commands fail, starting the application is aborted.
Default @code{} [] @endcode
Example @code{} global_prep_cmd = [{"do":"nircmd.exe setdisplay 1280 720 32 144","elevated":true,"undo":"nircmd.exe setdisplay 2560 1440 32 144"}] @endcode

notify_pre_releases

Description Whether to be notified of new pre-release versions of Sunshine.
Default @code{} enabled @endcode
Example @code{} notify_pre_releases = disabled @endcode

update_check_interval

Description Interval in seconds between automatic checks for new Sunshine releases. Set to 0 to disable periodic checking. Checks are date-based: Sunshine compares its build date to the latest release (and pre-releases if enabled) and notifies when a newer build is available.
Default @code{} 86400 @endcode (24 hours)
Example @code{} update_check_interval = 14400 @endcode

system_tray

Description Show icon in system tray and display desktop notifications.
Default @code{} enabled @endcode
Example @code{} system_tray = enabled @endcode

Input

controller

Description Whether to allow controller input from the client.
Default @code{} enabled @endcode
Example @code{} controller = enabled @endcode

gamepad

Description The type of gamepad to emulate on the host.
Default @code{} auto @endcode
Example @code{} gamepad = auto @endcode
Choices ds4 DualShock 4 controller (PS4) @note{This option applies to Windows only.}
ds5 DualShock 5 controller (PS5) @note{This option applies to FreeBSD and Linux only.}
switch Switch Pro controller @note{This option applies to FreeBSD and Linux only.}
x360 Xbox 360 controller @note{This option applies to Windows only.}
xone Xbox One controller @note{This option applies to FreeBSD and Linux only.}

ds4_back_as_touchpad_click

Description Allow Select/Back inputs to also trigger DS4 touchpad click. Useful for clients looking to emulate touchpad click on Xinput devices. @hint{Only applies when gamepad is set to ds4 manually. Unused in other gamepad modes.}
Default @code{} enabled @endcode
Example @code{} ds4_back_as_touchpad_click = enabled @endcode

motion_as_ds4

Description If a client reports that a connected gamepad has motion sensor support, emulate it on the host as a DS4 controller.

When disabled, motion sensors will not be taken into account during gamepad type selection. @hint{Only applies when gamepad is set to auto.}
Default @code{} enabled @endcode
Example @code{} motion_as_ds4 = enabled @endcode

touchpad_as_ds4

Description If a client reports that a connected gamepad has a touchpad, emulate it on the host as a DS4 controller.

When disabled, touchpad presence will not be taken into account during gamepad type selection. @hint{Only applies when gamepad is set to auto.}
Default @code{} enabled @endcode
Example @code{} touchpad_as_ds4 = enabled @endcode

back_button_timeout

Description If the Back/Select button is held down for the specified number of milliseconds, a Home/Guide button press is emulated. @tip{If back_button_timeout < 0, then the Home/Guide button will not be emulated.}
Default @code{} -1 @endcode
Example @code{} back_button_timeout = 2000 @endcode

keyboard

Description Whether to allow keyboard input from the client.
Default @code{} enabled @endcode
Example @code{} keyboard = enabled @endcode

key_repeat_delay

Description The initial delay, in milliseconds, before repeating keys. Controls how fast keys will repeat themselves.
Default @code{} 500 @endcode
Example @code{} key_repeat_delay = 500 @endcode

key_repeat_frequency

Description How often keys repeat every second. @tip{This configurable option supports decimals.}
Default @code{} 24.9 @endcode
Example @code{} key_repeat_frequency = 24.9 @endcode

always_send_scancodes

Description Sending scancodes enhances compatibility with games and apps but may result in incorrect keyboard input from certain clients that aren't using a US English keyboard layout.

Enable if keyboard input is not working at all in certain applications.

Disable if keys on the client are generating the wrong input on the host. @caution{Applies to Windows only.}
Default @code{} enabled @endcode
Example @code{} always_send_scancodes = enabled @endcode

key_rightalt_to_key_win

Description It may be possible that you cannot send the Windows Key from Moonlight directly. In those cases it may be useful to make Sunshine think the Right Alt key is the Windows key.
Default @code{} disabled @endcode
Example @code{} key_rightalt_to_key_win = enabled @endcode

mouse

Description Whether to allow mouse input from the client.
Default @code{} enabled @endcode
Example @code{} mouse = enabled @endcode

high_resolution_scrolling

Description When enabled, Sunshine will pass through high resolution scroll events from Moonlight clients.
This can be useful to disable for older applications that scroll too fast with high resolution scroll events.
Default @code{} enabled @endcode
Example @code{} high_resolution_scrolling = enabled @endcode

native_pen_touch

Description When enabled, Sunshine will pass through native pen/touch events from Moonlight clients.
This can be useful to disable for older applications without native pen/touch support.
Default @code{} enabled @endcode
Example @code{} native_pen_touch = enabled @endcode

keybindings

Description Sometimes it may be useful to map keybindings. Wayland won't allow clients to capture the Win Key for example. @tip{See [virtual key codes](https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes)} @hint{keybindings needs to have a multiple of two elements.} @note{This option is not available in the UI. A PR would be welcome.}
Default @code{} [ 0x10, 0xA0, 0x11, 0xA2, 0x12, 0xA4 ] @endcode
Example @code{} keybindings = [ 0x10, 0xA0, 0x11, 0xA2, 0x12, 0xA4, 0x4A, 0x4B ] @endcode

ds5_inputtino_randomize_mac

Description Randomize the MAC-Address for the generated virtual controller. @hint{Only applies on linux for gamepads created as PS5-style controllers}
Default @code{} enabled @endcode
Example @code{} ds5_inputtino_randomize_mac = enabled @endcode

Audio/Video

audio_sink

Description The name of the audio sink used for audio loopback. @tip{To find the name of the audio sink follow these instructions.

**FreeBSD/Linux + pulseaudio:**
@code{} pacmd list-sinks | grep "name:" @endcode

**FreeBSD/Linux + pipewire:**
@code{} pactl info | grep Source # in some causes you'd need to use the `Sink` device, if `Source` doesn't work, so try: pactl info | grep Sink @endcode

**macOS:**
Sunshine can only access microphones on macOS due to system limitations. To stream system audio use [Soundflower](https://github.com/mattingalls/Soundflower) or [BlackHole](https://github.com/ExistentialAudio/BlackHole).

**Windows:**
Enter the following command in command prompt or PowerShell. @code{} %ProgramFiles%\Sunshine\tools\audio-info.exe @endcode If you have multiple audio devices with identical names, use the Device ID instead. } @attention{If you want to mute the host speakers, use [virtual_sink](#virtual_sink) instead.}
Default Sunshine will select the default audio device.
Example (FreeBSD/Linux) @code{} audio_sink = alsa_output.pci-0000_09_00.3.analog-stereo @endcode
Example (macOS) @code{} audio_sink = BlackHole 2ch @endcode
Example (Windows) @code{} audio_sink = Speakers (High Definition Audio Device) @endcode

virtual_sink

Description The audio device that's virtual, like Steam Streaming Speakers. This allows Sunshine to stream audio, while muting the speakers. @tip{See [audio_sink](#audio_sink)!} @tip{These are some options for virtual sound devices. * Stream Streaming Speakers (Linux, macOS, Windows) * Steam must be installed. * Enable [install_steam_audio_drivers](#install_steam_audio_drivers) or use Steam Remote Play at least once to install the drivers. * [Virtual Audio Cable](https://vb-audio.com/Cable) (macOS, Windows) }
Default n/a
Example @code{} virtual_sink = Steam Streaming Speakers @endcode

install_steam_audio_drivers

Description Installs the Steam Streaming Speakers driver (if Steam is installed) to support surround sound and muting host audio. @note{This option is only supported on Windows.}
Default @code{} enabled @endcode
Example @code{} install_steam_audio_drivers = enabled @endcode

stream_audio

Description Whether to stream audio or not. Disabling this can be useful for streaming headless displays as second monitors.
Default @code{} enabled @endcode
Example @code{} stream_audio = disabled @endcode

adapter_name

Description Select the video card you want to stream. @tip{To find the appropriate values follow these instructions.

**FreeBSD/Linux + VA-API:**
Unlike with *amdvce* and *nvenc*, it doesn't matter if video encoding is done on a different GPU. @code{} ls /dev/dri/renderD* # to find all devices capable of VAAPI # replace ``renderD129`` with the device from above to list the name and capabilities of the device vainfo --display drm --device /dev/dri/renderD129 | \ grep -E "((VAProfileH264High|VAProfileHEVCMain|VAProfileHEVCMain10).*VAEntrypointEncSlice)|Driver version" @endcode To be supported by Sunshine, it needs to have at the very minimum: `VAProfileH264High : VAEntrypointEncSlice`

**Windows:**
Enter the following command in command prompt or PowerShell. @code{} %ProgramFiles%\Sunshine\tools\dxgi-info.exe @endcode For hybrid graphics systems, DXGI reports the outputs are connected to whichever graphics adapter that the application is configured to use, so it's not a reliable indicator of how the display is physically connected. }
Default Sunshine will select the default video card.
Example (FreeBSD/Linux) @code{} adapter_name = /dev/dri/renderD128 @endcode
Example (Windows) @code{} adapter_name = Radeon RX 580 Series @endcode

output_name

Description Select the display number you want to stream. @tip{To find the appropriate values follow these instructions.

**FreeBSD/Linux:**
During Sunshine startup, you should see the list of detected displays: @code{} Info: Detecting displays Info: Detected display: DVI-D-0 (id: 0) connected: false Info: Detected display: HDMI-0 (id: 1) connected: true Info: Detected display: DP-0 (id: 2) connected: true Info: Detected display: DP-1 (id: 3) connected: false Info: Detected display: DVI-D-1 (id: 4) connected: false @endcode You need to use the id value inside the parenthesis, e.g. `1`.

**macOS:**
During Sunshine startup, you should see the list of detected displays: @code{} Info: Detecting displays Info: Detected display: Monitor-0 (id: 3) connected: true Info: Detected display: Monitor-1 (id: 2) connected: true @endcode You need to use the id value inside the parenthesis, e.g. `3`.

**Windows:**
During Sunshine startup, you should see the list of detected displays: @code{} Info: Currently available display devices: [ { "device_id": "{64243705-4020-5895-b923-adc862c3457e}", "display_name": "", "friendly_name": "IDD HDR", "info": null }, { "device_id": "{77f67f3e-754f-5d31-af64-ee037e18100a}", "display_name": "", "friendly_name": "SunshineHDR", "info": null }, { "device_id": "{daeac860-f4db-5208-b1f5-cf59444fb768}", "display_name": "\\\\.\\DISPLAY1", "friendly_name": "ROG PG279Q", "info": { "hdr_state": null, "origin_point": { "x": 0, "y": 0 }, "primary": true, "refresh_rate": { "type": "rational", "value": { "denominator": 1000, "numerator": 119998 } }, "resolution": { "height": 1440, "width": 2560 }, "resolution_scale": { "type": "rational", "value": { "denominator": 100, "numerator": 100 } } } } ] @endcode You need to use the `device_id` value. }
Default Sunshine will select the default display.
Example (FreeBSD/Linux) @code{} output_name = 0 @endcode
Example (macOS) @code{} output_name = 3 @endcode
Example (Windows) @code{} output_name = {daeac860-f4db-5208-b1f5-cf59444fb768} @endcode

virtual_display_mode

Description Select which display Sunshine should prepare before streaming. When set to one of the virtual options, Sunshine will manage a Sudovda virtual display instead of relying on your physical monitor.
Default @code{} disabled @endcode
Example @code{} virtual_display_mode = shared @endcode
Choices disabled Use the physical display selected via output_name.
per_client Create a dedicated virtual display per client connection.
shared Reuse a single virtual display for all clients. Faster reconnects, but only one virtual layout is maintained.

virtual_display_layout

Description Controls how the virtual display is positioned relative to your physical monitors whenever virtual_display_mode is not disabled.
Default @code{} exclusive @endcode
Example @code{} virtual_display_layout = extended_primary_isolated @endcode
Choices exclusive Deactivate every other monitor so only the virtual display remains visible.
extended Keep all existing monitors active and simply add the virtual display as another screen.
extended_primary Extend the desktop while promoting the virtual display to be the primary monitor.
extended_isolated Extend the desktop but move the virtual display far away in the coordinate space so the mouse cannot accidentally reach it.
extended_primary_isolated Combine the primary + isolated behaviors: the virtual display becomes primary while remaining far away from the physical monitors.

dd_configuration_option

Description Perform mandatory verification and additional configuration for the display device. @note{Applies to Windows only.}
Default @code{} verify_only @endcode
Example @code{} dd_configuration_option = ensure_only_display @endcode
Choices disabled Perform no additional configuration (disables all `dd_` configuration options).
verify_only Verify that display is active only (this is a mandatory step without any extra steps to verify display state).
ensure_active Activate the display if it's currently inactive.
ensure_primary Activate the display if it's currently inactive and make it primary.
ensure_only_display Activate the display if it's currently inactive and disable all others.

dd_resolution_option

Description Perform additional resolution configuration for the display device. @note{"Optimize game settings" must be enabled in Moonlight for this option to work.} @note{Applies to Windows only.}
Default @code{}auto@endcode
Example @code{} dd_resolution_option = manual @endcode
Choices disabled Perform no additional configuration.
auto Change resolution to the requested resolution from the client.
manual Change resolution to the user specified one (set via [dd_manual_resolution](#dd_manual_resolution)).

dd_manual_resolution

Description Specify manual resolution to be used. @note{[dd_resolution_option](#dd_resolution_option) must be set to `manual`} @note{Applies to Windows only.}
Default n/a
Example @code{} dd_manual_resolution = 1920x1080 @endcode

dd_refresh_rate_option

Description Perform additional refresh rate configuration for the display device. @note{Applies to Windows only.}
Default @code{}auto@endcode
Example @code{} dd_refresh_rate_option = manual @endcode
Choices disabled Perform no additional configuration.
auto Change refresh rate to the requested FPS value from the client.
manual Change refresh rate to the user specified one (set via [dd_manual_refresh_rate](#dd_manual_refresh_rate)).
prefer_highest Prefer the highest available refresh rate for the selected resolution. Recommended when using a virtual display + RTSS to minimize VSYNC engagement on hosts with global VSYNC enabled and G-SYNC with ULLM.

dd_manual_refresh_rate

Description Specify manual refresh rate to be used. @note{[dd_refresh_rate_option](#dd_refresh_rate_option) must be set to `manual`} @note{Applies to Windows only.}
Default n/a
Example @code{} dd_manual_resolution = 120 dd_manual_resolution = 59.95 @endcode

dd_hdr_option

Description Perform additional HDR configuration for the display device. @note{Applies to Windows only.}
Default @code{}auto@endcode
Example @code{} dd_hdr_option = disabled @endcode
Choices disabled Perform no additional configuration.
auto Change HDR to the requested state from the client if the display supports it.

dd_hdr_request_override

Description Override the HDR request coming from the client. @note{Applies to Windows only.}
Default @code{}auto@endcode
Example @code{} dd_hdr_request_override = force_on @endcode
Choices auto Respect the client-requested HDR state.
force_on Always request HDR on, regardless of client settings.
force_off Always request HDR off, regardless of client settings.

dd_config_revert_delay

Description Additional delay in milliseconds to wait before reverting configuration when the app has been closed or the last session terminated. Main purpose is to provide a smoother transition when quickly switching between apps. @note{Applies to Windows only.}
Default @code{}3000@endcode
Example @code{} dd_config_revert_delay = 1500 @endcode

dd_config_revert_on_disconnect

Description When enabled, display configuration is reverted upon disconnect of all clients instead of app close or last session termination. This can be useful for returning to physical usage of the host machine without closing the active app. @warning{Some applications may not function properly when display configuration is changed while active.} @note{Applies to Windows only.}
Default @code{}disabled@endcode
Example @code{} dd_config_revert_on_disconnect = enabled @endcode

dd_always_restore_from_golden

Description Always attempt to restore the saved golden snapshot before using session snapshots. @note{Applies to Windows only.}
Default @code{}false@endcode
Example @code{} dd_always_restore_from_golden = true @endcode

dd_snapshot_exclude_devices

Description Comma-separated list or JSON array of display device identifiers to ignore when saving display snapshots.
Excluded devices are removed from session and golden snapshots so Sunshine will not restore to transient or dummy displays.
@note{Applies to Windows only.}
Default @code{}[]@endcode
Example @code{} dd_snapshot_exclude_devices = ["{de9bb7e2-186e-505b-9e93-f48793333810}", "\\\\.\\DISPLAY3"] @endcode
Notes Keep at least one display unexcluded so snapshots remain valid.
Device IDs accept the GUID reported by `/api/display-devices` (preferred) or the `\\.\DISPLAYX` name.
Ideal when using both a virtual display and a physical dummy plug so restores skip the dummy plug.

dd_snapshot_restore_hotkey

Description Keyboard shortcut key that restores the display snapshot and tears down any virtual displays.
Useful for forcing virtual displays off and restoring snapshots when Sunshine is paused or stuck. The modifier keys for this hotkey are configured separately via dd_snapshot_restore_hotkey_modifiers. Accepts function keys (F1-F24), letters, digits, or a virtual-key code. @note{Applies to Windows only.}
Default @code{}@endcode
Example @code{} dd_snapshot_restore_hotkey = F12 @endcode
Example @code{} dd_snapshot_restore_hotkey = 0x7B @endcode

dd_snapshot_restore_hotkey_modifiers

Description Modifier keys for the snapshot restore hotkey.
Accepts a delimiter-separated list (e.g., ctrl+alt+shift, ctrl|shift, win, none). Supported tokens: ctrl/control, alt, shift, win/windows/meta, none/off/disabled. @note{Applies to Windows only.}
Default @code{ctrl+alt+shift}@endcode
Example @code{} dd_snapshot_restore_hotkey_modifiers = ctrl+alt @endcode
Example @code{} dd_snapshot_restore_hotkey_modifiers = none @endcode

dd_activate_virtual_display

Description When enabled, Sunshine activates the virtual display driver and makes it the only active display during stream startup. @note{Applies to Windows only.}
Default @code{}false@endcode
Example @code{} dd_activate_virtual_display = true @endcode

dd_mode_remapping

Description Remap the requested resolution and FPS to another display mode.
Depending on the [dd_resolution_option](#dd_resolution_option) and [dd_refresh_rate_option](#dd_refresh_rate_option) values, the following mapping groups are available:
  • `mixed` - both options are set to `auto`.
  • `resolution_only` - only [dd_resolution_option](#dd_resolution_option) is set to `auto`.
  • `refresh_rate_only` - only [dd_refresh_rate_option](#dd_refresh_rate_option) is set to `auto`.
For each of those groups, a list of fields can be configured to perform remapping:
  • `requested_resolution` - resolution that needs to be matched in order to use this remapping entry.
  • `requested_fps` - FPS that needs to be matched in order to use this remapping entry.
  • `final_resolution` - resolution value to be used if the entry was matched.
  • `final_refresh_rate` - refresh rate value to be used if the entry was matched.
If `requested_*` field is left empty, it will match everything.
If `final_*` field is left empty, the original value will not be remapped and either a requested, manual or current value is used. However, at least one `final_*` must be set, otherwise the entry is considered invalid.
@note{"Optimize game settings" must be enabled on client side for ANY entry with `resolution` field to be considered.} @note{First entry to be matched in the list is the one that will be used.} @tip{`requested_resolution` and `final_resolution` can be omitted for `refresh_rate_only` group.} @tip{`requested_fps` and `final_refresh_rate` can be omitted for `resolution_only` group.} @note{Applies to Windows only.}
Default @code{} dd_mode_remapping = { "mixed": [], "resolution_only": [], "refresh_rate_only": [] } @endcode
Example @code{} dd_mode_remapping = { "mixed": [ { "requested_fps": "60", "final_refresh_rate": "119.95", "requested_resolution": "1920x1080", "final_resolution": "2560x1440" }, { "requested_fps": "60", "final_refresh_rate": "120", "requested_resolution": "", "final_resolution": "" } ], "resolution_only": [ { "requested_resolution": "1920x1080", "final_resolution": "2560x1440" } ], "refresh_rate_only": [ { "requested_fps": "60", "final_refresh_rate": "119.95" } ] }@endcode

dd_wa_virtual_double_refresh

Description When using Sunshine's virtual display driver, create and set the virtual monitor to double the target refresh rate to avoid unexplained FPS drops seen on virtual screens.
Disable only if a specific game or virtual monitor behaves incorrectly with the doubled refresh.
@note{Applies to Windows virtual displays only.}
Default @code{}true@endcode
Example @code{} dd_wa_virtual_double_refresh = false @endcode

dd_wa_dummy_plug_hdr10

Description Forces Windows to run the capture output at 30 Hz with HDR enabled so physical HDMI dummy plugs expose 10-bit colour.
Sunshine also keeps the "Disable VSYNC" override engaged to ensure the driver profile disables VSYNC during streams.
Default @code{}false@endcode
Example @code{} dd_wa_dummy_plug_hdr10 = true @endcode
Notes Only enable this when using a physical dummy plug that needs the 10-bit HDR workaround.
The workaround applies to directly launched applications only; Desktop streams keep their normal refresh rate so everyday use remains smooth.
See the @hyperlink{https://github.com/Nonary/documentation/wiki/DummyPlugs#enabling-10-bit-color-on-dummy-plugs-at-high-resolutions}{Dummy Plugs guide} for full setup details.

max_bitrate

Description The maximum bitrate (in Kbps) that Sunshine will encode the stream at. If set to 0, it will always use the bitrate requested by Moonlight.
Default @code{} 0 @endcode
Example @code{} max_bitrate = 5000 @endcode

minimum_fps_target

Description Sunshine tries to save bandwidth when content on screen is static or a low framerate. Because many clients expect a constant stream of video frames, a certain amount of duplicate frames are sent when this happens. This setting controls the lowest effective framerate a stream can reach.
Default @code{} 0 @endcode
Choices 0 Use half the stream's FPS as the minimum target.
1-1000 Specify your own value. The real minimum may differ from this value.

Network

upnp

Description Sunshine will attempt to open ports for streaming over the internet.
Default @code{} disabled @endcode
Example @code{} upnp = enabled @endcode

address_family

Description Set the address family that Sunshine will use.
Default @code{} ipv4 @endcode
Example @code{} address_family = both @endcode
Choices ipv4 IPv4 only
both IPv4+IPv6

bind_address

Description Set the IP address to bind Sunshine to. This is useful when you have multiple network interfaces and want to restrict Sunshine to a specific one. If not set, Sunshine will bind to all available interfaces (0.0.0.0 for IPv4 or :: for IPv6).

Note: The address must be valid for the system and must match the address family being used. When using IPv6, you can specify an IPv6 address even with address_family set to "both".
Default @code{} (empty - bind to all interfaces) @endcode
Example (IPv4) @code{} bind_address = 192.168.1.100 @endcode
Example (IPv6) @code{} bind_address = 2001:db8::1 @endcode
Example (Loopback) @code{} bind_address = 127.0.0.1 @endcode

port

Description Set the family of ports used by Sunshine. Changing this value will offset other ports as shown in config UI.
Default @code{} 47989 @endcode
Range 1029-65514
Example @code{} port = 47989 @endcode

origin_web_ui_allowed

Description The origin of the remote endpoint address that is not denied for HTTPS Web UI.
Default @code{} lan @endcode
Example @code{} origin_web_ui_allowed = lan @endcode
Choices pc Only localhost may access the web ui
lan Only LAN devices may access the web ui
wan Anyone may access the web ui

external_ip

Description If no external IP address is given, Sunshine will attempt to automatically detect external ip-address.
Default Automatic
Example @code{} external_ip = 123.456.789.12 @endcode

lan_encryption_mode

Description This determines when encryption will be used when streaming over your local network. @warning{Encryption can reduce streaming performance, particularly on less powerful hosts and clients.}
Default @code{} 0 @endcode
Example @code{} lan_encryption_mode = 0 @endcode
Choices 0 encryption will not be used
1 encryption will be used if the client supports it
2 encryption is mandatory and unencrypted connections are rejected

wan_encryption_mode

Description This determines when encryption will be used when streaming over the Internet. @warning{Encryption can reduce streaming performance, particularly on less powerful hosts and clients.}
Default @code{} 1 @endcode
Example @code{} wan_encryption_mode = 1 @endcode
Choices 0 encryption will not be used
1 encryption will be used if the client supports it
2 encryption is mandatory and unencrypted connections are rejected

ping_timeout

Description How long to wait, in milliseconds, for data from Moonlight before shutting down the stream.
Default @code{} 10000 @endcode
Example @code{} ping_timeout = 10000 @endcode

video_max_batch_size_kb

Description Maximum size in KiB for each outgoing video send batch. The default is 64 KiB. Lower values can improve stream stability on cheaper switches, routers, and Wi-Fi hardware by reducing burst size, but at the cost of less than 1 ms of additional host-side delay.
Default @code{} 64 @endcode
Choices 16, 32, 64
Example @code{} video_max_batch_size_kb = 32 @endcode

Config Files

file_apps

Description The application configuration file path. The file contains a JSON formatted list of applications that can be started by Moonlight.
Default @code{} apps.json @endcode
Example @code{} file_apps = apps.json @endcode

credentials_file

Description The file where user credentials for the UI are stored.
Default @code{} sunshine_state.json @endcode
Example @code{} credentials_file = sunshine_state.json @endcode

session_token_ttl_seconds

Description Web UI session timeout in seconds. Determines how long a login session remains valid before re-authentication is required.
Default @code{} 7200 @endcode (2 hours)
Notes For higher security on shared systems, reduce this value (e.g. 3600 for 1 hour). Minimum is 1 second.
Example @code{} session_token_ttl_seconds = 3600 @endcode

remember_me_refresh_token_ttl_seconds

Description Time-to-live for remember-me refresh tokens, in seconds.
Default @code{}604800@endcode
Example @code{} remember_me_refresh_token_ttl_seconds = 259200 @endcode

log_path

Description Determines where Sunshine stores log sessions. When this value points to a file (the default), Sunshine keeps a rolling logs folder next to that file and keeps the last 30 sessions, each capped at about 10 MiB by rolling ~2MB log files. Pointing to a directory stores the logs folder at the specified location.
Default @code{} sunshine.log @endcode
Example @code{} log_path = sunshine.log @endcode

pkey

Description The private key used for the web UI and Moonlight client pairing. For best compatibility, this should be an RSA-2048 private key. @warning{Not all Moonlight clients support ECDSA keys or RSA key lengths other than 2048 bits.}
Default @code{} credentials/cakey.pem @endcode
Example @code{} pkey = /dir/pkey.pem @endcode

cert

Description The certificate used for the web UI and Moonlight client pairing. For best compatibility, this should have an RSA-2048 public key. @warning{Not all Moonlight clients support ECDSA keys or RSA key lengths other than 2048 bits.}
Default @code{} credentials/cacert.pem @endcode
Example @code{} cert = /dir/cert.pem @endcode

file_state

Description The file where current state of Sunshine is stored.
Default @code{} sunshine_state.json @endcode
Example @code{} file_state = sunshine_state.json @endcode

luminalshine_file_state

Description The file used by new LuminalShine features to persist web authentication tokens and notification state. If left unset, it defaults to luminalshine_state.json in the same directory as other Sunshine data.
Default @code{} luminalshine_state.json @endcode
Example @code{} luminalshine_file_state = luminalshine_state.json @endcode

Advanced

fec_percentage

Description Percentage of error correcting packets per data packet in each video frame. @warning{Higher values can correct for more network packet loss, but at the cost of increasing bandwidth usage.}
Default @code{} 20 @endcode
Range 1-255
Example @code{} fec_percentage = 20 @endcode

qp

Description Quantization Parameter. Some devices don't support Constant Bit Rate. For those devices, QP is used instead. @warning{Higher value means more compression, but less quality.}
Default @code{} 28 @endcode
Example @code{} qp = 28 @endcode

min_threads

Description Minimum number of CPU threads used for encoding. @note{Increasing the value slightly reduces encoding efficiency, but the tradeoff is usually worth it to gain the use of more CPU cores for encoding. The ideal value is the lowest value that can reliably encode at your desired streaming settings on your hardware.}
Default @code{} 2 @endcode
Example @code{} min_threads = 2 @endcode

hevc_mode

Description Allows the client to request HEVC Main or HEVC Main10 video streams. @warning{HEVC is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.}
Default @code{} 0 @endcode
Example @code{} hevc_mode = 2 @endcode
Choices 0 advertise support for HEVC based on encoder capabilities (recommended)
1 do not advertise support for HEVC
2 advertise support for HEVC Main profile
3 advertise support for HEVC Main and Main10 (HDR) profiles

av1_mode

Description Allows the client to request AV1 Main 8-bit or 10-bit video streams. @warning{AV1 is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding.}
Default @code{} 0 @endcode
Example @code{} av1_mode = 2 @endcode
Choices 0 advertise support for AV1 based on encoder capabilities (recommended)
1 do not advertise support for AV1
2 advertise support for AV1 Main 8-bit profile
3 advertise support for AV1 Main 8-bit and 10-bit (HDR) profiles

prefer_10bit_sdr

Description Capture and encode SDR sessions in 10-bit when the client and encoder negotiate HEVC/AV1 Main10 support. @note{HDR stays disabled.} @note{Applies to HEVC or AV1 only; H.264 streaming remains 8-bit.} @warning{May cause crashes on client devices with older GPUs that don't support HEVC 10-bit decoding.}
Default @code{} disabled @endcode
Example @code{} prefer_10bit_sdr = enabled @endcode

capture

Description Force specific screen capture method.
Default Automatic
Sunshine will use the first capture method available in the order of the table below
Example @code{} capture = kms @endcode
Choices nvfbc Use NVIDIA Frame Buffer Capture to capture direct to GPU memory. This is usually the fastest method for NVIDIA cards. NvFBC does not have native Wayland support and does not work with XWayland. @note{Applies to Linux only.}
wlr Capture for wlroots based Wayland compositors via wlr-screencopy-unstable-v1. It is possible to capture virtual displays in e.g. Hyprland using this method. @note{Applies to Linux only.}
kms DRM/KMS screen capture from the kernel. This requires that Sunshine has `cap_sys_admin` capability. @note{Applies to Linux only.}
x11 Uses XCB. This is the slowest and most CPU intensive so should be avoided if possible. @note{Applies to FreeBSD and Linux only.}
ddx Use DirectX Desktop Duplication API to capture the display. This is well-supported on Windows machines. @note{Applies to Windows only.}
wgc Use Windows.Graphics.Capture to capture the display. Captures at a variable rate. @note{Windows only.} @note{NVIDIA Ultra Low Latency Mode (ULLM) can hurt performance; avoid this by either using a monitor whose refresh rate exceeds the stream and capping FPS to stop ULLM from engaging, or simply disable Low Latency Mode in the driver.} @tip{On NVIDIA cards, selecting this option will resolve stream freezes caused by high VRAM utilization.}
wgcc Use Windows.Graphics.Capture to capture the display. Captures at a constant rate. @note{Windows only.} @note{NVIDIA Ultra Low Latency Mode (ULLM) can hurt performance; avoid this by either using a monitor whose refresh rate exceeds the stream and capping FPS to stop ULLM from engaging, or simply disable Low Latency Mode in the driver.} @tip{On NVIDIA cards, selecting this option will resolve stream freezes caused by high VRAM utilization.}

lossless_scaling_path

Description Path to the LosslessScaling.exe executable used for frame generation or upscaling. If empty, Sunshine will attempt to auto-detect common installation locations. @note{Applies to Windows only.}
Default @code{}@endcode
Example @code{} lossless_scaling_path = "C:\\Program Files (x86)\\Steam\\steamapps\\common\\Lossless Scaling\\LosslessScaling.exe" @endcode

encoder

Description Force a specific encoder.
Default Sunshine will use the first encoder that is available.
Example @code{} encoder = nvenc @endcode
Choices nvenc For NVIDIA graphics cards
quicksync For Intel graphics cards
amdvce For AMD graphics cards
vaapi Use VA-API (AMD, Intel)
software Encoding occurs on the CPU

Frame Limiter (Windows)

These options integrate with Windows tooling to manage frame pacing and related behavior during a stream. They appear in the Frame Limiter section of the settings UI.

frame_limiter_enable

Description Enable the frame limiter integration for streams.
Default @code{}disabled@endcode
Example @code{} frame_limiter_enable = enabled @endcode

frame_limiter_provider

Description Select the frame limiter provider to use during streams.
Default @code{}auto@endcode
Example @code{} frame_limiter_provider = rtss @endcode
Choices auto Auto-detect and prefer RTSS when available, otherwise fall back to NVIDIA Control Panel.
rtss Use RivaTuner Statistics Server when installed.
nvidia-control-panel Force NVIDIA Control Panel based frame limiting.
none Disable all frame limiter providers.

frame_limiter_fps_limit

Description Optional FPS limit to apply while streaming. Set to 0 to use the stream's requested FPS.
Default @code{}0@endcode
Example @code{} frame_limiter_fps_limit = 120 @endcode

rtss_install_path

Description Full path to the RTSS install directory. If empty, Sunshine will attempt to auto-detect it.
Default @code{}@endcode
Example @code{} rtss_install_path = "C:\\Program Files (x86)\\RivaTuner Statistics Server" @endcode

rtss_frame_limit_type

Description RTSS sync limiter mode used when applying frame limits.
Default @code{}async@endcode
Example @code{} rtss_frame_limit_type = "front edge sync" @endcode
Choices async Asynchronous limiter (default).
front edge sync Front edge sync limiter.
back edge sync Back edge sync limiter.
nvidia reflex NVIDIA Reflex sync limiter (when supported).

frame_limiter_disable_vsync

Description Forces the NVIDIA driver VSYNC setting to Off for the Sunshine profile while streaming. Sunshine restores the previous VSYNC setting when streaming stops.

Use this when you globally enable VSYNC in the driver but need Sunshine sessions to run without it. This option no longer changes Ultra Low Latency Mode or pre-rendered frames.

When NVIDIA-specific overrides are unavailable, Sunshine falls back to forcing the active display to its highest available refresh rate during streams to minimize VSYNC engagement.

Notes:
  • Windows only; uses NVIDIA NvAPI overrides when available and relies on the Sunshine display helper for refresh-rate fallbacks.
  • Automatically enabled when the Dummy Plug HDR workaround is active.
  • On non-NVIDIA GPUs, the refresh-rate fallback acts as a best-effort VSYNC mitigation.
Default @code{}disabled@endcode
Example @code{} frame_limiter_disable_vsync = enabled @endcode

@note{Legacy configurations may still use @code{rtss_disable_vsync_ullm}. Sunshine continues to accept the old key and maps it to @code{frame_limiter_disable_vsync}.}

NVIDIA NVENC Encoder

nvenc_preset

Description NVENC encoder performance preset. Higher numbers improve compression (quality at given bitrate) at the cost of increased encoding latency. Recommended to change only when limited by network or decoder, otherwise similar effect can be accomplished by increasing bitrate. @note{This option only applies when using NVENC [encoder](#encoder).}
Default @code{} 1 @endcode
Example @code{} nvenc_preset = 1 @endcode
Choices 1 P1 (fastest, default)
2 P2
3 P3
4 P4 (balanced quality)
5 P5
6 P6
7 P7 (slowest)

nvenc_twopass

Description Enable two-pass mode in NVENC encoder. This allows to detect more motion vectors, better distribute bitrate across the frame and more strictly adhere to bitrate limits. Disabling it is not recommended since this can lead to occasional bitrate overshoot and subsequent packet loss. @note{This option only applies when using NVENC [encoder](#encoder).}
Default @code{} quarter_res @endcode
Example @code{} nvenc_twopass = quarter_res @endcode
Choices disabled One pass (fastest)
quarter_res Two passes, first pass at quarter resolution (faster)
full_res Two passes, first pass at full resolution (slower)

nvenc_spatial_aq

Description Assign higher QP values to flat regions of the video. Recommended to enable when streaming at lower bitrates. @note{This option only applies when using NVENC [encoder](#encoder).} @warning{Enabling this option may reduce performance.}
Default @code{} disabled @endcode
Example @code{} nvenc_spatial_aq = disabled @endcode

nvenc_vbv_increase

Description Single-frame VBV/HRD percentage increase. By default Sunshine uses single-frame VBV/HRD, which means any encoded video frame size is not expected to exceed requested bitrate divided by requested frame rate. Relaxing this restriction can be beneficial and act as low-latency variable bitrate, but may also lead to packet loss if the network doesn't have buffer headroom to handle bitrate spikes. Maximum accepted value is 400, which corresponds to 5x increased encoded video frame upper size limit. @note{This option only applies when using NVENC [encoder](#encoder).} @warning{Can lead to network packet loss.}
Default @code{} 0 @endcode
Range 0-400
Example @code{} nvenc_vbv_increase = 0 @endcode

nvenc_split_encode

Description Controls NVENC split-frame encoding for supported HEVC or AV1 sessions. NVIDIA drivers already enable split-frame encoding automatically for many 4K-and-above workloads. Set this to enabled when you want the same behavior at lower resolutions too, such as 2560x1440 at 120 Hz. Set it to disabled to prevent split-frame encoding even when the driver would normally use it automatically. @note{Applies to NVENC HEVC or AV1 only. H.264 does not use split-frame encoding.} @note{Requires NVENC API 12.1 or newer.}
Default @code{} auto @endcode
Possible Values @code{} auto enabled disabled @endcode
Example @code{} nvenc_split_encode = enabled @endcode

nvenc_realtime_hags

Description Use realtime gpu scheduling priority in NVENC when hardware accelerated gpu scheduling (HAGS) is enabled in Windows. Currently, NVIDIA drivers may freeze in encoder when HAGS is enabled, realtime priority is used and VRAM utilization is close to maximum. Disabling this option lowers the priority to high, sidestepping the freeze at the cost of reduced capture performance when the GPU is heavily loaded. @note{This option only applies when using NVENC [encoder](#encoder).} @note{Applies to Windows only.} @tip{Changing the capture method to Windows.Graphics.Capture also resolves this problem without any additional changes.}
Default @code{} enabled @endcode
Example @code{} nvenc_realtime_hags = enabled @endcode

nvenc_latency_over_power

Description Adaptive P-State algorithm which NVIDIA drivers employ doesn't work well with low latency streaming, so Sunshine requests high power mode explicitly. @note{This option only applies when using NVENC [encoder](#encoder).} @warning{Disabling this is not recommended since this can lead to significantly increased encoding latency.} @note{Applies to Windows only.}
Default @code{} enabled @endcode
Example @code{} nvenc_latency_over_power = enabled @endcode

nvenc_opengl_vulkan_on_dxgi

Description Sunshine can't capture fullscreen OpenGL and Vulkan programs at full frame rate unless they present on top of DXGI. With this option enabled Sunshine changes global Vulkan/OpenGL present method to "Prefer layered on DXGI Swapchain". This is system-wide setting that is reverted on Sunshine program exit. @note{This option only applies when using NVENC [encoder](#encoder).} @note{Applies to Windows only.}
Default @code{} enabled @endcode
Example @code{} nvenc_opengl_vulkan_on_dxgi = enabled @endcode

nvenc_h264_cavlc

Description Prefer CAVLC entropy coding over CABAC in H.264 when using NVENC. CAVLC is outdated and needs around 10% more bitrate for same quality, but provides slightly faster decoding when using software decoder. @note{This option only applies when using H.264 format with the NVENC [encoder](#encoder).}
Default @code{} disabled @endcode
Example @code{} nvenc_h264_cavlc = disabled @endcode

Intel QuickSync Encoder

qsv_preset

Description The encoder preset to use. @note{This option only applies when using quicksync [encoder](#encoder).}
Default @code{} medium @endcode
Example @code{} qsv_preset = medium @endcode
Choices veryfast fastest (lowest quality)
faster faster (lower quality)
fast fast (low quality)
medium medium (default)
slow slow (good quality)
slower slower (better quality)
veryslow slowest (best quality)

qsv_coder

Description The entropy encoding to use. @note{This option only applies when using H.264 with the quicksync [encoder](#encoder).}
Default @code{} auto @endcode
Example @code{} qsv_coder = auto @endcode
Choices auto let ffmpeg decide
cabac context adaptive binary arithmetic coding - higher quality
cavlc context adaptive variable-length coding - faster decode

qsv_slow_hevc

Description This options enables use of HEVC on older Intel GPUs that only support low power encoding for H.264. @note{This option only applies when using quicksync [encoder](#encoder).} @caution{Streaming performance may be significantly reduced when this option is enabled.}
Default @code{} disabled @endcode
Example @code{} qsv_slow_hevc = disabled @endcode

AMD AMF Encoder

amd_usage

Description The encoder usage profile is used to set the base set of encoding parameters. @note{This option only applies when using amdvce [encoder](#encoder).} @note{The other AMF options that follow will override a subset of the settings applied by your usage profile, but there are hidden parameters set in usage profiles that cannot be overridden elsewhere.}
Default @code{} ultralowlatency @endcode
Example @code{} amd_usage = ultralowlatency @endcode
Choices transcoding transcoding (slowest)
webcam webcam (slow)
lowlatency_high_quality low latency, high quality (fast)
lowlatency low latency (faster)
ultralowlatency ultra low latency (fastest)

amd_rc

Description The encoder rate control. @note{This option only applies when using amdvce [encoder](#encoder).} @warning{The `vbr_latency` option generally works best, but some bitrate overshoots may still occur. Enabling HRD allows all bitrate based rate controls to better constrain peak bitrate, but may result in encoding artifacts depending on your card.}
Default @code{} vbr_latency @endcode
Example @code{} amd_rc = vbr_latency @endcode
Choices cqp constant qp mode
cbr constant bitrate
vbr_latency variable bitrate, latency constrained
vbr_peak variable bitrate, peak constrained

amd_enforce_hrd

Description Enable Hypothetical Reference Decoder (HRD) enforcement to help constrain the target bitrate. @note{This option only applies when using amdvce [encoder](#encoder).} @warning{HRD is known to cause encoding artifacts or negatively affect encoding quality on certain cards.}
Default @code{} disabled @endcode
Example @code{} amd_enforce_hrd = disabled @endcode

amd_quality

Description The quality profile controls the tradeoff between speed and quality of encoding. @note{This option only applies when using amdvce [encoder](#encoder).}
Default @code{} balanced @endcode
Example @code{} amd_quality = balanced @endcode
Choices speed prefer speed
balanced balanced
quality prefer quality

amd_preanalysis

Description Preanalysis can increase encoding quality at the cost of latency. @note{This option only applies when using amdvce [encoder](#encoder).}
Default @code{} disabled @endcode
Example @code{} amd_preanalysis = disabled @endcode

amd_vbaq

Description Variance Based Adaptive Quantization (VBAQ) can increase subjective visual quality by prioritizing allocation of more bits to smooth areas compared to more textured areas. @note{This option only applies when using amdvce [encoder](#encoder).}
Default @code{} enabled @endcode
Example @code{} amd_vbaq = enabled @endcode

amd_coder

Description The entropy encoding to use. @note{This option only applies when using H.264 with the amdvce [encoder](#encoder).}
Default @code{} auto @endcode
Example @code{} amd_coder = auto @endcode
Choices auto let ffmpeg decide
cabac context adaptive binary arithmetic coding - faster decode
cavlc context adaptive variable-length coding - higher quality

VideoToolbox Encoder

vt_coder

Description The entropy encoding to use. @note{This option only applies when using macOS.}
Default @code{} auto @endcode
Example @code{} vt_coder = auto @endcode
Choices auto let ffmpeg decide
cabac context adaptive binary arithmetic coding - faster decode
cavlc context adaptive variable-length coding - higher quality

vt_software

Description Force Video Toolbox to use software encoding. @note{This option only applies when using macOS.}
Default @code{} auto @endcode
Example @code{} vt_software = auto @endcode
Choices auto let ffmpeg decide
disabled disable software encoding
allowed allow software encoding
forced force software encoding

vt_realtime

Description Realtime encoding. @note{This option only applies when using macOS.} @warning{Disabling realtime encoding might result in a delayed frame encoding or frame drop.}
Default @code{} enabled @endcode
Example @code{} vt_realtime = enabled @endcode

VA-API Encoder

vaapi_strict_rc_buffer

Description Enabling this option can avoid dropped frames over the network during scene changes, but video quality may be reduced during motion. @note{This option only applies for H.264 and HEVC when using VA-API [encoder](#encoder) on AMD GPUs.}
Default @code{} disabled @endcode
Example @code{} vaapi_strict_rc_buffer = enabled @endcode

Software Encoder

sw_preset

Description The encoder preset to use. @note{This option only applies when using software [encoder](#encoder).} @note{From [FFmpeg](https://trac.ffmpeg.org/wiki/Encode/H.264#preset).

A preset is a collection of options that will provide a certain encoding speed to compression ratio. A slower preset will provide better compression (compression is quality per filesize). This means that, for example, if you target a certain file size or constant bit rate, you will achieve better quality with a slower preset. Similarly, for constant quality encoding, you will simply save bitrate by choosing a slower preset.

Use the slowest preset that you have patience for.}
Default @code{} superfast @endcode
Example @code{} sw_preset = superfast @endcode
Choices ultrafast fastest
superfast
veryfast
faster
fast
medium
slow
slower
veryslow slowest

sw_tune

Description The tuning preset to use. @note{This option only applies when using software [encoder](#encoder).} @note{From [FFmpeg](https://trac.ffmpeg.org/wiki/Encode/H.264#preset).

You can optionally use -tune to change settings based upon the specifics of your input. }
Default @code{} zerolatency @endcode
Example @code{} sw_tune = zerolatency @endcode
Choices film use for high quality movie content; lowers deblocking
animation good for cartoons; uses higher deblocking and more reference frames
grain preserves the grain structure in old, grainy film material
stillimage good for slideshow-like content
fastdecode allows faster decoding by disabling certain filters
zerolatency good for fast encoding and low-latency streaming

Playnite Integration

playnite_sync_all_installed

Description When set to true, Sunshine synchronises every installed Playnite game into apps.json, in addition to any recent or category-based selections.
Default @code{}false@endcode
Example @code{}playnite_sync_all_installed = true@endcode

playnite_autosync_remove_uninstalled

Description Controls whether Sunshine removes auto-synced games when they are uninstalled in Playnite. Set to true to drop entries immediately when Playnite reports them as uninstalled.
Default @code{}true@endcode
Example @code{}playnite_autosync_remove_uninstalled = false@endcode

playnite_sync_plugins

Description List of Playnite library plugin IDs whose installed games should always be auto-synced. Accepts a JSON array of objects with id/name pairs or a comma-separated list of plugin IDs. Any installed game originating from the listed plugins is included even if it is not in the recent list.
Default @code{}@endcode
Example @code{} playnite_sync_plugins = [ {"id": "CB91DFC9-B977-43BF-8E70-55F46E410FAB", "name": "Steam"}, "83DD83A4-0CF7-49FB-9138-8547F6B60C18" ] @endcode

playnite_exclude_categories

Description List of Playnite categories to omit from Sunshine's auto-sync. Accepts a JSON array of objects with id/name pairs or a comma-separated list of category names. Any game tagged with one of these categories is skipped even if it matches recent-activity or inclusion-category rules.
Default @code{}@endcode
Example @code{} playnite_exclude_categories = ["Steam", {"id": "deck", "name": "Steam Deck"}] @endcode

Previous

Next

Legal

App Examples

[TOC]