From ec1ae4a3fec7eb13487bcece9297df0694cb06ad Mon Sep 17 00:00:00 2001
From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Date: Sun, 14 Jan 2024 08:16:02 -0500
Subject: [PATCH] docs(advanced-usage): cross reference config UI (#2000)

---
 docs/source/about/advanced_usage.rst     | 1625 +++++++++++-----------
 src_assets/common/assets/web/config.html |   38 +-
 2 files changed, 855 insertions(+), 808 deletions(-)

diff --git a/docs/source/about/advanced_usage.rst b/docs/source/about/advanced_usage.rst
index 3899c848..08f4f8aa 100644
--- a/docs/source/about/advanced_usage.rst
+++ b/docs/source/about/advanced_usage.rst
@@ -5,14 +5,14 @@ Sunshine will work with the default settings for most users. In some cases you m
 Performance Tips
 ----------------
 
-AMD
-^^^
-In Windows, enabling `Enhanced Sync` in AMD's settings may help reduce the latency by an additional frame. This
-applies to `amfenc` and `libx264`.
+.. tab:: AMD
 
-Nvidia
-^^^^^^
-Enabling `Fast Sync` in Nvidia settings may help reduce latency.
+   In Windows, enabling `Enhanced Sync` in AMD's settings may help reduce the latency by an additional frame. This
+   applies to `amfenc` and `libx264`.
+
+.. tab:: NVIDIA
+
+   Enabling `Fast Sync` in Nvidia settings may help reduce latency.
 
 Configuration
 -------------
@@ -41,15 +41,14 @@ location by modifying the configuration file.
 
       sunshine ~/sunshine_config.conf
 
-To manually configure sunshine you may edit the `conf` file in a text editor. Use the examples as reference.
+Although it is recommended to use the configuration UI, it is possible manually configure sunshine by
+editing the `conf` file in a text editor. Use the examples as reference.
 
-.. hint:: Some settings are not available within the web ui.
+`General <https://localhost:47990/config/#general>`__
+-----------------------------------------------------
 
-General
--------
-
-sunshine_name
-^^^^^^^^^^^^^
+`sunshine_name <https://localhost:47990/config/#sunshine_name>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    The name displayed by Moonlight
@@ -62,8 +61,8 @@ sunshine_name
 
       sunshine_name = Sunshine
 
-min_log_level
-^^^^^^^^^^^^^
+`min_log_level <https://localhost:47990/config/#min_log_level>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    The minimum log level printed to standard out.
@@ -93,22 +92,8 @@ min_log_level
 
       min_log_level = info
 
-log_path
-^^^^^^^^
-
-**Description**
-   The path where the sunshine log is stored.
-
-**Default**
-   ``sunshine.log``
-
-**Example**
-   .. code-block:: text
-
-      log_path = sunshine.log
-
-global_prep_cmd
-^^^^^^^^^^^^^^^
+`global_prep_cmd <https://localhost:47990/config/#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.
@@ -121,11 +106,115 @@ global_prep_cmd
 
       global_prep_cmd = [{"do":"nircmd.exe setdisplay 1280 720 32 144","undo":"nircmd.exe setdisplay 2560 1440 32 144"}]
 
-Controls
---------
+`Files <https://localhost:47990/config/#files>`__
+-------------------------------------------------
 
-gamepad
-^^^^^^^
+`file_apps <https://localhost:47990/config/#file_apps>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   The application configuration file path. The file contains a json formatted list of applications that can be started
+   by Moonlight.
+
+**Default**
+   OS and package dependent
+
+**Example**
+   .. code-block:: text
+
+      file_apps = apps.json
+
+`credentials_file <https://localhost:47990/config/#credentials_file>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   The file where user credentials for the UI are stored.
+
+**Default**
+   ``sunshine_state.json``
+
+**Example**
+   .. code-block:: text
+
+      credentials_file = sunshine_state.json
+
+`log_path <https://localhost:47990/config/#log_path>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   The path where the sunshine log is stored.
+
+**Default**
+   ``sunshine.log``
+
+**Example**
+   .. code-block:: text
+
+      log_path = sunshine.log
+
+`pkey <https://localhost:47990/config/#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**
+   ``credentials/cakey.pem``
+
+**Example**
+   .. code-block:: text
+
+      pkey = /dir/pkey.pem
+
+`cert <https://localhost:47990/config/#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**
+   ``credentials/cacert.pem``
+
+**Example**
+   .. code-block:: text
+
+      cert = /dir/cert.pem
+
+`file_state <https://localhost:47990/config/#file_state>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   The file where current state of Sunshine is stored.
+
+**Default**
+   ``sunshine_state.json``
+
+**Example**
+   .. code-block:: text
+
+      file_state = sunshine_state.json
+
+
+`Input <https://localhost:47990/config/#input>`__
+-------------------------------------------------
+
+`controller <https://localhost:47990/config/#controller>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   Whether to allow controller input from the client.
+
+**Example**
+   .. code-block:: text
+
+      controller = enabled
+
+`gamepad <https://localhost:47990/config/#gamepad>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    The type of gamepad to emulate on the host.
@@ -153,8 +242,8 @@ gamepad
 
       gamepad = auto
       
-ds4_back_as_touchpad_click
-^^^^^^^^^^^^^^^^^^^^^^^^^^
+`ds4_back_as_touchpad_click <https://localhost:47990/config/#ds4_back_as_touchpad_click>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    .. hint:: Only applies when gamepad is set to ds4 manually. Unused in other gamepad modes.
@@ -170,8 +259,8 @@ ds4_back_as_touchpad_click
 
       ds4_back_as_touchpad_click = enabled
 
-motion_as_ds4
-^^^^^^^^^^^^^
+`motion_as_ds4 <https://localhost:47990/config/#motion_as_ds4>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    .. hint:: Only applies when gamepad is set to auto.
@@ -188,8 +277,8 @@ motion_as_ds4
 
       motion_as_ds4 = enabled
 
-touchpad_as_ds4
-^^^^^^^^^^^^^^^
+`touchpad_as_ds4 <https://localhost:47990/config/#touchpad_as_ds4>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    .. hint:: Only applies when gamepad is set to auto.
@@ -206,8 +295,8 @@ touchpad_as_ds4
 
       touchpad_as_ds4 = enabled
 
-back_button_timeout
-^^^^^^^^^^^^^^^^^^^
+`back_button_timeout <https://localhost:47990/config/#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.
@@ -222,8 +311,19 @@ back_button_timeout
 
       back_button_timeout = 2000
 
-key_repeat_delay
-^^^^^^^^^^^^^^^^
+`keyboard <https://localhost:47990/config/#keyboard>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   Whether to allow keyboard input from the client.
+
+**Example**
+   .. code-block:: text
+
+      keyboard = enabled
+
+`key_repeat_delay <https://localhost:47990/config/#key_repeat_delay>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    The initial delay, in milliseconds, before repeating keys. Controls how fast keys will repeat themselves.
@@ -236,8 +336,8 @@ key_repeat_delay
 
       key_repeat_delay = 500
 
-key_repeat_frequency
-^^^^^^^^^^^^^^^^^^^^
+`key_repeat_frequency <https://localhost:47990/config/#key_repeat_frequency>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    How often keys repeat every second.
@@ -252,8 +352,8 @@ key_repeat_frequency
 
       key_repeat_frequency = 24.9
 
-always_send_scancodes
-^^^^^^^^^^^^^^^^^^^^^
+`always_send_scancodes <https://localhost:47990/config/#always_send_scancodes>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    Sending scancodes enhances compatibility with games and apps but may result in incorrect keyboard input
@@ -273,8 +373,34 @@ always_send_scancodes
 
       always_send_scancodes = enabled
 
-high_resolution_scrolling
-^^^^^^^^^^^^^^^^^^^^^^^^^
+`key_rightalt_to_key_win <https://localhost:47990/config/#key_rightalt_to_key_win>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   It may be possible that you cannot send the Windows Key from Moonlight directly. In those cases it may be useful to
+   make Sunshine think the Right Alt key is the Windows key.
+
+**Default**
+   ``disabled``
+
+**Example**
+   .. code-block:: text
+
+      key_rightalt_to_key_win = enabled
+
+`mouse <https://localhost:47990/config/#mouse>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   Whether to allow mouse input from the client.
+
+**Example**
+   .. code-block:: text
+
+      mouse = enabled
+
+`high_resolution_scrolling <https://localhost:47990/config/#high_resolution_scrolling>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    When enabled, Sunshine will pass through high resolution scroll events from Moonlight clients.
@@ -289,8 +415,8 @@ high_resolution_scrolling
 
       high_resolution_scrolling = enabled
 
-native_pen_touch
-^^^^^^^^^^^^^^^^
+`native_pen_touch <https://localhost:47990/config/#native_pen_touch>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    When enabled, Sunshine will pass through native pen/touch events from Moonlight clients. 
@@ -336,181 +462,13 @@ keybindings
         0x4A, 0x4B
       ]
 
-key_rightalt_to_key_win
-^^^^^^^^^^^^^^^^^^^^^^^
+.. note:: This option is not available in the UI. A PR would be welcome.
 
-**Description**
-   It may be possible that you cannot send the Windows Key from Moonlight directly. In those cases it may be useful to
-   make Sunshine think the Right Alt key is the Windows key.
+`Audio/Video <https://localhost:47990/config/#audio-video>`__
+-------------------------------------------------------------
 
-**Default**
-   ``disabled``
-
-**Example**
-   .. code-block:: text
-
-      key_rightalt_to_key_win = enabled
-
-Display
--------
-
-adapter_name
-^^^^^^^^^^^^
-
-**Description**
-   Select the video card you want to stream.
-
-   .. tip:: To find the name of the appropriate values follow these instructions.
-
-      **Linux + VA-API**
-         Unlike with `amdvce` and `nvenc`, it doesn't matter if video encoding is done on a different GPU.
-
-         .. code-block:: bash
-
-            ls /dev/dri/renderD*  # to find all devices capable of VAAPI
-
-            # replace ``renderD129`` with the device from above to lists the name and capabilities of the device
-            vainfo --display drm --device /dev/dri/renderD129 | \
-              grep -E "((VAProfileH264High|VAProfileHEVCMain|VAProfileHEVCMain10).*VAEntrypointEncSlice)|Driver version"
-
-         To be supported by Sunshine, it needs to have at the very minimum:
-         ``VAProfileH264High   : VAEntrypointEncSlice``
-
-      .. todo:: macOS
-
-      **Windows**
-         .. code-block:: batch
-
-            tools\dxgi-info.exe
-
-         .. note:: For hybrid graphics systems, DXGI reports the outputs are connected to whichever graphics adapter
-            that the application is configured to use, so it's not a reliable indicator of how the display is
-            physically connected.
-
-**Default**
-   Sunshine will select the default video card.
-
-**Examples**
-   **Linux**
-      .. code-block:: text
-
-         adapter_name = /dev/dri/renderD128
-
-   .. todo:: macOS
-
-   **Windows**
-      .. code-block:: text
-
-         adapter_name = Radeon RX 580 Series
-
-output_name
-^^^^^^^^^^^
-
-**Description**
-   Select the display number you want to stream.
-
-   .. tip:: To find the name of the appropriate values follow these instructions.
-
-      **Linux**
-         During Sunshine startup, you should see the list of detected monitors:
-
-         .. code-block:: text
-
-            Info: Detecting connected monitors
-            Info: Detected monitor 0: DVI-D-0, connected: false
-            Info: Detected monitor 1: HDMI-0, connected: true
-            Info: Detected monitor 2: DP-0, connected: true
-            Info: Detected monitor 3: DP-1, connected: false
-            Info: Detected monitor 4: DVI-D-1, connected: false
-
-         You need to use the value before the colon in the output, e.g. ``1``.
-
-      .. todo:: macOS
-
-      **Windows**
-         .. code-block:: batch
-
-            tools\dxgi-info.exe
-
-**Default**
-   Sunshine will select the default display.
-
-**Examples**
-   **Linux**
-      .. code-block:: text
-
-         output_name = 0
-
-   .. todo:: macOS
-
-   **Windows**
-      .. code-block:: text
-
-         output_name  = \\.\DISPLAY1
-
-fps
-^^^
-
-**Description**
-   The fps modes advertised by Sunshine.
-
-   .. note:: Some versions of Moonlight, such as Moonlight-nx (Switch), rely on this list to ensure that the requested
-      fps is supported.
-
-**Default**
-   ``[10, 30, 60, 90, 120]``
-
-**Example**
-   .. code-block:: text
-
-      fps = [10, 30, 60, 90, 120]
-
-resolutions
-^^^^^^^^^^^
-
-**Description**
-   The resolutions advertised by Sunshine.
-
-   .. note:: Some versions of Moonlight, such as Moonlight-nx (Switch), rely on this list to ensure that the requested
-      resolution is supported.
-
-**Default**
-   .. code-block:: text
-
-      [
-        352x240,
-        480x360,
-        858x480,
-        1280x720,
-        1920x1080,
-        2560x1080,
-        3440x1440,
-        1920x1200,
-        3840x2160,
-        3840x1600,
-      ]
-
-**Example**
-   .. code-block:: text
-
-      resolutions = [
-        352x240,
-        480x360,
-        858x480,
-        1280x720,
-        1920x1080,
-        2560x1080,
-        3440x1440,
-        1920x1200,
-        3840x2160,
-        3840x1600,
-      ]
-
-Audio
------
-
-audio_sink
-^^^^^^^^^^
+`audio_sink <https://localhost:47990/config/#audio_sink>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    The name of the audio sink used for audio loopback.
@@ -562,8 +520,8 @@ audio_sink
 
          audio_sink = Speakers (High Definition Audio Device)
 
-virtual_sink
-^^^^^^^^^^^^
+`virtual_sink <https://localhost:47990/config/#virtual_sink>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    The audio device that's virtual, like Steam Streaming Speakers. This allows Sunshine to stream audio, while muting
@@ -585,8 +543,8 @@ virtual_sink
 
       virtual_sink = Steam Streaming Speakers
 
-install_steam_audio_drivers
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
+`install_steam_audio_drivers <https://localhost:47990/config/#install_steam_audio_drivers>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    Installs the Steam Streaming Speakers driver (if Steam is installed) to support surround sound and muting host audio.
@@ -601,25 +559,187 @@ install_steam_audio_drivers
 
       install_steam_audio_drivers = enabled
 
-Network
--------
-
-external_ip
-^^^^^^^^^^^
+`adapter_name <https://localhost:47990/config/#adapter_name>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
-   If no external IP address is given, Sunshine will attempt to automatically detect external ip-address.
+   Select the video card you want to stream.
+
+   .. tip:: To find the name of the appropriate values follow these instructions.
+
+      **Linux + VA-API**
+         Unlike with `amdvce` and `nvenc`, it doesn't matter if video encoding is done on a different GPU.
+
+         .. code-block:: bash
+
+            ls /dev/dri/renderD*  # to find all devices capable of VAAPI
+
+            # replace ``renderD129`` with the device from above to lists the name and capabilities of the device
+            vainfo --display drm --device /dev/dri/renderD129 | \
+              grep -E "((VAProfileH264High|VAProfileHEVCMain|VAProfileHEVCMain10).*VAEntrypointEncSlice)|Driver version"
+
+         To be supported by Sunshine, it needs to have at the very minimum:
+         ``VAProfileH264High   : VAEntrypointEncSlice``
+
+      .. todo:: macOS
+
+      **Windows**
+         .. code-block:: batch
+
+            tools\dxgi-info.exe
+
+         .. note:: For hybrid graphics systems, DXGI reports the outputs are connected to whichever graphics adapter
+            that the application is configured to use, so it's not a reliable indicator of how the display is
+            physically connected.
 
 **Default**
-   Automatic
+   Sunshine will select the default video card.
+
+**Examples**
+   **Linux**
+      .. code-block:: text
+
+         adapter_name = /dev/dri/renderD128
+
+   .. todo:: macOS
+
+   **Windows**
+      .. code-block:: text
+
+         adapter_name = Radeon RX 580 Series
+
+`output_name <https://localhost:47990/config/#output_name>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   Select the display number you want to stream.
+
+   .. tip:: To find the name of the appropriate values follow these instructions.
+
+      **Linux**
+         During Sunshine startup, you should see the list of detected monitors:
+
+         .. code-block:: text
+
+            Info: Detecting connected monitors
+            Info: Detected monitor 0: DVI-D-0, connected: false
+            Info: Detected monitor 1: HDMI-0, connected: true
+            Info: Detected monitor 2: DP-0, connected: true
+            Info: Detected monitor 3: DP-1, connected: false
+            Info: Detected monitor 4: DVI-D-1, connected: false
+
+         You need to use the value before the colon in the output, e.g. ``1``.
+
+      .. todo:: macOS
+
+      **Windows**
+         .. code-block:: batch
+
+            tools\dxgi-info.exe
+
+**Default**
+   Sunshine will select the default display.
+
+**Examples**
+   **Linux**
+      .. code-block:: text
+
+         output_name = 0
+
+   .. todo:: macOS
+
+   **Windows**
+      .. code-block:: text
+
+         output_name  = \\.\DISPLAY1
+
+`resolutions <https://localhost:47990/config/#resolutions>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   The resolutions advertised by Sunshine.
+
+   .. note:: Some versions of Moonlight, such as Moonlight-nx (Switch), rely on this list to ensure that the requested
+      resolution is supported.
+
+**Default**
+   .. code-block:: text
+
+      [
+        352x240,
+        480x360,
+        858x480,
+        1280x720,
+        1920x1080,
+        2560x1080,
+        3440x1440,
+        1920x1200,
+        3840x2160,
+        3840x1600,
+      ]
 
 **Example**
    .. code-block:: text
 
-      external_ip = 123.456.789.12
+      resolutions = [
+        352x240,
+        480x360,
+        858x480,
+        1280x720,
+        1920x1080,
+        2560x1080,
+        3440x1440,
+        1920x1200,
+        3840x2160,
+        3840x1600,
+      ]
 
-port
-^^^^
+`fps <https://localhost:47990/config/#fps>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   The fps modes advertised by Sunshine.
+
+   .. note:: Some versions of Moonlight, such as Moonlight-nx (Switch), rely on this list to ensure that the requested
+      fps is supported.
+
+**Default**
+   ``[10, 30, 60, 90, 120]``
+
+**Example**
+   .. code-block:: text
+
+      fps = [10, 30, 60, 90, 120]
+
+`Network <https://localhost:47990/config/#network>`__
+-----------------------------------------------------
+
+`address_family <https://localhost:47990/config/#address_family>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   Set the address family that Sunshine will use.
+
+.. table::
+   :widths: auto
+
+   =====     ===========
+   Value     Description
+   =====     ===========
+   ipv4      IPv4 only
+   both      IPv4+IPv6
+   =====     ===========
+
+**Default**
+   ``ipv4``
+
+**Example**
+   .. code-block:: text
+
+      address_family = both
+
+`port <https://localhost:47990/config/#port>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    Set the family of ports used by Sunshine. Changing this value will offset other ports per the table below.
@@ -653,64 +773,8 @@ port
 
       port = 47989
 
-address_family
-^^^^^^^^^^^^^^
-
-**Description**
-   Set the address family that Sunshine will use.
-
-.. table::
-   :widths: auto
-
-   =====     ===========
-   Value     Description
-   =====     ===========
-   ipv4      IPv4 only
-   both      IPv4+IPv6
-   =====     ===========
-
-**Default**
-   ``ipv4``
-
-**Example**
-   .. code-block:: text
-
-      address_family = both
-
-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**
-   ``credentials/cakey.pem``
-
-**Example**
-   .. code-block:: text
-
-      pkey = /dir/pkey.pem
-
-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**
-   ``credentials/cacert.pem``
-
-**Example**
-   .. code-block:: text
-
-      cert = /dir/cert.pem
-
-origin_web_ui_allowed
-^^^^^^^^^^^^^^^^^^^^^
+`origin_web_ui_allowed <https://localhost:47990/config/#origin_web_ui_allowed>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    The origin of the remote endpoint address that is not denied for HTTPS Web UI.
@@ -736,8 +800,8 @@ origin_web_ui_allowed
 
       origin_web_ui_allowed = lan
 
-upnp
-^^^^
+`upnp <https://localhost:47990/config/#upnp>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    Sunshine will attempt to open ports for streaming over the internet.
@@ -762,8 +826,22 @@ upnp
 
       upnp = on
 
-ping_timeout
-^^^^^^^^^^^^
+`external_ip <https://localhost:47990/config/#external_ip>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   If no external IP address is given, Sunshine will attempt to automatically detect external ip-address.
+
+**Default**
+   Automatic
+
+**Example**
+   .. code-block:: text
+
+      external_ip = 123.456.789.12
+
+`ping_timeout <https://localhost:47990/config/#ping_timeout>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    How long to wait, in milliseconds, for data from Moonlight before shutting down the stream.
@@ -776,11 +854,11 @@ ping_timeout
 
       ping_timeout = 10000
 
-Encoding
---------
+`Advanced <https://localhost:47990/config/#advanced>`__
+-------------------------------------------------------
 
-channels
-^^^^^^^^
+`channels <https://localhost:47990/config/#channels>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    This will generate distinct video streams, unlike simply broadcasting to multiple Clients.
@@ -802,8 +880,8 @@ channels
 
       channels = 1
 
-fec_percentage
-^^^^^^^^^^^^^^
+`fec_percentage <https://localhost:47990/config/#fec_percentage>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    Percentage of error correcting packets per data packet in each video frame.
@@ -821,8 +899,8 @@ fec_percentage
 
       fec_percentage = 20
 
-qp
-^^
+`qp <https://localhost:47990/config/#qp>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    Quantization Parameter. Some devices don't support Constant Bit Rate. For those devices, QP is used instead.
@@ -837,8 +915,8 @@ qp
 
       qp = 28
 
-min_threads
-^^^^^^^^^^^
+`min_threads <https://localhost:47990/config/#min_threads>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    Minimum number of threads used for software encoding.
@@ -855,8 +933,8 @@ min_threads
 
       min_threads = 1
 
-hevc_mode
-^^^^^^^^^
+`hevc_mode <https://localhost:47990/config/#hevc_mode>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    Allows the client to request HEVC Main or HEVC Main10 video streams.
@@ -886,8 +964,8 @@ hevc_mode
 
       hevc_mode = 2
 
-av1_mode
-^^^^^^^^^
+`av1_mode <https://localhost:47990/config/#av1_mode>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    Allows the client to request AV1 Main 8-bit or 10-bit video streams.
@@ -917,8 +995,8 @@ av1_mode
 
       av1_mode = 2
 
-capture
-^^^^^^^
+`capture <https://localhost:47990/config/#capture>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    Force specific screen capture method.
@@ -951,8 +1029,8 @@ capture
 
       capture = kms
 
-encoder
-^^^^^^^
+`encoder <https://localhost:47990/config/#encoder>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    Force a specific encoder.
@@ -979,8 +1057,439 @@ encoder
 
       encoder = nvenc
 
-sw_preset
-^^^^^^^^^
+`NVIDIA NVENC Encoder <https://localhost:47990/config/#nvidia-nvenc-encoder>`__
+-------------------------------------------------------------------------------
+
+`nvenc_preset <https://localhost:47990/config/#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`_.
+
+**Choices**
+
+.. table::
+   :widths: auto
+
+   ========== ===========
+   Value      Description
+   ========== ===========
+   1          P1 (fastest)
+   2          P2
+   3          P3
+   4          P4
+   5          P5
+   6          P6
+   7          P7 (slowest)
+   ========== ===========
+
+**Default**
+   ``1``
+
+**Example**
+   .. code-block:: text
+
+      nvenc_preset = 1
+
+`nvenc_twopass <https://localhost:47990/config/#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`_.
+
+**Choices**
+
+.. table::
+   :widths: auto
+
+   =========== ===========
+   Value       Description
+   =========== ===========
+   disabled    One pass (fastest)
+   quarter_res Two passes, first pass at quarter resolution (faster)
+   full_res    Two passes, first pass at full resolution (slower)
+   =========== ===========
+
+**Default**
+   ``quarter_res``
+
+**Example**
+   .. code-block:: text
+
+      nvenc_twopass = quarter_res
+
+`nvenc_realtime_hags <https://localhost:47990/config/#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`_.
+
+   .. caution:: Applies to Windows only.
+
+**Choices**
+
+.. table::
+   :widths: auto
+
+   ========== ===========
+   Value      Description
+   ========== ===========
+   disabled   Use high priority
+   enabled    Use realtime priority
+   ========== ===========
+
+**Default**
+   ``enabled``
+
+**Example**
+   .. code-block:: text
+
+      nvenc_realtime_hags = enabled
+
+`nvenc_h264_cavlc <https://localhost:47990/config/#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 NVENC `encoder`_.
+
+**Choices**
+
+.. table::
+   :widths: auto
+
+   ========== ===========
+   Value      Description
+   ========== ===========
+   disabled   Prefer CABAC
+   enabled    Prefer CAVLC
+   ========== ===========
+
+**Default**
+   ``disabled``
+
+**Example**
+   .. code-block:: text
+
+      nvenc_h264_cavlc = disabled
+
+`Intel QuickSync Encoder <https://localhost:47990/config/#intel-quicksync-encoder>`__
+-------------------------------------------------------------------------------------
+
+`qsv_preset <https://localhost:47990/config/#qsv_preset>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   The encoder preset to use.
+
+   .. note:: This option only applies when using quicksync `encoder`_.
+
+**Choices**
+
+.. table::
+   :widths: auto
+
+   ========== ===========
+   Value      Description
+   ========== ===========
+   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)
+   ========== ===========
+
+**Default**
+   ``medium``
+
+**Example**
+   .. code-block:: text
+
+      qsv_preset = medium
+
+`qsv_coder <https://localhost:47990/config/#qsv_coder>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   The entropy encoding to use.
+
+   .. note:: This option only applies when using H264 with quicksync `encoder`_.
+
+**Choices**
+
+.. table::
+   :widths: auto
+
+   ========== ===========
+   Value      Description
+   ========== ===========
+   auto       let ffmpeg decide
+   cabac      context adaptive binary arithmetic coding - higher quality
+   cavlc      context adaptive variable-length coding - faster decode
+   ========== ===========
+
+**Default**
+   ``auto``
+
+**Example**
+   .. code-block:: text
+
+      qsv_coder = auto
+
+`AMD AMF Encoder <https://localhost:47990/config/#amd-amf-encoder>`__
+---------------------------------------------------------------------
+
+`amd_quality <https://localhost:47990/config/#amd_quality>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   The encoder preset to use.
+
+   .. note:: This option only applies when using amdvce `encoder`_.
+
+**Choices**
+
+.. table::
+   :widths: auto
+
+   ========== ===========
+   Value      Description
+   ========== ===========
+   speed      prefer speed
+   balanced   balanced
+   quality    prefer quality
+   ========== ===========
+
+**Default**
+   ``balanced``
+
+**Example**
+   .. code-block:: text
+
+      amd_quality = balanced
+
+`amd_rc <https://localhost:47990/config/#amd_rc>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   The encoder rate control.
+
+   .. note:: This option only applies when using amdvce `encoder`_.
+
+**Choices**
+
+.. table::
+   :widths: auto
+
+   =========== ===========
+   Value       Description
+   =========== ===========
+   cqp         constant qp mode
+   cbr         constant bitrate
+   vbr_latency variable bitrate, latency constrained
+   vbr_peak    variable bitrate, peak constrained
+   =========== ===========
+
+**Default**
+   ``vbr_latency``
+
+**Example**
+   .. code-block:: text
+
+      amd_rc = vbr_latency
+
+`amd_usage <https://localhost:47990/config/#amd_usage>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   The encoder usage profile, used to balance latency with encoding quality.
+
+   .. note:: This option only applies when using amdvce `encoder`_.
+
+**Choices**
+
+.. table::
+   :widths: auto
+
+   =============== ===========
+   Value           Description
+   =============== ===========
+   transcoding     transcoding (slowest)
+   webcam          webcam (slow)
+   lowlatency      low latency (fast)
+   ultralowlatency ultra low latency (fastest)
+   =============== ===========
+
+**Default**
+   ``ultralowlatency``
+
+**Example**
+   .. code-block:: text
+
+      amd_usage = ultralowlatency
+
+`amd_preanalysis <https://localhost:47990/config/#amd_preanalysis>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   Preanalysis can increase encoding quality at the cost of latency.
+
+   .. note:: This option only applies when using amdvce `encoder`_.
+
+**Default**
+   ``disabled``
+
+**Example**
+   .. code-block:: text
+
+      amd_preanalysis = disabled
+
+`amd_vbaq <https://localhost:47990/config/#amd_vbaq>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   Variance Based Adaptive Quantization (VBAQ) can increase subjective visual quality.
+
+   .. note:: This option only applies when using amdvce `encoder`_.
+
+**Default**
+   ``enabled``
+
+**Example**
+   .. code-block:: text
+
+      amd_vbaq = enabled
+
+`amd_coder <https://localhost:47990/config/#amd_coder>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   The entropy encoding to use.
+
+   .. note:: This option only applies when using H264 with amdvce `encoder`_.
+
+**Choices**
+
+.. table::
+   :widths: auto
+
+   ========== ===========
+   Value      Description
+   ========== ===========
+   auto       let ffmpeg decide
+   cabac      context adaptive variable-length coding - higher quality
+   cavlc      context adaptive binary arithmetic coding - faster decode
+   ========== ===========
+
+**Default**
+   ``auto``
+
+**Example**
+   .. code-block:: text
+
+      amd_coder = auto
+
+`VideoToolbox Encoder <https://localhost:47990/config/#videotoolbox-encoder>`__
+-------------------------------------------------------------------------------
+
+`vt_coder <https://localhost:47990/config/#vt_coder>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   The entropy encoding to use.
+
+   .. note:: This option only applies when using macOS.
+
+**Choices**
+
+.. table::
+   :widths: auto
+
+   ========== ===========
+   Value      Description
+   ========== ===========
+   auto       let ffmpeg decide
+   cabac
+   cavlc
+   ========== ===========
+
+**Default**
+   ``auto``
+
+**Example**
+   .. code-block:: text
+
+      vt_coder = auto
+
+`vt_software <https://localhost:47990/config/#vt_software>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   Force Video Toolbox to use software encoding.
+
+   .. note:: This option only applies when using macOS.
+
+**Choices**
+
+.. table::
+   :widths: auto
+
+   ========== ===========
+   Value      Description
+   ========== ===========
+   auto       let ffmpeg decide
+   disabled   disable software encoding
+   allowed    allow software encoding
+   forced     force software encoding
+   ========== ===========
+
+**Default**
+   ``auto``
+
+**Example**
+   .. code-block:: text
+
+      vt_software = auto
+
+`vt_realtime <https://localhost:47990/config/#vt_realtime>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+**Description**
+   Realtime encoding.
+
+   .. note:: This option only applies when using macOS.
+
+   .. warning:: Disabling realtime encoding might result in a delayed frame encoding or frame drop.
+
+**Default**
+   ``enabled``
+
+**Example**
+   .. code-block:: text
+
+      vt_realtime = enabled
+
+`Software Encoder <https://localhost:47990/config/#software-encoder>`__
+-----------------------------------------------------------------------
+
+`sw_preset <https://localhost:47990/config/#sw_preset>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    The encoder preset to use.
@@ -1021,10 +1530,10 @@ sw_preset
 **Example**
    .. code-block:: text
 
-      sw_preset  = superfast
+      sw_preset = superfast
 
-sw_tune
-^^^^^^^
+`sw_tune <https://localhost:47990/config/#sw_tune>`__
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 **Description**
    The tuning preset to use.
@@ -1057,466 +1566,4 @@ sw_tune
 **Example**
    .. code-block:: text
 
-      sw_tune    = zerolatency
-
-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`_.
-
-**Choices**
-
-.. table::
-   :widths: auto
-
-   ========== ===========
-   Value      Description
-   ========== ===========
-   1          P1 (fastest)
-   2          P2
-   3          P3
-   4          P4
-   5          P5
-   6          P6
-   7          P7 (slowest)
-   ========== ===========
-
-**Default**
-   ``1``
-
-**Example**
-   .. code-block:: text
-
-      nvenc_preset = 1
-
-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`_.
-
-**Choices**
-
-.. table::
-   :widths: auto
-
-   =========== ===========
-   Value       Description
-   =========== ===========
-   disabled    One pass (fastest)
-   quarter_res Two passes, first pass at quarter resolution (faster)
-   full_res    Two passes, first pass at full resolution (slower)
-   =========== ===========
-
-**Default**
-   ``quarter_res``
-
-**Example**
-   .. code-block:: text
-
-      nvenc_twopass = quarter_res
-
-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`_.
-
-   .. caution:: Applies to Windows only.
-
-**Choices**
-
-.. table::
-   :widths: auto
-
-   ========== ===========
-   Value      Description
-   ========== ===========
-   disabled   Use high priority
-   enabled    Use realtime priority
-   ========== ===========
-
-**Default**
-   ``enabled``
-
-**Example**
-   .. code-block:: text
-
-      nvenc_realtime_hags = enabled
-
-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 NVENC `encoder`_.
-
-**Choices**
-
-.. table::
-   :widths: auto
-
-   ========== ===========
-   Value      Description
-   ========== ===========
-   disabled   Prefer CABAC
-   enabled    Prefer CAVLC
-   ========== ===========
-
-**Default**
-   ``disabled``
-
-**Example**
-   .. code-block:: text
-
-      nvenc_h264_cavlc = disabled
-
-qsv_preset
-^^^^^^^^^^
-
-**Description**
-   The encoder preset to use.
-
-   .. note:: This option only applies when using quicksync `encoder`_.
-
-**Choices**
-
-.. table::
-   :widths: auto
-
-   ========== ===========
-   Value      Description
-   ========== ===========
-   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)
-   ========== ===========
-
-**Default**
-   ``medium``
-
-**Example**
-   .. code-block:: text
-
-      qsv_preset = medium
-
-qsv_coder
-^^^^^^^^^
-
-**Description**
-   The entropy encoding to use.
-
-   .. note:: This option only applies when using H264 with quicksync `encoder`_.
-
-**Choices**
-
-.. table::
-   :widths: auto
-
-   ========== ===========
-   Value      Description
-   ========== ===========
-   auto       let ffmpeg decide
-   cabac      context adaptive binary arithmetic coding - higher quality
-   cavlc      context adaptive variable-length coding - faster decode
-   ========== ===========
-
-**Default**
-   ``auto``
-
-**Example**
-   .. code-block:: text
-
-      qsv_coder = auto
-
-amd_quality
-^^^^^^^^^^^
-
-**Description**
-   The encoder preset to use.
-
-   .. note:: This option only applies when using amdvce `encoder`_.
-
-**Choices**
-
-.. table::
-   :widths: auto
-
-   ========== ===========
-   Value      Description
-   ========== ===========
-   speed      prefer speed
-   balanced   balanced
-   quality    prefer quality
-   ========== ===========
-
-**Default**
-   ``balanced``
-
-**Example**
-   .. code-block:: text
-
-      amd_quality = balanced
-
-amd_rc
-^^^^^^
-
-**Description**
-   The encoder rate control.
-
-   .. note:: This option only applies when using amdvce `encoder`_.
-
-**Choices**
-
-.. table::
-   :widths: auto
-
-   =========== ===========
-   Value       Description
-   =========== ===========
-   cqp         constant qp mode
-   cbr         constant bitrate
-   vbr_latency variable bitrate, latency constrained
-   vbr_peak    variable bitrate, peak constrained
-   =========== ===========
-
-**Default**
-   ``vbr_latency``
-
-**Example**
-   .. code-block:: text
-
-      amd_rc = vbr_latency
-
-amd_usage
-^^^^^^^^^
-
-**Description**
-   The encoder usage profile, used to balance latency with encoding quality.
-
-   .. note:: This option only applies when using amdvce `encoder`_.
-
-**Choices**
-
-.. table::
-   :widths: auto
-
-   =============== ===========
-   Value           Description
-   =============== ===========
-   transcoding     transcoding (slowest)
-   webcam          webcam (slow)
-   lowlatency      low latency (fast)
-   ultralowlatency ultra low latency (fastest)
-   =============== ===========
-
-**Default**
-   ``ultralowlatency``
-
-**Example**
-   .. code-block:: text
-
-      amd_usage = ultralowlatency
-
-amd_preanalysis
-^^^^^^^^^^^^^^^
-
-**Description**
-   Preanalysis can increase encoding quality at the cost of latency.
-
-   .. note:: This option only applies when using amdvce `encoder`_.
-
-**Default**
-   ``disabled``
-
-**Example**
-   .. code-block:: text
-
-      amd_preanalysis = disabled
-
-amd_vbaq
-^^^^^^^^
-
-**Description**
-   Variance Based Adaptive Quantization (VBAQ) can increase subjective visual quality.
-
-   .. note:: This option only applies when using amdvce `encoder`_.
-
-**Default**
-   ``enabled``
-
-**Example**
-   .. code-block:: text
-
-      amd_vbaq = enabled
-
-amd_coder
-^^^^^^^^^
-
-**Description**
-   The entropy encoding to use.
-
-   .. note:: This option only applies when using H264 with amdvce `encoder`_.
-
-**Choices**
-
-.. table::
-   :widths: auto
-
-   ========== ===========
-   Value      Description
-   ========== ===========
-   auto       let ffmpeg decide
-   cabac      context adaptive variable-length coding - higher quality
-   cavlc      context adaptive binary arithmetic coding - faster decode
-   ========== ===========
-
-**Default**
-   ``auto``
-
-**Example**
-   .. code-block:: text
-
-      amd_coder = auto
-
-vt_software
-^^^^^^^^^^^
-
-**Description**
-   Force Video Toolbox to use software encoding.
-
-   .. note:: This option only applies when using macOS.
-
-**Choices**
-
-.. table::
-   :widths: auto
-
-   ========== ===========
-   Value      Description
-   ========== ===========
-   auto       let ffmpeg decide
-   disabled   disable software encoding
-   allowed    allow software encoding
-   forced     force software encoding
-   ========== ===========
-
-**Default**
-   ``auto``
-
-**Example**
-   .. code-block:: text
-
-      vt_software = auto
-
-vt_realtime
-^^^^^^^^^^^
-
-**Description**
-   Realtime encoding.
-
-   .. note:: This option only applies when using macOS.
-
-   .. warning:: Disabling realtime encoding might result in a delayed frame encoding or frame drop.
-
-**Default**
-   ``enabled``
-
-**Example**
-   .. code-block:: text
-
-      vt_realtime = enabled
-
-vt_coder
-^^^^^^^^
-
-**Description**
-   The entropy encoding to use.
-
-   .. note:: This option only applies when using macOS.
-
-**Choices**
-
-.. table::
-   :widths: auto
-
-   ========== ===========
-   Value      Description
-   ========== ===========
-   auto       let ffmpeg decide
-   cabac
-   cavlc
-   ========== ===========
-
-**Default**
-   ``auto``
-
-**Example**
-   .. code-block:: text
-
-      vt_coder = auto
-
-Advanced
---------
-
-file_apps
-^^^^^^^^^
-
-**Description**
-   The application configuration file path. The file contains a json formatted list of applications that can be started
-   by Moonlight.
-
-**Default**
-   OS and package dependent
-
-**Example**
-   .. code-block:: text
-
-      file_apps = apps.json
-
-file_state
-^^^^^^^^^^
-
-**Description**
-   The file where current state of Sunshine is stored.
-
-**Default**
-   ``sunshine_state.json``
-
-**Example**
-   .. code-block:: text
-
-      file_state = sunshine_state.json
-
-credentials_file
-^^^^^^^^^^^^^^^^
-
-**Description**
-   The file where user credentials for the UI are stored.
-
-**Default**
-   ``sunshine_state.json``
-
-**Example**
-   .. code-block:: text
-
-      credentials_file = sunshine_state.json
+      sw_tune = zerolatency
diff --git a/src_assets/common/assets/web/config.html b/src_assets/common/assets/web/config.html
index 875135e0..54ca2ed9 100644
--- a/src_assets/common/assets/web/config.html
+++ b/src_assets/common/assets/web/config.html
@@ -36,7 +36,7 @@
       </ul>
 
       <!-- General Tab -->
-      <div v-if="currentTab === 'general'" class="config-page">
+      <div id="general" v-if="currentTab === 'general'" class="config-page">
         <!-- Sunshine Name -->
         <div class="mb-3">
           <label for="sunshine_name" class="form-label">Sunshine Name</label>
@@ -65,7 +65,7 @@
         </div>
 
         <!-- Global Prep Commands -->
-        <div class="mb-3 d-flex flex-column">
+        <div id="global_prep_cmd" class="mb-3 d-flex flex-column">
           <label class="form-label">Command Preparations</label>
           <div class="form-text">
             Configure a list of commands to be executed before or after running any application.
@@ -115,7 +115,7 @@
       </div>
 
       <!-- Files Tab -->
-      <div v-if="currentTab === 'files'" class="config-page">
+      <div id="files" v-if="currentTab === 'files'" class="config-page">
         <!-- Apps File -->
         <div class="mb-3">
           <label for="file_apps" class="form-label">Apps File</label>
@@ -174,11 +174,11 @@
       </div>
 
       <!-- Input Tab -->
-      <div v-if="currentTab === 'input'" class="config-page">
+      <div id="input" v-if="currentTab === 'input'" class="config-page">
         <!-- Enable Gamepad Input -->
         <div class="mb-3">
-          <label for="gamepad" class="form-label">Enable Gamepad Input</label>
-          <select id="gamepad" class="form-select" v-model="config.controller">
+          <label for="controller" class="form-label">Enable Gamepad Input</label>
+          <select id="controller" class="form-select" v-model="config.controller">
             <option value="disabled">Disabled</option>
             <option value="enabled">Enabled</option>
           </select>
@@ -319,8 +319,8 @@
 
         <!-- Mapping Key AltRight to Key Windows -->
         <div class="mb-3" v-if="config.keyboard === 'enabled'">
-          <label for="mapkey" class="form-label">Map Right Alt key to Windows key</label>
-          <select id="mapkey" class="form-select" v-model="config.key_rightalt_to_key_win">
+          <label for="key_rightalt_to_key_win" class="form-label">Map Right Alt key to Windows key</label>
+          <select id="key_rightalt_to_key_win" class="form-select" v-model="config.key_rightalt_to_key_win">
             <option value="disabled">Disabled</option>
             <option value="enabled">Enabled</option>
           </select>
@@ -373,7 +373,7 @@
       </div>
 
       <!-- Audio/Video Tab -->
-      <div v-if="currentTab === 'av'" class="config-page">
+      <div id="audio-video" v-if="currentTab === 'av'" class="config-page">
         <!-- Audio Sink -->
         <div class="mb-3" v-if="platform === 'windows'">
           <label for="audio_sink" class="form-label">Audio Sink</label>
@@ -500,7 +500,7 @@
         <!-- Display Modes -->
         <div class="mb-3">
           <!-- Advertised Resolutions -->
-          <div class="resolutions-container">
+          <div id="resolutions" class="resolutions-container">
             <label>Advertised Resolutions</label>
             <div class="resolutions d-flex flex-wrap">
               <div class="p-2 ms-item m-2 d-flex justify-content-between" v-for="(r,i) in resolutions" :key="r">
@@ -521,7 +521,7 @@
           </div>
 
           <!-- Advertised FPS -->
-          <div class="fps-container">
+          <div id="fps" class="fps-container">
             <label>Advertised FPS</label>
             <div class="fps d-flex flex-wrap">
               <div class="p-2 ms-item m-2 d-flex justify-content-between" v-for="(f,i) in fps" :key="f">
@@ -552,7 +552,7 @@
       </div>
 
       <!-- Network Tab -->
-      <div v-if="currentTab === 'network'" class="config-page">
+      <div id="network" v-if="currentTab === 'network'" class="config-page">
         <!-- Address family -->
         <div class="mb-3">
           <label for="address_family" class="form-label">Address Family</label>
@@ -813,7 +813,7 @@
       </div>
 
       <!-- NVIDIA NVENC Encoder Tab -->
-      <div v-if="currentTab === 'nv'" class="config-page">
+      <div id="nvidia-nvenc-encoder" v-if="currentTab === 'nv'" class="config-page">
         <!-- Performance preset -->
         <div class="mb-3">
           <label for="nvenc_preset" class="form-label">Performance preset</label>
@@ -897,7 +897,7 @@
       </div>
 
       <!-- Intel QuickSync Encoder Tab -->
-      <div v-if="currentTab === 'qsv'" class="config-page">
+      <div id="intel-quicksync-encoder" v-if="currentTab === 'qsv'" class="config-page">
         <!-- QuickSync Preset -->
         <div class="mb-3">
           <label for="qsv_preset" class="form-label">QuickSync Preset</label>
@@ -925,7 +925,7 @@
       </div>
 
       <!-- AMD AMF Encoder Tab -->
-      <div v-if="currentTab === 'amd'" class="config-page">
+      <div id="amd-amf-encoder" v-if="currentTab === 'amd'" class="config-page">
         <!-- AMF Quality -->
         <div class="mb-3">
           <label for="amd_quality" class="form-label">AMF Quality</label>
@@ -958,7 +958,7 @@
           </select>
         </div>
 
-        <!-- AMF Preanalysis -->
+        <!-- AMD Preanalysis -->
         <div class="mb-3">
           <label for="amd_preanalysis" class="form-label">AMF Preanalysis</label>
           <select id="amd_preanalysis" class="form-select" v-model="config.amd_preanalysis">
@@ -967,7 +967,7 @@
           </select>
         </div>
 
-        <!-- AMF VBAQ -->
+        <!-- AMD VBAQ -->
         <div class="mb-3">
           <label for="amd_vbaq" class="form-label">AMF Variance Based Adaptive Quantization (VBAQ)</label>
           <select id="amd_vbaq" class="form-select" v-model="config.amd_vbaq">
@@ -988,7 +988,7 @@
       </div>
 
       <!-- VideoToolbox Encoder Tab -->
-      <div v-if="currentTab === 'vt'" class="config-page">
+      <div id="videotoolbox-encoder" v-if="currentTab === 'vt'" class="config-page">
         <!-- Presets -->
         <div class="mb-3">
           <label for="vt_coder" class="form-label">VideoToolbox Coder</label>
@@ -1017,7 +1017,7 @@
       </div>
 
       <!-- Software Encoder Tab -->
-      <div v-if="currentTab === 'sw'" class="config-page">
+      <div id="software-encoder" v-if="currentTab === 'sw'" class="config-page">
         <div class="mb-3">
           <label for="sw_preset" class="form-label">SW Presets</label>
           <select id="sw_preset" class="form-select" v-model="config.sw_preset">