
Don't have a GUI but want to use LibreSpeed servers to test your Internet speed?
librespeed-cli comes to rescue!
This is a command line interface for LibreSpeed speed test backends, written in Go. Usage
Features:
Upstream repositories:
- https://github.com/librespeed/speedtest-cli
- https://github.com/juanro49/harbour-librespeed (rpm build)
| Attachment | Size | Date |
|---|---|---|
| 2.7 MB | 04/01/2026 - 11:36 | |
| 2.65 MB | 04/06/2026 - 22:34 |
- Package changes:
-
- Versión 1.0.13
- Upstream changes:
- fix: fix goreleaser build error
-
- chore: migrate goreleaser config to v2
- fix: fix goreleaser ldflags, darwin amd64 UPX crash, CSV newline, and docs unit
- - Fix #72: correct ProgVersion and BuildDate ldflags path in goreleaser config
- (librespeed-cli/defs. -> github.com/librespeed/speedtest-cli/defs.)
- - Fix #70: add darwin/amd64 to no-upx build to avoid UPX segfault
- - Fix #35: trim trailing newline from gocsv CSV output
- - Fix #112: update --json and --csv help text from 'bit/s' to 'Mbps'
- to match actual output behavior
- refactor: remove logrus dependency, delete obsolete log_formatter.go
- refactor: replace logrus with output package in server.go
- refactor: replace logrus with output package in helper.go
- refactor: replace logrus with output package in speedtest.go
- refactor: remove logrus from main.go, use output package
- feat: add output package for clean stdout/stderr separation
- fix: gracefully handle rawIspInfo being an empty string in GetIPInfo
- When the server returns rawIspInfo as an empty string ("") instead of
- an object ({}), json.Unmarshal fails because the field type is a struct.
- The previous fallback set ProcessedString to the entire raw JSON,
- causing ugly display like 'You're testing from: {"processedString":...}'.
- Now we first try to extract just the processedString field on parse
- failure, so the user-facing message stays clean.
- fix: fix critical concurrency bugs, replace go-ping with pro-bing, and improve performance
- - Replace deprecated go-ping with prometheus-community/pro-bing (maintained fork)
- - Fix ctx.Done() no-op bug: change to cancel() so timeout properly cancels
- pending download/upload goroutines
- - Fix concurrent http.Request sharing: clone request per goroutine in download;
- create per-goroutine body readers with io.TeeReader for upload
- - Fix BytesCounter data race: move reader.Read() inside mutex lock
- - Fix goroutine leak in ping workers: close jobs channel after sending all
- jobs, workers use 'range' to exit cleanly
- - Fix goreleaser ldflags: use correct module path
- (github.com/librespeed/speedtest-cli/defs)
- - Replace deprecated io/ioutil with io and os equivalents
- - Fix report.Client{} unkeyed struct field literal
- - Replace time.Now().Sub(t) with time.Since(t) throughout
- - Fix SeekWrapper.Seek to return correct offset value
- - Remove duplicate comment and redundant uint64() casts
- - Replace crypto/rand with math/rand/v2 for upload payload generation
- (~50x faster for bulk data)
- - Use atomic.AddUint64 for BytesCounter.Write to reduce lock contention
- - Tune HTTP transport MaxIdleConnsPerHost/MaxConnsPerHost for concurrent tests
- Add --insecure option to allow forcing unencrypted http (#115)
- fix docker build and run (#102)
- Co-authored-by: XYG <xyg@189csp.cn>
- fix: fix server selection based on ping results (#106)
Recent comments