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 deployThat'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 ./distnpm run build # emits dist/
vibehost deploy ./distexport default { output: 'export' };npm run build # emits out/
vibehost deploy ./outSee Next.js guide for the dynamic-server path.
vibehost deploy ./public# whatever your build emits — site/ or dist/ or build/
vibehost deploy ./siteWhat 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):
| Constraint | Default cap |
|---|---|
| Total archive size | 200 MB compressed |
| Per-file size | 50 MB |
| Entry count | 50,000 |
| Symlinks | Rejected (security) |
Absolute paths / .. | Rejected (security) |
SPA routing (history mode)
Single-page apps need a fallback so deep links don't 404:
vibehost deploy ./dist --spaThis 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 helloThen add the printed CNAME record at your DNS provider. See Custom domains for full DNS setup, including Cloudflare-proxied domains.