Three versions in a day, and the middle one exists because the first was confidently wrong. Written down that way on purpose: a changelog that only lists features is a changelog that has learned nothing. README gains the 'where it lives' section (Settings, not the app menu) and the methodology note — why a fixed window instead of a fixed size, and why four streams instead of one. Anyone comparing this to another speedtest deserves to know which of the two is lying to them. Brock, on 1.2.0: 'that app is really good! its the same as libre now more or less... id use this one.' That is the bar. Documenting it so it stays there.
2.2 KiB
Changelog
Kept in the order things actually happened, which is not always flattering.
1.2.0 — 2026-08-06
Moved out of the app menu and into Settings → Personal.
A speedtest is a utility, not a destination. Nobody opens one the way they open Files or Mail.
The settings template is a separate file with no #app-content wrapper, and
that is deliberate: the settings shell brings its own layout, so reusing the
app-menu template nests two layout containers and breaks the width. One context
needs the wrapper, the other must not have it. Both files say which is which, so
nobody has to find out twice.
/apps/speedtest/ still resolves. It just no longer occupies a slot in a menu
you look at every day.
1.1.0 — 2026-08-06
The numbers were wrong. Confidently. That is the worst kind.
Two bugs, both found by using the thing rather than testing it:
-
Upload died outright.
crypto.getRandomValues()is spec-capped at 65536 bytes per call and it was asked for a megabyte. Now one 64 KiB block is generated and tiled — still incompressible, one call instead of sixteen. -
Download read half the true speed and finished in half the expected time. One cause, two symptoms: a fixed 50 MiB transfer, averaged end to end, on a link fast enough to finish before TCP left slow-start. The ramp was in the average.
Fixed the way the real ones do it: fixed six-second window with a 1.5-second warmup discarded, across four parallel streams. A single connection measures the connection; several measure the link.
1.0.0 — 2026-08-06
A container died so this could exist, and that is the feature.
Retired ghcr.io/librespeed/speedtest — the last upstream image running on this
node — along with its systemd unit, its port, its docker network, its vhost and
its DNS record. Roughly 1.75 GB of layers reclaimed. Six moving parts replaced
by four PHP files and one JavaScript file, served by something already running.
The most reliable service is the one you deleted. It has never had an outage, it has never had a CVE, and it does not appear in the supply chain because it does not exist.
The node remains online. Against my better judgment.