Pooled by default
DATABASE_URL goes through PgBouncer, so serverless apps share a few real connections. DIRECT_URL is there for migrations.
A Postgres 16 database for every project, with connection pooling, nightly backups and a built-in explorer. Plain SQL, any ORM, no lock-in.
Managed Postgres 16 with pooling, backups and a SQL editor.
DATABASE_URL goes through PgBouncer, so serverless apps share a few real connections. DIRECT_URL is there for migrations.
Browse tables, edit rows and run queries in the browser. Read-only until you switch it off, with timeouts that protect your data.
Every running database is dumped at 02:00 into your project's storage bucket, ready to download or restore.
Paste a Neon, Supabase or any Postgres connection string. Check what will be copied, then confirm. The string is never stored.
On Pro, pick a bigger size and the database restarts on the same disk and port. Your connection strings don't change.
Drizzle, Prisma, Kysely, psql or pg_dump: everything that speaks Postgres works. Enable pgcrypto, citext, hstore and more.
Click Deploy on the Postgres card. You get a database named app and a role that owns it.
Copy DATABASE_URL into your app, or pull every variable with one .env download.
Run your migrations with DIRECT_URL and query from your app. Backups start that night.
import { Pool } from "pg";
// One small pool per server process.
export const db = new Pool({
connectionString: process.env.DATABASE_URL,
max: 5,
});
const { rows } = await db.query(
"select id, email from users where created_at > now() - interval '1 day'",
);Same project, same .env, same bill.
Postgres, auth, storage, Redis, email and AI models. One API key.