Developer DocsCommand line

vibe CLI

Pair a terminal with your Station, jump between projects, and tag files.

npm install --global @vibery/vibe-cli

Developer portal

vibe is the command-line client for a Vibery Station and its Gateway. It shows your station status, jumps between docked projects and crew worktrees, keeps favorites, renders the daily briefing, and tags files, all from the terminal.

  • npm package: @vibery/vibe-cli
  • Binary: vibe (plus the vgo alias once shell integration is loaded)
  • Requires Node.js 22.22.2 or newer

Inside the hosted Vibery terminal, vibe is already installed and authenticated. Skip to Commands.

Install

npm install --global @vibery/vibe-cli
vibe --version

Version note. npm currently serves 0.1.1. Finding the desktop app automatically (via gateway.json), the vibery://pair link, the Linux browser opener and the Windows %APPDATA% lookup need 0.1.2, which is not published yet. Until then, set the two URLs from the app's gateway.json (see File locations) before vibe login:

export VIBE_GATEWAY_URL=ws://127.0.0.1:<port>
export VIBE_WEB_URL=http://127.0.0.1:<port>

Or install 0.1.2 from source.

npm is the only supported install channel.

Load shell integration so vibe go can change your current directory (a child process cannot cd its parent shell, so a small wrapper function does it):

# zsh
eval "$(vibe shell-init zsh)"
# bash
eval "$(vibe shell-init bash)"

Add the line for your shell to ~/.zshrc or ~/.bashrc once it works. It also defines the vgo alias for vibe go.

Quickstart

  1. Open the Vibery desktop app. Running a Station from a source checkout instead? See Running from a source checkout.

  2. Pair this CLI:

    vibe login
    

    vibe login checks that the Gateway and the Station web app are reachable, then starts a pairing request. It opens the approval page, /cli/pair on the Station web app (or the Vibery window via a vibery://pair link when the desktop app is running). Approve the named client there within 10 minutes. After that the request expires and you must run vibe login again.

  3. Check it worked:

    vibe whoami
    vibe doctor
    

Use a named profile when one machine needs more than one paired client:

vibe login --profile work --name "Work laptop"
vibe --profile work whoami

Token lifetime

Tokens issued by vibe login pairing have a 30-day sliding expiry.

Successful Gateway authentication refreshes the expiry to 30 days from that use. Refresh writes are throttled, so not every command updates the expiry. After roughly 30 days of inactivity, or if the token is revoked, re-run vibe login (add --profile NAME if you use one). Expired or revoked tokens cannot be refreshed.

This sliding expiry applies only to pairing-issued client tokens, not Settings or /auth/cli-token tokens, hosted-terminal tokens, browser/chat-proxy tokens, or legacy tokens without the pairing marker. Those keep their fixed expiry.

The hosted Vibery terminal gets a fresh token every time it starts a shell, so you never need to log in there.

Commands

Global option: --profile NAME (or --profile=NAME) selects a paired client profile for one command. Names are 1 to 64 letters, numbers, dots, underscores, or hyphens. When --profile is given, VIBE_TOKEN and VIBE_TOKEN_FILE are ignored for that command, so an inherited token cannot sign you in as someone else.

CommandFlags and argumentsWhat it does
vibe / vibe status(none)Station status: projects docked, how many have uncommitted changes, active crew worktrees, saved favorites.
vibe projects--jsonDocked projects with branch, dirty marker and phase, plus crew worktrees as project/agent (independent clones are marked (clone)). --json prints the raw list.
vibe go [name]name: a favorite, project, project/agent, or a unique prefix. --print-pathResolves a destination and prints its local path. With shell integration loaded, it changes your directory. With no name it goes to the workspace root. Lookup order: project/agent worktree, exact favorite, exact project, then unique prefix.
vgo [name]same as vibe goAlias defined by shell integration.
vibe fav list(default subcommand)Lists saved favorites.
vibe fav add <name> [path]path defaults to the current directorySaves a favorite on the Gateway.
vibe fav rm <name>alias: removeDeletes a favorite.
vibe actions(none)Read-only suggestions for the current directory (for example git status in a dirty repo, recent log in a crew worktree). Never runs anything.
vibe brief--plain, --sourceRenders the latest daily briefing (briefings/briefing-latest.sacred.md under the data root) in the terminal. --plain prints Markdown, --source prints the raw file. No Gateway connection needed.
vibe tag <file>--tags a,b,c (required), --dry-run, --new, --yes/-yPrepends curated tags to a filename.
vibe tag <dir> --recurse[=N]N is 1 to 3 (default 1), plus the flags aboveTags the files inside a folder. Refuses symlink roots and macOS package folders. Batches over 25 files ask for confirmation unless --yes.
vibe tag --plan <plan.json>--dry-run, --new, --yesApplies a JSON array of {"path": "...", "tags": ["..."]} entries. Every entry is validated before any file moves.
vibe tag undo <path>(none)Restores a file tagged by vibe tag to its original name, using the local tag log.
vibe whoami(none)Identity, auth mode, scopes, Gateway URL, and data dir.
vibe login--profile NAME, --name LABEL, --web-url URL, --helpPairs this CLI with a Station (see Quickstart). --name is the label shown on the approval screen (default Vibe CLI (<profile>)).
vibe logout--profile NAMERevokes the profile's token on the Gateway and deletes the local profile file. The file is deleted even if the Gateway is unreachable.
vibe doctor--offlineChecks the CLI version, Node version, shell integration, and (unless --offline) a live Gateway connection.
vibe gateway start(none)Starts a local backend from a Vibery source checkout (see Running from a source checkout). Only works for a local (loopback) Gateway URL. Does nothing if one is already reachable.
vibe shell-init <bash|zsh>(none)Prints the shell integration script.
vibe update--checkChecks npm for a newer @vibery/vibe-cli and installs it with npm install --global, then verifies the new version. --check only reports.
vibe --versionaliases: version, -vPrints the installed version.
vibe helpaliases: --help, -hPrints help. vibe tag --help and vibe login --help have their own.

Environment variables

VariableUsed for
VIBE_GATEWAY_URLGateway WebSocket URL. Wins over everything else.
VIBERY_GATEWAY_URLFallback Gateway URL when VIBE_GATEWAY_URL is unset.
VIBE_WEB_URLStation web app URL used by vibe login for the approval page. --web-url overrides it.
VIBE_TOKENA token to use directly. Set automatically in the hosted terminal.
VIBE_TOKEN_FILEPath to a file holding a token (dev and local setups).
VIBE_PROFILEPaired profile to use when no --profile is given (default default).
VIBE_DATA_ROOTLocal path of the Gateway data directory. First in the data-root order.
VIBERY_DATA_ROOTSecond in the data-root order.
VIBE_SHELL_INTEGRATIONSet to 1 by the shell wrapper. vibe doctor reads it; you do not set it yourself.
VIBE_UPDATE_REGISTRYnpm registry vibe update checks (default https://registry.npmjs.org).
VIBE_UPDATE_NPMnpm executable vibe update runs (default npm).
VIBE_UPDATE_BINARYExecutable vibe update runs afterwards to verify the version (default vibe).
VIBE_UPDATE_ALLOW_ANY_INSTALLSet to 1 to let vibe update run when the CLI was not installed by npm.
NO_COLORDisables colored output. Color is also off when stdout is not a terminal.

Token resolution order: VIBE_TOKEN, then VIBE_TOKEN_FILE, then the paired profile file. With no token, Gateway commands fail with Unauthorized.

Gateway URL resolution order: VIBE_GATEWAY_URL, VIBERY_GATEWAY_URL, the running Station's gateway.json, then ws://127.0.0.1:8080. The web URL follows the same pattern: --web-url (login only), VIBE_WEB_URL, gateway.json, then http://127.0.0.1:3000.

File locations

PathContents
~/.vibery/vibe/clients/<profile>.jsonPaired client profile, including its token. Directory mode 0700, file mode 0600. Removed by vibe logout.
<data root>/gateway.jsonEndpoints a running desktop Station publishes (gatewayUrl, webUrl, pid). The packaged app binds random ports, so the CLI reads this to find it. A file left by a Station process that is no longer running is ignored.
<data root>/briefings/briefing-latest.sacred.mdSource for vibe brief.
~/.vibery/tags/log.jsonlLocal tag log used by vibe tag undo.
~/.vibery/tags/vocabulary.jsonYour local tag vocabulary additions (vibe tag --new).

Data-root resolution order (only existing directories count; the first match wins for gateway.json and vibe brief):

  1. $VIBE_DATA_ROOT
  2. $VIBERY_DATA_ROOT
  3. /data (inside the backend container)
  4. %APPDATA%\vibery\data (Windows desktop installs)
  5. ~/.vibery/data (macOS and Linux desktop installs, and vibe gateway start)

Hosted Gateway

The production Gateway is wss://gateway.vibery.gg, and the web app is https://vibery.gg.

What works today:

  • Hosted Vibery terminal: vibe is preinstalled and VIBE_GATEWAY_URL and VIBE_TOKEN are set for you. Run commands directly.

  • Pointing at the hosted Gateway with a token you already have:

    export VIBE_GATEWAY_URL=wss://gateway.vibery.gg
    export VIBE_TOKEN_FILE=~/path/to/token
    vibe whoami
    

What does not work today: vibe login against the hosted Gateway. The Gateway only accepts pairing requests that come from the same machine (loopback), and requests through the gateway.vibery.gg proxy are refused with CLI pairing start is loopback-only. Pair against a local or desktop Station instead.

Troubleshooting

Unauthorized, or a command fails after working earlier. Your paired token has expired or was revoked. Run vibe login again (add --profile NAME if you use one). Inside the hosted terminal, open a new terminal tab to get a fresh token.

Cannot reach the Vibery Gateway at .... Nothing is listening at that URL. For a local Station, open the desktop app (or run vibe gateway start from a source checkout). Otherwise check VIBE_GATEWAY_URL. vibe whoami and vibe doctor show which URL is in use, and curl http://127.0.0.1:8080/health (with your host) checks the backend directly.

Cannot reach the Station web app at .... vibe login also needs the web app. Open the desktop app, or pass the web app URL with vibe login --web-url URL.

No browser opens on headless Linux. vibe login uses xdg-open. Without it you will see Could not open a browser automatically. Open the printed Approval URL in any browser that is signed in to the Station, and approve within 10 minutes.

CLI pairing expired before approval. The 10-minute window passed. Run vibe login again.

Windows. Paired profiles, and the desktop Station's data root (where its gateway.json lives):

%USERPROFILE%\.vibery\vibe\clients\
%APPDATA%\vibery\data

vibe go prints a path but does not change directory. Shell integration is not loaded. Run eval "$(vibe shell-init zsh)" (or bash). vibe doctor warns when it is missing.

vibe update says the CLI is not npm-managed. Reinstall with npm install --global @vibery/vibe-cli.

Running from a source checkout

For contributors with access to the Vibery repo. Run these from the repo root.

Start a local Station in two terminals:

# terminal 1: local backend, loopback only
vibe gateway start
# terminal 2: Station web app
npm --prefix vibery-ui-web run dev

Then continue with step 2 of the Quickstart.

Install 0.1.2 from source

npm ci --ignore-scripts \
  --include-workspace-root=false \
  --workspace @vibery/vibe-cli \
  --workspace @vibery-llc/sacred-markdown
npm run build --workspace @vibery/vibe-cli
node scripts/stage-vibe-cli-package.mjs
npm install --global ./packages/vibery-cli/.publish