Skip to main content

Diagnose why your network connection is slow

Project description

yslow

A command-line tool that diagnoses why your network connection is slow (or feels slow).

Instead of just reporting numbers, yslow isolates where the problem is — your local network (wifi/router), your ISP, or the broader internet — and tells you in plain language.

╻ ╻┏━┓╻  ┏━┓╻ ╻┏━┓
┗┳┛┗━┓┃  ┃ ┃┃╻┃ ╺┛
 ╹ ┗━┛┗━╸┗━┛┗┻┛ ╹

Is it slow?
● YES!

Why?
  ⚠ network no targets reachable (internet may be down) (1x, ongoing)
  ⚠ LAN     gateway unreachable (unusual routing setup) (1x, ongoing)

Details
  LAN:          gateway 192.168.1.1 unreachable
  ISP/internet: all targets unreachable
  10.0.0.1:       3.0 ms cached,  45.0 ms uncached ✱
  Google DNS:    25.0 ms cached,  60.0 ms uncached
  OpenDNS:       35.0 ms cached,  42.0 ms uncached
  Cloudflare DNS:  9.0 ms cached,  40.0 ms uncached

What it checks

  • Gateway latency — how fast your machine can talk to your router. High latency or jitter here points to wifi congestion, a bad cable, or an overloaded router.
  • Internet latency — TCP handshake time to multiple well-known servers (Cloudflare, Google, OpenDNS).
  • DNS resolution — cached and uncached lookup times for your configured resolver and public resolvers (Google, Cloudflare, OpenDNS). Flags slow resolvers and compares your configured resolver against public alternatives.
  • Packet loss — at both the local and internet level.
  • Jitter — variance in latency, which causes buffering, choppy calls, and inconsistent page loads.

Usage

uvx yslow              # one-shot check
uvx yslow -w           # continuous monitoring (every 30s)

Requires Python 3.10+. Works on Linux and macOS.

How it works

yslow uses TCP handshake timing rather than ICMP ping. A TCP connect to port 443 measures the same network round-trip as ping, but works without root privileges and inside containers where ICMP is often blocked.

For the gateway, it tries common TCP ports (80, 443, 53, 22) and falls back to ICMP ping if needed.

Development

uv sync                  # install deps
./check.sh               # run all checks (format, lint, typecheck, tests)
uv run ruff check --fix  # lint
uv run ruff format       # format

Documentation

See docs/metrics.md for details on what yslow measures (RTT, packet loss, jitter, DNS), how each metric is calculated, and the thresholds used for diagnosis.

Planned

  • Bufferbloat detection (latency under load)
  • Bandwidth / throughput estimation
  • IPv6 health check
  • Route analysis (where along the path is the bottleneck)

See TODO.md for more

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

yslow-0.3.1.tar.gz (44.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

yslow-0.3.1-py3-none-any.whl (16.8 kB view details)

Uploaded Python 3

File details

Details for the file yslow-0.3.1.tar.gz.

File metadata

  • Download URL: yslow-0.3.1.tar.gz
  • Upload date:
  • Size: 44.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"25.10","id":"questing","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for yslow-0.3.1.tar.gz
Algorithm Hash digest
SHA256 81892c54a6bdf1c37b1df3549aceaf5336c8ddfcdb07ded49796fa489d92138c
MD5 f6899a932c52986693b2d9341fbd55ce
BLAKE2b-256 52235913db56f69355150735ee48c73acdc1e3c15727a6c62bfe8f51293568eb

See more details on using hashes here.

File details

Details for the file yslow-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: yslow-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 16.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"25.10","id":"questing","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for yslow-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 8b5a05be08c304d2dc8b1f256aeb66086bf5198bf3a70a373685f19e7368cd39
MD5 df9dcf2aaa4deeeaeea2518829c6e674
BLAKE2b-256 b40cd92d3de647f144ca48aacc8e425514a5d8f3203917a123ef2eca6493f7c3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page