doc/configuration.md
Rayhunter can be configured through web user interface or by editing /data/rayhunter/config.toml on the device.
Through web UI you can set:
https://ntfy.sh/rayhunter_notifications_ba9di7ie or https://myserver.example.com/rayhunter_notifications_ba9di7ie. The ntfy Android and iOS apps can then be used to receive notifications. More information can be found in the ntfy docs.The GPS Settings allows you to attach GPS-based location history to every recording. Data is stored as a separate JSON file next to QMDL, and also inlined into the PCAP file as packet comment.
The modes are:
Disabled, the default option, disables this feature entirely.
Fixed, for hardcoding latitude (-90 to 90) and longitude (-180 to 180) for devices that don't move very often or at all. Every packet in the recording will have that location.
API Endpoint, enables the POST /api/gps endpoint so that third-party tools (i.e. your own scripts) can update location info continuously. Please refer to the API documentation for more info.
The GPS data is stored as a separate JSON file next to QMDL captures, and contains its own timestamps. These timestamps are meant to be compared during analysis with the packet timestamp so we know the time difference between the packet capture from the GPS capture, if there is any, since GPS data and packet data may come from two entirely separate devices.
On the Orbic, Moxee, UZ801, TMOHS1, and Wingtech, Rayhunter can connect the device to an existing WiFi network while keeping the hotspot running. This gives the device internet access for notifications and lets you reach the web UI from any device on that network.
config.toml (in wpa_sta.conf on the device) and is never exposed through the API.9.9.9.9 and 149.112.112.112 (Quad9) if not set.After saving, the connection status will show connecting, connected (with the assigned IP address), or failed (with an error message). If the connection fails, check that the SSID and password are correct and that the network is in range.
The WiFi kernel module (wlan.ko) can occasionally crash or unload, taking both the hotspot and client interfaces down with it. Rayhunter includes a watchdog that detects this and automatically reloads the module, restarts the hotspot, and reconnects to the configured network. During recovery the WiFi status will show recovering.
On the first detection of a crash, a diagnostic snapshot is saved to /data/rayhunter/crash-logs/ on the device. You can pull these logs with adb pull /data/rayhunter/crash-logs/ and inspect them to understand what went wrong. Each log contains:
BUG:/Oops: lines, or wlan/wcnss errors. The kernel ring buffer is small and gets overwritten quickly, so crash details may already be gone if the crash happened well before detection.wlan is absent, the module fully unloaded. If present but interfaces are gone, the driver is stuck.hostapd, wpa_supplicant, wland) were still running.If recovery fails after 5 attempts, the status will change to failed. A reboot of the device will reset WiFi.
You can also configure WiFi during installation:
./installer orbic --admin-password 'mypassword' --wifi-ssid 'MyNetwork' --wifi-password 'networkpass'
Rayhunter can automatically upload finished recordings to a WebDAV server. When a [webdav] section is present in config.toml, a background worker periodically scans the recording store and uploads any closed entry that is older than min_age_secs. Each eligible entry uploads two files: the raw .qmdl capture and its .ndjson analysis output. After a successful upload the entry is either marked as uploaded in the manifest (and skipped on subsequent polls), or deleted locally if delete_on_upload = true. With no [webdav] section, no upload worker runs.
WebDAV upload is currently configurable only by editing config.toml — there is no web UI control for it yet.
| Key | Required | Default | Description |
|---|---|---|---|
url | yes | — | WebDAV server base URL, e.g. https://example.com/remote.php/files/user/rayhunter/ |
username | no | — | HTTP Basic auth username |
password | no | — | HTTP Basic auth password |
upload_timeout_secs | no | 300 | Timeout (seconds) for each upload request |
poll_interval_secs | no | 3600 | How often (seconds) the worker scans for eligible entries |
min_age_secs | no | 86400 | Minimum age (seconds) an entry must have before it becomes eligible for upload |
delete_on_upload | no | false | Delete the entry locally after a successful upload |
Example:
[webdav]
url = "https://dav.example.com/rayhunter/"
username = "user"
password = "pass"
upload_timeout_secs = 300
poll_interval_secs = 3600
min_age_secs = 86400
delete_on_upload = false
A few notes on behavior:
password without a username is rejected — the request is sent unauthenticated and a warning is logged..qmdl and .ndjson) must both upload successfully before the entry is marked as uploaded in the manifest. If one upload fails, the entry stays unmarked and both files are retried on the next poll — the one that previously succeeded will be overwritten on the server. Once an entry is marked as uploaded, Rayhunter will not upload it again.If you prefer editing config.toml file, you need to obtain a shell on your Orbic or TP-Link device and edit the file manually. You can view the default configuration file on GitHub.