# MySpeed Speed test *history*. It runs a test on a cron schedule, keeps the results for as long as you tell it to, and draws the graph — so you can answer "is it slow right now, or has it been slow every evening for a fortnight?" Pairs with [librespeed](../librespeed/) rather than competing with it: that one is an on-demand test you open when you want a number, this one is the unattended recorder. MySpeed can even use LibreSpeed as its measurement backend — it offers **Ookla, LibreSpeed and Cloudflare** as test providers, so the instance next door can be the thing it measures against. ## Quick start ```bash cp .env.example .env # optional -- every value has a default docker compose up -d ``` Open `http://:5216`. Everything — schedule, retention, provider, alerts — is configured in the web UI, not in this file. ## Ports | Port | Proto | Purpose | |------|-------|---------| | 5216 | http | Web UI and API | ## Why it looks like this **A bind mount instead of upstream's named volume.** The official install is `docker run -v myspeed:/myspeed/data`, a Docker-managed volume. Here it is `${DATA_PATH:-./data}`, so the history database sits next to the compose file where you can see it and a backup job can find it without knowing Docker's layout. Same reasoning as [jellyfin](../jellyfin/README.md)'s `/config`. **MySpeed itself takes no environment configuration** — no `PUID`, no `TZ`, no options. State and settings both live in the SQLite database in that one directory, which makes the stack trivially portable and the backup story simple: copy the directory. The variables in `.env.example` are therefore Compose-level only: the image tag, the host port, and where that directory lives. ## Gotchas - **`latest` is a build from May 2024.** The project is alive — the repository was pushed to in September 2026 — but the last tagged release is `v1.0.9` and Docker Hub's `latest` still points at that same image: | Tag | Pushed | Size | Digest | |-----|--------|------|--------| | `development` | 2026-08-02 | 102 MB | `sha256:043c2f00…` | | `latest` | 2024-05-21 | 59 MB | `sha256:3a3e774b…` | | `1.0.9` | 2024-05-21 | 59 MB | `sha256:3a3e774b…` | So `latest` here does not mean recent — it means "the newest *release*", and there hasn't been one since May 2024. It will start moving again if upstream tags one. Until then, "update to the newest version" means `MYSPEED_TAG=development`, which is a choice to make knowingly rather than a `docker compose pull` away. - **Scheduled tests run on container time.** The whole feature is cron expressions, and the image documents no `TZ` variable — so "run at 03:00" is 03:00 **UTC** unless you tell the container otherwise. The two clock mounts are in `compose.yaml`, commented out; uncomment them to follow the host instead. They are off by default because turning them on shifts every existing schedule by your UTC offset. Same class of trap as the cron container in [firefly](../firefly/README.md). - **A speed test measures the path from *this box*.** If MySpeed runs on the NAS, the graph is the NAS's connectivity — which is usually what you want, but it is not your laptop's Wi-Fi. And a low-power host can cap the result on CPU before the link saturates; see [librespeed](../librespeed/README.md) for the same caveat. - **Back up the data directory.** Months of measurements and every setting are in there, and nothing regenerates. ## What else it does Worth knowing about before you go looking for another tool: - **Health checks with alerting** — email, Signal, WhatsApp or Telegram when a test fails or the line goes down. - **Prometheus and Grafana export**, if you would rather graph this beside everything else. - **Multiple servers on one instance**, so a single dashboard can watch more than one site. - **Configurable retention**, from a few days to forever. ## Exposing it - [Reverse proxy with Caddy](../docs/reverse-proxy.md) — fine; the UI is just a dashboard, and the tests run server-side regardless of how you reach it. - [Cloudflare Tunnel](../cloudflare-tunnel/) — fine for the dashboard, unlike [librespeed](../librespeed/README.md): the measurements do not travel through the tunnel, only the page does. - [Single sign-on with Authentik](../docs/authentik-sso.md) — forward auth suits it: browser-only, no accounts of its own. MySpeed has no authentication built in, so anyone who reaches the port can change the schedule and read the history. ## Links - Upstream: - Website and docs: · - Image: