Skip to main content
Version: 6.0.0

Command Line Interface

Visibox ships with a visibox command-line tool for controlling a running Visibox from your shell. It is a lighter alternative to the AI Assistants integration for quick one-offs, shell aliases, scripting, and hotkey tools.

The CLI is a thin wrapper over the same HTTP REST API the Stream Deck plugin and the MCP server use, so anything the CLI can do, any other client can too.

Installation

Install the CLI from inside Visibox:

  1. Choose Install CLI Tool… (on Mac, from the Visibox menu; on Windows, from the File menu).
  2. Visibox installs the command and shows you where it landed. Open a new terminal and run visibox health (Mac, or Windows from Command Prompt or PowerShell) or visibox.cmd health (Windows from Git Bash or WSL) to confirm it is working.

To remove it later, choose Install CLI Tool… again. Visibox detects that it is already installed and offers an Uninstall option.

Where it lands

PlatformInstall pathInvoke as
macOS/usr/local/bin/visiboxvisibox
Windows%LOCALAPPDATA%\Visibox\bin\visibox.cmdvisibox or visibox.cmd

On macOS, /usr/local/bin is already on your $PATH, so visibox works in any shell. You may be asked for your password, since writing there needs administrator rights.

On Windows, Visibox adds %LOCALAPPDATA%\Visibox\bin to your user PATH. In Command Prompt and PowerShell, type visibox and Windows resolves it to visibox.cmd automatically. In Git Bash, WSL, or another Unix-style shell on Windows, type visibox.cmd explicitly, because those shells do not do that resolution. To shorten it in bash, add alias visibox=visibox.cmd to your ~/.bashrc.

The installed command is a small wrapper that runs the CLI out of the Visibox app itself, so there is no separate runtime to install.

note

You may need to open a new terminal window, or reload your shell profile, after installing so the command is on your PATH.

Quick Start

# Is Visibox running?
visibox health

# What's playing?
visibox status

# Control playback
visibox play
visibox stop
visibox next
visibox prev

Connection and Authentication

By default the CLI connects to http://127.0.0.1:17736 on your local machine, and localhost connections skip authentication. There is nothing to configure for scripting your own Visibox.

To reach a Visibox on another machine you need a pairing token. See Remote Pairing for how to pair, then pass the token with a flag or an environment variable:

Flag / VariablePurpose
--host <host> / VISIBOX_HOSTHost to connect to.
--port <port> / VISIBOX_PORTPort. Default 17736.
--token <token> / VISIBOX_TOKENPairing token for remote connections.

The CLI also reads a token from ~/.visibox/mcp-token if it is there, the same file the MCP server uses, so if MCP already works then the CLI does too.

note

The default port changed in Visibox 6.0. Visibox 5.x used 51736. Update any script that names the port.

Counting from One

Song and Clip indices are one-based by default, matching the numbers the Controller shows. visibox play-clip 1 plays the first Clip.

This is the opposite of the API, which is zero-based. The CLI takes the friendlier default because a person is typing it.

To switch, use --zero-based on a single command, set VISIBOX_INDEX_BASE=0, or make it permanent:

visibox config set index-base 0

--one-based and --zero-based cannot both be given at once.

Playback

CommandWhat it does
visibox playStart playback.
visibox stopStop playback.
visibox pausePause.
visibox resumeResume.
visibox nextNext Clip.
visibox prevPrevious Clip.
visibox next-songNext Song.
visibox prev-songPrevious Song.
visibox restartRestart the current Clip.
visibox stop-allStop all playing Clips.
visibox play-toggleToggle play and stop.
visibox pause-toggleToggle pause and resume.
visibox play-clip <index>Play the Clip at that position.
visibox release-clip <index>Release the Clip at that position.
visibox song <index|id>Switch to a Song by position or ID.
visibox trigger <clipId>Trigger a Clip, respecting retrigger behavior.
visibox release <clipId>Release a Clip by ID.
visibox seek <clipId> <percent>Seek within a Clip, 0 to 100.

play-clip and release-clip both take -s, --song <songId> to work on a Song other than the active one.

song works out for itself whether you gave it a position or an ID. Force the reading with --index <n> or --id <id> if a Song ID of yours happens to be all digits.

Real-Time Control

CommandWhat it does
visibox controlsList the Project’s Controls, their letters and their names.
visibox control <letter> <value>Set a Control by its letter, 0 to 1. Percentages work: 50%.
visibox param <targetId> <value>Set a bound parameter directly by its Target ID, skipping Controls.

See Real-Time Control for what Controls and Targets are.

Releasing a Clip

release and release-clip are the note-off half of a held button, new in 6.0. They stop a Clip that is in Gate launch mode and do nothing to a Clip in any other launch mode.

That makes them safe to fire unconditionally, which is what a hotkey tool wants:

# on key down
visibox play-clip 3
# on key up
visibox release-clip 3

System

CommandWhat it does
visibox fullscreenToggle the Output window full screen.
visibox muteToggle output mute.
visibox volume <0-100>Set the master output level.
visibox panicEmergency reload. Restart all Visibox windows.
visibox undoUndo the last project edit.
visibox redoRedo the last undone project edit.

Query

CommandWhat it returns
visibox healthWhether Visibox is running and reachable.
visibox statusThe active project and playback state.
visibox app-stateFull screen, mute, and volume.
visibox projectsAll open projects.
visibox project [id]Detail for a project. Defaults to the active one.
visibox songsSongs in the active Project.
visibox clips <songIndexOrId>Clips in a Song.
visibox presetsAvailable Visualizer and Effect presets.
visibox camerasConnected cameras and video inputs.
visibox versionCLI, app, and API versions from the running Visibox.

presets takes -k, --kind <effect\|visualizer> and -s, --source <app\|user\|plugin> to narrow the list.

visibox --version is different: it prints the CLI’s own version without contacting Visibox.

Editing

A single edit command dispatches any edit the API supports:

visibox edit song:update-title --param songId=abc123 --param title="New Title"
visibox edit clip:delete --param clipId=xyz789

Run visibox edit list to print every available edit name, grouped by kind. Running visibox edit with no name does the same thing.

To see what one edit takes:

visibox edit song:set-timeline --describe

For nested parameters, pass the whole object at once instead of repeating --param:

visibox edit clip:update-options --params-json '{"clipId":"xyz789","options":{"speed":1.5}}'

A --param value that parses as JSON is coerced, so --param volume=0.5 sends a number and --param mute=true sends a boolean.

Edit parameters are always zero-based, whatever your index-base setting is.

JSON Output

Append --json to any command for machine-readable output instead of formatted text. This is the right mode for piping into jq, grep, or another script:

visibox status --json | jq '.project.name'
visibox songs --json | jq -r '.[].title'

With --json, errors go to standard error as JSON too, so a script can tell an application error from a connection failure without parsing prose.

Targeting a Specific Project

Most commands default to the active Project. Use --project <id> to target another:

visibox songs --project abc123
visibox play --project abc123

Global Options

OptionDescription
--jsonOutput raw JSON instead of formatted text.
--host <host>Visibox host. Default 127.0.0.1.
--port <port>Visibox port. Default 17736.
--token <token>Auth token for remote connections.
--project <id>Target Project ID. Defaults to the active Project.
--timeout <ms>Request timeout in milliseconds. Default 5000.
--one-basedTreat Song and Clip indices as one-based. This is the default.
--zero-basedTreat Song and Clip indices as zero-based.
--versionPrint the CLI version and exit.

Configuration

visibox config reads and writes preferences in ~/.visibox/config.json:

visibox config get
visibox config get index-base
visibox config set index-base 0

index-base is the only key, and it takes 0 or 1.

Exit Codes

CodeMeaning
0Success.
1Application error. Visibox returned an error, or refused the action.
2Connection error. Visibox is not running or is unreachable.

Exit codes make the CLI friendly to shell scripts: check $? or chain with && and \|\| like any other Unix tool.

note

As of 6.0, an action Visibox refuses exits 1 rather than 0. A script that checked only for a connection failure now catches a refused action too.

Examples

The examples below are written for bash (macOS, Linux, WSL, Git Bash). On Windows, run them from Git Bash or WSL, or translate the loops and jq pipelines to PowerShell. In Git Bash, substitute visibox.cmd for visibox.

# Fire off a panic reload from a Stream Deck button, keyboard shortcut tool, or hotkey app
visibox panic

# Rotate through songs on a timer (for example, in a soundcheck script)
for i in 1 2 3 4 5; do
visibox song $i
sleep 30
done

# Dump a set list for a show document
visibox songs --json | jq -r '.[] | "\(.index). \(.title)"'

# Trigger the first Clip of every Song in sequence (hands-off preview)
visibox songs --json | jq -r '.[].id' | while read songId; do
visibox song "$songId"
visibox play-clip 1
sleep 15
done

# Bail out of a script if Visibox isn't running
visibox health || { echo "Visibox is not running"; exit 1; }
tip

The CLI, the Stream Deck plugin, and AI Assistants are three ways to reach the same API. Reach for the CLI when you want scripting or shell-speed control, the Stream Deck for physical buttons, and an AI assistant when you want to drive Visibox with natural language.