VibeHost
Guides

Static sites

Any directory with index.html is deployable. The default and fastest path on VibeHost.

Static is the default runtime on VibeHost. If you have an index.html somewhere in a directory tree, you can deploy it — no build step required, no framework lock-in.

The simplest possible deploy

mkdir hello && cd hello
echo '<h1>Hello, vibe coding</h1>' > index.html
vibehost app create hello --json
vibehost link --app hello
vibehost deploy

That's the entire flow. Output:

{
  "ok": true,
  "data": {
    "url": "https://hello.vibehost.space",
    "immutableUrl": "https://<deploy-id>.vibehost.space",
    "deployKind": "static"
  }
}

How static works

  • Your dir is tarballed, validated (no .. traversal, no symlinks, size caps), and uploaded as content-addressed chunks.
  • Repeat deploys skip blobs the server already has — only changed files transfer.
  • Assets land in Cloudflare R2; the dispatcher Worker serves them directly. Routable in ~5 seconds from deploy. Zero cold start because there's no app-specific Worker for pure static.

Frameworks that "just work"

Anything that emits a static dir:

npm run build              # emits dist/
vibehost deploy ./dist
npm run build              # emits dist/
vibehost deploy ./dist
export default { output: 'export' };
npm run build              # emits out/
vibehost deploy ./out

See Next.js guide for the dynamic-server path.

vibehost deploy ./public
# whatever your build emits — site/ or dist/ or build/
vibehost deploy ./site

What makes the cut

The tarball must contain at least one index.html somewhere. The CLI auto-detects the document root.

Limits per archive (raise via Enterprise plan):

ConstraintDefault cap
Total archive size200 MB compressed
Per-file size50 MB
Entry count50,000
SymlinksRejected (security)
Absolute paths / ..Rejected (security)

SPA routing (history mode)

Single-page apps need a fallback so deep links don't 404:

vibehost deploy ./dist --spa

This adds a /* → /index.html rewrite. Without it, /dashboard returns 404 because no file at that path exists.

What you can't do (yet)

  • No server-side logic — no edge functions, no middleware, no API routes. For dynamic backends, use Next.js instead.
  • No private static apps via build — visibility is set per-app (public / workspace / private). Private static apps are gated by the dispatcher, not by the build.

Custom domains

vibehost domain add www.example.com --app hello

Then add the printed CNAME record at your DNS provider. See Custom domains for full DNS setup, including Cloudflare-proxied domains.

On this page