| Manifest version | 1 |
| Service name regex | ^[a-z][a-z0-9-]{0,30}$ |
| Public-port prefix regex | ^[a-z][a-z0-9-]{0,30}$ |
| Secret / variable name regex | ^[A-Z][A-Z0-9_]*$ |
| Public ports per service | 1 |
| Pod replicas per service | 1 |
| TTL clock starts | when status reaches healthy (build time doesn’t eat the window) |
| “Concurrent instance” unit | one live environment instance — a multi-repo environment is still 1, and each preview / dev / manual instance is +1. Always-on instances are drawn from this pool, not added to it. |
| PR preview lifetime | your plan’s preview cap |
| Manual / dev instance lifetime | your plan’s manual cap — deliberately much shorter than the preview cap |
| Primary (always-on) instance lifetime | none: it never sleeps and is never reaped |
| Public host shape | <env-name>-<service>-<id>.<apps-base> (<id> = 8 hex from the env-instance UUID) |
| Host stability | Stable across redeploys; an instance keeps its <id> for its lifetime |
| Invite expiry | 7 days |
| Storage overage hard ceiling | 4× the plan’s included storage (on plans that bill overage) |
| Log retention | 30 days |
| Usage metrics retention | 30 days (sampled every 30s — see Metrics) |
| Deployments list default page size | 15 |
| Repos list default page size | 24 |
| Max page size on any list | 100 |
| Request body cap (app traffic) | 10 MB (413 beyond it) |