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 thevgoalias once shell integration is loaded) - Requires Node.js 22.22.2 or newer
Inside the hosted Vibery terminal,
vibeis 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), thevibery://pairlink, 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'sgateway.json(see File locations) beforevibe login:export VIBE_GATEWAY_URL=ws://127.0.0.1:<port> export VIBE_WEB_URL=http://127.0.0.1:<port>
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
-
Open the Vibery desktop app. Running a Station from a source checkout instead? See Running from a source checkout.
-
Pair this CLI:
vibe loginvibe loginchecks that the Gateway and the Station web app are reachable, then starts a pairing request. It opens the approval page,/cli/pairon the Station web app (or the Vibery window via avibery://pairlink when the desktop app is running). Approve the named client there within 10 minutes. After that the request expires and you must runvibe loginagain. -
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.
| Command | Flags and arguments | What it does |
|---|---|---|
vibe / vibe status | (none) | Station status: projects docked, how many have uncommitted changes, active crew worktrees, saved favorites. |
vibe projects | --json | Docked 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-path | Resolves 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 go | Alias defined by shell integration. |
vibe fav list | (default subcommand) | Lists saved favorites. |
vibe fav add <name> [path] | path defaults to the current directory | Saves a favorite on the Gateway. |
vibe fav rm <name> | alias: remove | Deletes 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, --source | Renders 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/-y | Prepends curated tags to a filename. |
vibe tag <dir> --recurse[=N] | N is 1 to 3 (default 1), plus the flags above | Tags 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, --yes | Applies 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, --help | Pairs this CLI with a Station (see Quickstart). --name is the label shown on the approval screen (default Vibe CLI (<profile>)). |
vibe logout | --profile NAME | Revokes 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 | --offline | Checks 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 | --check | Checks npm for a newer @vibery/vibe-cli and installs it with npm install --global, then verifies the new version. --check only reports. |
vibe --version | aliases: version, -v | Prints the installed version. |
vibe help | aliases: --help, -h | Prints help. vibe tag --help and vibe login --help have their own. |
Environment variables
| Variable | Used for |
|---|---|
VIBE_GATEWAY_URL | Gateway WebSocket URL. Wins over everything else. |
VIBERY_GATEWAY_URL | Fallback Gateway URL when VIBE_GATEWAY_URL is unset. |
VIBE_WEB_URL | Station web app URL used by vibe login for the approval page. --web-url overrides it. |
VIBE_TOKEN | A token to use directly. Set automatically in the hosted terminal. |
VIBE_TOKEN_FILE | Path to a file holding a token (dev and local setups). |
VIBE_PROFILE | Paired profile to use when no --profile is given (default default). |
VIBE_DATA_ROOT | Local path of the Gateway data directory. First in the data-root order. |
VIBERY_DATA_ROOT | Second in the data-root order. |
VIBE_SHELL_INTEGRATION | Set to 1 by the shell wrapper. vibe doctor reads it; you do not set it yourself. |
VIBE_UPDATE_REGISTRY | npm registry vibe update checks (default https://registry.npmjs.org). |
VIBE_UPDATE_NPM | npm executable vibe update runs (default npm). |
VIBE_UPDATE_BINARY | Executable vibe update runs afterwards to verify the version (default vibe). |
VIBE_UPDATE_ALLOW_ANY_INSTALL | Set to 1 to let vibe update run when the CLI was not installed by npm. |
NO_COLOR | Disables 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
| Path | Contents |
|---|---|
~/.vibery/vibe/clients/<profile>.json | Paired client profile, including its token. Directory mode 0700, file mode 0600. Removed by vibe logout. |
<data root>/gateway.json | Endpoints 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.md | Source for vibe brief. |
~/.vibery/tags/log.jsonl | Local tag log used by vibe tag undo. |
~/.vibery/tags/vocabulary.json | Your 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):
$VIBE_DATA_ROOT$VIBERY_DATA_ROOT/data(inside the backend container)%APPDATA%\vibery\data(Windows desktop installs)~/.vibery/data(macOS and Linux desktop installs, andvibe 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:
vibeis preinstalled andVIBE_GATEWAY_URLandVIBE_TOKENare 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