VibeHost
Guides

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 | sh
iwr -useb https://vibehost.com/install.ps1 | iex

Installs 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 update

Self-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:

CodeMeaning
0Success
1Unknown error (bug, panic)
2Auth (login required, EMAIL_NOT_VERIFIED, REAUTH_REQUIRED)
3Validation (bad input, missing field, malformed cursor)
4Upstream (API returned 5xx, runtime down, SERVICE_UNAVAILABLE, RELEASE_GONE)
5Network (DNS, timeout, cert)
6Rate-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:

FlagEffect
--jsonEmit JSON on stdout/stderr (scriptable)
--workspace <slug>One-off workspace override; doesn't persist
--team <slug>One-off team override
--help / -hShow command help
--version / -VPrint CLI version

Env vars:

VarEffect
VIBEHOST_TOKENPAT for auth (overrides vibehost login)
VIBEHOST_API_URLBase URL (default https://api.vibehost.com)
VIBEHOST_TELEMETRYon / off for one-off telemetry override
NO_COLORDisable 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 logout

vibehost 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.png

app 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 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 static

deploy 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-42

channel 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_xyz

pull 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 --json

Logs 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.com

domain 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-site

redirects 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.

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-site

Visibility

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-site

Password gate

vibehost app password set <password> --app my-site
vibehost app password clear --app my-site
vibehost app password status --app my-site
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-site

share-link revoke accepts an id or a unique prefix. See Grants and visibility for the decision tree and access matrix.

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-site

OG 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 verified

Team

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_added

Records: 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-run

The 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

On this page