The multi-target release: named measurement targets replace the single global provider, iperf3 measures against a server of your own, and the statistics learned to compare like with like — alongside eight new languages and the fixes three review campaigns turned up. Upgrading runs one automatic migration: your provider settings become the first target and every stored test is stamped with it, nothing to redo by hand. One behaviour changes on its own: LibreSpeed runs at its own 15-second default instead of the 5 seconds it was pinned to, so its figures firm up and its tests take a little longer.
✨ New
- Measurement targets — named provider+server pairings instead of one global choice: add several, reorder them, switch one off, give each its own alerts and optimal values. The chips filter the dashboard, the statistics and the export; Prometheus carries per-target series; a backup names each row's target so a history survives the move to another instance; and a read-only viewer never sees a private server's address. Pages grade against the target their rows actually belong to — a mixed view falls back to the instance-wide settings rather than judging one line by another's optimum.
- iperf3 — a fourth provider, for measuring against an operator-run server:
host[:port], IPv6 in brackets, one invocation per direction with TCP slow-start left out of the figure, and latency sampled separately since iperf3 reports none. The binary is fetched on first use, not at boot. - The period comparison is honest — a range still running is compared against the same elapsed share of the previous window, cut at the same time of day (daylight-saving changes included), instead of seven full days standing against six and a half — which read every count as systematically down. The note says when the comparison window was cut, and tests-per-day divides by the days that have actually happened.
- Medians beside the averages — ping, jitter, download and upload each carry one now, on the value panes and the latency row: one spike drags an average, and the middle value says whether the line or the afternoon was slow.
- Data used by the testing — what the tests themselves cost in traffic over the range, down/up/total with its change against the previous period, in the overview detail panel. Worth a look before tightening a schedule on a metered line.
- Peak-hour latency — the rise from the calmest hour's average ping to the busiest hour's, beside the peak-hour slowdown: the per-hour latency was computed all along and displayed nowhere, and it is the half of an evening slowdown a call actually feels.
- Eight new languages — Czech, Japanese, Korean, Norwegian Bokmål, Swedish, Traditional Chinese, Irish and Catalan bring the count to 23, alongside a 379-correction sweep of the existing ones and the Spanish, Turkish, Italian and Russian repairs taken from upstream.
- Sign-in from a forward-auth proxy (#767) — trusted-header authentication for setups where Authelia or friends already decided who you are.
🔒 Security
- The installer keeps the data directory private — created with the service account as owner and nobody else inside, on every path that can create it; the ownership handover no longer follows a symlink; and anything already at the data path that is not a real directory is refused before the running service is touched.
- The HTTPS listener is held to the HTTP one's limits — the same header split and a ceiling on both, instead of one door stricter than the other.
🐛 Fixes
- A figure an older node spells as text is a reading everywhere — and the
-1placeholder is a reading nowhere: proxied payloads no longer print "-1%" beside a delta computed from it, hide a measured value as N/A, or let one corrupt stored number drag an average. A poisoned row in a restored history degrades that figure, not the page. - Every latency prints at one decimal — the stability card said "5.23 ms" one panel from a detail pane saying "5.2 ms" for the same measurement.
- Charts show honest gaps. The line was drawn straight across the nulls a failed test leaves, so an outage rendered as a continuous curve — the gaps break the line now, and a lone reading in a bad hour gets a dot instead of being invisible.
- The CLI runner is tougher — output is decoded across chunk boundaries, so a multi-byte character split mid-number no longer corrupts a parse; a wedged CLI's streams are bounded instead of growing the heap for the whole timeout; and shutdown waits for the tracked child instead of leaving it writing into a closed database.
- One dead endpoint no longer delays every other notification — integrations are notified together, not queued behind the slowest timeout.
- An invalid stored cron schedules the default instead of nothing, and says so.
- The countdown counts to the run that is sleeping, not the slot after it — with the schedule offset on, a poll during the offset sleep rolled the bar forward as if the test had been skipped.
- A missing static asset answers 404 instead of the app page wearing a script's name — which browsers reported as a MIME refusal and caches remembered.
- Switching the active node under an open statistics page re-fetches everything for the node now shown.
- Interfaces the connectivity probe cannot vouch for are listed anyway (#806) — a probe failure hid real adapters from the dropdown.
- A restored row no run could have produced is skipped, counted, and said — not stored to poison the averages later.
- ntfy and Gotify meet their APIs — an out-of-range or non-numeric ntfy priority is dropped instead of sent as
NaN, and Gotify's longer v3 tokens are accepted. - The storage dialog's export hint holds its height — ticking "Include credentials" swapped in a longer sentence and moved the toggle out from under the pointer that clicked it.
- Small edges from 1.4.1's theme work — the system-theme listener falls back where older browsers lack
addEventListener, the settings menu closes on the same keydown treaty as every other overlay, and the language list stops cropping the last entry's border.
Downloads
| Platform | x86-64 | ARM64 |
|---|---|---|
| Windows | EXE · MSI · EXE (no AVX2) · MSI (no AVX2) | |
| Linux | Binary · No AVX2 | Binary |
| macOS | Binary | Binary |
Source Distribution
- ZIP Archive (requires Bun runtime)
Docker Images
i7gamer/myspeed:latesti7gamer/myspeed:1.5.0
What's Changed
- Fix/status countdown and language list by @i7Gamer in #34
- feat: multiple measurement targets and iperf3 support by @i7Gamer in #37
- chore(deps): bump the server-minor-and-patch group with 4 updates by @dependabot[bot] in #35
- chore(deps): bump the client-minor-and-patch group in /client with 7 updates by @dependabot[bot] in #36
Full Changelog: v1.4.1...v1.5.0