A modern iperf3 alternative with a live TUI, multi-client server, MPTCP, and QUIC support. Built in Rust.
Documentation · Installation · Releases · Known issues
cargo install xfr # Rust 1.88+; or brew install xfr
xfr serve # On the server
xfr 192.168.1.1 # On the client: TCP, 10 seconds
xfr 192.168.1.1 -P 4 # Four parallel streams
xfr 192.168.1.1 -u -b 1G # UDP at 1 GbpsUse the same xfr version on both peers for all current features. xfr uses its own protocol and does not connect to iperf3 servers. Allow port 5201 for TCP and UDP; see firewall requirements for older peers and client source ports.
- Live client TUI with throughput graphs and per-stream statistics.
- Multi-client server with an optional dashboard:
xfr serve --tui. - TCP, UDP, QUIC, and Linux MPTCP; parallel streams and bidirectional tests.
- Plain text, JSON, streaming JSON, and CSV output for automation.
- Saved configuration, LAN discovery, result comparison, and optional Prometheus metrics.
- Push final client results to a Prometheus Pushgateway or vmagent:
xfr <host> --push-gateway <url>. - Both TUIs report status through OSC 7501; unsupported terminals ignore it.
See the iperf3 comparison and migration guide.
cargo install xfr # Default features
cargo install xfr --features prometheus # Add metrics support
brew install xfr # macOS/LinuxThe lance0/tap/xfr tap remains available; see the
Homebrew installation options.
All installation channels and shell completions, including release binaries, Docker, AUR, Termux, Nix, pkgsrc, and source builds.
Release binaries cover Linux x86_64/ARM64, macOS Apple Silicon, and Android ARM64. macOS Intel can build from crates.io; NetBSD has a community pkgsrc package. Native Windows remains experimental; WSL2 is recommended.
CI covers Ubuntu, macOS, and Windows. Packaging and CI coverage do not establish runtime qualification for every platform or transport. See platform details and limitations.
| Task | Command or guide |
|---|---|
| Measure a VPN tunnel | xfr 10.8.0.1 -t 30s |
| Download or test both directions | xfr <host> -R / xfr <host> --bidir |
| Detect UDP congestion | xfr <host> -u -b 500M -t 60s |
| Find a path's UDP payload limit | xfr <host> --probe-mtu; UDP sizing |
| Exercise multiple paths/streams | xfr <host> -P 8 -t 30s; MPTCP |
| Compare before and after | Save with -o before.json / -o after.json, then xfr diff before.json after.json --threshold 5 |
| Find servers on the LAN | xfr discover |
| Automate tests and collect metrics | Scripting, Docker, CI/CD, Prometheus |
| Look up flags | xfr --help, xfr serve --help, CLI reference |
Press ? / F1 for TUI help. Client keys include s for settings, t for
themes, and p to pause/resume traffic. See client keys,
server keys, and themes.
Set defaults in ~/.config/xfr/config.toml, in /etc/xfr/config.toml for the whole system, or in any file passed with --config; CLI values override them.
Sharing a host with iperf3? See running next to iperf3.
See configuration and precedence,
metrics, and the CLI reference.
TCP and UDP bulk payloads are plaintext. QUIC encrypts traffic but verifies
peer identity only when a PSK is configured. Prefer --psk-file to placing a
key in command arguments or environment variables. Read the
transport security details,
authentication requirements, and
security policy before exposing a server.
For connection failures, throughput tuning, and UDP loss, start with troubleshooting and known issues.
The documentation index covers installation, features, automation, architecture, development, release history, and demo sources.
- Terminal Trove — xfr listing and discovery
- AUR — community Arch Linux package
- pkgsrc — community NetBSD package
Special thanks to Matthieu Baerts (matttbe), Linux kernel MPTCP co-maintainer, for extensive testing, detailed bug reports with packet traces, and feature suggestions including MPTCP support, kernel TCP pacing, zero-copy IO, and high stream-count hardening. xfr is significantly better because of his contributions.
Licensed under either of Apache License, Version 2.0 or MIT license at your option.

