{"id":51007595,"url":"https://github.com/mhdiiilham/speeder","last_synced_at":"2026-06-20T22:02:04.471Z","repository":{"id":364262475,"uuid":"1267086026","full_name":"mhdiiilham/speeder","owner":"mhdiiilham","description":"Fast, data-efficient internet speed test CLI uses ndt7 protocol over M-Lab's open server network","archived":false,"fork":false,"pushed_at":"2026-06-12T09:09:54.000Z","size":35,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-12T11:07:12.311Z","etag":null,"topics":["cli","go","golang","internet-speed","m-lab","ndt7","network","speedtest","terminal"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mhdiiilham.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-12T07:53:53.000Z","updated_at":"2026-06-12T09:24:36.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mhdiiilham/speeder","commit_stats":null,"previous_names":["mhdiiilham/speeder"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/mhdiiilham/speeder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhdiiilham%2Fspeeder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhdiiilham%2Fspeeder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhdiiilham%2Fspeeder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhdiiilham%2Fspeeder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mhdiiilham","download_url":"https://codeload.github.com/mhdiiilham/speeder/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhdiiilham%2Fspeeder/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34586666,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-20T02:00:06.407Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","go","golang","internet-speed","m-lab","ndt7","network","speedtest","terminal"],"created_at":"2026-06-20T22:02:02.749Z","updated_at":"2026-06-20T22:02:04.466Z","avatar_url":"https://github.com/mhdiiilham.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# speeder\n\n[![CI](https://github.com/mhdiiilham/speeder/actions/workflows/ci.yml/badge.svg)](https://github.com/mhdiiilham/speeder/actions/workflows/ci.yml)\n[![Go Report Card](https://goreportcard.com/badge/github.com/mhdiiilham/speeder)](https://goreportcard.com/report/github.com/mhdiiilham/speeder)\n[![Go Version](https://img.shields.io/badge/go-%3E%3D1.21-00ADD8?logo=go)](https://go.dev)\n[![License](https://img.shields.io/github/license/mhdiiilham/speeder)](LICENSE)\n[![Release](https://img.shields.io/github/v/release/mhdiiilham/speeder)](https://github.com/mhdiiilham/speeder/releases)\n\nA fast, data-efficient internet speed test CLI built in Go — with built-in game server latency checking for CS2 and Dota 2.\n\nUses the [ndt7 protocol](https://github.com/m-lab/ndt-server/blob/master/spec/ndt7-protocol.md) over [M-Lab's](https://www.measurementlab.net/) open, nonprofit server network. No Ookla/speedtest.net dependency.\n\n```\n  Server:    ndt-mlab1-sin01.mlab-oti.measurement-lab.org\n  Location:  Singapore SG\n\n  Latency:   14.2 ms  jitter: 0.9 ms\n  Download:  94.71 Mbps  (3.1s, 36.8 MB)\n  Upload:    23.10 Mbps  (2.8s,  8.1 MB)\n\n  Data used: 44.9 MB\n```\n\n## speeder vs Ookla Speedtest\n\nBoth tools measure internet speed — they just make different trade-offs.\n\n| | speeder | Ookla Speedtest |\n|---|---|---|\n| **Server network** | ~800 M-Lab servers (nonprofit) | ~15,000 community servers |\n| **Open source** | Yes (MIT) | Client is proprietary |\n| **Data per test** | ~30–50 MB (adaptive) | ~150–300 MB |\n| **Test data** | Published openly by M-Lab | Collected by Ookla |\n| **API key** | Not required | Required for CLI/automation |\n| **JSON output** | Built-in | Available |\n| **Game ping** | Built-in (CS2, Dota 2) | Not available |\n\n**M-Lab** (Measurement Lab) is a nonprofit research project backed by Google, Princeton University, and New America. Its infrastructure is designed specifically for open, reproducible internet measurement — the same backend used by Google's built-in speed test. All test results are published as open data.\n\n**Ookla** has a much larger server network and is the industry-standard reference that most ISPs and users recognise.\n\nNeither is objectively \"better\" — they measure different things against different server networks, so results will naturally differ. speeder is a good fit if you want a lightweight, scriptable, open-source tool with no account required. Ookla is the right choice when you need a result that's widely recognised or when comparing against an ISP's advertised speeds using their preferred benchmark.\n\n## Features\n\n- **Speed test** — adaptive early stopping (CV \u003c 3%), minimal data usage\n- **Game ping** — check CS2 and Dota 2 server latency, jitter, packet loss, and gaming score before queuing\n- **ISP + public IP** — automatically detected and shown alongside results\n- **History** — every result saved to `~/.speeder/history.jsonl`; view with `speeder history`\n- **`--ping-only`** — latency/jitter only, no download/upload, uses ~0 data\n- **`--watch 5m`** — repeat test on an interval, great for monitoring unstable connections\n- **`--fail-if-below 50mbps`** — exit code 1 if download is below threshold, scriptable for health checks\n- `--quick` preset: 4 s max, typically \u003c 35 MB total\n- JSON output for scripting\n- Zero config, no account, no API key\n- Pure Go, no CGO — any OS, any architecture\n\n## Installation\n\n### With Go (any OS, any architecture)\n\n```bash\ngo install github.com/mhdiiilham/speeder@latest\n```\n\nThe binary lands in `$(go env GOPATH)/bin/`. Make sure that directory is on your `PATH`.\n\n### Pre-built binaries\n\nDownload the latest binary for your platform from the [Releases page](https://github.com/mhdiiilham/speeder/releases):\n\n| Platform | Binary |\n|---|---|\n| Linux amd64 | `speeder-linux-amd64` |\n| Linux arm64 | `speeder-linux-arm64` |\n| macOS (Apple Silicon) | `speeder-darwin-arm64` |\n| macOS (Intel) | `speeder-darwin-amd64` |\n| Windows amd64 | `speeder-windows-amd64.exe` |\n\n### Windows (PowerShell one-liner)\n\n```powershell\nirm https://raw.githubusercontent.com/mhdiiilham/speeder/main/install.ps1 | iex\n```\n\nDownloads the correct binary for your architecture, installs it to `%LOCALAPPDATA%\\speeder\\`, and adds it to your user `PATH` — no admin rights required. Open a new terminal after installing, then run `speeder`.\n\n### macOS / Linux (curl one-liner)\n\n```bash\ncurl -Lo speeder \\\n  https://github.com/mhdiiilham/speeder/releases/latest/download/speeder-linux-amd64\nchmod +x speeder \u0026\u0026 sudo mv speeder /usr/local/bin/\n```\n\n## Usage\n\n```\nspeeder [flags]\n\n  --list              list nearby M-Lab servers and exit\n  --server string     use a specific server hostname\n  --json              output results as JSON to stdout\n  --no-progress       disable live progress updates\n  --duration int      max seconds per test phase (default 8)\n  --quick             quick preset: 4 s max, minimal data usage\n  --ping-only         measure latency/jitter only, skip download/upload\n  --fail-if-below N   exit 1 if download \u003c N Mbps (e.g. 50 or 50mbps)\n  --watch duration    repeat on an interval (e.g. 5m, 30s, 1h)\n  --game string       check game server latency: cs2, dota2\n  --version           print version and exit\n\nspeeder history [flags]\n\n  --last int          number of results to show (default 10)\n  --json              output raw JSONL\n```\n\n### Speed test\n\n```bash\nspeeder                        # full test, auto-selects nearest server\nspeeder --quick                # less data, faster result\nspeeder --ping-only            # latency/jitter only, ~0 data\nspeeder --json | jq .download_mbps\nspeeder --fail-if-below 50     # exits 1 if download \u003c 50 Mbps\nspeeder --watch 5m             # repeat every 5 minutes until Ctrl-C\nspeeder --no-progress --json \u003e\u003e speedlog.jsonl\n```\n\nExample output:\n\n```\n  Server:    ndt-mlab1-sin01.mlab-oti.measurement-lab.org\n  Location:  Singapore SG\n  ISP:       Maxis Broadband Sdn Bhd  (203.115.x.x)\n\n  Latency:   14.2 ms  jitter: 0.9 ms\n  Download:  94.71 Mbps  (3.1s, 36.8 MB)\n  Upload:    23.10 Mbps  (2.8s,  8.1 MB)\n\n  Data used: 44.9 MB\n```\n\n### History\n\nResults are automatically saved to `~/.speeder/history.jsonl` after every run.\n\n```bash\nspeeder history           # show last 10 results\nspeeder history --last 30\nspeeder history --json    # raw JSONL for scripting\n```\n\n```\n  Speed Test History\n\n  TIME              SERVER                   DOWNLOAD    UPLOAD    LATENCY\n  ─────────────────────────────────────────────────────────────────────────\n  Jun 12 10:00     ndt-mlab1-sin01...        94.7 Mbps  23.1 Mbps  14.2 ms\n  Jun 11 22:30     ndt-mlab1-sin01...        88.3 Mbps  21.4 Mbps  15.1 ms\n  Jun 11 18:15     ndt-mlab1-sin01...       102.1 Mbps  24.9 Mbps  13.8 ms\n  ─────────────────────────────────────────────────────────────────────────\n  3 result(s) total.\n```\n\n### Game server check\n\nKnow your connection quality before queuing into a ranked match:\n\n```bash\nspeeder --game cs2\nspeeder --game dota2\n```\n\n```\n  CS2 Server Latency\n\n  SERVER                     PING   JITTER   LOSS  SCR  STATUS\n  ────────────────────────────────────────────────────────────\n  Singapore [AP]            12 ms     1 ms     0%   97  Excellent ✓\n  Tokyo [AP]                47 ms     4 ms     0%   72  Good\n  Hong Kong [AP]            55 ms     6 ms     0%   64  Playable\n  Frankfurt [EU]           198 ms    15 ms     5%    8  Very Poor\n  Virginia [NA]            220 ms    20 ms     3%    5  Very Poor\n  ────────────────────────────────────────────────────────────\n\n  Verdict: Ready to play! Your connection to Singapore is excellent.\n\n  Note: Steam SDR adds ~2–5 ms overhead between the relay and the actual\n  game server, so your real in-game ping will be slightly higher than\n  shown here. The relative ranking between servers is accurate.\n```\n\nShows the 5 best servers, sorted by gaming score.\n\n#### Gaming score (0–100)\n\n| Metric | Weight | Best value |\n|---|---|---|\n| Latency | 50 pts | ≤ 20 ms |\n| Jitter | 30 pts | ≤ 2 ms |\n| Packet loss | 20 pts | 0% |\n\n| Score | Verdict |\n|---|---|\n| 85–100 | Ready to play — excellent |\n| 70–84 | Good — slight disadvantage in close duels |\n| 50–69 | Playable — consider playing off-peak |\n| 30–49 | High latency — avoid ranked |\n| 0–29 | Very poor — not recommended for competitive |\n\n#### How servers are measured\n\nCS2 and Dota 2 use Valve's CM (Connection Manager) server hostnames\n(`cmp1-*.steamserver.net:27018`). These are TCP/WebSocket servers that\naccept direct connections and share datacenters with game servers, giving\naccurate latency readings. 10 TCP probes per server measure ping, jitter,\nand packet loss concurrently.\n\n#### Aliases\n\n```bash\nspeeder --game cs            # same as --game cs2\nspeeder --game counter-strike\nspeeder --game dota          # same as --game dota2\n```\n\n### JSON output format (speed test)\n\n```json\n{\n  \"server\": { \"hostname\": \"...\", \"city\": \"Singapore\", \"country\": \"SG\" },\n  \"latency_ms\": 14.2,\n  \"jitter_ms\": 0.9,\n  \"download_mbps\": 94.71,\n  \"upload_mbps\": 23.10,\n  \"data_used_mb\": 44.9\n}\n```\n\n## Privacy\n\nspeeder makes outbound connections to three services:\n\n| Service | What it's used for | Data collected |\n|---|---|---|\n| **M-Lab** (`measurementlab.net`) | Server discovery and speed test | Your IP, test results — published as [open data](https://www.measurementlab.net/data/) |\n| **ipinfo.io** | ISP name and public IP lookup | Your IP address, timestamp, User-Agent |\n| **Valve** (`steamserver.net`) | CS2/Dota 2 game ping only | TCP connection metadata |\n\n**On ipinfo.io:** it is a commercial service that logs requests and may use them for analytics. The ISP lookup is a best-effort convenience feature — no account or API key is required, and speeder sends only a standard HTTP request with no personal data beyond your IP. If you prefer not to contact ipinfo.io, the feature still works as expected; ISP and IP fields will just be empty in the output.\n\nM-Lab's data collection is worth knowing about: all ndt7 test results (your IP, speed, location) are published publicly as open research data. This is by design — it's how M-Lab tracks global internet health. If you need private results, use `--no-progress --json` and pipe the output locally without the data reaching M-Lab's archives... though the test itself still runs against their servers.\n\n## Data usage (speed test)\n\nspeeder stops each phase as soon as the speed measurement stabilises,\nminimising data usage without sacrificing accuracy.\n\n| Connection | Default | `--quick` |\n|---|---|---|\n| 50 Mbps | ~25 MB | ~15 MB |\n| 100 Mbps | ~40 MB | ~25 MB |\n| 500 Mbps | ~100 MB | ~60 MB |\n\nCompare: Ookla's official client typically uses 150–300 MB on a fast connection.\n\n## Building from source\n\n```bash\ngit clone https://github.com/mhdiiilham/speeder.git\ncd speeder\ngo mod tidy\nmake build          # → bin/speeder\nmake test           # run tests with race detector\nmake coverage       # test + HTML coverage report\nmake release        # cross-compile all platforms to bin/\n```\n\n### Integration tests (hit real servers)\n\n```bash\ngo test -tags integration ./internal/game/ -v -timeout 60s\n```\n\nPings real CS2 and Dota 2 servers and prints a full latency table.\n\nRequires Go 1.21+.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmhdiiilham%2Fspeeder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmhdiiilham%2Fspeeder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmhdiiilham%2Fspeeder/lists"}