$ curl -O https://pgrun.dev/discovery.sql discovery.sql 100%[==================>] 12.0K$ shasum -a 256 discovery.sql bf33edf04e14da086437788eb7a851964103fc06312808380528f863976b1646 discovery.sql✓ matches the hash printed below$ psql -q -f discovery.sql "$DATABASE_URL"$ ls -la pgrun-discovery.json -rw-r--r-- 1 you staff 9.2K pgrun-discovery.json✓ written locally. nothing was uploaded. drop it on this page to see your report.$
$ curl -O https://pgrun.dev/discovery.sql discovery.sql 100%[==================>] 12.0K$ shasum -a 256 discovery.sql bf33edf04e14da086437788eb7a851964103fc06312808380528f863976b1646 discovery.sql✓ matches the hash printed below$ psql -q -f discovery.sql "$DATABASE_URL"$ ls -la pgrun-discovery.json -rw-r--r-- 1 you staff 9.2K pgrun-discovery.json✓ written locally. nothing was uploaded. drop it on this page to see your report.$ $ head -3 discovery.sql -- pgrun.dev discovery — captures the SHAPE of your database -- for a migration assessment. Read-only: SELECTs over -- pg_catalog/pg_stat_*. It never reads a row of your data.$ grep -cE "^(SELECT|SET)" discovery.sql 16 16 statements: SELECTs plus one SET statement_timeout. 12KB of SQL — audit it yourself before running.$ $ jq 'keys[0:6]' pgrun-discovery.json [ "fks", "pgss", "role", "server", "tables", "indexes" ]$ jq '.tables.top[0] | {name, total_bytes}' pgrun-discovery.json { "name": "orders", "total_bytes": 43578368 } table names, sizes, index defs, settings — never a row of your data.$
discovery.sql captures the shape of your database —
sizes, indexes, extensions, replication settings. Read-only
SELECTs over the catalogs; it never reads a row of your data.
Download it, read it, then run it:
$ curl -O https://pgrun.dev/discovery.sql
$ shasum -a 256 discovery.sql
# should print exactly:
# bf33edf04e14da086437788eb7a851964103fc06312808380528f863976b1646$ psql -q -f discovery.sql "$DATABASE_URL"
#=> writes pgrun-discovery.json — open it, it's yours to read
Takes seconds on most databases, a minute or two on very large ones (it
caps its own work and sets a 120s statement timeout). The hash catches a
corrupted download. Works on anything psql can reach: RDS, Aurora,
Heroku, Supabase, Neon, Cloud SQL, your own box.
Using a coding agent? Drop pgrun.dev/migrate.md
into your repo and say "migrate my database to pgrun following this
file" — it's the complete runbook: discovery, path choice, commands,
cutover checklist, and hard safety rules (never writes to your source,
never cuts over without your say-so).
[02]
Drop the file
drop pgrun-discovery.json here — or click to choose
parsed on your machine. nothing is uploaded — watch devtools if you like.
is a maintenance window acceptable?· target version
[03]
Your report
[04]
The plan we'd run for you
Every step above is standard tooling — you can run it yourself, and the
copy buttons hand each fix to your coding agent. Or we run it with you:
standard migrations are included.