github i7Gamer/MySpeed v1.1.2
Release 1.1.2

latest releases: v1.7.0, v1.6.1, v1.6.0...
one month ago

Speedtests now say what they are doing while they run and why they failed when they don't, and MySpeed records two figures the Ookla CLI has always reported and always dropped: packet loss, and the latency measured while the line is saturated.

Added

  • Live status bar on the overview. Replaces the latest-test panel, which showed the same four numbers as the first row of the list beneath it. The bar reports the phase of a running test, a progress bar driven by the CLI's own reported progress, and the live speed of the transfer being measured. Idle, it gives the age of the last test, when the schedule next fires, and a button to start one. Failures in the last 24 hours are surfaced here, so an outage is visible without opening the statistics. Polled once a second during a run and every five otherwise. A read-only visitor is offered no start button rather than one that answers 401.
  • Latency under load and packet loss. Captured per test as the interquartile mean per direction, so a single outlier does not describe the connection. Shown in the expanded test view and on the statistics quality tile. Nullable throughout: librespeed and Cloudflare do not measure them, and rows recorded before this release have no value rather than a value of zero.
  • Bufferbloat grade, A+ to F on the latency the line gains once saturated, using the thresholds the established bufferbloat tests use. Graded on the worse of the two directions rather than an average — a line that is clean downstream and buffered upstream is a buffered line. Shown in the test detail panel and on the statistics quality tile.
  • Bufferbloat trend. The quality tile carries the grades of the last ten measured tests, oldest to newest, each captioned with its time and added latency. Rendered once there is something to compare.
  • Failure reasons in the test list. A failed test states its reason inline and translated, instead of a row of blank columns that had to be expanded to mean anything. Adds friendly forms for "Cannot open socket" and "Latency test failed", which previously read as "Unknown error".
  • Prometheus: myspeed_packet_loss, myspeed_download_latency and myspeed_upload_latency. Left unset rather than zeroed when the provider did not measure them — an absent series is a gap in a graph, a zero is a claim the line was flawless.
  • GET /speedtests/status now reports the phase, overall progress, the live speed of the current transfer, when the run started, the last test and whether it failed, how many tests failed in the last day, and when the schedule next fires. paused and running keep their names and their place; everything else is additive and may be absent, so older nodes still answer usefully.
  • CSV export now carries serverName, serverHost, packetLoss, downloadLatency and uploadLatency.
  • The failed-test count on the statistics overview now carries its share of the total: 23 failures is a rounding error across a year and an outage across an afternoon.

Changed

  • The five help dialogs moved from the latest-test panel to the metric icons on every row, so each measurement explains itself rather than only the newest one.
  • Values in the test list carry their unit, honouring the MB/s preference.
  • The overview and the statistics take one shared centred container capped at 1400px and one shared card gap; neither page decides its own width any more.
  • The gap between test rows tightened from 2rem to 0.75rem, which fits noticeably more history on screen.
  • The header's start-test gauge is hidden on the overview, where the status bar carries the same control with a label on it.
  • Only the Ookla CLI can report progress. librespeed and Cloudflare get an indeterminate bar, the elapsed seconds and "Measuring…" rather than a progress bar sitting at 0%, which reads as a hung test.
  • The next scheduled run is marked approximate ("Next at ~00:00") when the schedule offset is enabled, since the offset makes the cron time the earliest a run could start rather than when it will.
  • The Ookla CLI is invoked with jsonl rather than json, which reports each phase as it goes. The final record is the same result either way.

Fixed

  • Successful speedtests were reported as failures. The Ookla CLI logs every candidate server it cannot open a socket to — routine when MySpeed binds the run to one interface address and a dual-stack server answers on the other family — and then finishes the test against one that works. Those stderr lines were turned into a thrown error even when stdout had already carried a complete result. stdout is the authority now; stderr only describes the outcome when no result was parsed.
  • The statistics reported a perfect connection from no measurements. The consistency score fell through to 100% whenever the mean was not above zero, which includes having no successful tests to take a mean of, so a range in which every test failed reported 100% at ±0. It reads N/A now. The average tiles in the same range showed a bare "Mbps" with no number in front of it, and the average duration rendered the literal string "nulls".
  • The node list presented a failed test as a reading. A failure is stored with -1 in every numeric column, and the node card printed those straight out, advertising "-1 ms" and "-1 Mbps" as though they had been measured.
  • The optimal values dialog lost its layout. A rule added directly above the indented speeds block made that block its child in the Sass indented syntax, so every rule for the three inputs compiled to a selector matching nothing.
  • The test list's metric columns did not align between rows. Each row was positioned by its own content width, so the numbers wandered by up to 15px and could not be compared down a column, which is the point of a list.
  • serverName and serverHost were missing from every CSV export since they were introduced in migration 0003.
  • A failed CLI launch left a three-minute timer behind, because the spawn timeout is never cleared when the spawn itself fails.

Internal

  • create() takes a named object instead of eleven positional parameters; argument order was the only thing keeping each measurement in its own column, and a transposed pair would have failed no test.
  • CLI output parsing moved to server/util/providers/cliOutput.js and progress weighting to server/util/providers/progress.js, so both are testable without a database behind them.
  • npm test is now the 608 unit tests (~2s) for the edit-run loop; npm run test:integration and npm run test:all cover the rest, and CI runs test:all. The full suite went from 183s to 13.5s.
  • The generate-* scripts run under node rather than bun — they were plain node programs behind bun run, which fails on machines without bun.
  • New guard against a migration that was written but never regenerated into the gitignored registry, and therefore silently never run.

Upgrade notes

  • Migration 0005-add-quality-columns adds three nullable columns and runs automatically on start.
  • The CSV column order changed: five columns are inserted before error, which stays last. Parse by header rather than by position.
  • Tests recorded before this release, and every test from librespeed or Cloudflare, have no packet loss or loaded latency and are shown as absent rather than as zero.

Downloads

Platform x86-64 ARM64
Windows EXE · MSI
Linux Binary Binary
macOS Binary Binary

Source Distribution

  • ZIP Archive (requires Bun runtime)

Docker Images

  • i7gamer/myspeed:latest
  • i7gamer/myspeed:1.1.2

Don't miss a new MySpeed release

NewReleases is sending notifications on new releases.