Connecting
pg-checkup works with any PostgreSQL 13 or newer that it can reach over the internet. The checks are the same on every host; what differs is roles, extensions and how long statistics last.
The role
Create a dedicated role and grant pg_monitor. It can read statistics views, not the rows in your tables. Avoid scanning as a superuser or as your application's role.
Query findings
Query findings need the pg_stat_statements extension. Most managed hosts include it; run CREATE EXTENSION pg_stat_statements; if it isn't enabled. On a self-hosted server, add it to shared_preload_libraries and restart first.
Its statistics cover the time since they were last reset or the server last restarted.
Poolers
Use a direct connection or a session-mode pooler. A transaction-mode pooler can send each query to a different server connection, so the scan's read-only session setting may not hold. The scan page refuses the common transaction-mode ports.
Private addresses
Hostnames that only resolve inside a private network (for example *.internal) can't be reached. Use the public connection string your host gives you.
Free disk space
Free disk space isn't visible from SQL. The Footprint on disk check adds up data and WAL; compare it with the disk size your host shows.
Neon
- Neon runs
fsync = offandfull_page_writes = offon purpose, because its storage layer provides durability. It also names its own WAL service insynchronous_standby_namesand keeps two internal replication slots. None of these are reported as findings; the checks pass with an explanation. - Unlogged tables are emptied whenever the compute suspends, not only after a crash.
- Roles created in the Neon console get
neon_superuser, which includespg_monitor. A role created with SQL needspg_monitorgranted explicitly. pg_stat_statementsstatistics are lost when the compute suspends or restarts, including scale-to-zero. Query findings cover the time since the last wake-up.
Supabase
- Supabase's own roles (
supabase_*,pgbouncer,dashboard_user), its managed schemas (auth,storage,realtime,vault,extensions,graphqland similar) and queries run by those roles are left out of findings. - The API roles (
anon,authenticated,service_role) run your app's traffic, so their queries are counted. - Tables in
publicthat theanonrole can read with row-level security off are reported. - The
pg_cronandpg_netbookkeeping tables (cron.job_run_details,net._http_response) are not hidden: they grow with your own usage and are a common cause of disk growth. - Use the session pooler (port 5432) or a direct connection. Port 6543 is the transaction-mode pooler.
Railway
- Plain PostgreSQL on a fixed-size volume; nothing is hidden.
postgres.railway.internalonly works inside the project. Use the public connection string (DATABASE_PUBLIC_URL).
Amazon RDS, Aurora, Google Cloud SQL, Azure
- Enable
pg_stat_statementsthrough the instance's parameter settings. - Use
sslmode=require. - Free storage is a metric in the provider's console, not visible from SQL.
Self-hosted
Follow the quickstart, and add pg_stat_statements to shared_preload_libraries before restarting.