I work at an internet provider in Brazil, and every support call about "slow internet" starts the same way: the customer runs a public speed test that measures to some server far away, and we can't tell if the problem is our network, their Wi-Fi or the route in between.
So I built Speed CJC, a speed test the provider runs on its own server. The customer measures straight to us, the technician gets the network details that actually explain the problem, and the admin sees everything live.
It's a single Node.js process with a local SQLite database. No third-party cloud, no database server to install, and the provider can put its own brand on it.
How it measures
The parts I had the most fun with:
- Upload is counted on the server, not in the browser. Browsers overestimate upload, so the number you see is what the server actually received.
- Packet loss over real UDP: 200 packets through WebRTC, with no retransmission, so lost packets stay lost.
- Bufferbloat: ping measured while download and upload are running.
- NAT type: STUN against two different providers through the same port. Same port back means moderate (type 2); a different one means strict (type 3).
- Double NAT: the TTL of the device's packets compared with the TTL of a ping to the customer's router. The difference is the number of routers inside the house.
- MTU: "don't fragment" pings to the customer in a binary search, the same thing a technician does by hand with
ping -f -l. - MSS: read from the customer's own TCP connection with
ss. - Route:
mtrfrom the server to the customer. - The server flags a result as "not verified" when it doesn't match what it actually delivered.
It also times the path to the CDNs of streaming services, banks and PIX (Brazil's instant payments), which is usually what the customer really cares about.
For the provider
- A technician area with MTU/MSS and the hop-by-hop route, plus the support ticket data saved with the test
- Sending the result, with photos, to the team's WhatsApp groups
- Accounts with password recovery through WhatsApp, and a customer history with a map
- An admin panel showing who is testing right now, users, audit log and server status
It has been running in production at the provider I work for: https://velocidadeteste.audicomtelecom.com.br
The code is open source (AGPL-3.0), and there's an 8-minute video tour of the whole system (in Portuguese, with subtitles) linked in the README.
Repo: https://github.com/Davicjc/Speed-CJC
If you run network ops at an ISP, I'd like to hear what you'd want a test like this to show.

