A lightweight, self-hosted speed test tracker. Runs tests, stores results, displays in a dashboard.
610
A lightweight, self-hosted speed test tracker. Runs scheduled tests against either Ookla or Cloudflare, stores every result in SQLite, and displays the truth โ especially failures โ in a clean dashboard with charts.
No built-in authentication. Intended to run behind a reverse proxy, Cloudflare Zero Trust, Tailscale, or on a trusted LAN.
docker run -d \
--name speed-watch \
--restart unless-stopped \
-p 6100:6100 \
-v $(pwd)/data:/data \
daltonsbaker/speed-watch:latest
Then open http://localhost:6100โ .
Create a docker-compose.yml:
services:
speed-watch:
image: daltonsbaker/speed-watch:latest
container_name: speed-watch
restart: unless-stopped
ports:
- "6100:6100"
volumes:
- ./data:/data
Then run:
docker compose up -d
Everything is stored under /data inside the container:
| Path | Description |
|---|---|
/data/speedtest.db | SQLite database with run history |
/data/config.json | Application config (created on first run) |
Mount this to a persistent host directory so data survives restarts and image updates.
These are bootstrap-only settings. All normal configuration is done through the UI and saved to config.json.
| Variable | Default | Description |
|---|---|---|
PORT | 6100 | HTTP port to listen on |
HOST | 0.0.0.0 | Bind address |
DATA_DIR | /data | Directory for db + config |
DB_PATH | /data/speedtest.db | Override DB path |
CONFIG_PATH | /data/config.json | Override config path |
http://<host>:6100Defaults out of the box:
*/10 * * * * (every 10 minutes)cloudflareThe scheduler reloads automatically after saving a valid config.
The container speaks plain HTTP on port 6100. Drop it behind Caddy, Traefik, nginx, or similar and add authentication there if needed.
| Method | Path | Description |
|---|---|---|
GET | /api/runs/latest | Most recent scheduled run |
GET | /api/runs/latest-success | Most recent successful run |
GET | /api/runs?from=&to=&provider= | Historical runs with optional filters |
GET | /api/runs/:id | Single run by ID |
POST | /api/run | Trigger a manual speed test (not persisted) |
GET | /api/config | Current configuration |
PUT | /api/config | Update configuration (validated) |
GET | /api/status | Scheduler state + active-run flag + range summary |
All timestamps are Unix epoch milliseconds. JSON keys are camelCase.
See DEVELOPMENT.mdโ .
Content type
Image
Digest
sha256:e6f77ed45โฆ
Size
88.6 MB
Last updated
5 months ago
docker pull daltonsbaker/speed-watch