Skip to main content

A terminal client for vaux listening rooms.

Project description

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 shellvaux 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 Nguyennviolet0120@gmail.com

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vaux_cli-0.2.8.tar.gz (44.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vaux_cli-0.2.8-py3-none-any.whl (42.9 kB view details)

Uploaded Python 3

File details

Details for the file vaux_cli-0.2.8.tar.gz.

File metadata

  • Download URL: vaux_cli-0.2.8.tar.gz
  • Upload date:
  • Size: 44.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for vaux_cli-0.2.8.tar.gz
Algorithm Hash digest
SHA256 8986a081369e9bb0c6a75cb3a26644917e28d25331bd28ec8649d925ca7eb3ba
MD5 c90525f96f24be2c6400856e1cdac2b9
BLAKE2b-256 4d98a7870840cb7a508c1179708fe33acfc5688bd96440cc8f981689f659badc

See more details on using hashes here.

File details

Details for the file vaux_cli-0.2.8-py3-none-any.whl.

File metadata

  • Download URL: vaux_cli-0.2.8-py3-none-any.whl
  • Upload date:
  • Size: 42.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for vaux_cli-0.2.8-py3-none-any.whl
Algorithm Hash digest
SHA256 1d435a226a6b2ca41193a5a40c226ad23aba2086de5c4cf0ad62a76e07e27b13
MD5 443929c65ca3fb42931f2d01d5b10d3a
BLAKE2b-256 b446363d0950a2449cd72d16a8e9deac694aaef5f77ec46559e954f791696e6b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page