You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Footer["q quit · r reset · i interface · c units · ? help"]
36
-
37
-
Title --> Download
38
-
Download --> Upload
39
-
Upload --> Info
40
-
Info --> Footer
41
-
```
16
+
## Contents
42
17
43
-
- Large centered breathing title row that scales to a multi-line ASCII art logo on larger terminals.
44
-
- Clean stacked panels separating download and upload statistics, wrapped in custom rounded borders with speed-reactive glow (transitions from dark slate/forest to bright cyan/emerald under load).
45
-
- High-resolution U+2800 Braille-grid waveforms scrolling horizontally with sub-pixel precision at 30 FPS.
46
-
- Velocity glyphs (↗ ↘ →) next to values indicating trend direction.
47
-
- Session peaks (flashes white on updates) and daily totals in a clean info bar.
48
-
- Quiet footer with interface name and keybindings.
18
+
-[Install](#install)
19
+
-[Rationale](#rationale)
20
+
-[Modes](#modes)
21
+
-[Features](#features)
22
+
-[Usage](#usage)
23
+
-[Configuration](#configuration)
24
+
-[Architecture](#architecture)
25
+
-[Development](#development)
26
+
-[Star History](#star-history)
27
+
-[License](#license)
49
28
50
29
## Install
51
30
@@ -61,77 +40,71 @@ cd flow
61
40
make install
62
41
```
63
42
64
-
Pre-built binaries for Linux, macOS, Windows (amd64/arm64) are on the
Pre-built binaries for Linux, macOS, and Windows (amd64 and arm64) are available on the [releases page](https://github.com/programmersd21/flow/releases).
> Does this help someone understand their network in under one second?
79
-
> If no — cut it.
47
+
Most network monitors display CPU usage, per-process breakdowns, packet counts, and connection tables. flow displays throughput only.
80
48
81
-
flow stays deliberately small. No CPU panels, no packet counters, no multi-pane layouts. Download and upload throughput, in real time, nothing else.
49
+
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.
82
50
83
-
The interface is built to feel calm and expensive: large typography, soft gradients, spring-driven motion, and restrained decoration.
51
+
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.
84
52
85
-
## Features
53
+
## Modes
86
54
87
-
- Real-time download (↓) and upload (↑) throughput
88
-
- Spring-driven interpolation for display values
89
-
- Pulse and shimmer microinteractions tied to live traffic
90
-
- High-resolution Braille-grid waveforms with 30 FPS horizontal smooth scrolling
91
-
- Speed-reactive, glowing rounded borders
92
-
- Typographic peak highlights (bold white flash on breaching records)
93
-
- Velocity glyphs (↗ ↘ →) show traffic direction trend
94
-
- Auto-scaling units: B/s, KB/s, MB/s, GB/s (cycle with `c`)
95
-
- Saturated color gradients that brighten with activity
96
-
- Session peak tracking and daily traffic totals
97
-
- Three view modes: hero, compact, tiny
98
-
- Graceful auto-resize between modes
99
-
- Zero configuration — optional TOML config at
100
-
`~/.config/flow/config.toml`
101
-
- Non-interactive modes: `--json` and `--once` for scripts
102
-
- Cross-platform: Linux, macOS, Windows
55
+
flow adjusts its display according to terminal width.
`~/.config/flow/config.toml` is auto-created on first run. It respects
158
-
`XDG_CONFIG_HOME`.
130
+
A configuration file is created automatically at `~/.config/flow/config.toml` on first run. The `XDG_CONFIG_HOME` environment variable is respected if set.
159
131
160
132
```toml
161
133
refresh = "100ms"# sampling interval
162
-
history = 60# seconds of sparkline history retained
134
+
history = 60# seconds of retained sparkline history
163
135
theme = "default"
164
-
unit = "auto"# auto | kb | mb | gb (case-insensitive)
165
-
interface = "auto"# auto or name (e.g. eth0, wlan0)
136
+
unit = "auto"# auto, kb, mb, or gb
137
+
interface = "auto"# auto, or a specific interface name (e.g. eth0, wlan0)
166
138
no_color = false
167
139
```
168
140
141
+
<details>
142
+
<summary>Interface layout</summary>
143
+
144
+
```mermaid
145
+
flowchart TD
146
+
Title["flow"]
147
+
Download["DOWNLOAD panel: current speed, peak, waveform"]
148
+
Upload["UPLOAD panel: current speed, peak, waveform"]
149
+
Info["Daily totals and active interface"]
150
+
Footer["Keybinding reference"]
151
+
152
+
Title --> Download
153
+
Download --> Upload
154
+
Upload --> Info
155
+
Info --> Footer
156
+
```
157
+
158
+
All elements are centered on both axes. Panel border color changes according to current transfer speed.
159
+
160
+
</details>
161
+
169
162
## Architecture
170
163
171
-
Two decoupled loops connected by a channel:
164
+
flow runs two independent loops connected by a channel.
172
165
173
166
```mermaid
174
167
flowchart LR
175
-
subgraph Sampling["Sampling Loop (~10 Hz)"]
176
-
OS["/proc/net/dev · sysctl · GetIfTable2"] --> SlidingWindow["Sliding-Window Average<br/>(last N samples)"]
subgraph Sampling["Sampling loop, approximately 10 Hz"]
169
+
OS["Network counters via gopsutil"] --> SlidingWindow["Sliding-window average"]
170
+
SlidingWindow --> Channel["Sample channel"]
178
171
end
179
172
180
-
subgraph Rendering["Render Loop (~30 fps)"]
181
-
Channel --> Spring["Spring Interpolation<br/>(smooth value animation)"]
182
-
Spring --> Display["Dashboard Render<br/>(Bubble Tea TUI)"]
183
-
Theme["Theme Config"] -.-> Display
173
+
subgraph Rendering["Render loop, approximately 30 fps"]
174
+
Channel --> Spring["Spring interpolation"]
175
+
Spring --> Display["Dashboard render (Bubble Tea)"]
176
+
Theme["Theme configuration"] -.-> Display
184
177
end
185
178
```
186
179
187
-
-**Sampling loop** (~10 Hz): reads OS network counters via gopsutil, computes a sliding-window average, emits a sample on a channel.
188
-
-**Render loop** (~30 fps): springs display values toward the latest sample, decays brief pulses, clears the terminal, and renders the full dashboard.
180
+
- The sampling loop reads network counters from the operating system, computes a sliding-window average, and emits a sample on a channel.
181
+
- The render loop interpolates display values toward the latest sample and renders the dashboard.
182
+
183
+
Separating collection from rendering keeps the interface responsive without adding load to the sampler. Idle CPU usage remains below one percent.
189
184
190
-
The model keeps rendering separate from collection so the UI can stay smooth without adding work to the sampler. Idle CPU stays well under 1%.
185
+
**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.
186
+
187
+
## Development
191
188
192
-
## Platform notes
189
+
```sh
190
+
make check # format check, vet, lint, and test
191
+
make build # build ./bin/flow
192
+
make test# go test ./... -race -cover
193
+
make release-dry # goreleaser snapshot build, no publish
194
+
```
193
195
194
-
- Linux: reads `/proc/net/dev` via gopsutil.
195
-
- macOS: sysctl / getifaddrs.
196
-
- Windows: `GetIfTable2`. No elevated privileges.
196
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for contribution guidelines.
197
197
198
198
## Star History
199
199
@@ -205,17 +205,6 @@ The model keeps rendering separate from collection so the UI can stay smooth wit
205
205
</picture>
206
206
</a>
207
207
208
-
## Development
209
-
210
-
```sh
211
-
make check # fmt-check + vet + lint + test — run before every PR
212
-
make build # build ./bin/flow
213
-
make test# go test ./... -race -cover
214
-
make release-dry # goreleaser snapshot (no publish)
215
-
```
216
-
217
-
See [CONTRIBUTING.md](CONTRIBUTING.md) for the full guide.
0 commit comments