texas2step
Throughput, latency, jitter and packet loss between endpoints, measured from a web browser. Open the page and press Start. texas2step measures the path between you and the server with multi-stream HTTP transfers, latency probes idle and under load, and real UDP packet loss over WebRTC, then shows every figure as discrete metrics and graphs. The same measurements are available as a REST API, a Python CLI, and server-to-server functions.
Inspired by speed.cloudflare.com (cloudflare/speedtest), but self-hosted: a Python server, a dependency-free TypeScript client, and no third-party services, so it works on air-gapped and internal networks.
What it measures
| Metric | How | Transport |
|---|---|---|
| Latency | 20 keep-alive pings, timed with Resource Timing, server time removed | HTTP |
| Jitter | Mean absolute difference between consecutive RTTs | HTTP |
| Download / upload | N parallel streams for T seconds, 100 ms timeline, ramp-up excluded | HTTP |
| One stream | One stream's download for the same time: what a single file copy gets | HTTP |
| Latency under load | Probes every 250 ms on a separate connection during each transfer, graded A+ to F | WebSocket |
| Packet loss | Numbered probes on an unreliable data channel, echoed and stamped by the server; each direction's loss and delay apart | UDP (WebRTC) |
| Stream fairness | Per-stream rates and Jain's index | HTTP |
| Call quality | A G.711 call's MOS (1 to 5) each way, from the ITU-T E-model: delay, and packets lost, late or in bursts | derived |
| Responsiveness | Round trips per minute under load, on new connections and the loaded one, as the IETF draft and macOS's networkQuality count them |
HTTP, WebSocket |
| Readiness | Grades for streaming, video calls, reaction time/VDI/SSH and bulk transfers | derived |
Details and definitions: docs/methodology.md. What the scores mean to the people using a connection: docs/experience.md.
The UI has five views: Test (gauge, live link animation, charts, exportable and
shareable results), Monitor (continuous UDP probing with a scrolling RTT and loss
trace, to one server or to two at once for a side-by-side comparison, or a voice or video
call's packets scored every 10 seconds), Diag (HTTPS,
WebSocket and UDP over IPv4 and IPv6, tried once a second, with your addresses, NAT,
TLS and an event log), History (saved runs and trend), and API (copy-ready
examples). A site can hide any of them (page_test, page_monitor, page_diag,
page_history, page_api). Every
chart has a hover readout and a table equivalent.
Visitors pick a theme from the header: Light, Dark, America, Energy, Federal, Military or Texas, or one that follows the OS. A page-size drop-down beside it (70% to 125%) fits more on smaller screens. Operators can rename the site, add their logo, organization and support links, show a notice on every page and set the default theme; see Branding and themes.
Install
On an Ubuntu 26.04 LTS server that already runs nginx, install the Debian package from
the releases page and add
one line to your site's server { } block:
sudo apt install ./texas2step-*-amd64.deb # the package from the releases page
# in /etc/nginx/sites-available/<your site>: include snippets/texas2step.conf;
sudo nginx -t && sudo systemctl reload nginx # → https://www.example.net/texas2step/
Or let texas2step-setup, which ships next to the .deb, check the server first. It
reports what it will change and what you must fix, then writes an install script for
that server. The script installs, reinstalls or upgrades texas2step, merges your
settings into the new template, publishes it through nginx and opens the UDP range:
sudo ./texas2step-setup --id houston --name "houston.example.net" --location "Houston, TX"
sudo ./texas2step-install.sh # after reading it
Once installed, sudo texas2step update upgrades it to the newest release, and a timer
can do that unattended. On a server without internet access,
sudo texas2step update --from <directory> installs a release whose two files you put
there. The install guide covers the rest: the setup
tool's options, the optional /speedtest address, configuration, the firewall rule for
the UDP test, updates, clearing saved results, cloning a server and removal.
To run it from source instead:
uv sync && uv run texas2step serve # http://localhost:8080
Building, testing, the docs site and packaging are covered in docs/development.md.
Command line
The CLI runs the same engine from any host toward a texas2step server. The package
installs it as /usr/bin/texas2step; elsewhere, uv tool install texas2step (or
pipx install texas2step) installs it from PyPI.
texas2step run https://www.example.net/texas2step # full test, human-readable
texas2step run https://www.example.net/texas2step --json --save
texas2step latency https://www.example.net/texas2step --count 50
texas2step download https://www.example.net/texas2step --streams 8 --seconds 15
texas2step upload https://www.example.net/texas2step
texas2step loss https://www.example.net/texas2step --packets 1000 --interval 5
client 127.0.0.1 (IPv4, HTTP/1.1)
this computer 127.0.0.1
Latency 1.85 ms jitter 0.08 ms (min 1.63 · p90 2.03 · 20 samples)
Download 4,893.9 Mbps peak 5,554.3 (2 streams · loaded -0.8 ms)
One stream 5,720.1 Mbps peak 6,167.7 (a single file copy · 117 % of 2 streams)
Upload 8,681.2 Mbps peak 11,391.7 (2 streams · loaded +0.1 ms)
Loss 0.00 % (0/200 lost · ↑ 0.00 % ↓ 0.00 % · UDP RTT 1.19 ms · jitter 0.12 ms)
Call quality 4.4 MOS excellent (you hear 4.4 · they hear 4.4 · longest gap ↓ 0 ↑ 0 ms · late ↓ 0.00 % ↑ 0.00 %)
Responsiveness 28,501 RPM (↓ 50,014 · ↑ 28,501 · a new connection 1.0 ms idle, 4.7 ms under load)
Bufferbloat A+
client is the address the server sees; this computer is the CLI's own on that
connection, before any NAT, with the interface's MAC address on Linux. --save stores
both with the result, and --no-local leaves them out.
API
Every primitive is a plain HTTP endpoint (/api/v1/ping, /down, /up, /ws,
/rtc/offer), and a server can measure toward another server on request:
curl -o /dev/null 'https://www.example.net/texas2step/api/v1/down?bytes=1000000000'
curl -s -X POST https://dallas.example.net/texas2step/api/v1/measure/full \
-H 'content-type: application/json' -d '{"target": "https://houston.example.net/texas2step"}'
Full reference: docs/api.md, or /api/docs on a running server.
Several locations
List other texas2step servers in the config and they appear in the header's server picker. The browser tests the chosen server directly (cross-origin), and each server can measure the others through the API. See docs/configuration.md. For servers open to the Internet, see Access codes.
Documentation
- Install: the Ubuntu package, nginx, firewall, upgrades.
- Configuration: every setting.
- Access codes: servers open to the Internet, a code from the service desk, and the desk's tools kept to your networks.
- Traffic limits: a daily and monthly cap on what the tests move, for servers whose traffic is billed.
- Security: the security controls, what each guards against, and what is left to the operator.
- Methodology: what is measured, and how.
- Quality and user experience: what the call-quality score and responsiveness mean to the people using a connection, the adjustments texas2step makes to match what they notice, and the sources.
- API: endpoints and the UDP probe protocol.
- Development: running from source, tests, docs site, packaging, releases.
- Roadmap: ideas for future work.
The same pages are published at robert-patrick-texas.github.io/texas2step.
License
Copyright 2026 Robert Patrick. Licensed under the Apache License 2.0.
Metadata
Release files for texas2step 2.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| texas2step-2.2.1.tar.gz | 1.4 MB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| texas2step-2.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.1 MB
Release files / texas2step-2.2.1.tar.gz
| Download URL | texas2step-2.2.1.tar.gz |
|---|---|
| Size | 1.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fd7fe7656832c7637212824675ae611a6274128bcbde9630a957066f246ddb81
|
|
BLAKE2b-256 checksum How to use checksums |
463986f8fbb82c5b7a81e13f85bf65a611a0c1b55dd1365d1b98fda66dec2d34
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logRelease files / texas2step-2.2.1-py3-none-any.whl
| Download URL | texas2step-2.2.1-py3-none-any.whl |
|---|---|
| Size | 668.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3597d2a8c31a4d33ebe435d113992ae5de1d4322b8bbd23c6ff33a978835a004
|
|
BLAKE2b-256 checksum How to use checksums |
44797775e3f75bb7c17bbee411cc2fafda63874d7c1cc25dba60ce5a39a644be
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logSecurity for texas2step 2.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for texas2step-2.2.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.