A terminal UI for per-channel (L/R) volume and balance control using PulseAudio / PipeWire (pactl).
╭──────────────────────────────────────────────────────────────────╮
│ volta │
│ ◀ EDIFIER W830NB ▶ (3 / 6) │
│ │
│ L ██████████████████████████████████████░░░░░░░░░░ 80 % │
│ R ████████████████████████████████████████████████ 100 % │
│ │
│ BAL ────────────────────────┼──●──────────────────── +20 R │
│ │
│ ────────────────────────────────────────────────────────── │
│ k / j L vol +5 / -5 │ K / J R vol +5 / -5 │
│ h / l balance ±3 │ ← / → prev / next sink │
│ L lock L = R │ r reset to 100% │
│ m mute toggle │ q quit │
│ │
╰──────────────────────────────────────────────────────────────────╯
- Per-channel control — adjust left and right volume independently
- Balance bar — visual representation of the stereo balance
- Lock mode — link L and R channels so they move together
- Sink cycling — navigate all available audio sinks with arrow keys
- Mute toggle — mute/unmute any sink instantly
- Persistent state — remembers the last used sink across sessions
- Responsive layout — all bars and controls adapt to terminal width
- PipeWire / PulseAudio — works with any
pactl-compatible backend
- Go 1.22+
- PulseAudio or PipeWire with
pactlavailable
From source:
git clone git@github.com:mateuspim/volta.git
cd volta
make build
# binary at ./bin/voltaRun directly:
make run| Key | Action |
|---|---|
k / j |
Left channel volume +5 / -5 |
K / J |
Right channel volume +5 / -5 |
h / l |
Shift balance left / right by 3 |
← / → |
Previous / next sink |
tab / shift+tab |
Previous / next sink |
L |
Toggle lock L = R |
r |
Reset both channels to 100% |
m |
Toggle mute |
q / ctrl+c |
Quit |
Arrow keys cycle sinks.
hjkl/KJcontrol volume and balance exclusively.
Bars support 0–150%. The 100–150% range renders in red as an over-gain indicator.
Last used sink is saved to ~/.config/volta/state.json and restored on the next launch. If the sink is unavailable (e.g. Bluetooth headphones unplugged), volta falls back to the first available sink.
volta/
├── cmd/volta/ # entrypoint
├── internal/
│ ├── audio/ # pactl wrapper (list sinks, set volume, mute)
│ ├── tui/ # bubbletea model, update loop, rendering
│ └── state/ # persistent sink state (~/.config/volta/)
├── .github/workflows/ # CI: build + test on dev, release binaries on tags
└── Makefile
- Push to
devor PR tomaster→ build + vet + test - Tag
v*onmaster→ release withlinux/amd64andlinux/arm64binaries
| TUI framework | Bubble Tea |
| Styling | Lip Gloss |
| Components | Bubbles |
| Audio backend | pactl (PulseAudio / PipeWire) |
MIT