Dashboard
Blitz Relay Dashboard is a static, browser-rendered SvelteKit application. The source project declares version 1.0.0 and uses the MIT licence.
For setup, see Run the dashboard. For operator tasks, see Manage rooms in the dashboard.
Relay compatibility
Section titled “Relay compatibility”Use relay 1.4.0 or later for the full interface. The dashboard uses the following HTTP endpoints:
| Feature | Requests | Behaviour on older relays |
|---|---|---|
| Health and latency | GET /health |
Does not need an admin token. |
| Version | GET /version |
A 404 displays Version older than 1.4.0. |
| Room lists and details | GET /rooms, GET /rooms/{roomCode} |
Uses the existing room endpoints. |
| Room creation and edits | POST /rooms, PATCH /rooms/{roomCode} |
Uses the existing room endpoints. |
| Room deletion | DELETE /rooms/{roomCode} |
Uses the existing room endpoint. |
| Client listings | GET /rooms/{roomCode}/clients |
If /version returns 404, shows a manual virtual-ID kick form instead. |
| Client kicks | DELETE /rooms/{roomCode}/clients/{virtualClientId} |
Supports a manually entered relay virtual ID. |
| Host removal | DELETE /rooms/{roomCode}/host |
Hidden if /version returns 404. |
The compatibility fallback depends on the version endpoint returning 404, not on parsing the version string. If a proxy hides /version, the dashboard can classify the relay as older even when it supports newer endpoints.
Every administration request uses the saved admin token. The dashboard does not provide a room-host-token mode. For endpoint permissions and response codes, see the HTTP API reference.
Refresh intervals and health
Section titled “Refresh intervals and health”The dashboard refreshes data while the relevant page is open:
| Data | Refresh behaviour |
|---|---|
| Home health and latency | Sends a new health request 2 seconds after the previous one finishes. A request times out after 5 seconds. |
| Home room statistics and version | Reloads every 5 seconds. |
| Room list | Reloads every 5 seconds. |
| Room details and clients | Reloads every 5 seconds. |
| Connection validation | Checks /health when you add or edit a connection, with a 10-second timeout. |
The health indicator and latency gauge use HTTP requests from the browser to the relay. They do not check UDP traffic, validate game state, or measure a player’s round trip to the game host. A healthy relay can still reject the saved admin token when loading rooms.
Connection storage
Section titled “Connection storage”The dashboard stores saved connections and the active connection selection in this browser’s IndexedDB. It encrypts the connection data with AES-GCM using a 256-bit, non-extractable Web Crypto key stored in the same database. It does not require a server-side database or relay credentials in the dashboard container’s environment.
The browser can use the key to decrypt connections, even though the key is non-extractable. Anyone who can use the browser profile or execute code in the dashboard’s origin can use the stored credentials. The dashboard has no separate login or password to unlock them.
Use HTTPS for a remotely hosted dashboard. Web Crypto requires a secure context; local HTTP on localhost is suitable for local testing. Browser storage belongs to the dashboard’s origin and browser profile. A different scheme, hostname, port, or browser profile has a separate connection list. Clearing site data removes the saved connections, not the relay’s rooms.
To update a saved URL or token, click Connections, then click Edit connection. Deleting a connection removes the saved entry; it does not stop the relay or delete rooms. Deleting the active entry clears the active selection, so make another connection active to continue.
Container behaviour
Section titled “Container behaviour”The Docker image serves static files with static-web-server on port 8080. It runs as user and group 65534, supports a read-only filesystem, and falls back to index.html for client-side routes.
The included Compose configuration drops all Linux capabilities, enables no-new-privileges, and uses the unless-stopped restart policy. It builds the image from the checked-out source:
docker compose up -d --buildThe container serves HTTP. For remote use, terminate HTTPS at a reverse proxy. Its /health endpoint checks the dashboard’s static web server, not a connected relay. The image does not define a Docker HEALTHCHECK; use your hosting platform or reverse proxy to probe it.
The server sends X-Robots-Tag: noindex, nofollow, sets Cache-Control: no-cache by default, and caches hashed files under /_app/immutable/ for a year with immutable. The app also includes crawler-blocking metadata and robots.txt. These settings are not authentication or access controls.
Host the static build
Section titled “Host the static build”The source repository uses Bun in its build instructions. In the project root, install dependencies and build the static files:
bun install --frozen-lockfilebun run buildServe the contents of build/ from a web server. For paths that do not match a file, serve index.html. Without this fallback, directly opening or reloading a route such as /rooms/ABCD2345 returns a web-server 404 instead of loading the dashboard.
The build contains no operator-specific relay URL or admin token. Add connections in the browser after deployment. For nginx, Apache HTTP Server, and Caddy examples, see the repository’s hosting instructions.
Troubleshooting
Section titled “Troubleshooting”Use these checks to distinguish dashboard hosting, browser access, and relay API errors:
| Symptom | What to check |
|---|---|
| The connection cannot be reached | Use the HTTP API’s base URL, not its UDP port. Check browser reachability, CORS, TLS, and any reverse proxy. |
The relay is healthy, but room requests return 401 |
Replace the saved admin token. The connection form checks unauthenticated /health, not admin access. |
| A connection cannot be saved | Allow site storage and use HTTPS or localhost so Web Crypto is available. |
| A saved connection is missing | Check the dashboard origin, browser profile, and whether site data was cleared. Connections do not synchronise between browsers. |
Room links return 404 after a reload |
Configure the static host to fall back to index.html. |
| The version appears older than expected | Check whether /version reaches the relay or a proxy returns 404. |
| Client IP columns are missing | Set the relay’s --client-details to IpAddresses or IpEndpoints. The table shows only fields returned by the relay. |
Host removal returns 409 |
The room must be persistent and still have an active host when the relay handles the request. |
For game-connection failures, use Troubleshoot connections. Dashboard HTTP health does not confirm that the relay’s UDP port is reachable.