CLI reference
Every vibehost command. All accept --json for machine-readable output.
The CLI is the canonical interface for VibeHost. The dashboard, MCP server, and SDKs are conveniences over the same REST API the CLI uses. Anything you can do here, an agent can do too — and vice versa.
Install
curl -fsSL https://vibehost.com/install.sh | shiwr -useb https://vibehost.com/install.ps1 | iexInstalls a single static binary to ~/.vibehost/bin/. No Node runtime needed.
Config lives at ~/.config/vibehost/config.json (chmod 600). Multi-instance support via vibehost init <url>. The CLI never logs plaintext tokens; only sha256(plaintext) is sent on token issuance APIs.
Upgrade:
vibehost updateSelf-replaces the binary; CI should pin a version by re-downloading the install script with a version param (https://vibehost.com/install.sh accepts a VIBEHOST_VERSION env var — e.g. curl -fsSL https://vibehost.com/install.sh | VIBEHOST_VERSION=<version> sh).
JSON output and exit codes
Every command takes --json. Success returns {ok: true, data}, error returns {ok: false, error: {code, message, details?}}. Exit codes:
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Unknown error (bug, panic) |
| 2 | Auth (login required, EMAIL_NOT_VERIFIED, REAUTH_REQUIRED) |
| 3 | Validation (bad input, missing field, malformed cursor) |
| 4 | Upstream (API returned 5xx, runtime down, SERVICE_UNAVAILABLE, RELEASE_GONE) |
| 5 | Network (DNS, timeout, cert) |
| 6 | Rate-limited (RATE_LIMITED) — back off and retry |
LLM clients should branch on error.code (stable SCREAMING_SNAKE_CASE), not error.message. See Errors reference for the full list.
Global flags
Any command accepts:
| Flag | Effect |
|---|---|
--json | Emit JSON on stdout/stderr (scriptable) |
--workspace <slug> | One-off workspace override; doesn't persist |
--team <slug> | One-off team override |
--help / -h | Show command help |
--version / -V | Print CLI version |
Env vars:
| Var | Effect |
|---|---|
VIBEHOST_TOKEN | PAT for auth (overrides vibehost login) |
VIBEHOST_API_URL | Base URL (default https://api.vibehost.com) |
VIBEHOST_TELEMETRY | on / off for one-off telemetry override |
NO_COLOR | Disable ANSI colors |
Auth
Sign in, register, and manage your CLI session. vibehost login runs a device flow (supports Google); pass --email and --password to skip it in CI.
vibehost init https://api.vibehost.com
vibehost register --email you@x.com --password <pw>
vibehost login
vibehost login --email you@... --password <pw>
vibehost whoami
vibehost auth resend-verification
vibehost auth change-password
vibehost logoutvibehost init sets the API base URL for multi-instance setups. vibehost whoami returns identity, workspace, team, and abilities. vibehost auth change-password requires re-auth within 5 minutes; vibehost logout revokes this CLI's token and clears local config.
Example whoami --json:
{
"ok": true,
"data": {
"userId": "usr_...",
"email": "you@example.com",
"workspaceId": "ws_...",
"workspaceSlug": "acme",
"teamId": "tm_...",
"teamSlug": "web",
"abilities": ["apps:read", "apps:write", "apps:deploy", "..."]
}
}Apps
Create, inspect, and manage apps. New apps default to the static runtime; app list is aliased ls, and visibility is one of public | workspace | private.
vibehost app create my-site
vibehost app create my-site --display-name "Acme Marketing Site" --description "Landing pages for the spring campaign"
vibehost app list
vibehost app inspect my-site
vibehost app update my-site --display-name "Acme Site v2"
vibehost app update my-site --description "Refreshed spring campaign pages"
vibehost app update my-site --clear-display-name
vibehost app update my-site --clear-description
vibehost app delete --app my-site
vibehost app delete my-site --force
vibehost app visibility my-site public
vibehost app qr --app my-site
vibehost app qr https://example.com --png ./qr.pngapp create optionally takes --display-name (1–100 chars) and --description (1–500 chars) — mutable, non-unique display metadata shown in the dashboard, which falls back to the name when unset. The name itself is the immutable unique slug used in URLs. app update edits the metadata later: --display-name / --description set a new value, --clear-display-name / --clear-description reset to unset. When an app is created without a display name, the CLI prints a one-line stderr tip suggesting the flags.
app delete prompts interactively; pass --force for CI / non-TTY. app qr renders a terminal QR of the deployed URL, or any URL you pass, optionally to a PNG with --png.
app inspect is the agent-facing canonical readout — one call, full state. Use it before any non-trivial decision.
vibehost app inspect my-site --json | jq '.data | {visibility, passwordSet, channels: [.channels[].name], grants: [.teamGrants[].role]}'Link + deploy
link saves an app reference to .vibehost/project.json in the current dir. After linking, --app is optional.
vibehost link --app my-site
vibehost unlink
vibehost deploy
vibehost deploy ./public
vibehost deploy --channel pr-42
vibehost deploy --no-chunked
vibehost deploy --build server
vibehost deploy --runtime staticdeploy packs the cwd (or an explicit dir), uploads chunked by default (--no-chunked for a raw tar), and auto-detects the runtime (--runtime to override). --channel targets a preview channel; --build server opts into the sandboxed builder.
Deploy response (truncated):
{
"ok": true,
"data": {
"id": "depl_abc123",
"url": "https://my-site.vibehost.space",
"immutableUrl": "https://depl_abc123.vibehost.space",
"deployKind": "static",
"status": "healthy",
"warnings": []
}
}--build server runs the build inside a sandboxed builder for
machines that can't build locally (constrained agents, e.g. some MCP
hosts). Default is --build client — your machine builds, the server
only accepts the artifact.
Channels, promote, rollback
promote launches an already-uploaded deployment into a channel; rollback flips the channel alias back to the previous healthy deployment (production by default).
vibehost channel list --app my-site
vibehost channel delete pr-42 --app my-site
vibehost channel delete pr-42 --app my-site --force
vibehost promote <deploymentId> --to-channel production --app my-site
vibehost rollback --app my-site
vibehost rollback --app my-site --channel pr-42channel list shows all channels plus the current deployment id. channel delete removes a channel and its deployment alias (--force skips the prompt).
Pull (remix a teammate's deploy)
Download a live static artifact to edit and redeploy. vibehost pull my-site writes to ./my-site/, ready to edit and redeploy.
vibehost pull my-site
vibehost pull my-site --channel pr-42
vibehost pull my-site --deployment depl_xyzpull makes deployments source-of-truth: a teammate with grant downloads a static deploy, edits, redeploys. No separate repo needed. Static apps only.
Logs
Tail deployment logs. Defaults to the latest deployment's last 100 lines; --since windows the range and --follow streams new lines.
vibehost logs --app my-app
vibehost logs my-app
vibehost logs --app my-app --deployment <id>
vibehost logs --app my-app --since 10m
vibehost logs --app my-app --since 1h --follow
vibehost logs --app my-app --jsonLogs are bound to deployments, not channels — when you rollback, you read logs from the now-current (older) deployment. --json emits one JSON object per line.
Custom domains
Attach and verify custom hostnames. domain add prints DNS instructions; run domain verify after you've set the records.
vibehost domain list --app my-site
vibehost domain add blog.example.com --app my-site
vibehost domain verify blog.example.com --app my-site
vibehost domain remove blog.example.com --app my-site
vibehost domain show blog.example.comdomain show reports the status of any hostname. See Custom domains for DNS provider walkthroughs and verification failure modes.
Environment variables
Set build and runtime env vars. set targets both by default; narrow with --target runtime or --target build. --secret masks the value in env ls unless you pass --reveal.
vibehost env set KEY=value --app my-app
vibehost env set KEY=value --app my-app --target runtime
vibehost env set KEY=value --app my-app --target build
vibehost env set KEY=value --app my-app --secret
vibehost env ls --app my-app
vibehost env ls --app my-app --reveal
vibehost env rm KEY --app my-app--target build is rare (the CLI builds locally). --secret masks the value in env ls output for casual inspection; the actual value is encrypted at rest (column-level encryption with workspace-scoped keys).
Redirects
Platform-level redirects, applied without a rebuild. The default status is 301 (--status to override); upload and sync apply rules in bulk.
vibehost redirects list --app my-site
vibehost redirects add /old-path /new-path --app my-site
vibehost redirects add /old-path /new-path --app my-site --status 302
vibehost redirects remove <ruleId> --app my-site
vibehost redirects upload ./redirects.json --app my-site
vibehost redirects sync --app my-siteredirects sync diffs the local file against the live rules and applies the delta. Static apps can also ship a _redirects file in the deploy dir (Netlify syntax); platform redirects override _redirects if there's a conflict.
Grants, visibility, password, share links
App access lives under vibehost app …. Two grant axes (team + email), plus visibility (public / workspace / private), plus optional password gate, plus optional share-link cookies. All compose AND-style: every active gate must pass (share-link cookies are the documented bypass).
Team + email grants
grants ls shows both axes; grants self grants your own user (audited).
vibehost app grants ls --app my-site
vibehost app grants add-team <team-slug> deployer --app my-site
vibehost app grants remove-team <team-slug> --app my-site
vibehost app grants add-email teammate@x.com viewer --app my-site
vibehost app grants remove-email teammate@x.com --app my-site
vibehost app grants self admin --app my-siteVisibility
Both forms work — the variadic positional accepts either order. Visibility is one of public | workspace | private.
vibehost app visibility my-site public
vibehost app visibility public --app my-sitePassword gate
vibehost app password set <password> --app my-site
vibehost app password clear --app my-site
vibehost app password status --app my-siteShare links
vibehost app share-link create --app my-site --label "Acme review" --expires 7d
vibehost app share-link ls --app my-site
vibehost app share-link revoke <idOrPrefix> --app my-siteshare-link revoke accepts an id or a unique prefix. See Grants and visibility for the decision tree and access matrix.
OG card (link previews)
Customize the link-preview card. Free tier carries a powered by VibeHost watermark; turning it off with --off requires a paid plan.
vibehost app og --app my-site
vibehost app og set --title "..." --description "..." --app my-site
vibehost app og set --image https://... --app my-site
vibehost app og watermark --off --app my-siteOG screenshots are auto-generated by the previewer worker after each deploy.
Workspace + team
Workspace
workspace role takes owner | admin | member. workspace delete is owner-only and refuses if apps still exist.
vibehost workspace ls
vibehost workspace use <slug>
vibehost workspace info
vibehost workspace create <slug>
vibehost workspace members
vibehost workspace role <email> <role>
vibehost workspace invite <email> --role admin
vibehost workspace uninvite <id>
vibehost workspace remove <email>
vibehost workspace delete <slug> --force
vibehost workspace domain ls
vibehost workspace domain add yourcompany.com --tier verifiedTeam
Team roles are member | manager. rename-slug changes the URL-visible slug.
vibehost team ls
vibehost team switch <slug>
vibehost team info
vibehost team create <slug>
vibehost team invite <email> --role member
vibehost team members
vibehost team role <email> <role>
vibehost team remove <email>
vibehost team delete <slug> --force
vibehost team rename-slug <new-slug>Audit
Read the workspace audit log (owner / admin only). Defaults to the latest 100 rows; filter by --since, --actor, --target, or --action.
vibehost audit
vibehost audit --since 7d
vibehost audit --since 7d --json
vibehost audit --actor teammate@x.com
vibehost audit --target app:my-site
vibehost audit --action grant_addedRecords: actor, action, target, before/after diff, timestamp. No deletion — retention is workspace-lifetime. --json feeds an external SIEM.
GC (clean up old deployments)
Delete old deployments (owner / admin only). Keeps the last 5 per channel by default; --keep changes retention and --dry-run previews without deleting.
vibehost gc --app my-app
vibehost gc --app my-app --keep 10
vibehost gc --app my-app --dry-runThe kept deployments' immutableUrls stay live; older ones are deleted and their storage freed.
Doctor + telemetry + referral + redeem
Diagnostics and account utilities. Run vibehost doctor first when something's off; vibehost redeem <code> exchanges a code for N months of Business.
vibehost doctor
vibehost doctor --json
vibehost telemetry
vibehost telemetry on
vibehost telemetry off
vibehost referral
vibehost referral claim
vibehost redeem <code>doctor reports auth state, API reachability, version skew, common config gotchas, DNS resolution, and system time skew. vibehost referral shows your referral link and stats; referral claim claims a credit you've earned.
Full command list
Run vibehost --help or any vibehost <cmd> --help for the authoritative list. Every command supports --json, --help, and --workspace <slug>.
See also
- Errors reference — every error code, what triggers it, how to handle
- Personal access tokens — auth for CI; drive the same surface over HTTP