About vibehost-deploy
vibehost-deploy is a skill for publishing static sites and Next.js apps to VibeHost, using its CLI or MCP tools. It guides deployment from setup and authentication through health checks, and calls out the live and immutable URLs to report.
Key features
- 01Deploys static sites and Next.js apps
- 02Installs and authenticates the VibeHost CLI
- 03Supports CLI and MCP deployment paths
- 04Checks deployment status until healthy
- 05Returns alias and immutable URLs
Use cases
- 01Publishing a static build for a preview
- 02Deploying a Next.js app to VibeHost
- 03Deploying without shell access through MCP
- 04Sharing a pinned build URL for review
MCP support
When shell access is unavailable, the skill uses the MCP server at https://api.vibehost.com/mcp. It guides calls to discover apps, upload missing blobs, deploy, and poll deployment status.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ gntc-labs/ skills --skill vibehost-deployAfter installing, type/vibehost-deployin Claude Code to confirm it loaded.
Details
From the project READMEDeploy to VibeHost
Take a built static site or Next.js app and put it live on VibeHost at a private URL in seconds.
When this skill applies
The user says something like:
- "ship this", "deploy this", "put this live", "host this", "publish this"
- "get me a preview URL for this build"
- "send this to staging / a demo link"
Or you've just produced a static build output (dist/, out/, build/) or a Next.js build, and the natural next step is hosting it.
If the user has no VibeHost account yet, point them at https://vibehost.com/signup — deploying requires an authenticated session.
Setup
Install the CLI by downloading the installer, reviewing it, then running it — don't pipe it straight into a shell:
# macOS / Linux; installs one static binary, user-level only (no sudo)
curl -fsSL -o vibehost-install.sh https://vibehost.com/install.sh
cat vibehost-install.sh # review it first: the script verifies the CLI binary's
# SHA256 against the release manifest before installing
sh vibehost-install.sh && rm vibehost-install.sh
vibehost login # device-flow browser login; or VIBEHOST_TOKEN env var for headless/CI
vibehost whoami # confirm session + which workspace is active
The installer writes only to ~/.vibehost/ and a bin shim in ~/.local/bin — no shell-profile edits, no root. It sends an anonymous install beacon (platform, shell version, success/fail); opt out with VIBEHOST_NO_TELEMETRY=1.
Auth can come from any of: a prior vibehost login (token in ~/.config/vibehost/config.json), a VIBEHOST_TOKEN PAT in the environment (headless/CI), or an MCP OAuth session on https://api.vibehost.com/mcp. Most commands accept --json for scriptable output — prefer it when parsing.
What VibeHost can host
- Static sites (default runtime) — any directory with an
index.htmlat its root (dist/,out/,build/, or plain HTML). - Next.js apps (private beta) — opt in with
--runtime nextjs. App Router, SSR, ISR, server actions, and image optimisation are supported; prerender-only builds are auto-served via the static fast-path (no container). Apps that need a database can use the managed Postgres (vibehost db, Neon serverless) instead of an external DB. Ifapp create --runtime nextjsreturnsNEXTJS_RUNTIME_GATED, the runtime is currently unavailable to this user/workspace (access can depend on platform, workspace, and user gates) — fall back to a static export (output: 'export'+ deploy./out) or request access from the workspace owner.
Recommended path: the CLI
The vibehost CLI bundles app-creation, file hashing, blob upload, and the deploy into one command with progress output. Prefer it whenever you can run shell commands.
vibehost app create my-app # once per app; name: lowercase, 2–40 chars, [a-z][a-z0-9-]*
vibehost deploy ./dist --app my-app --json # every time
# Next.js app instead of a static build (private beta — see above; server build by default):
vibehost app create my-app --runtime nextjs --json
vibehost deploy . --app my-app --json # sandboxed server build; no local next build required
# Or explicitly build on the user's machine:
vibehost deploy . --app my-app --build client --json
The --json output is { ok: true, data: { url, immutableUrl, ... } }. The command exits 0 only after the deployment is healthy, so a successful exit means the URL is live.
Tip: vibehost link --app my-app inside the project writes .vibehost/project.json, after which plain vibehost deploy works with no flags.
Without a shell: the MCP server
If you can't run a shell but have an MCP connection to https://api.vibehost.com/mcp, the deploy is a sequence of tool calls. Read each tool's own description for the authoritative parameter schema — the names and order are below, but don't hardcode argument shapes from this doc.
list_apps— find existing apps in the workspace.create_app— only if the target doesn't exist ({ name, workspaceId }).check_blobs_missing— pass the file SHA-256s; learn which the server still needs.request_upload— mint pre-signed PUT URLs for the missing SHAs, then PUT the raw bytes to each (Content-Type: application/octet-stream) via plain HTTP.deploy—{ appId, channel?, manifest[] }. Returns{ deploymentId, status: "starting" }immediately — the site is not live yet.get_deployment— poll withdeploymentIduntilstatusishealthy(live),failed(read the error), orsuperseded.
What to give the user
Always surface both URLs from the result:
- alias URL (
url) — tracks the latest deploy on this channel. Share this with people. - immutable URL (
immutableUrl) — pinned to this exact build. Use for bug reports, review links, archived demos.
Pitfalls
- No
index.htmlat the root — static deploys need one. For client-side-routed SPAs (React Router, Vue Router, Remix SPA mode), the edge has to serveindex.htmlon path misses; see https://docs.vibehost.com/guides/static-sites. Do not add a_redirectsfile — VibeHost doesn't parse it (that's a Netlify/Pages convention). - Tarball rejected — oversized or malformed builds raise
TARBALL_INVALID;error.detailssays why. Trim large assets (videos, prod source maps, straynode_modules) or upgrade the plan. - Wrong workspace — a token scoped to workspace A deploying to an app in workspace B returns
TOKEN_WORKSPACE_MISMATCH. Surface it; don't silently retry elsewhere. - Discover ids, don't guess —
appIdandworkspaceIdcome fromlist_apps/vibehost whoami(orlist_workspaces). Hardcoding a stale id fails; resolve it live each time. - Read MCP tool schemas first — when using the MCP path, the parameter shapes vary by tool and evolve over time. Read each tool's own
descriptionbefore calling it; don't assume argument shapes from this doc. - Branch on
error.code, noterror.message— codes are stableSCREAMING_SNAKE_CASE; messages can reword. - Raw blob upload blocked by the edge WAF — the CLI keeps
UPSTREAM_FAILEDbut addsdetails.kind = "blob_upload_blocked", the file path, and a--no-chunkedhint. Retry withvibehost deploy --no-chunked; the gzip tarball path avoids content inspection of raw file bytes.
Reference
- Deploy guide: https://docs.vibehost.com/guides/quickstart
- CLI reference: https://docs.vibehost.com/guides/cli
- MCP server: https://docs.vibehost.com/guides/mcp
- Error codes: https://docs.vibehost.com/reference/errors