Reference
Limits
Per-plan and per-runtime caps. Where Enterprise raises caps and where it doesn't.
Defaults below apply to per-workspace scope unless stated. Enterprise plan negotiates higher caps where marked raisable.
| Limit | Free | Business | Enterprise | Raisable? |
|---|
| Apps per workspace | 100 | 500 | per contract | ✓ |
| Channels per app | 50 (incl. production) | 200 | per contract | ✓ |
| Deployments per app (retained) | last 5 per channel | last 20 per channel | per contract | ✓ |
| Workspace members | 3 | 25 | per contract | ✓ |
| Concurrent deploys per workspace | 5 | 25 | per contract | ✓ |
| Deploys per workspace per minute | 30 | 60 | per contract | ✓ |
| Limit | Default cap | Raisable? |
|---|
| Total archive size (compressed) | 200 MB | ✓ (Enterprise) |
| Per-file size | 50 MB | ✓ (Enterprise) |
| Entry count | 50 000 | ✓ (Enterprise) |
| Symlinks | rejected (security) | ✗ |
Absolute paths / .. traversal | rejected (security) | ✗ |
Empty archive (no index.html) | rejected | ✗ |
Hitting the entry-count cap is almost always a node_modules leak. Check what you're shipping with vibehost deploy --dry-run --json | jq '.data.fileCount'.
| Limit | Default | Raisable? |
|---|
| Hostnames per app | 25 | ✓ |
| Hostnames per workspace | 250 | ✓ |
vibehost domain verify retries / min | 30 | ✓ |
| DNS verify timeout | 3 s × 3 retries | ✗ |
| Cert provisioning timeout | 5 min | ✗ |
| Subdomain takeover protection | always on | ✗ |
| Limit | Default | Raisable? |
|---|
| Platform redirects per app | 500 | ✓ |
_redirects file rules | unlimited (subject to tarball cap) | n/a |
| Limit | Default | Notes |
|---|
| Active PATs per user per workspace | 20 | Returns PAT_CAP_REACHED (409) |
| Max scopes per PAT | unlimited | But least-privilege is the recommendation |
| Resource binding (apps allowlist) | unlimited per PAT | |
| PAT expiry options | 30 / 60 / 90 / 365 days / never | Set at issuance |
| Plaintext shown after issuance | once, never again | Server stores sha256(plaintext) only |
| Limit | Cap | Notes |
|---|
| Anonymous reads to public deploys | unmetered | |
| Authenticated API calls per token per minute | 600 | Returns RATE_LIMITED (429); see headers for Retry-After |
| Failed auth attempts per IP per minute | 30 | After threshold, IP is blocked for 5 min |
vibehost workspace invite per workspace per day | 50 | Anti-abuse |
vibehost app share-link create per app per hour | 60 | Anti-abuse |
| Resource | Free | Business | Enterprise |
|---|
| Storage for live deployments | unmetered (within app count) | unmetered | per contract |
| Egress bandwidth | unmetered for *.vibehost.space; custom-domain bandwidth via your DNS provider | unmetered | per contract |
| Log retention | 7 days | 30 days | per contract |
| Audit log retention | workspace-lifetime | workspace-lifetime | workspace-lifetime |
vibehost deploy --build server runs your build inside a sandboxed server-side builder for agents that can't build locally. Defaults:
| Constraint | Cap |
|---|
| Build wall time | 10 min |
| RAM | 4 GB |
| Disk | 10 GB |
| Network egress | npm + GitHub allowlist |
npm install parallel jobs | 4 |
For most cases (--build client, the default), these don't apply — your machine builds.
- Deploys per app is uncapped beyond the rate-limit. Iterating fast is fine.
- Channels are slot-based, not lifetime-based. Delete unused channels to free slots.
- Apps don't expire on free tier. Replit-style "Always-on" doesn't apply — your app stays live as long as your workspace exists.
- Per-app users don't have to be in your workspace. Email grants work on outside emails (invite-before-signup).
| Error code | What to do |
|---|
RATE_LIMITED | Wait the Retry-After window; check vibehost doctor for unusual CLI loops |
QUOTA_EXCEEDED | Upgrade plan, or delete unused apps / channels |
PLAN_LIMIT_EXCEEDED | Specific feature requires paid tier |
PAT_CAP_REACHED | Revoke old PATs at vibehost.com/account/tokens |
TARBALL_INVALID (count exceeded) | node_modules likely leaked into the build — exclude it |
See errors reference for the full code list.