A terminal UI dashboard that connects to your Starlink Dishy via gRPC and displays real-time metrics as live-updating charts.
- Real-time monitoring — polls your dish every second for live metrics
- Dynamic panels — add, remove, and rearrange panels on the fly
- Fullscreen zoom — press Enter to expand any panel to full screen
- Graph panels — downlink/uplink throughput, latency, drop rate, SNR, obstruction
- Tabular panels — device info, network stats, connection event log
- Adaptive grid — layout automatically reflows as panels are added/removed
- Panel picker — press
ato browse and add from 9 available panel types
- Go 1.21+
- Network access to your Starlink Dishy (default:
192.168.100.1:9200) - Must be on the Starlink LAN (or have routed access to the dish)
go install github.com/forde-dev/dishy@latestOr build from source:
git clone https://github.com/forde-dev/dishy.git
cd dishy
go build -o dishy .# Connect to dish at default address (192.168.100.1:9200)
./dishy
# Use environment variable for address
export DISHY_ADDR=192.168.100.1:9200
./dishy
# Custom address overrides environment variable
./dishy -addr 192.168.100.1:9200
# Custom polling interval
./dishy -interval 2sAddress resolution order:
-addrflag (highest priority)DISHY_ADDRenvironment variable- default
192.168.100.1:9200
| Key | Action |
|---|---|
q / Ctrl+C |
Quit |
Tab |
Cycle focus to next panel |
Shift+Tab |
Cycle focus to previous panel |
Enter |
Toggle fullscreen zoom on focused panel |
Esc |
Exit fullscreen / close picker |
d |
Remove focused panel from dashboard |
a |
Open panel picker to add a new panel |
↑/k ↓/j |
Navigate panel picker |
Graph panels (sparkline charts):
| Panel | Metric | Unit |
|---|---|---|
| Downlink | Download throughput | Mbps |
| Uplink | Upload throughput | Mbps |
| Latency | PoP ping latency | ms |
| Drop Rate | Packet drop rate | % |
| SNR | Signal-to-noise ratio | dB |
| Obstruction | Dish obstruction | % |
Table panels:
| Panel | Content |
|---|---|
| Device Info | HW/SW version, device ID, uptime, state |
| Network Stats | Current throughput, latency, drop rate, SNR + drop rate sparkline |
| Connection Log | Timestamped state changes, obstruction events, errors |
┌──────────────────────┐┌──────────────────────┐
│ ↓ Downlink (Mbps) ││ ↑ Uplink (Mbps) │
│ ▃▅▇█▆▅▃▂▅▇█▇▅▃ ││ ▂▃▄▅▃▂▁▂▃▄▅▄▃▂ │
│ ││ │
└──────────────────────┘└──────────────────────┘
┌──────────────────────┐┌──────────────────────┐
│ ⏱ Latency (ms) ││ 📡 Device Info │
│ ▂▃▂▂▃▄▃▂▂▃▂▂▃▂ ││ State 🟢 CONNECTED│
│ ││ Uptime 2d 5h 30m │
│ ││ Software 2024.01.00 │
└──────────────────────┘└──────────────────────┘
Starlink Dishy ◄──gRPC──► Collector (1s poll) ──► Ring Buffer ──► Bubble Tea TUI
- gRPC Client — connects to the dish using community-maintained proto bindings
- Collector — polls
get_statusat configurable intervals, stores in a fixed-size ring buffer (300 samples = 5 minutes), tracks connection events - TUI — Bubble Tea framework with dynamic panel system, adaptive grid layout, and picker overlay
dishy/
├── main.go # Entry point, CLI flags
├── internal/
│ ├── dish/
│ │ ├── client.go # gRPC client for Dishy
│ │ └── metrics.go # Metric types + ConnectionEvent
│ ├── collector/
│ │ └── collector.go # Periodic polling, ring buffer, event log
│ └── ui/
│ ├── app.go # Bubble Tea model + keybindings
│ ├── dashboard.go # Panel rendering (graphs + tables)
│ ├── layout.go # Adaptive grid layout engine
│ ├── panel.go # Panel type definitions + catalog
│ └── styles.go # Lip Gloss theme + picker styles
└── README.md
MIT
