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.