Requires Enterprise plan. Currently available on AWS runners only. GCP support is coming soon.
When to use warm pools
Warm pools are most effective for:- Large or monorepo projects where EBS snapshot restoration adds noticeable startup latency. EC2 instances lazy-load data from the prebuild snapshot on first boot, and larger volumes take longer to fully hydrate. For these projects, warm pools can cut startup time from minutes to around 10 seconds.
- Smaller projects with many users where prebuilds already bring startup to 30-50 seconds. Warm pools can reduce this further to around 10 seconds. Whether the cost is justified depends on how many engineers use the project and how often they create new environments versus reusing existing ones.
- Latency-sensitive workflows where every second of startup time matters (e.g. PR review environments, demo environments).
How it works
- You enable a warm pool for a project and environment class, specifying a minimum and maximum pool size.
- The runner launches EC2 instances from the latest prebuild snapshot, scaling between the minimum and maximum pool size.
- The pool scales dynamically between your configured minimum and maximum based on demand (see Dynamic scaling).
- When a user creates an environment, Ona claims a warm instance from the pool instead of launching a new one. The pool immediately begins replenishing.
- When a new prebuild completes, the pool rotates instances to use the new snapshot.
Dynamic scaling
Warm pools scale automatically based on demand. The runner monitors how frequently instances are claimed and adjusts the number of running instances accordingly. It scales up when environments are being created (by engineers, automations, or agents) and scales back down when demand drops.- Scale-out happens when sustained demand exceeds what the current running instances can serve. Stopped instances are started to meet demand (see Stopped instances), so scaling out takes roughly 1–2 minutes rather than the 5+ minutes of a cold boot.
- Scale-in happens when demand drops. The pool waits for demand to stay low before removing instances, so brief idle periods don’t cause unnecessary churn.
- The pool never scales below
min-sizeor abovemax-size.
Stopped instances
In addition to running instances, the pool maintains stopped instances that are pre-provisioned but not actively running. These act as a buffer for fast scale-out: when demand increases, a stopped instance can be started in roughly 1–2 minutes instead of provisioning a new one from scratch (~5 minutes). The number of stopped instances equals the remaining capacity between the current number of running instances andmax-size. For example, with max-size = 5 and 3 running instances, there are 2 stopped instances ready to start.
Stopped instances save on cost because you only pay for their EBS storage, not compute. This means the pool can maintain headroom for burst demand without paying for idle running instances.
Stopped instances only help when the pool scales out (adding more running instances). They do not reduce startup time for the first environment when the pool is scaled to zero, because there are no running instances to claim. In that case, the first environment is a cold start.
Scale to zero
Settingmin-size to 0 allows the pool to scale down to zero running instances when there is no demand. This is useful for reducing costs during off-hours, weekends, or for projects with intermittent usage.
Tradeoffs:
| min-size = 0 | min-size ≥ 1 | |
|---|---|---|
| Off-hours cost | No running instances, no compute cost | At least one instance running 24/7 |
| First environment after idle | Cold start (similar to not having a warm pool) | Near-instant (~10 seconds) |
| Subsequent environments | Near-instant once the pool has scaled up | Near-instant |
Prerequisites
- Enterprise plan
- Prebuilds enabled for the project
- AWS runner with the latest infrastructure version. Upgrade your CloudFormation stack if you haven’t already.
- At least one successful prebuild for the environment class
- Project admin role on the project
Enable warm pools
Only project admins can configure warm pools.
Via the dashboard
- Navigate to your project settings
- In the Prebuilds section, find the environment class list
- Expand an environment class row. A Warm Pool toggle appears below each class that has prebuilds enabled
- Toggle Warm Pool on
- Set the Min Size and Max Size to define the scaling range
Via the CLI
--format json, --format yaml, and --format table output.
Pool lifecycle
Warm pools go through these phases:| Phase | Description |
|---|---|
| Pending | Pool created, waiting for a prebuild snapshot to be assigned |
| Ready | Instances are available for claiming (running count may vary based on current demand) |
| Degraded | The runner reported a problem (e.g. failed to launch instances). Check the failure message for details |
| Deleting | Pool is being deleted, instances are draining |
| Deleted | All instances terminated, cleanup complete |
Cost
Warm pool instances are regular EC2 instances in your AWS account. With dynamic scaling, you pay only for instances that are actually running. The pool scales down during low-demand periods. No Ona credits are consumed. You pay only for the AWS infrastructure. Running instances (actively serving or waiting to be claimed) are billed at standard EC2 on-demand rates. Stopped instances (pre-provisioned for fast scale-out) are not billed for compute. You pay only for their EBS volumes.Cost estimates
Costs depend on the environment class (instance type) and AWS region. Estimates below useus-east-1 on-demand pricing:
| Environment Class | Instance Type | Approx. cost per running instance/month |
|---|---|---|
| Small | m6i.large (2 vCPU, 8 GB) | ~$70 |
| Regular | m6i.xlarge (4 vCPU, 16 GB) | ~$140 |
| Large | m6i.2xlarge (8 vCPU, 32 GB) | ~$280 |
min-size = 0 and max-size = 3 using m6i.xlarge (Regular) instances might average 1 running instance during business hours and 0 outside of them. That costs roughly $70–100/month instead of $280/month for a fixed pool of 2.
EBS volume costs are additional but typically small relative to compute, roughly $0.08/GB/month for gp3 volumes.
Viewing warm pool costs in AWS
Filter AWS Cost Explorer by the taggitpod.dev/warm-pool to isolate warm pool instance costs from regular environment costs. See Costs & budgeting for general cost tracking.
Sizing guidance
| Team size | Recommended min | Recommended max | Rationale |
|---|---|---|---|
| 1-10 engineers | 0-1 | 2 | Low concurrency; scale-to-zero saves cost for small teams |
| 10-30 engineers | 1 | 3 | Keeps one instance always ready; scales for burst patterns |
| 30+ engineers | 1-2 | 3-5 | Higher baseline for peak-hour concurrency |
Viewing warm pool usage
You can view warm pools configured in your organization from the dashboard or CLI.Organization admins see all warm pools. Other members only see warm pools for projects they have access to.
Via the dashboard
Navigate to a runner’s details page and select the Warm Pools tab. This shows all warm pools on that runner, including the associated project, environment class, pool size, and current phase.Via the CLI
Monitoring
Warm pools expose Prometheus metrics through the runner’s metrics endpoint. Use these to track pool utilization, claim hit rate, and scaling behavior. See Custom metrics pipeline for setup instructions and the full list of available metrics. Key metrics to watch:warm_pool_claims_total: Track theinstance_not_foundresult to see how often users hit cold starts. If this happens frequently, increasemax-sizeormin-size(the pool may be scaling down too aggressively).warm_pool_claim_instance_age_seconds: Shows how long instances waited before being claimed. Very short ages may indicate the pool is undersized.warm_pool_instances_by_state: Compare running vs stopped instance counts to verify scaling behavior.
Limitations
- AWS only. GCP support is coming soon.
- No spot instances. Warm pools require on-demand environment classes. If you enable a warm pool on a spot environment class, the pool enters the Degraded phase. Use a non-spot class instead.