Skip to content

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.

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.

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.

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.

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:

Terminal window
docker compose up -d --build

The 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.

The source repository uses Bun in its build instructions. In the project root, install dependencies and build the static files:

Terminal window
bun install --frozen-lockfile
bun run build

Serve 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.

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.