Plans & limits
What each plan includes, the hard limits per service and workspace, and the platform limits that apply to everyone.
Plans#
| Free | Hobby | Pro | |
|---|---|---|---|
| Price | $0, no subscription | $5 / month | $20 / month |
| Usage included per period | — | $5 | $20 |
| Services per workspace | 1 app + 1 database | unlimited | unlimited |
| Memory limit per service | 512 MiB | 8 GiB | 32 GiB |
| CPU limit per service | 1 vCPU | 8 vCPU | 32 vCPU |
| Volume size | up to 1 GB | up to 100 GB | up to 250 GB |
| Egress included per period | 100 GB | 100 GB | 100 GB |
| App Sleeping | always on (static sites never sleep) | optional | optional |
| Free CPU quota per period | 50 vCPU·h unverified, 100 vCPU·h verified | — | — |
| PR preview environments | — | yes | yes |
| TCP proxies | — | yes | yes |
| Grace period at zero balance | none, pause immediately | 3 days | 3 days |
| API requests | 100 / hour | 1 000 / hour, 10 / s | 10 000 / hour, 50 / s |
| Members and roles, custom domains, templates, cron, private networking, backups | yes | yes | yes |
On Free, a database is a service from a database image in the template catalog (Postgres, MySQL, MariaDB, Redis, Valkey, MongoDB, ClickHouse and the rest of the Databases category); everything else — a repository, any other image — is the app. So one app with its Postgres, or a template such as n8n or Umami, fits the free tier. A database has no public domain, so it never sleeps.
New workspaces start on Free. Upgrades apply immediately with a prorated charge for the rest of the billing period; downgrades take effect at the end of the period without a refund and only when the workspace fits the smaller plan — see Billing → Changing plan.
Exceeding a plan limit returns PLAN_LIMIT (extensions.code) from serviceCreate, serviceInstanceUpdate, volumeCreate, tcpProxyCreate and templateDeployV2; the dashboard shows the same message. Resources above the plan are clamped when a deployment is rendered, so a scheduled downgrade does not break running services: it shrinks them on the next deploy.
Account verification (trust levels)#
What a workspace can do also depends on its trust level, independent of how you signed in. It is shown in Settings → General → Account verification.
| Unverified | Verified | Trusted | |
|---|---|---|---|
| How you get it | every new account | GitHub account older than 30 days with public activity (or older than 180 days), or a first top-up of $5 that stays on your balance | automatically after $20 in top-ups, 30 days of history and no abuse flags |
| Projects / services | 1 / 2 | plan limits | plan limits |
| Total CPU / memory across services | 1 vCPU / 1 GiB | plan limits | plan limits |
| Builds per hour | 5 | unlimited | unlimited |
| TCP proxies, cron | — | yes | yes |
| Free CPU quota per period | 50 vCPU·h | 100 vCPU·h | none |
| Outgoing SMTP (25/465/587) | blocked | blocked | allowed |
| Behavioural abuse detector | on (suspected abuse pauses the service) | on (flags for review) | off |
The Free CPU quota is real CPU time used by your services in the billing period; a static site uses almost none. When it is used up, services pause until the next period — upgrading to Hobby or a higher trust level resumes them. Exceeding a trust limit returns TRUST_LIMIT (extensions.code), the dashboard shows the same message. Disposable e-mail addresses do not count towards verification.
Usage rates (all plans)#
| Resource | Rate |
|---|---|
| Memory | $8 per GB-month (reserved limit, while running) |
| CPU | $15 per vCPU-month (reserved limit, while running) |
| Volumes | $0.12 per GB-month (provisioned) |
| Egress | $0.03 per GB beyond the 100 GB included per period |
Defaults and platform limits#
| Value | |
|---|---|
| Default service resources | 2 vCPU / 2 GiB (or the plan maximum if lower) |
| Guaranteed (reserved) resources per replica | min(limit, 0.25 vCPU / 256 MiB) |
| Concurrent builds per node | 2 |
| Startup grace before a deployment fails | 5 minutes |
| Rollout timeout | 10 minutes |
| Log buffer | last 5 000 lines per deployment |
| Metrics retention | 7 days |
| Replicas with a volume | 1 |
| TCP proxies per service and environment | 5 |
| TCP proxy port range | 20000–29999 |
| Shell sessions | 5 per user, 30 minutes idle |
| App Sleeping idle timeout | ~10 minutes |
| Volume backups | daily, 7 daily / 4 weekly / 3 monthly snapshots |
| Top-up | $5 minimum, $1 000 maximum; PayPal, card or crypto |
| Welcome credit | $5, personal workspaces only, once the account is verified |
| Low-balance warning | below $5 |
| Grace period at zero balance | 3 days on Hobby and Pro; none on Free |
| Auto top-up | not available yet (coming soon) |
| Outbound SMTP (port 25) | blocked |
| Regions | EU only (Hetzner: Helsinki, Falkenstein, Nuremberg); more regions later |
Fair use of CPU#
Services can use CPU up to their limit whenever the server has spare capacity. When a server is overloaded, CPU is shared by plan — Pro first, then Hobby, then Free — and a workspace that keeps most of the server busy for several minutes gets a temporary shared cap of half of the server's CPU. Nothing restarts: services keep running, heavy jobs just take longer, and the cap is lifted automatically once the load drops. You get a notification when it happens. A single service never gets more CPU than one server has, even if its plan allows more.
Need more than the Pro limits, a dedicated node or a different region? Write to support@skiffly.dev.