{#if loading}
Loading config...
{:else if config}
{ e.preventDefault(); save_config(); }} >

Note: Rayhunter draws over the device's native UI, so some flickering is expected

Notification Settings

Test button below uses the saved configuration URL, not the input above

{#if testMessage}
{testMessage}
{/if}
Enabled Notification Types

Storage Management

Recording will not start if less than this amount of disk space is free

Recording will stop automatically if disk space drops below this level

WebDAV Upload

Once a recording has been closed for at least the configured age, both the .qmdl and .ndjson files are uploaded in the background to the WebDAV server.

{ webdavExpanded = e.currentTarget.checked; if (webdavExpanded) { setTimeout(() => webdavUrlInput?.focus(), 0); } else { if (config) config.webdav.url = ''; } }} class="h-4 w-4 text-rayhunter-blue focus:ring-rayhunter-blue border-gray-300 rounded-sm" />
{#if webdavExpanded}
{ if (config && config.webdav.url.trim() === '') { webdavExpanded = false; } }} placeholder="https://dav.example.com/rayhunter/" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-hidden focus:ring-2 focus:ring-rayhunter-blue" />

Files are uploaded via HTTP PUT under this base URL. No folders are created, and folders in this base URL are assumed to exist already.

Optional. Leave blank for unauthenticated uploads.

A password without a username will be rejected and the request will be sent unauthenticated.

How often the worker checks for new entries to upload.

How long a recording must be closed before it becomes eligible for upload.

When enabled, the local files are removed after a successful upload. Otherwise the manifest is just marked as uploaded.

{/if}
{#if config.device === 'orbic' || config.device === 'moxee' || config.device === 'tmobile' || config.device === 'wingtech'}

WiFi Client Mode

Connect the device to an existing WiFi network for internet access (e.g. notifications, remote access). The hotspot AP stays running alongside WiFi client mode.

Unchecking stops WiFi without clearing saved credentials.

{#if wifiStatus && config.wifi_enabled} {#if wifiStatus.state === 'connected'}

Connected to "{wifiStatus.ssid}" ({wifiStatus.ip})

{:else if wifiStatus.state === 'connecting'}

Connecting...

{:else if wifiStatus.state === 'recovering'}

Recovering connection...

{:else if wifiStatus.state === 'dataPathDead'}

Data path stalled, attempting recovery...

{:else if wifiStatus.state === 'failed'}

Failed: {wifiStatus.error}

{/if} {/if}
{#if scanError}

{scanError}

{/if} {#if scanResults.length > 0}
{#each scanResults as network} {/each}
{/if} {#if config.wifi_ssid}
{/if}

Changing the network requires re-entering the password.

{#if config.wifi_ssid}

Comma-separated. Used when WiFi is active. Defaults to 9.9.9.9, 149.112.112.112 (Quad9).

{/if}
{/if}

Analyzer Heuristic Settings

GPS Settings

{#if config.gps_mode === GpsMode.Api} POST latitude, longitude, and timestamp to /api/gps from any device on the network. {:else if config.gps_mode === GpsMode.Fixed} GPS coordinates are fixed to the values below. {:else} GPS is disabled; no coordinates will be tracked. {/if}

{#if config.gps_mode === GpsMode.Fixed}

Decimal degrees, -90 to 90

Decimal degrees, -180 to 180

{/if}
{#if message}
{message}
{/if} {:else}
Failed to load configuration. Please try reloading the page.
{/if}