Neon made branching and scale-to-zero standard for Postgres, and the alternatives differ in where the database runs, what comes bundled with it and how it fits into deploys.
Neon popularized serverless Postgres, with storage separated from compute, branches that copy a database in seconds and compute that scales to zero after 5 minutes of inactivity. Databricks agreed to acquire Neon in May 2025, and Neon now presents its database as Lakebase Postgres alongside auth, functions and object storage.
Teams look at alternatives when they want the database in their own cloud account, a backend bundled around it, or a provider closer to the rest of their stack. This guide compares the main options, with notes on branching, scale to zero and where the data lives.
Each option is covered below, starting with Encore.
Encore is infrastructure from code for TypeScript and Go, with a platform that provisions and deploys into your own AWS or GCP account. A service declares its database in code, and Encore provisions RDS on AWS or Cloud SQL on GCP for each environment, or a Neon database if you prefer to keep Neon.

The code stays the same whichever provider an environment uses, as in this transfer endpoint, which runs in a transaction and rolls back when the sender lacks credits:
// credits/credits.ts
import { api, APIError } from "encore.dev/api";
import { SQLDatabase } from "encore.dev/storage/sqldb";
// RDS on AWS, Cloud SQL on GCP, or a Neon branch, chosen per environment.
const db = new SQLDatabase("credits", { migrations: "./migrations" });
interface TransferRequest {
from: string;
to: string;
amount: number;
}
export const transfer = api(
{ expose: true, method: "POST", path: "/credits/transfer" },
async (req: TransferRequest): Promise<{ ok: boolean }> => {
const tx = await db.begin();
try {
const debited = await tx.queryRow<{ credits: number }>`
UPDATE balances SET credits = credits - ${req.amount}
WHERE account_id = ${req.from} AND credits >= ${req.amount}
RETURNING credits`;
if (!debited) {
throw APIError.failedPrecondition("insufficient credits");
}
await tx.exec`
UPDATE balances SET credits = credits + ${req.amount}
WHERE account_id = ${req.to}`;
await tx.commit();
return { ok: true };
} catch (err) {
await tx.rollback();
throw err;
}
},
);
The migration in credits/migrations creates the balances table the queries use:
-- credits/migrations/1_create_balances.up.sql
CREATE TABLE balances (
account_id TEXT PRIMARY KEY,
credits INTEGER NOT NULL
);
Run in your terminal to get started locally.
encore run starts Postgres locally and applies the migrations, so the transfer works on a laptop with no account anywhere. An environment that uses Neon can be branched from another environment's Neon database.
An agent that adds a table writes a migration file next to the service and tests it against local Postgres right away. Encore provisions an IAM role for the service when it deploys.
Best fit: teams that want Postgres in their own AWS or GCP account, provisioned and migrated from the same code that uses it.
Supabase wraps Postgres with auth, storage, realtime subscriptions, edge functions and an auto-generated REST and GraphQL API. Its branching creates a preview database per Git branch and runs the migrations in the repository against it.
It is a bigger commitment than a database alone, since auth and row-level security policies tie the app to Supabase's model, and free projects pause after a period of inactivity.
Best fit: apps that want the database, auth and storage from one provider.
Aurora Serverless v2 runs Aurora PostgreSQL with capacity measured in ACUs, and with a minimum of 0 ACUs it pauses automatically after an idle period of 5 minutes to 24 hours. The database lives in your AWS account, inside your VPC and under your IAM policies.
Open connections, RDS Proxy and logical replication keep it from pausing, and there is no Git-style branching, only snapshots and fast clones.
Best fit: AWS teams that want Postgres capacity to follow traffic without leaving their account.
PlanetScale, known for its MySQL platform, made Postgres generally available in September 2025. Development branches are fully isolated databases, and schema changes are applied to the production branch deliberately rather than copied automatically.
It is a managed platform rather than serverless, so capacity is provisioned per cluster and does not scale to zero.
Best fit: teams that want a managed Postgres with a structured branch workflow.
Prisma Postgres is a managed Postgres from the team behind Prisma ORM, with built-in connection pooling, a serverless driver for edge runtimes and scale to zero. It is designed to pair with Prisma Client, though any Postgres client can connect.
Best fit: TypeScript teams already on Prisma ORM who want the database from the same vendor.
Choose Supabase for a bundled backend, Aurora Serverless v2 for scale to zero inside AWS, PlanetScale for branch-based workflows, and Prisma Postgres for Prisma-centric apps. Choose Encore when the database should be provisioned in your own AWS or GCP account from application code, with Neon still available per environment if you rely on its branching.
For more on Neon itself, see our guide to Neon serverless Postgres, and for bundled backends, the Supabase alternatives guide.
Supabase for Postgres bundled with auth, storage and realtime, Aurora Serverless v2 for scale-to-zero Postgres inside AWS, PlanetScale Postgres for branch-based workflows on a managed platform, and Prisma Postgres for teams using Prisma ORM.
It does when the minimum capacity is set to 0 ACUs: the instance pauses after an idle period you configure, from 5 minutes to 24 hours, and resumes on the next connection. Open connections, RDS Proxy and some other features prevent it from pausing.
With Encore, call db.begin() on a SQLDatabase to get a transaction, run tx.queryRow and tx.exec tagged-template queries on it, then call tx.commit(), or tx.rollback() in a catch block if anything throws.
Deploy to your cloud on AWS and Google Cloud
without managing infrastructure
Encore lets developers and agents define application infrastructure directly in code, then automatically provisions it from local development to production in your AWS or GCP account.