Skip to main content

Vaux

Vaux CLI

A terminal client for Vaux listening rooms. Listen to YouTube audio in sync with friends directly from your terminal.

Built with Textual and powered by mpv.

Vaux CLI lobby preview

Vaux CLI room preview


Features

  • Synchronized playback — everyone hears the same timestamp
  • Shared queue — search YouTube and add tracks from the terminal
  • Live voting — vote tracks up or down to re-sort the queue
  • Live chat — talk with friends alongside the music
  • Private rooms — invite-only with end-to-end encrypted chat (XSalsa20-Poly1305, Argon2id key derivation). Room burns when the host leaves.
  • Host controls — play, pause, skip, remove tracks, transfer host
  • No YouTube API key — search and stream URLs come from the Vaux server (with local yt-dlp fallback)
  • Faster track starts — background stream preloading + cache-aware resolution paths

Requirements

  • mpv — plays audio. On Windows, the CLI can download a portable build on first run. On Linux/macOS, install via your package manager (apt install mpv, brew install mpv, etc.).
  • Node.js (recommended) — modern yt-dlp needs a JS runtime for YouTube extraction. Node is auto-detected when using the local yt-dlp fallback. The hosted server already runs Node.
  • yt-dlp — included as a package dependency; keep it updated with pip install -U yt-dlp.

Installation

pipx install vaux-cli

Or:

pip install vaux-cli

Upgrade to latest release

pip install --upgrade vaux-cli

Usage

Launch the interactive lobby:

vaux

Join a public room directly:

vaux <room-id> -u <your-name>

Join a private room from an invite link or 22-character code:

vaux "https://vaux.app/#<22-char-code>" -u <your-name>
vaux <22-char-code> -u <your-name>

Or paste the invite from the lobby's 🔒 private → paste invite tab.

Point at a local server when developing:

vaux --server http://localhost:4000
vaux --server http://localhost:4000 my-room -u yourname

Keyboard shortcuts

In a room

Key Action
Ctrl+S Focus search
Ctrl+R Clear search results
Ctrl+T Focus chat
↑ / ↓ Chat history (chat input focused)
Ctrl+O Play / pause (host)
Ctrl+N Skip track (host)
x / Del Remove queue item (host, queue focused)
Ctrl+U Vote up selected track
Ctrl+D Vote down selected track
- / = Volume down / up
m Mute / unmute
Ctrl+K Copy room name (or private invite code)
Ctrl+L Listeners & transfer host (host)
Ctrl+G Info (version, links, shortcuts)
Ctrl+B Report a bug (Google Form / GitHub)
Ctrl+P Command palette (save screenshot, etc.)
Ctrl+C Quit

Type /host <username> in chat to transfer host to another listener.

Private rooms

  • Chat messages and member names are end-to-end encrypted with a key derived locally from the invite code (Argon2id). The server only sees ciphertext.
  • The room ID, queue, and playback events are NOT encrypted — only chat. Don't share private-room codes through untrusted channels.
  • The invite code stays in memory only. Closing the CLI loses it. Share before joining.
  • When the host quits, the room is destroyed immediately. Other members are disconnected.
  • Wrong codes lock the room for 60 s after 10 failed attempts.

Lobby

Key Action
Tab Next field
Ctrl+G Info (version, links, shortcuts)
Ctrl+B Report a bug (Google Form / GitHub)
Ctrl+P Command palette (save screenshot, etc.)
Ctrl+C Quit

Modal overlays

Key Action
Esc Close current overlay (Info / Bug / Listeners)

Streaming notes

Audio stream URLs are resolved through a low-latency pipeline:

  • Server attempts yt-dlp extraction with client-chain fallbacks.
  • Server caches stream URLs for a short TTL and pre-resolves on queue:add.
  • CLI races server and local yt-dlp in parallel, then uses the first success.
  • CLI preloads upcoming tracks and keeps an in-memory per-session stream cache.

During playback startup, the system log shows:

  • ⚡ stream source: cache (local)
  • ⚡ stream source: cache (server)
  • ⚡ stream source: server live
  • ⚡ stream source: local yt-dlp

Override VAUX_API_KEY only if the server uses a custom API_KEY. If playback fails, update yt-dlp and keep Node.js on PATH:

pip install -U yt-dlp
yt-dlp --js-runtimes node --remote-components ejs:github "https://youtu.be/VIDEO_ID"

If that command works locally, the CLI fallback should work too.

Reporting bugs

Found something broken? You have three ways to report it:

  • Inside the app — press Ctrl+B from the lobby or any room. An overlay opens with two choices:
    • Google Form — anonymous, no GitHub account needed.
    • GitHub Issues — opens a pre-filled issue with your vaux-cli version, Python version, and OS already in the body.
  • From the shell — vaux bug opens the GitHub Issues page in your browser with the same pre-filled template.
  • Attaching a screenshot — press Ctrl+P inside vaux to open Textual's command palette, then choose Save screenshot. vaux writes an SVG of the current terminal screen to your working directory; attach it to the form or drop it into the GitHub issue. Close the bug-report overlay before capturing so the screenshot shows the underlying screen.

Development

cd cli
python -m venv .venv
.venv\Scripts\activate        # Windows
source .venv/bin/activate     # macOS/Linux
pip install -e .
python main.py --server http://localhost:4000

Links


Why this project

I'm too lazy to switch tabs and need my full screen while coding ... That's it, that's why. 😺

Okay, not entirely.

This project was created because I wanted to learn how to use Socket.IO across a CLI application and a web app. It started as a fun hobby project and a learning exercise, and I decided to publish it so others can play around with it, learn from it, or build their own ideas based on what I've made.

Disclaimer: This is a personal hobby project created for learning and experimentation. It is free, open source, non-commercial, and released under the MIT License. No donations, sponsorships, subscriptions, or other forms of compensation are requested or expected. If you find it useful, that's more than enough.


Author

Violet Nguyen — nviolet0120@gmail.com

License

MIT — see LICENSE.

Release files for vaux-cli 0.2.9

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for vaux-cli 0.2.9
File Size Uploaded
vaux_cli-0.2.9.tar.gz 48.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for vaux-cli 0.2.9
File Interpreter ABI Platform
vaux_cli-0.2.9-py3-none-any.whl Python 3 none any Details

Total release size: 95.5 kB

Release files / vaux_cli-0.2.9.tar.gz

Download URL vaux_cli-0.2.9.tar.gz
Size 48.8 kB
Tags Source
SHA-256 checksum
How to use checksums
4838e23e36a5288afca5433587c6f706422eda5433798510c94d1c3d50cad735
BLAKE2b-256 checksum
How to use checksums
578c1d6c9fff03ee93d8793814ba83613792d11a07341ba7fb07df6ddbec90b0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 1, 2026.

Transparency log

Release files / vaux_cli-0.2.9-py3-none-any.whl

Download URL vaux_cli-0.2.9-py3-none-any.whl
Size 46.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c1a7ba5b1cbb914413c09f4e455a4f84a6aeccc89c8b8cbc05847cebb2bde22d
BLAKE2b-256 checksum
How to use checksums
2c19594a08a721c1554e16f27b7109cab9d3c9690af1c3f5ed4d3549a2a479b8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 1, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.9 This release

2 release files

0.2.8

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.1.26

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page