# 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 } ArtLight Server will work with the default settings for most users. In some cases you may want to configure ArtLight Server 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 ArtLight Server. **Example** ```bash 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 | | Linux (native package) | @code{}/var/lib/artlight@endcode | | Linux (standalone) | @code{}~/.config/artlight@endcode (or `$XDG_CONFIG_HOME/artlight`) | | Windows | @code{}%ProgramFiles%\\Artlight\\Artlight Server\\config@endcode | Native Linux packages share one machine profile across the login screen and desktop. Edit settings through the Web UI; use `artlight paths` to locate files and `sudo artlight logs` for diagnostics. Package upgrades import the selected desktop user's legacy `~/.config/artlight` profile once and preserve existing machine settings. Although it is recommended to use the configuration UI, it is possible manually configure ArtLight Server by editing the `conf` file in a text editor. Use the examples as reference. ## General ### locale
Description The locale used for ArtLight Server'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 ArtLight Server.
Default @code{} enabled @endcode
Example @code{} notify_pre_releases = disabled @endcode
### update_check_interval
Description Interval in seconds between automatic checks for new ArtLight Server releases. Set to 0 to disable periodic checking. Checks are date-based: ArtLight Server 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 and Linux. On Linux it uses UHID and includes rumble, the touchpad, motion sensors, battery reporting, and the lightbar.}
ds5 DualShock 5 controller (PS5) @note{This option applies to Linux only.}
switch Switch Pro controller @note{This option applies to Linux only.}
vhf ArtLight Server's own virtual gamepad driver, instead of ViGEmBus, choosing the controller automatically @note{This option applies to Windows only and requires the ArtLight Server virtual gamepad driver to be installed. It presents a DualSense to clients that report a PlayStation controller, or when motion_as_ds4 or touchpad_as_ds4 applies, and an Xbox Series controller otherwise. On an older driver it falls back to a generic HID pad that publishes the DirectInput Physical Interface Device report set, so force feedback still works in DirectInput games.}
vhf_switch Switch Pro Controller on ArtLight Server's own virtual gamepad driver @note{This option applies to Windows only and requires the ArtLight Server virtual gamepad driver to be installed. Includes motion sensors, battery reporting, rumble, and the Capture button. This controller has no analog triggers, so trigger travel is reported as ZL and ZR presses, and it has no touchpad.}
vhf_xbox Xbox Series controller on ArtLight Server's own virtual gamepad driver @note{This option applies to Windows only and requires the ArtLight Server virtual gamepad driver to be installed. Along with vhf_xbox_one, this is a virtual gamepad option Windows places on the XInput path, so it is one of the two that games supporting only XInput can see. It has rumble and impulse triggers, but no touchpad, motion, or battery reporting.}
vhf_xbox_one Xbox One controller on ArtLight Server's own virtual gamepad driver @note{This option applies to Windows only and requires the ArtLight Server virtual gamepad driver to be installed. It reaches the XInput path the same way vhf_xbox does, and is recognised by Windows on its own product ID rather than a generic one, which can help with software that identifies controllers by generation. It is otherwise identical to vhf_xbox except that an Xbox One pad has no Share button.}
vhf_ds4 DualShock 4 on ArtLight Server's own virtual gamepad driver @note{This option applies to Windows only and requires the ArtLight Server virtual gamepad driver to be installed. Includes the touchpad, motion sensors, battery reporting, and the lightbar.}
vhf_ds5 DualSense on ArtLight Server's own virtual gamepad driver @note{This option applies to Windows only and requires the ArtLight Server virtual gamepad driver to be installed. Includes the touchpad, motion sensors, battery reporting, the lightbar, the player and microphone LEDs, and the adaptive triggers.}
x360 Xbox 360 controller @note{This option applies to Windows only.}
xone Xbox One controller @note{This option applies to 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 ArtLight Server 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, ArtLight Server 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, ArtLight Server 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
### proton_dualsense_compatibility
Description Supply native DualSense audio compatibility defaults to Proton games launched during streaming, including games started inside an already-running Steam client. Sets PROTON_KEEP_SONY_AUDIO_ENDPOINT_VISIBLE=1 and PROTON_SONY_WINDOWS_DEVICE_NAMES=1 unless the game explicitly overrides them. Independent of HDR and frame limiting. Requires a Proton build implementing these options and a game with native DualSense support. Reconnect the stream and relaunch the game after changing this option. @hint{Only applies on Linux. Without an active stream, the Proton hook is inert.}
Default @code{} enabled @endcode
Example @code{} proton_dualsense_compatibility = 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.

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

**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

**Windows:**
Enter the following command in command prompt or PowerShell. @code{} %ProgramFiles%\Artlight\Artlight Server\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 ArtLight Server will select the default audio device.
Example (Linux) @code{} audio_sink = alsa_output.pci-0000_09_00.3.analog-stereo @endcode
Example (Windows) @code{} audio_sink = Speakers (High Definition Audio Device) @endcode
### audio_sink_capture_only
Description On Windows, capture the explicitly selected [audio_sink](#audio_sink) without changing any default output device. Route the desired application's audio to that device in Windows before connecting. Capture stays on that endpoint if the Windows default changes during the stream.
Requires a non-empty audio_sink. Virtual sink selection still takes precedence: leave virtual_sink empty and enable host audio in the client if you have an automatically detected virtual audio device. Other platforms ignore this option. When disabled, selecting an Audio Sink retains the existing behavior of switching Windows default outputs for the stream and restoring them afterward.
Default disabled
Example (Windows) @code{} audio_sink = Speakers (High Definition Audio Device) audio_sink_capture_only = enabled @endcode
### virtual_sink
Description The audio device that's virtual, like Steam Streaming Speakers. This allows ArtLight Server to stream audio, while muting the speakers. @tip{See [audio_sink](#audio_sink)!} @tip{These are some options for virtual sound devices. * 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. }
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.

**Linux + VA-API:**
Unlike with AMD AMF encoders 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 ArtLight Server, it needs to have at the very minimum: `VAProfileH264High : VAEntrypointEncSlice`

**Windows:**
Select the adapter in the web interface so ArtLight Server can save both its display name and persistent Windows device identity. For manually authored configurations, use the following command in command prompt or PowerShell to list adapter descriptions. @code{} %ProgramFiles%\Artlight\Artlight Server\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.

Once an adapter is selected, capture stays pinned to it. If that GPU currently has no display attached (for example a TV that is powered off), ArtLight Server does **not** fall back to another GPU; it treats the host as displayless and creates the virtual display on the selected adapter. }
Default ArtLight Server will select the default video card.
Example (Linux) @code{} adapter_name = /dev/dri/renderD128 @endcode
Example (Windows) @code{} adapter_name = Radeon RX 580 Series @endcode
### adapter_pnp_id
Description Windows-only persistent PnP identity paired with `adapter_name`. The web interface records this value automatically when an adapter is selected, allowing adapters with identical descriptions to remain distinct across restarts and enumeration-order changes. The same identity selects the render adapter when ArtLight Server creates a virtual display fallback. Do not configure this key by itself. If it is omitted, `adapter_name` retains its legacy description-only behavior.
Default Unset.
Example (Windows) @code{} adapter_name = Radeon RX 580 Series adapter_pnp_id = PCI\VEN_1002&DEV_67DF&SUBSYS_00000000&REV_E7 @endcode
### output_name
Description Select the display number you want to stream. @tip{To find the appropriate values follow these instructions.

**Linux:**
During ArtLight Server 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`.

**Windows:**
During ArtLight Server 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 ArtLight Server will select the default display.
Example (Linux) @code{} output_name = 0 @endcode
Example (Windows) @code{} output_name = {daeac860-f4db-5208-b1f5-cf59444fb768} @endcode
### virtual_display_mode
Description Select which display ArtLight Server should prepare before streaming. When set to one of the virtual options, ArtLight Server will manage a virtual display instead of relying on your physical monitor.
Default @code{} per_client @endcode On Windows 10 hosts the default is disabled (physical display) instead, because the Windows 11 capture features the virtual-display pipeline relies on (WGC frame-generation capture at 4x refresh) are unavailable there. An explicit value always wins.
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_outputs
Description Linux-only list of DRM connector names reserved for private streaming displays. Separate names with commas, or provide a JSON string array. Leave this empty to auto-discover outputs created by the packaged vibeshine-vkms.service. The Linux DRM driver, connector broker, and service assets are supplied by the bundled libvirtualdisplay dependency. Explicit connector names are useful for a forced-EDID or hardware dummy output.
Default Empty (auto-discover the managed VKMS pool)
Example @code{} virtual_display_outputs = Virtual-1, Virtual-2 @endcode
Linux setup @code{} sudo artlight driver install sudo systemctl enable --now vibeshine-vkms.service @endcode Native packages and vibeshine-drm-setup.service attempt this installation automatically; use the first command to install or retry it manually. The privileged helper always uses the fixed, root-owned /usr/libexec/vibeshine path, independent of the application install prefix. Replacing the module file does not replace a module already loaded by the compositor. Compare modinfo -F version vibeshine_drm with cat /sys/module/vibeshine_drm/version and reboot before testing when they differ. The module supports Linux 6.16 or newer and exposes four independent virtual connectors with a deterministic HDR10 EDID, BT.2020/PQ metadata, 8-16 bits per component, and 10-bit RGB plane formats. ArtLight Server enables one only for a stream, applies the requested mode, layout, and HDR state through KScreen, captures that exact connector, and restores the prior topology afterward. KDE Plasma/KWin and kscreen-doctor are required for managed topology. ArtLight Server uses direct DRM/KMS capture for managed HDR output so the 10-bit scanout reaches the encoder. The custom driver also notifies capture after completed presentation changes and exports the exact pinned primary-plane DMA-BUF for that sequence. Sparse changes are captured immediately, while faster changes are coalesced to the stream's requested maximum frame rate without re-querying KMS state. Managed outputs expose no cursor or overlay planes, so KWin composites the complete monitor image into that primary framebuffer. An older module without this ABI is rejected rather than polled. KWin ScreenCast remains the recommended compositor capture path for SDR.

If the custom module cannot be built or loaded (including on older kernels or when the kernel rejects an untrusted module signature), managed virtual displays remain unavailable. ArtLight Server deliberately does not fall back to CPU-backed stock vkms scanout. Arch Linux and CachyOS packages use DKMS to sign future rebuilds with a persistent local key and verify the embedded signer before accepting the module. Stock Arch and CachyOS kernels need no separate signing step: accepting the normal package-install confirmation is enough, including with Secure Boot through Limine or systemd-boot. Only a custom kernel that enforces trusted module signatures requires shim. The package installation detects this and launches the one-time signing-key authorization prompt automatically; reboot and approve the pending firmware confirmations once. Future updates remain automatic. Install the matching kernel headers before retrying a failed module build.
### 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.
### remote_monitor_mute_audio Do not capture or transmit host audio for Remote Monitor sessions. Video and input continue normally. The default is `false`. ### remote_monitor_disconnect_on_stream_end Release a client's owned Remote Monitor display when its RTSP stream ends. The default is `false`, which retains the display identity and requested topology after transport loss so that the paired client can Resume it. ### remote_monitor_disconnect_on_client_disconnect Release a retained Remote Monitor when the paired client explicitly disconnects. The default is `false`. ### remote_monitor_terminate_on_first_request Allow an additional paired client to terminate the active game with its first Terminate request. The original game client is unaffected. The default is `false`. ### remote_monitor_confirm_app_replacement Protect a running app while ArtLight Server advertises the host as available for warning-free Remote Input and Remote Monitor attachment. Selecting a different normal app is rejected once and temporarily advertises the running app as resumable to that paired client, allowing Moonlight to show its native close-app warning on the next attempt. The confirmation window is 60 seconds. Disable this option to replace the running app immediately. The default is `true`. ### dd_configuration_option
Description Perform mandatory verification and additional configuration for the display device. @note{Applies to Windows and to Linux private displays managed through KScreen.}
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{On Linux, this applies to private displays managed through KScreen.}
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{On Linux, this applies to private displays managed through KScreen.}
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{On Linux, this applies to private displays managed through KScreen.}
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{On Linux, this applies to private displays managed through KScreen.}
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{On Linux 6.16 or newer, the managed vibeshine_drm output supplied by libvirtualdisplay advertises GPU-attached HDR10 and 10-bit formats. Managed display creation fails if that driver is unavailable rather than using CPU-backed stock VKMS.}
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{Linux applies this to private displays managed through KScreen.}
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{On Linux, this delay also governs restoration of the physical desktop.}
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{On Linux, this restores the physical desktop and releases the private display.}
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_display_helper_engine
Description Engine used to apply and restore display settings. In automatic mode the new v2 state-machine engine runs on pre-release builds only; stable releases keep the legacy engine unless you opt in with @code{}v2@endcode. @note{Applies to Windows only.}
Choices @code{}auto@endcode, @code{}v2@endcode, @code{}legacy@endcode
Default @code{}auto@endcode
Example @code{} dd_display_helper_engine = v2 @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 ArtLight Server 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 ArtLight Server 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_use_sunshine_virtual_display_driver
Description When enabled, ArtLight Server uses the ArtLight Server Display Driver for virtual display streams. Disable this to switch back to the bundled SudoVDA rollback driver. @note{Applies to Windows only.}
Default @code{}true@endcode
Example @code{} dd_use_sunshine_virtual_display_driver = true @endcode
### dd_activate_virtual_display
Description When enabled, ArtLight Server 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{Linux applies remapped modes to private displays managed through KScreen.}
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_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.
ArtLight Server 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.
### max_bitrate
Description The maximum bitrate (in Kbps) that ArtLight Server 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 ArtLight Server 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 ArtLight Server 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 ArtLight Server 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 ArtLight Server to. This is useful when you have multiple network interfaces and want to restrict ArtLight Server to a specific one. If not set, ArtLight Server 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 ArtLight Server. 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
### csrf_allowed_origins
Description Comma-separated list of additional allowed origins for CSRF protection. These origins will be appended to the default allowed origins (localhost variants and the configured web UI port). Requests from allowed origins can access state-changing API endpoints without CSRF tokens.

@attention{Only add origins you trust. Each origin must be a complete URL prefix including protocol and host (e.g., https://example.com). Port numbers are optional.}
Default @code{} (empty - uses built-in defaults: https://localhost, https://127.0.0.1, https://[::1], with configured UI port variants) @endcode
Example @code{} csrf_allowed_origins = https://myapp.local,https://custom.domain.com @endcode
### external_ip
Description If no external IP address is given, ArtLight Server 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. PyroWave resolves its send batch size automatically and ignores this setting.
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 ArtLight Server stores log sessions. When this value points to a file (the default), ArtLight Server 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 ArtLight Server is stored.
Default @code{} sunshine_state.json @endcode
Example @code{} file_state = sunshine_state.json @endcode
### vibeshine_file_state
Description The file used by new ArtLight Server features to persist web authentication tokens and notification state. If left unset, it defaults to vibeshine_state.json in the same directory as other ArtLight Server data.
Default @code{} vibeshine_state.json @endcode
Example @code{} vibeshine_file_state = vibeshine_state.json @endcode
## Advanced ### fec_percentage
Description Percentage of error correcting packets per data packet in each video frame. PyroWave ignores this setting; its parity is controlled by `pyrowave_critical_fec_percentage`. @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
### pyrowave_critical_fec_percentage
Description Percentage of error correcting packets for the packets that carry the coarsest wavelet level of a PyroWave frame, the first few percent of it. The client cannot decode a frame if any of these packets remain missing after recovery. Protection requires record framing with shard alignment and a value greater than 0, and adds at least 2 error correcting packets when the critical data and parity fit in one FEC block. Length-prefixed frames and unaligned record frames receive no parity; see [PyroWave protocol](pyrowave-protocol.md) for the packet-size requirements. With record framing and a value greater than 0, encoded image size is capped at the encoder bitrate divided by negotiated FPS. At sustained frame rates below negotiated FPS, mostly unchanged pictures also receive adaptive protection for finer detail, using only unused bitrate and available FEC block space. Detail parity follows the cadence shortfall, up to 50%, independently of this setting's critical-packet rate. This targets flicker caused by packet loss; it cannot correct encoder quantization shimmer. `fec_percentage` does not apply to PyroWave. 0 disables both kinds of protection, removes the cap of one negotiated frame's bitrate allowance, and allows frames up to about 5.5 MB instead of 4.1 MB with 1392-byte packets. Frames remain bounded by elapsed-time bitrate allowance and transport capacity.
Default @code{} 20 @endcode
Range 0-255
Example @code{} pyrowave_critical_fec_percentage = 50 @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
### pyrowave
Description Allows PyroWave-capable clients (such as the onaiaku Moonlight fork) to request PyroWave, an intra-only GPU wavelet codec. Every frame is coded on its own in well under a millisecond, so a lost frame never needs a keyframe, but a clean picture needs hundreds of Mbps; use it on wired LANs only. It is advertised only when the GPU can run the PyroWave Vulkan encoder. Windows uses Direct3D 11 interop; Linux imports explicit-modifier RGB DMA-BUF capture frames (including KMS) and also supports BGRA system-memory capture. Linux preserves scaling, cursor composition, and the negotiated color matrix/range for 8/10-bit and 4:2:0/4:4:4 profiles. CUDA-only NvFBC capture is not supported. The client's bitrate setting supplies the requested bandwidth budget; at session setup the host subtracts allowances for audio, packet overhead, and control traffic to set the encoder bitrate. Critical packets use `pyrowave_critical_fec_percentage`; `fec_percentage` does not apply. See [PyroWave protocol](pyrowave-protocol.md).
Default @code{} enabled @endcode
Example @code{} pyrowave = disabled @endcode
### capture
Description Force specific screen capture method.
Default Automatic
ArtLight Server will use the first capture method available in the order of the table below
Example @code{} capture = kms @endcode
Choices gamescope Capture the Gamescope compositor's main output through PipeWire in SDR. Automatically preferred when Gamescope is available. Supports downscaling within the physical output. HDR requires the version-matched ArtLight Server Gamescope capture patch and a working Main10 hardware encoder; stock Gamescope remains SDR. Independent virtual modes are unavailable. @note{Applies to Linux only.}
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 ArtLight Server has `cap_sys_admin` capability. Managed Linux private HDR sessions use this path automatically to preserve 10-bit scanout, even when KWin is selected globally for SDR capture. With the vibeshine_drm presentation ABI, capture is change-driven, imports the exact pinned DMA-BUF associated with each completed sequence, and coalesces bursts to the client-requested maximum frame rate. Ordinary KMS drivers retain fixed-rate polling; older vibeshine_drm modules without the frame-export ABI are rejected. @note{Applies to Linux only.}
kwin Capture with KDE/KWin Wayland compositor via KDE screencasting. This is recommended for managed private displays in SDR; managed HDR sessions switch to direct DRM/KMS capture. @note{Applies to Linux only.}
portal Capture a selected Wayland display through the XDG Desktop Portal and PipeWire. @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 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, ArtLight Server 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 ArtLight Server will use the first encoder that is available.
Example @code{} encoder = nvenc @endcode
Choices nvenc For NVIDIA graphics cards. Uses ArtLight Server's native NVENC implementation on Windows and on CUDA-enabled Linux builds. On Linux it is tried first during automatic selection.
nvenc_legacy Legacy FFmpeg-based NVIDIA NVENC encoder. Select this explicitly on Linux to roll back from the native implementation. Existing @code{}nvenc_experimental@endcode settings are accepted as a compatibility alias for @code{}nvenc@endcode. @note{Applies to Linux only.}
quicksync For Intel graphics cards
amdvce_ffmpeg For AMD graphics cards. This is the supported FFmpeg-based AMF encoder and the implementation used by automatic selection on Windows. @note{Existing configurations using @code{}amdvce_legacy@endcode are accepted as a compatibility alias for @code{}amdvce_ffmpeg@endcode. The former native @code{}amdvce@endcode value is accepted as an alias for @code{}amdvce_experimental@endcode.}
amdvce_experimental Experimental native AMD AMF encoder. It is not selected automatically, has limited hardware test coverage, and may not work with older GPUs or driver versions. Explicit selection fails closed instead of silently changing encoder implementations. @note{Applies to Windows only.}
vaapi Use VA-API (AMD, Intel)
vulkan Use Vulkan encoder (AMD, Intel, NVIDIA). @note{Applies to Linux only.}
software Encoding occurs on the CPU
## Frame Limiter These options integrate with Proton and MangoHUD on Linux and RTSS or NVIDIA Control Panel on Windows 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 = mangohud @endcode
Choices auto On Linux, use Proton's DXVK/VKD3D limiter and present the MangoHUD overlay. On Windows, prefer RTSS when available and otherwise fall back to NVIDIA Control Panel.
mangohud Use MangoHUD on Linux. ArtLight Server enables it for launched games and supplies the stream-derived FPS limit.
mangohud-proton Use Proton's DXVK/VKD3D limiter for managed Steam games and external Proton launches and keep the MangoHUD overlay visible. This limiter supports frame-generated output.
proton Use Proton's DXVK/VKD3D limiter for managed Steam games and external Proton launches without presenting MangoHUD. This limiter supports frame-generated output.
rtss Use RivaTuner Statistics Server when installed.
nvidia-control-panel Force NVIDIA Control Panel based frame limiting.
none Disable all frame limiter providers.
On native Linux, an active stream also prepares launch hooks in writable Proton installations discovered through Steam. This applies the selected Proton or MangoHUD provider to games started from Steam or another launcher, even when the game is not a ArtLight Server application. Existing `user_settings.py` code and file permissions are preserved. The hook is inert when no stream is active and after host shutdown; it does not persist an FPS limit in Proton's configuration. These are launch-time renderer settings: start the game after the stream connects. A game already running retains its previous settings until restarted, including when the stream ends. Read-only Proton installations, native Linux games launched outside ArtLight Server, and containers with a separate network namespace are not covered by this Proton hook. Native games launched by ArtLight Server retain the existing MangoHUD integration. Newly installed Proton versions in known libraries are detected during the stream. The host log reports hook readiness or failure. ### frame_limiter_fps_limit
Description Optional FPS limit to apply while streaming. MangoHUD and RTSS support fractional values with up to three decimal places; NVIDIA Control Panel rounds them to the nearest whole FPS. Set to 0 to use a client display-mode override when present, otherwise the stream's requested FPS.
Default @code{}0@endcode
Example @code{} frame_limiter_fps_limit = 59.94 @endcode
### mangohud_limiter_method
Description Linux-only timing used when frame_limiter_provider = mangohud. early waits before presentation for smoother pacing at the cost of more latency. late waits after presentation for lower latency, but cannot limit frame-generated output. The Proton limiter supports frame generation.
Default @code{}late@endcode
Example @code{} mangohud_limiter_method = early @endcode
Choices earlySmoother frame pacing with more latency.
lateLower latency; does not limit frame-generated output.
### mangohud_preset
Description Linux-only MangoHUD metrics and layout preset used for games launched during a stream. Use custom to retain the metrics from the user's MangoHud configuration, or select one of MangoHud's standard built-in presets.
Default @code{}custom@endcode
Example @code{} mangohud_preset = 3 @endcode
Choices customUse the metrics and layout from the user's MangoHud configuration.
1FPS only.
2Horizontal.
3Extended.
4Detailed.
### mangohud_always_show_graph
Description Linux-only option that keeps the MangoHud overlay visible and enables its live frame-time graph for every managed game launch.
Default @code{}disabled@endcode
Example @code{} mangohud_always_show_graph = enabled @endcode
### frame_limiter_auto_virtual_framegen
Description Controls how fast the virtual display refreshes, which decides how soon each game frame is captured. Windows only hands the capture path a new frame when the display redraws, so on a display that refreshes at the stream rate a frame that finishes just after a redraw waits up to a whole refresh before capture, and frames reach the client unevenly. A faster virtual display captures each frame closer to when the game drew it. None of the modes change the stream FPS or bandwidth, and all but @code{}disabled@endcode cap games to the stream rate.
@code{}vrr@endcode holds the virtual display at a fixed 1000 Hz whatever the stream rate, so every frame is captured within 1 ms of being drawn and its RTP timestamp carries accurate game timing for clients with VRR pacing. @code{}enabled@endcode keeps the display at 4x the stream rate (within ~2 ms at 120 FPS) and captures at most 2x the stream rate on the desktop. @code{}legacy@endcode uses a fixed 2x refresh, as older versions did. @code{}disabled@endcode leaves the display at the stream rate and turns off the matching game cap. Existing boolean values remain compatible: true maps to enabled and false maps to disabled.
Default @code{}enabled@endcode
Examples @code{} frame_limiter_auto_virtual_framegen = vrr frame_limiter_auto_virtual_framegen = disabled frame_limiter_auto_virtual_framegen = legacy @endcode
### rtss_install_path
Description Full path to the RTSS install directory. If empty, ArtLight Server 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. Virtual-display streams use NVIDIA Reflex automatically unless @code{}rtss_allow_virtual_display_override@endcode is enabled. An explicit per-app or per-client RTSS mode override still takes precedence.
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).
### rtss_allow_virtual_display_override
Description Allows @code{}rtss_frame_limit_type@endcode to replace the automatic NVIDIA Reflex mode for virtual-display streams. Keep this disabled unless you accept the trade-off: Async, Front-edge Sync, Back-edge Sync, or any other non-Reflex mode can cause massive latency when a game uses DLSS Frame Generation. Mark a game as @code{}Frame generation -> Game provided@endcode to keep Reflex for that app. Explicit per-app or per-client RTSS mode overrides remain authoritative.
Default @code{}disabled@endcode
Example @code{} rtss_allow_virtual_display_override = enabled @endcode
### frame_limiter_disable_vsync
Description Forces the NVIDIA driver VSYNC setting to Off for the ArtLight Server profile while streaming. ArtLight Server restores the previous VSYNC setting when streaming stops.

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

When NVIDIA-specific overrides are unavailable, ArtLight Server 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 ArtLight Server 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}. ArtLight Server continues to accept the old key and maps it to @code{frame_limiter_disable_vsync}.} ## NVIDIA NVENC Encoder The options in this section are shared by both NVENC implementations. On Linux, @code{nvenc} talks directly to the NVIDIA Video Codec SDK and is preferred during automatic probing, while @code{nvenc_legacy} uses FFmpeg as a rollback path. ### 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 ArtLight Server 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.} @note{On Linux, both the legacy FFmpeg @code{nvenc_legacy} encoder and the native @code{nvenc} encoder honor the configured auto, enabled, or disabled mode.}
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 ArtLight Server 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 ArtLight Server can't capture fullscreen OpenGL and Vulkan programs at full frame rate unless they present on top of DXGI. With this option enabled ArtLight Server changes global Vulkan/OpenGL present method to "Prefer layered on DXGI Swapchain". This is system-wide setting that is reverted on ArtLight Server 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 @note{HDR (HEVC Main10) encoding through AMF requires the AMF runtime shipped with Adrenalin 23.30 or newer, which reports AMF 1.4.32. FFmpeg refuses 10-bit P010 surfaces on any older runtime, so HDR is not offered to clients even though ArtLight Server's own AMF check only needs 1.4.23. Update your graphics drivers if HDR is unavailable on an AMD GPU. This limitation applies to the @code{amdvce_ffmpeg} encoder only; the experimental native @code{amdvce_experimental} encoder talks to AMF directly and is not subject to FFmpeg's 10-bit refusal. ArtLight Server carries one narrow exception for the FFmpeg-based encoder: on a Radeon Pro 5500 XT (PCI @code{1002:7340}) running AMF 1.4.31.x, it presents 1.4.32 to FFmpeg for the duration of codec validation so HEVC Main10 is not refused. The exception is applied automatically, has no configuration option, and does not apply to any other adapter. The detected AMF runtime version is written to the log on every AMD HDR HEVC attempt (search for @code{AMF Main10 override}).} ### amd_usage
Description The encoder usage profile is used to set the base set of encoding parameters. @note{This option applies to the AMD [encoders](#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 applies to the AMD [encoders](#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
qvbr quality-defined variable bitrate (see amd_qvbr_quality_level)
hqvbr high quality variable bitrate
hqcbr high quality constant bitrate
### amd_qvbr_quality_level
Description The target quality level used by the `qvbr` rate control method, where 1 is the lowest quality and 51 is the highest. Higher values spend more bits to preserve quality. @note{This option only applies to AMD [encoders](#encoder) with `amd_rc` set to `qvbr`. Native `amdvce_experimental` automatically enables PreAnalysis with a one-frame low-latency lookahead for `qvbr`, `hqvbr`, and `hqcbr`.} @note{Leave this at `0` to keep the encoder default.}
Default @code{} 0 @endcode
Range 1-51 (0 to use the encoder default)
Example @code{} amd_qvbr_quality_level = 18 @endcode
### amd_enforce_hrd
Description Enable Hypothetical Reference Decoder (HRD) enforcement to help constrain the target bitrate. @note{This option applies to the AMD [encoders](#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. `auto` leaves the quality property unset so the selected AMF usage preset can choose it. @note{This option applies to the AMD [encoders](#encoder).}
Default @code{} balanced @endcode
Example @code{} amd_quality = balanced @endcode
Choices auto follow the selected AMF usage preset
speed prefer speed
balanced balanced
quality prefer quality
### amd_preanalysis
Description Preanalysis can increase encoding quality at the cost of latency. Native `amdvce_experimental` uses a one-frame low-latency lookahead; it is enabled automatically by `qvbr`, `hqvbr`, and `hqcbr`. The setting is also forwarded to `amdvce_ffmpeg`.
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. `auto` leaves the property unset so the selected AMF usage preset can choose it. VBAQ is enabled by default. @note{This option applies to the AMD [encoders](#encoder).}
Default @code{} enabled @endcode
Example @code{} amd_vbaq = enabled @endcode
Choices auto follow the selected AMF usage preset
enabled enable VBAQ
disabled disable VBAQ
### amd_coder
Description The entropy encoding to use. @note{This option only applies when using H.264 with an AMD [encoder](#encoder).}
Default @code{} auto @endcode
Example @code{} amd_coder = auto @endcode
Choices auto leave the encoder default
cabac context adaptive binary arithmetic coding - faster decode
cavlc context adaptive variable-length coding - higher quality
### amd_av1_screen_content
Description Enable AV1 screen-content coding tools, which can improve efficiency and text/UI clarity for desktop and screen-heavy content. @note{AV1 only. This option only applies to the native amdvce_experimental [encoder](#encoder) (not amdvce_ffmpeg).} @note{Leave at `auto` to use the driver default.}
Default @code{} auto @endcode
Example @code{} amd_av1_screen_content = enabled @endcode
Choices auto leave the driver default
enabled force screen-content tools on
disabled force screen-content tools off
### amd_av1_latency_mode
Description AV1 encoding-latency tier. Lower tiers finish each frame faster at the cost of higher power draw. @note{AV1 only. This option only applies to the native amdvce_experimental [encoder](#encoder) (not amdvce_ffmpeg).} @note{Leave at `auto` to use the driver default.}
Default @code{} auto @endcode
Example @code{} amd_av1_latency_mode = lowest @endcode
Choices auto leave the driver default
none balance latency and power
power_saving real-time with lower power
realtime real-time
lowest lowest latency (highest power)
## VideoToolbox Encoder ### vt_coder
Description The entropy encoding to use.
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.
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. @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
## Vulkan Encoder ### vk_tune
Description Encoder tuning preset. Low latency modes reduce encoding delay at the cost of quality. @note{This option only applies when using Vulkan [encoder](#encoder).}
Default @code{} 2 @endcode
Example @code{} vk_tune = 1 @endcode
Options 0 (default) Let the driver decide
1 (hq) High Quality
2 (ll) Low Latency
3 (ull) Ultra Low Latency
4 (lossless) Lossless
### vk_rc_mode
Description Rate control mode for encoding. Auto lets the driver decide. @note{This option only applies when using Vulkan [encoder](#encoder).}
Default @code{} 2 @endcode
Example @code{} vk_rc_mode = 4 @endcode
Options 0 Auto (driver decides)
1 CQP (Constant QP)
2 CBR (Constant Bitrate)
4 VBR (Variable Bitrate)
## 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
## Steam Integration ### steam_enabled Enables local Steam library discovery, synchronization, and launch support. Disabled by default on all platforms; it can be combined with `playnite_enabled` or used by itself. Default: `false` ### steam_auto_sync Synchronizes the games selected by the Steam policy into `apps.json` when configuration is applied and checks for manifest, local play-history, library, metadata, and artwork changes every 30 seconds while ArtLight Server is running. Steam-managed entries use stable Steam IDs; manual and Playnite-managed entries are preserved. Default: `false` ### steam_sync_all_installed Synchronizes every installed Steam game. Disable this to use the recent-game count and age policy instead. Default: `false` ### steam_recent_games Maximum number of installed games to synchronize, ordered by Steam's local `LastPlayed` timestamp, when `steam_sync_all_installed` is disabled. Set to `0` to disable recent-game synchronization. Exclusions and tool filtering apply before the limit. Default: `10` ### steam_recent_max_age_days Excludes games last played more than this many days ago from recent-game synchronization. Set to `0` for no age limit. Default: `30` ### steam_autosync_remove_uninstalled When enabled, Steam-managed entries whose installed manifest disappears are removed during synchronization. Manual and Playnite-managed entries are never removed by this provider. Recent-only synchronization always removes managed games that leave the selected recent set so the configured limit remains effective. Default: `true` ### steam_exclude_games JSON array of Steam app IDs (or objects containing `id` and optional `name`) to exclude from Steam synchronization. A legacy comma-separated list is accepted as well. Object names are used only when no ID is supplied, so a game rename cannot accidentally exclude a different app. Example: `steam_exclude_games = [{"id":"228980","name":"Steamworks Common Redistributables"},{"id":"570"}]` Steam compatibility/runtime/tool manifests are also excluded by default based on their manifest type and known runtime IDs. Set `steam_include_tools = true` to import those records intentionally. ### steam_include_tools Includes Steam manifests marked as tools, runtimes, configuration, DLC, music, or video. This is intended for users who deliberately want those records in their catalog. Default: `false` The manual application picker shows installed, importable Steam games by default, matching the Playnite picker. ArtLight Server also reads Steam's local user play-history and `appinfo.vdf` caches to rank installed games for recent-game synchronization without requiring a Steam Web API key or a public profile. ## Lutris Integration ### lutris_enabled Enables local Lutris library discovery, synchronization, and launch support on Linux. Steam remains enabled independently and is authoritative for Steam games. Default: `true` on Linux ### lutris_auto_sync Synchronizes installed Lutris games into `apps.json` when configuration is applied and checks the Lutris database every 30 seconds. Default: `true` ### lutris_autosync_remove_uninstalled Removes Lutris-managed applications when their installed record disappears. Manual, Steam-managed, and Playnite-managed entries are preserved. Default: `true` ### lutris_exclude_games JSON array of Lutris numeric game IDs, or objects containing `id` and optional `name`, to exclude from synchronization. A legacy comma-separated list is also accepted. ### lutris_include_steam Includes Lutris records backed by Steam. This is disabled by default because the direct Steam provider has richer metadata and lifecycle information. If enabled, a direct Steam entry with the same Steam app ID wins, so duplicate catalog entries are not created. Default: `false` ## Playnite Integration ### playnite_enabled Enables Playnite library synchronization and launch support on Windows. Disable this setting to use Steam by itself, or leave both providers enabled to combine their catalogs. Playnite is unavailable on Linux. Default: `true` on Windows ### playnite_sync_all_installed
Description When set to true, ArtLight Server 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 ArtLight Server 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 ArtLight Server'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
## Advanced runtime and recovery options ### amd_ltr_frames Sets the number of long-term reference frames used by the experimental native AMD encoder. Leave this at the automatic default unless a client or driver-specific recovery workflow requires a fixed value. ### amd_input_queue_size Sets the experimental native AMD encoder input queue depth. A positive explicit value overrides automatic low-latency queue selection. ### amd_smart_access_video Controls SmartAccess Video for the experimental native AMD encoder when the installed AMF runtime exposes that capability. Use `auto` to leave the driver default unchanged. ### amd_lowlatency_mode Controls the experimental native AMD encoder's low-latency mode. Use `auto` to leave the driver default unchanged. ### amd_high_motion_quality_boost Controls high-motion quality boost for the experimental native AMD encoder. Use `auto` to leave the driver default unchanged. ### dd_paused_virtual_display_timeout_secs Sets how long a paused virtual display may remain ready before the display helper releases it. Set `0` to disable the timeout. ### dd_virtual_display_scale Sets the virtual-display scale override. The default, `0` (Retain), keeps your chosen scale for future streams. On Windows, connect to the virtual display and choose **Scale** in **Settings > System > Display**; subsequent streams using that virtual display retain your choice. Choose an explicit percentage to change desktop scaling without changing the requested pixel resolution. On Windows, scaling is applied through the DPI setter without changing the virtual monitor's reported physical size. The optional `-1` setting chooses a scale based on resolution. ### dd_wa_hdr_toggle Enables the display-helper HDR-toggle workaround for display stacks that require an explicit HDR transition. ### dd_wa_hdr_toggle_delay Sets the delay, in milliseconds, used by the display-helper HDR-toggle workaround. ### lossless_scaling_legacy_auto_detect Enables legacy automatic discovery of Lossless Scaling when no explicit `lossless_scaling_path` is configured. ### realtime_stats_enabled Enables collection of the host and session statistics shown by the real-time statistics view. ### realtime_stats_poll_interval_ms Sets the real-time statistics polling interval in milliseconds. Lower values refresh the dashboard more frequently. ### rtx_hdr Enables RTX HDR processing when the active NVIDIA environment supports it. ### rtx_hdr_force_sdr Forces the source display to remain SDR while RTX HDR performs the SDR-to-HDR conversion. ### rtx_hdr_sdr_brightness Sets the RTX HDR SDR brightness control. ### rtx_hdr_contrast Sets the RTX HDR contrast control. ### rtx_hdr_saturation Sets the RTX HDR saturation control. ### rtx_hdr_middle_gray Sets the RTX HDR middle-gray control. ### rtx_hdr_peak_brightness Sets the RTX HDR peak-brightness control. ### session_history_enabled Enables persistent session-history recording. ### session_history_ttl_days Sets the number of days to retain session-history records. Set `0` to retain records until another configured limit removes them. ### session_history_db_size_limit_mb Sets the maximum on-disk size, in MiB, of the session-history database before older records are pruned. ### vulkan_hdr_layer Enables the Vulkan HDR layer used by the display stack when HDR Vulkan capture support is available. ### wayland_hdr_compatibility Enables KDE Plasma Wayland HDR environment compatibility for games launched during a resolved HDR stream. This does not force HDR and does not override SDR stream outcomes. ### wgc_pacing_smoothing Enables WGC pacing smoothing so capture re-anchors to the pacing grid instead of raw frame-arrival timing. ### auto_capture_sink Automatically selects the audio capture sink when no explicit virtual sink is configured. ### enable_discovery Controls whether ArtLight Server advertises itself for local-network discovery. ### enable_input_only_mode Allows clients to connect in input-only mode without starting a video stream. ### enable_pairing Controls whether new clients may pair with this host. ### envvar_compatibility_mode Enables compatibility handling for legacy environment-variable based integrations. ### fallback_mode Sets the display mode used when the requested streaming mode cannot be applied. ### forward_rumble Forwards controller rumble events to the emulated host gamepad. ### global_state_cmd Configures commands that run when any application changes streaming state. ### hide_tray_controls Hides the interactive controls in the system-tray menu. ### ignore_encoder_probe_failure Allows streaming to continue when the encoder capability probe cannot complete. ### keep_sink_default Keeps the selected audio sink as the system default while streaming. ### legacy_ordering Enables legacy application ordering for clients and integrations that require it. ### limit_framerate Limits capture and encoding to the requested stream frame rate. ### nvenc_intra_refresh Uses NVIDIA intra refresh instead of full keyframes when supported. ### nvenc_temporal_aq Enables NVIDIA temporal adaptive quantization when supported. ### pacing_max_bitrate_kbps Sets the maximum bitrate, in Kbps, considered by the network pacing policy. Set `0` to use the automatic default. ### packetsize Sets the maximum network packet size used for streaming. Set `0` to use the default behavior. ### input_quit_hotkey The combination that ends a stream when its keyboard has been shared over USB, for example `Ctrl+Alt+Shift+Q`. The default is `Ctrl+Alt+Shift+Q` - the same combination the client uses to leave a stream, so the key people already press keeps working once the keyboard has moved. Sharing a keyboard takes it away from the machine the client is running on, so the client can no longer see the combination it normally uses to leave - the stream becomes inescapable. This setting is read from the shared keyboard instead, so it works from wherever that keyboard now is, including the machine it was taken from. Only the client the combination was pressed on leaves; anyone else watching the same stream keeps watching. Letters `A`-`Z`, digits `0`-`9` and function keys `F1`-`F24` are accepted, with `Ctrl`, `Alt` and `Shift` in any order and in any letter case. A value that cannot be understood is ignored, the default is used, and the reason is written to the log - a typo here does not stop the server. @note{On Windows the combination is reserved by the operating system, so it does not reach anything else running on that machine. On Linux the key press also carries on to whatever is running there. That is a real difference between the platforms rather than an oversight.} ### input_usbip_enabled Moves the USB devices shared by the machine you are streaming from onto the machine you are streaming to, for the duration of the session, and gives them back when the session ends. Off by default. A device moved this way is taken away from the machine it is plugged into, so this does not turn itself on: set it to `true` to enable it per application. ### input_usbip_exporter The machine the shared USB devices are plugged into. Leave empty to use the address the stream is being taken from, which is correct whenever the devices are plugged into the machine that is streaming. ### input_usbip_busids A comma-separated list of the device IDs to move, for example `9-1,9-2`. Leave empty to move every device the exporter is offering, which is what the tick boxes on the exporter already decided.
| Previous | Next | |:------------------|--------------------------------:| | [Legal](legal.md) | [App Examples](app_examples.md) |
[TOC]