Reads from next door. Writes that outlive a region.
Strata keeps a copy of your data in six regions. Every user reads from the nearest one, and every write is logged in three regions before Strata says yes. Lose a region, and no write goes with it.
- Regions
- 6Full copy in each
- Commit
- 3 of 6Regions per write
- Failover
- 1.8 sMedian, no writes lost
- Request
- Replicate
- Acknowledge
- Commit
- Client city
- Region down
All six regions up. Writes commit in three.
- Commits
- 0
- Writes lost
- 0
- Failover
- —
All six regions up. Writes commit in three.
- Sheet
- A-01
- Title
- System overview
- Rev
- D
- Scale
- NTS
- Date
- 2026-10-30
Pick a city. See what its users wait for.
Twelve cities where Pinecart has shoppers, against the same app on one Postgres region in Virginia. Reads get faster wherever Strata has a closer copy. Writes pay one hop between regions, so cities next to Virginia write a little slower. That hop is what keeps a write alive when a region is not.
- Read p50
- Single region · Virginia231 msStrata · SIN15 ms
- −216 ms15× faster
- Read p99
- Single region · Virginia349 msStrata · SIN30 ms
- −319 ms12× faster
- Write p50
- Single region · Virginia693 msStrata · SIN205 ms
- −488 ms3.4× faster
- Write p99
- Single region · Virginia952 msStrata · SIN294 ms
- −658 ms3.2× faster
- Read: one-row SELECT by primary key.
- Write: add-to-cart transaction (SELECT … FOR UPDATE, UPDATE, COMMIT), serializable.
- Sample data: 10,000 requests per city from a client in a nearby data center, October 2026.
- Sheet
- A-02
- Title
- Latency by city
- Rev
- C
- Scale
- 1:1
- Date
- 2026-10-21
Four layers, each with one job.
Strata runs as one binary per node. A query travels down through four layers and the answer comes back up the same way.
- 1SQL layer· PG wire v3
- 2Planner· Cost + RTT
- 3Replication log· 3 of 6 to commit
- 4Storage· LSM · NVMe
- 1
SQL layerPG wire v3
Speaks the Postgres wire protocol and parses queries the way Postgres 16 does, so drivers, ORMs and psql work unchanged.
- 2
PlannerCost + RTT
Cost-based and aware of geography. It knows where every copy lives and how fresh it is, and sends each read to the nearest copy that can answer.
- 3
Replication log3 of 6 to commit
One consensus log per range of rows. A write commits when three regions have it on disk. Leases need four, so a new leader always holds every committed write.
- 4
StorageLSM · NVMe
A log-structured merge tree on local NVMe in every region, with checksummed pages and continuous backup for 30 days of point-in-time recovery.
- How the log, leases and failover fit together
- Sheet
- A-03
- Title
- Engine, exploded view
- Rev
- B
- Scale
- 1:4
- Date
- 2026-09-18
From where your app sits, it is Postgres.
Strata speaks the Postgres wire protocol and the SQL your app already sends. Keep your driver, your ORM and your migrations. There are two new ideas, both optional: where a row lives, and how stale a read may be.
CREATE TABLE carts ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), shopper_id uuid NOT NULL, items jsonb NOT NULL DEFAULT '[]', updated_at timestamptz NOT NULL DEFAULT now()) WITH (strata.home = 'nearest');1SET strata.read_staleness = '2s';2SELECT items FROM carts WHERE shopper_id = $1;BEGIN;3UPDATE carts SET items = items || $2, updated_at = now() WHERE shopper_id = $1;COMMIT;4- 1
Line 06Rows live in the region nearest the shopper who writes them.
- 2
Line 08Reads may come from the local copy, at most 2 s old.
- 3
Line 11Serializable is the default and the only level.
- 4
Line 14Returns once three regions have logged the write.
import { createPool } from '@ironleaf/strata';const db = createPool({ url: process.env.STRATA_URL,1 readStaleness: '2s',2});export async function addToCart(shopperId: string, item: Item) { return db.transaction(async (tx) => {3 const cart = await tx.one( 'SELECT items FROM carts WHERE shopper_id = $1 FOR UPDATE', [shopperId], ); await tx.query('UPDATE carts SET items = $2 WHERE shopper_id = $1', [shopperId, [...cart.items, item]]); });4}- 1
Line 04One URL. The client connects to the nearest live region.
- 2
Line 05Applies to every read on this pool unless a query overrides it.
- 3
Line 09Conflicts are retried with backoff, up to five times.
- 4
Line 16Resolves after the commit quorum answers, never before.
From one Postgres to six regions, in four steps
Fig. 6 — Migration path- 1
Mirror
Point Strata at your Postgres. It copies a snapshot, then follows the write-ahead log through logical replication. Your app does not change.
Takes Hours
- 2
Shadow reads
Send a share of reads to Strata and compare every result with Postgres. Mismatches show up by query, with both rows side by side.
Takes Days
- 3
Cut over
Strata waits for the log to drain, takes the primary role and hands your app a new URL. Writes pause for seconds, not minutes.
Takes ≈ 20 s write pause
- 4
Add regions
Add regions one at a time. Each copies data in the background and starts serving local reads once it has caught up.
Takes Hours per region
$ strata migrate cutover --from pg-primary.pinecart.internal --to pinecart-prod
waiting for source to drain · 2,318 transactions left · eta 7 s
- Sheet
- A-04
- Title
- Developer experience
- Rev
- C
- Scale
- 1:1
- Date
- 2026-10-09
Pinecart moved checkout off a single region in six weeks.
Pinecart delivers groceries in 30 countries from one Postgres primary in Virginia. Shoppers in Jakarta waited more than a second for a cart to load, and an outage in Virginia in 2025 stopped checkout for 3 hours 40 minutes.
They mirrored to Strata in March, moved reads in April and cut over writes on a Sunday morning in May. Their first region-loss drill ran at lunchtime on a Tuesday.
“We took Frankfurt down in the middle of the Tuesday lunch rush. Carts kept loading. The only people who noticed were the ones watching the infra channel.”
- 1Cart load p99, Jakarta
- Before1,180 msAfter38 ms
- 2Checkout down when a region fails
- Before3 h 40 minAfter1.8 s
- 3Database pages to on-call, per quarter
- Before14After2
| Region | Quorum | Ranges led | Lag | Read p99 | Txn/s |
|---|---|---|---|---|---|
| ORE Oregon | VIR + SYD | 412 | 0.31 s | 6 ms | 3.1k |
| VIR Virginia | ORE + FRA | 1,288 | 0.29 s | 5 ms | 9.8k |
| SAO São Paulo | VIR + ORE | 603 | 0.42 s | 7 ms | 4.4k |
| FRA Frankfurt | VIR + ORE | 1,517 | 0.33 s | 6 ms | 11.2k |
| SIN Singapore | SYD + FRA | 1,904 | 0.38 s | 6 ms | 14.6k |
| SYD Sydney | SIN + ORE | 377 | 0.35 s | 5 ms | 2.7k |
Commits / s · 24 h
28.1k peak 18:00 UTC
Last drill
FRA down · Tue 12:41
failover 1.7 s · 0 writes lost
- Sheet
- A-05
- Title
- Case: Pinecart
- Rev
- A
- Scale
- 1:1
- Date
- 2026-08-27
What we promise, in writing.
| No. | Item | Specification | Notes | Ref. |
|---|---|---|---|---|
| 01 | Isolation | Serializable transactions | The default and the only level. Conflicting transactions are retried by the client library. | See sheet B-01 |
| 02 | Durability | Commit after 3 regions log the write | No acknowledged write is lost with up to two regions down. | See sheet B-02 |
| 03 | Availability | 99.995% target, per month | About 2 minutes 10 seconds a month. Service credits when we miss it. | See sheet B-04 |
| 04 | Region loss | Survives 2 of 6 regions down | Failover in 1.8 s at the median. At three down, writes pause by design and reads continue. | See sheet B-04 |
| 05 | Encryption | At rest and in transit | AES-256-GCM with per-region keys. TLS 1.3 between clients, nodes and regions. | — |
| 06 | Recovery | Point-in-time recovery, 30 days | Restore to any second into a new cluster while the live one keeps serving. | — |
| 07 | Compatibility | Postgres 16 wire protocol and SQL | pgcrypto, uuid-ossp and pg_trgm included. Custom C extensions are not supported. | — |
- Sheet
- A-06
- Title
- Specification
- Rev
- E
- Scale
- —
- Date
- 2026-10-30
Build the 1.0 with us.
We are taking twelve design partners for 2027: teams with users on more than one continent and a Postgres they have outgrown.
- 1A production cluster in the regions you need, free through 2027.
- 2A shared channel with the engineers who wrote the replication log.
- 3A seat at the monthly roadmap review, with a vote on what ships next.
- Sheet
- A-07
- Title
- Design partners
- Rev
- A
- Scale
- 1:1
- Date
- 2026-11-02