Docs · Guides

Postgres databases.

Every project can have its own isolated Postgres database — its own database, its own role, unreachable from other tenants. One click to provision; the connection string arrives as DATABASE_URL.

Provisioning

Open your project’s Database tab and provision. You get a dedicated database and role, and the DSN is injected into your app as DATABASE_URL on the next deploy. The full connection details (host, port, user, password) stay visible on the tab for external tools. Database size is capped per plan (see the limits).

import pg from 'pg';

// DATABASE_URL is injected automatically once a database is provisioned.
const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL });

const { rows } = await pool.query('SELECT now()');

Free plan note: Starter accounts need a payment method on file to provision a database. You aren’t charged — it’s an anti-abuse gate, not a subscription.

Migrations and seeds

Run migrations the same way you would anywhere: as part of your build script (prisma migrate deploy, drizzle-kit push, knex migrate:latest) or from your app on boot. The database is reachable during builds, so build-time migrations work.

Connecting from outside

The connection details on the Database tab work from external clients (psql, TablePlus, your ORM’s studio). Data stays on Canadian infrastructure — the same sovereignty posture as your app.

Analytics on your data

Project databases show up as a source in Data Workshop: browse tables and run SQL from the dashboard. To read or write your database on a schedule — nightly rollups, reconciliation, cross-project moves — use scheduled SQL queries.

Backups

Platform databases are backed up nightly. For belt-and-suspenders on critical data, pg_dump with your connection string works from anywhere.