Norwegian: to weave
A terminal multiplexer for Linux and macOS on Apple silicon (arm64). One Go binary, a per-user daemon, a thin client.
Warning
Alpha software. Expect breaking changes.
CI covers Ubuntu and macOS arm64. The release installer supports Linux x86_64 and macOS arm64.
What it is built around:
- Remote attach that survives bad networks. SSH bootstraps the connection, then the session runs over UDP and resumes after sleep or Wi-Fi changes. Inspired by mosh, with its own protocol.
- Server-side rendering. The daemon keeps a full VT screen per pane and sends minimal diffs to the client, so high-output programs (agents, build logs) stay smooth locally and over SSH.
- Nothing but the standard library. VT emulation, renderer, wire protocol, and UDP transport are all in this repo. Zero runtime dependencies.
- Performance treated as a feature. A reproducible harness measures 252 scenarios across workloads and transports, including lossy and high-latency UDP.
go install github.com/bnema/vev@latestThe default UI runs entirely from the vev binary. Optional external bar anchors can be configured in ~/.config/vev/config.
vev create an ephemeral session
vev new <name> create a named session
vev attach <name> attach to a session (alias: a)
vev attach user@host[:session] attach to a remote daemon over SSH
vev ls list sessions
vev kill <name> kill a session (--all kills everything)
The daemon starts on first use and exits with the last session. Ephemeral sessions are numbered, survive detach, and disappear with the daemon. Named sessions persist across daemon restarts and come back with their layout, scrollback, and allowlisted processes.
No prefix key; everything is Alt.
| Key | Action |
|---|---|
| Alt+Space | command palette |
| Alt+f | floating terminal for the current tab |
| Alt+1 .. 9 | switch tab |
| Alt+h/j/k/l, Alt+Arrow | focus pane |
| Alt+a | jump to a session needing attention |
The palette does the rest: type a short code (SPR split right, CNT new tab, SSP session picker, ...) or fuzzy-search the command list. Named active and stopped sessions are fuzzy-searchable, and selecting a stopped session resumes it. Scroll up with the mouse to enter scrollback; vim keys move, v selects, y copies via OSC 52.
vev attach user@host[:session]vev must be installed on the remote. If your firewall only allows SSH, open the UDP range first (default 61000:61023, override with VEV_UDP_PORT_RANGE):
sudo ufw allow 61000:61023/udpWhere UDP is not an option, VEV_REMOTE_TRANSPORT=stdio keeps everything inside SSH at the cost of slower disconnect detection. Details in docs/remote-resilience.md.
Optional file at ~/.config/vev/config, reloaded live. Themes, key bindings, palette codes, the floating terminal, status bar scripts: see docs/configuration.md. Terminal color and VT compatibility notes live in docs/terminal.md.
make test # go test ./... -race
make lint # goimports check, go vet
make mocks # regenerate mocks