π Thanks to @Dominiquini for helping bring Flow to the AUR!
Homebrew:
brew install programmersd21/flow/flow
Go:
go install github.com/programmersd21/flow/cmd/flow@latest
From source:
git clone https://github.com/programmersd21/flow
cd flow
make install
Pre-built binaries for Linux, macOS, and Windows (amd64 and arm64) are available on the releases page.
Rationale
Most network monitors display CPU usage, per-process breakdowns, packet counts, and connection tables. flow displays throughput only.
btop
flow
CPU, memory, disks, processes, network
throughput only
Every feature decision is evaluated against a single question: does this help the user understand their network within one second. If not, it is not included.
The result is a small, deliberately scoped tool. There are no additional panels, no required configuration, and no unnecessary complexity in either the interface or the underlying implementation.
# ~/.tmux.conf
set -g status-right "#(flow --tiny --no-color)"
set -g status-interval 1
Configuration
A configuration file is created automatically on first run:
Platform
Path
Linux
~/.config/flow/config.toml
macOS
~/Library/Application Support/flow/config.toml
Windows
%APPDATA%\flow\config.toml
The XDG_CONFIG_HOME environment variable is respected on Linux if set.
refresh = "100ms" # sampling interval
history = 60 # seconds of retained sparkline history
theme = "default"
unit = "auto" # auto, kb, mb, or gb
interface = "auto" # auto, or a specific interface name (e.g. eth0, wlan0)
no_color = false
bits = false # display throughput in bits/sec
Interface layout
flowchart TD
Title["flow"]
Download["DOWNLOAD panel: current speed, peak, waveform"]
Upload["UPLOAD panel: current speed, peak, waveform"]
Info["Daily totals and active interface"]
Footer["Keybinding reference"]
Title --> Download
Download --> Upload
Upload --> Info
Info --> Footer
All elements are centered on both axes. Panel border color changes according to current transfer speed.
Architecture
flow runs two independent loops connected by a channel.
flowchart LR
subgraph Sampling["Sampling loop, approximately 10 Hz"]
OS["Network counters via gopsutil"] --> SlidingWindow["Sliding-window average"]
SlidingWindow --> Channel["Sample channel"]
end
subgraph Rendering["Render loop, approximately 30 fps"]
Channel --> Spring["Spring interpolation"]
Spring --> Display["Dashboard render (Bubble Tea)"]
Theme["Theme configuration"] -.-> Display
InterfaceInfo["Interface details (IP, MAC)"] -.-> Display
end
The sampling loop reads network counters from the operating system, computes a sliding-window average, and emits a sample on a channel.
The render loop interpolates display values toward the latest sample and renders the dashboard.
Interface details (IP addresses, MAC, link status) are fetched on demand via I using both gopsutil and the Go standard library.
Separating collection from rendering keeps the interface responsive without adding load to the sampler. Idle CPU usage remains below one percent.
Platform notes: Linux reads /proc/net/dev via gopsutil. macOS uses sysctl and getifaddrs. Windows uses GetIfTable2. No elevated privileges are required on any platform.
Development
make check # format check, vet, lint, and test
make build # build ./bin/flow
make test # go test ./... -race -cover
make release-dry # goreleaser snapshot build, no publish
Thank you to everyone who has supported flow. Whether you've starred the repository, reported an issue, submitted a pull request, shared the project, or simply use it every day - your support is what keeps the project growing.
β Stargazers
β€οΈ Sponsor
If flow has made your terminal a little better, please consider sponsoring its development on GitHub.
Your sponsorship helps support:
π New features
π Bug fixes
β‘ Performance improvements
π Better documentation
π οΈ Long-term maintenance
If you're unable to sponsor, you can still make a huge difference by:
β Starring the repository
π’ Sharing flow with others
π¬ Recommending it to friends and colleagues
π Reporting bugs or suggesting improvements
π€ Contributing code or documentation
Every contribution, no matter how small, helps flow continue to grow.