# 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) | |
| Description | The name displayed by Moonlight. | |
| Default | PC hostname | |
| Example | @code{} sunshine_name = Sunshine @endcode | |
| 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. | |
| 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 | |
| Description | Whether to be notified of new pre-release versions of ArtLight Server. | |
| Default | @code{} enabled @endcode | |
| Example | @code{} notify_pre_releases = disabled @endcode | |
| 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 | |
| Description | Show icon in system tray and display desktop notifications. | |
| Default | @code{} enabled @endcode | |
| Example | @code{} system_tray = enabled @endcode | |
| Description | Whether to allow controller input from the client. | |
| Default | @code{} enabled @endcode | |
| Example | @code{} controller = enabled @endcode | |
| 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.} | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| Description | Whether to allow keyboard input from the client. | |
| Default | @code{} enabled @endcode | |
| Example | @code{} keyboard = enabled @endcode | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| Description | Whether to allow mouse input from the client. | |
| Default | @code{} enabled @endcode | |
| Example | @code{} mouse = enabled @endcode | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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. | |
| 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.
|
|
| 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. | |
| 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. | |
| 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)). | |
| 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 | |
| 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. | |
| 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 | |
| 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. | |
| 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. | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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. |
|
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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:
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 | |
| 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. |
|
| 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 | |
| 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. | |
| Description | ArtLight Server will attempt to open ports for streaming over the internet. | |
| Default | @code{} disabled @endcode | |
| Example | @code{} upnp = enabled @endcode | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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.} | |
| 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 | |
| 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 | |
| Description | Enable the frame limiter integration for streams. | |
| Default | @code{}disabled@endcode | |
| Example | @code{} frame_limiter_enable = enabled @endcode | |
| 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. | |
| 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 | |
| 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 | early | Smoother frame pacing with more latency. |
| late | Lower latency; does not limit frame-generated output. | |
| 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 | custom | Use the metrics and layout from the user's MangoHud configuration. |
| 1 | FPS only. | |
| 2 | Horizontal. | |
| 3 | Extended. | |
| 4 | Detailed. | |
| 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 | |
| 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 | |
| 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 | |
| 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). | |
| 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 | |
| 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:
|
|
| Default | @code{}disabled@endcode | |
| Example | @code{} frame_limiter_disable_vsync = enabled @endcode | |
| 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) | |
| 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) | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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) | |
| 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 | |
| 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 | |
| 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) | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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) | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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) | |
| 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 | |
| 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 | |
| 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 |
| 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 |
| 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 |
| 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 |