Every project keeps its own unmodified PostgreSQL 18 instance. Durability moves from a per-VM disk to a shared, batched commit path on object storage (S3), so instances become disposable and many of them can share a handful of hosts.
Left: starting assumptions (all editable). Right: resources used by a one-VM-per-project fleet versus ScaleGres shared cells for the same projects and the same workload. Changes are also encoded in the page address, so a configured scenario can be shared as a link.
| Resource | One VM per project (today) | ScaleGres shared cells | Difference |
|---|
ScaleGres turns PostgreSQL into a compute layer on top of object storage. A project is a normal PostgreSQL instance (a cell) whose write-ahead log (WAL) is made durable in S3 instead of on a local disk. Because everything that must survive lives in S3, a cell can be stopped, moved or recreated on any host in seconds, and idle projects need no running compute at all.
A complete PostgreSQL 18 server for one project: its own postmaster, shared buffers, extensions and data directory. Only the point where WAL becomes durable is redirected to the durability path.
Receives WAL ranges from many cells and writes them as one immutable, checksummed object per short time window. The commit of every tenant in the window is acknowledged by that single shared PUT.
S3 holds the shared WAL batches and periodic base generations (content-addressed chunks, so unchanged data is stored once). Together they are enough to rebuild any cell.
Batching is what makes object storage practical for commits: with many tenants sharing each window, a single PUT carries hundreds of commits, so the request rate to S3 stays small even when the number of projects is large.
The OS, kernel and reserved-but-unused memory of tens of thousands of VMs disappear; many cells share one host's memory and CPU.
Only projects that are active right now hold a cell. The rest cost storage in S3 and nothing else.
Data is paid for as stored in S3, not as provisioned per volume, and it is shared across restarts and hosts.
ScaleGres does not reimplement PostgreSQL and does not sit behind a protocol proxy that emulates it. The server is stock PostgreSQL 18, changed in a minimal way by a small patch; everything else is done outside the server.
xlog.c, xlog.h).XLogWrite() before the flush pointer advances.pgvector, with no changes and no per-extension adaptation, because the server’s extension interface is untouched.pg_dump/pg_restore, pg_basebackup and standbys all use the formats they already know.The defaults of the model above. They are estimates built from public information and general experience, not telemetry from any platform, and every one can be changed in the form.
| Assumption | Default | Basis |
|---|---|---|
| Fleet | 90,000 Free + 10,000 Pro | Round numbers for a large managed fleet. Pro projects are always running and never scale to zero. |
| Free VM today | 0.5 GB, 2 shared vCPU | Public plan description: Free has 500 MB RAM and shared CPU. |
| Free projects holding a VM today | 30% | Free projects are paused after 7 days of inactivity (public), so many idle projects still hold a VM. |
| Pro VM size mix | 70% 1 GB, 20% 2 GB, 8% 4 GB, 2% 8 GB (average 1.58 GB) | Public default is the 1 GB "Micro" size; larger sizes are paid add-ons; the split is an estimate. |
| Provisioned volume today | 8 GB per project | Volume paid for even when the project is paused. |
| Free projects with a cell up at a given moment | 6% | Hobby and development databases are idle almost all the time; cells stop after a few idle minutes. |
| Memory per active Free cell | 0.30 GB | An idle PostgreSQL cell with small shared buffers measured around 70 MB before client sessions and page cache; plus a few backends and a small working set. |
| Average CPU per cell | 0.03 vCPU Free, 0.10 vCPU Pro | Typical low average utilisation with bursts. |
| Pro cell memory vs. its VM | 90% | VM and OS overhead and unused headroom disappear; the working set stays. |
| Host | 64 GB / 8 vCPU, 85% RAM, 60% CPU | Memory-optimised instance class; utilisation targets leave room for page cache and bursts. |
| Data per project | 50 MB Free, 3 GB Pro | Typical sizes; object-store amplification 2× (base generations and WAL). |
| Not modelled | – | Network, backups, read replicas, high-availability spares of shared services (the spare-hosts field adds a percentage for host failures). |
How hosts are computed: hosts needed = the larger of (RAM needed ÷ usable RAM per host) and (average CPU demand ÷ usable vCPU per host), then rounded up and increased by the spare percentage.