streamtop
Live HLS, DASH, and IPTV stream diagnostics in the terminal.
Installation
Rust
Windows (Scoop)
scoop bucket add streamtop https://github.com/Jorji49/streamtop
scoop install streamtop/streamtop
Windows (Winget)
Package submission is in review (PR #424450 for 0.3.2). Manifests for 0.3.3 live under dist/winget/ and will be submitted after merge. After the package is available:
winget install streamtop
macOS / Linux (Homebrew)
Arch Linux (AUR)
A packaging template lives at dist/aur/PKGBUILD. The package is not published to the AUR yet.
Docker
The image contains the CLI binary only (no mpv / ffplay). Quick Play is unavailable in the container.
<URL> -
Debian / Ubuntu
From source
Release binaries: latest release
Quick start
--probe-headers downloads only the start of each segment (faster; enough for header and wire checks).
What you see
| Area | Meaning |
|---|---|
| Status | URL, LIVE / ESTIMATED, health score (SHI), FPS, GOP/audio badges, latency, CDN, buffer, LL-HLS timing |
| Last segment | Sequence, sizes, DNS / TCP / TLS / TTFB, container type, GOP interval, audio wire info |
| ABR ladder | Bitrates, resolution, FPS, codecs. [wire] is from the bitstream; red marks manifest vs wire mismatch |
| Charts | Latency or TTFB, download rate or transfer time |
| Log | Warnings, ads (SCTE-35), stalls, HTTP errors |
FPS comes from the playlist (FRAME-RATE / @frameRate) when present; otherwise from the bitstream when readable. GOP interval is estimated from keyframe PTS across consecutive segments (Fixed vs Variable cadence). Audio codec, sample rate, and channels come from ADTS, fMP4, or MPEG-TS PMT when present in the probe window.
Commands
# Live dashboard
# Compare two feeds
# Webhook alerts (Slack / Discord / HTTP). Private and metadata hosts are blocked by default.
# Local webhook testing only:
# Channel list audit -> audit_report.json / .csv
# Headless pass/fail (CI). JSON schema: schemas/summary.v1.json
# Ticket attach: curl / HAR (secrets redacted)
# Named profile from ~/.config/streamtop/config.toml (see config.example.toml)
# Prometheus on 127.0.0.1:9184/metrics
# Scrape with: curl -H "Authorization: Bearer $STREAMTOP_METRICS_TOKEN" http://host:9184/metrics
# Query ?token= is not supported (Bearer header only).
# Optional DRM license / LA_URL TTFB probe
# Grafana dashboard JSON
Alert kinds for --alert-on: stall, shi_below_70, http_5xx, mismatch, ad_start.
Keys
| Key | Action |
|---|---|
q / Esc / Ctrl+C |
Quit (Esc returns to channel list when open) |
Space |
Save report under diagnostics/ (URLs and secrets redacted) |
c |
Copy a curl for the last segment (redacted) |
p |
Quick Play via mpv or ffplay (not available in Docker) |
r |
Reset metrics |
Tab |
Channel overlay |
? |
Help |
/ |
Search in channel list |
j / k |
Scroll log or channel list |
Compare mode: Space pause/resume (ring buffer), d detail, l log focus, c curl, h HAR, Tab focus pane.
License
MIT. See LICENSE.