# Plans

> App and Postgres sizes — CPU and memory per plan

URL: https://pier.run/docs/plans

A plan is a target's size. Apps and Postgres instances each have their own table; a
plan change is applied by `pier set app api --plan app-m` (a roll) or `pier set pg main --plan pg-m` (a restart), or by editing `plan:` and applying.

## Apps

| Plan      | CPU | Memory |
| --------- | --- | ------ |
| `app-s`   | 0.5 | 512 MB |
| `app-m`   | 1   | 2 GB   |
| `app-l`   | 2   | 4 GB   |
| `app-xl`  | 4   | 8 GB   |
| `app-2xl` | 8   | 16 GB  |

Memory is 1 GB per CPU at `app-s` and 2 GB per CPU from `app-m` up. Replicas multiply
the plan: `app-s` × `replicas: 3` is three instances of 0.5 CPU / 512 MB.

## Postgres

| Plan     | CPU | Memory |
| -------- | --- | ------ |
| `pg-s`   | 0.5 | 1 GB   |
| `pg-m`   | 0.5 | 2 GB   |
| `pg-l`   | 1   | 4 GB   |
| `pg-xl`  | 2   | 8 GB   |
| `pg-2xl` | 4   | 16 GB  |

`pg-m` is a memory-only step over `pg-s` (same CPU, twice the cache) for read-heavy
small workloads; from `pg-l` up memory is 4 GB per CPU. Storage is not part of the plan:
it grows with the data, capped by `max_storage_gb` if set.

`pier pg plans` prints the Postgres table from the platform.

## Sites, buckets, volumes, domains

Sites, buckets and domains have no plan. Volumes are sized by `storage_gb`
([Volumes](/docs/resources/volumes)).

Prices are on [pier.run](/) and in `pier billing overview` for your workspace.
