The baseline release: each target judged against itself — an alert that needs nothing chosen but a percentage, a comparison window you name rather than the one before, and every metric drawn with the targets side by side. iperf3 gains the tuning its own CLI has, and the form controls finally look like the rest of the app. Upgrading runs three automatic migrations that add the new target columns — nothing to redo by hand. One behaviour changes on its own: a round measuring more than one target now waits ten seconds between them, so each is measured on a line the one before it has let go of.
✨ New
- Baseline alerts — notify when a target falls below what it usually delivers, against the rolling median of its own last 30 days rather than a figure somebody had to pick: a gigabit LAN box and a rural DSL line are each judged against themselves. Per target, with its own percentage, off until switched on. Two things worth knowing: a run is measured against the median as it stands now rather than as it stood then, and a rolling median walks with a sustained drop — a degradation that lasts stops breaching after roughly half a window.
- The alert says what crossed — a fixed-limit notification names which limits the result missed and by how much, and a baseline one names the direction and how far under it landed, both on new template variables. A message that arrives saying only "a test finished" is a message that stops being read.
- Compare against a window you name — the statistics measured a range against the period immediately before it; they can now measure it against the same span one, three or six months back, or one or two years, picked from a list beside the range.
- Every target on one chart — each metric carries an overlay of all the targets and a table under it, with each target compared against its own previous window instead of the whole instance against itself. The comparison row sits beside the target chips.
- iperf3 tuning — a target says how long its run measures and over how many parallel streams, and can measure with datagrams instead: UDP mode reads the jitter and packet loss iperf3 reports, at a bitrate the target sets.
- Ten seconds between a round's members — a multi-target round ran them back to back, so the second measured a line the first had just saturated. The wait is interruptible; a shutdown does not sit through it.
🐛 Fixes
- The form controls are the app's own now. Every number field has lost the browser's spin buttons — a pale chrome widget on a dark field, drawn outside the palette — for a stepper where stepping is worth offering and a clean figure where it is not. The quiet-hours field is the app's own picker rather than an operating-system panel laid over a dark dialog, and it follows the 12/24-hour preference every other time in the app already followed; on touch it keeps the platform's own picker wherever that shows the right clock. Every native select wears the same caret, where only one of five did.
- A control was in the browser's font wherever nobody had said otherwise by hand — every dialog's Save button, the custom cron field and its disclosure, and the header's icon buttons all sat in Arial beside labels in Inter.
- A day ends at the last instant it actually had. Where a zone springs forward at 23:00 — Greenland does — the end of a day fell inside the hour that day skips and rounded into the next one, so the previous period overlapped the range it was compared against by a full hour and every test in it was counted on both sides.
- A target moved to a provider with no server list goes through. The pinned server is retired with the endpoint now; it used to be left behind, and the door then refused the change over a field the request never mentioned.
- The target editor names the field that greyed the button — an iperf3 host it cannot dial and a server id that is not digits are marked in place and refused before the request, rather than a green button and a 400 naming a value the operator is looking at.
- Menus answer the keyboard visibly — a menu row had a hover and no focus ring, so a reader arriving by Tab had nothing telling them which row they were on.
- The comparison table's row separator survives a light theme — drawn in literal white at 4%, it was invisible on anything but the dark palettes.
- The storage dialog fits its own words — its retention row wrapped in nine of the twenty-three languages, the label on one line and its control on the next.
- Smaller edges — a target id is read as a number the database can be asked about, and the empty statistics page keeps its sentence off its button.
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.1
What's Changed
- feat: compare the targets side by side on the statistics page by @i7Gamer in #38
- feat: weekly/monthly digests and reliability statistics by @i7Gamer in #39
- chore(ci): Bump dependabot/fetch-metadata from 2 to 3 by @dependabot[bot] in #40
- Fix/ux polish by @i7Gamer in #41
- feat: per-target deltas, arbitrary compare windows, iperf3 tuning, and baseline alerts by @i7Gamer in #42
Full Changelog: v1.5.0...v1.5.1