Drift Scanner
Catch PostgreSQL schema drift before it hits production.
Drift Scanner watches your databases and tells you the moment a column type changes, a constraint loosens, or environments fall out of sync. Read-only. Agentless. Wires into the CI you already have.
Drift Scanner is in early access. Founder pricing locked in for the first hundred customers.
How it works
Connection to first alert in under five minutes.
Connect
Add a Postgres environment with read-only credentials. Drift Scanner only reads catalog metadata, never your data.
Scan
It snapshots tables, columns, types, indexes, constraints, and extensions on the schedule you set.
Detect
Each change is classified breaking, risky, or safe — based on the operation and the data shape behind it.
Alert
Slack, webhook, or PR comment with the full diff. Wires into the workflow your team already uses.
What happens behind the scenes
Read-only access, deterministic catalog queries, structured snapshots, severity-classified alerts.
Schema introspection
Drift Scanner queries pg_catalog and information_schema directly with explicit ORDER BY clauses — never pg_dump. pg_dump output is non-deterministic; direct catalog queries produce identical bytes for identical schemas, every time.
Tables, columns, types, nullability, defaults, indexes, and constraints — captured without ever reading application data.
1700 dark:text-emerald-400 font-semibold">SELECT
2 table_schema,
3 table_name,
4 column_name,
5 data_type,
6 is_nullable,
7 column_default,
8 character_maximum_length
9700 dark:text-emerald-400 font-semibold">FROM information_schema.columns
10700 dark:text-emerald-400 font-semibold">WHERE table_schema 700 dark:text-emerald-400 font-semibold">NOT 700 dark:text-emerald-400 font-semibold">IN (
11 300">'pg_catalog',
12 300">'information_schema'
13)
14700 dark:text-emerald-400 font-semibold">ORDER 700 dark:text-emerald-400 font-semibold">BY
15 table_schema,
16 table_name,
17 ordinal_position;
Environment registration
Register an environment with one API call. Drift Scanner takes it from there — first snapshot in under thirty seconds, then automatic snapshots on the cadence you set.
1$ curl -X POST https:300">"text-slate-400 dark:text-slate-500 italic">//drift.arcnull.com/api/v1/environments \
2 -H 300">"Authorization: Bearer ds_live_sk_..." \
3 -H 300">"Content-Type: application/json" \
4 -d '{
5 300">"name": 300">"production",
6 300">"connection": {
7 300">"host": 300">"db.example.com",
8 300">"port": 5432,
9 300">"database": 300">"myapp",
10 300">"user": 300">"drift_reader"
11 },
12 300">"scan_interval": 300">"6h",
13 300">"labels": [300">"production", 300">"us-east-1"]
14 }'
15
16300">"text-slate-400 dark:text-slate-500 italic"># 201 Created
17{
18 300">"id": 300">"env_01HQXK9...",
19 300">"status": 300">"connected",
20 300">"schemas_detected": 4,
21 300">"tables_detected": 47,
22 300">"first_snapshot_at": 300">"2026-04-12T08:31:00Z"
23}
CI integration
Drop the GitHub Action into your workflow. Drift checks run on every PR and on a schedule. Breaking changes block the merge.
1name: Schema Drift Check
2700 dark:text-emerald-400 font-semibold">on:
3 push:
4 branches: [main]
5 pull_request:
6 schedule:
7 - cron: 300">'0 */6 * * *'
8
9jobs:
10 drift-check:
11 runs-700 dark:text-emerald-400 font-semibold">on: ubuntu-latest
12 steps:
13 - uses: arcnull-hq/schema-drift-action@v1
14 with:
15 api-key: ${{ secrets.DRIFT_SCANNER_API_KEY }}
16 base-env: production
17 head-env: staging
18 fail-700 dark:text-emerald-400 font-semibold">on-breaking: 700 dark:text-emerald-400 font-semibold">true
19 notify: slack
Structured alerts
When drift is detected, you get a webhook with the full diff, severity, breaking-change count, and a dashboard link. Slack and PR comments are powered by the same payload.
1{
2 300">"event": 300">"drift.detected",
3 300">"severity": 300">"high",
4 300">"breaking_count": 2,
5 300">"timestamp": 300">"2026-04-12T08:30:00Z",
6 300">"environment": {
7 300">"base": 300">"production",
8 300">"head": 300">"staging"
9 },
10 300">"items": [
11 {
12 300">"700 dark:text-emerald-400 font-semibold">table": 300">"users",
13 300">"column": 300">"phone_verified",
14 300">"change": 300">"column_added",
15 300">"type": 300">"boolean",
16 300">"nullable": 700 dark:text-emerald-400 font-semibold">true,
17 300">"default": 300">"700 dark:text-emerald-400 font-semibold">false",
18 300">"breaking": 700 dark:text-emerald-400 font-semibold">false
19 },
20 {
21 300">"700 dark:text-emerald-400 font-semibold">table": 300">"orders",
22 300">"column": 300">"total_amount",
23 300">"change": 300">"type_changed",
24 300">"700 dark:text-emerald-400 font-semibold">from": 300">"numeric(10,2)",
25 300">"to": 300">"integer",
26 300">"breaking": 700 dark:text-emerald-400 font-semibold">true
27 }
28 ],
29 300">"dashboard_url": 300">"https:400 dark:text-slate-500 italic300">">//drift.arcnull.com/api/v1/diffs/rpt_..."
30}
Free to start. Move up when you need more.
Free tier covers two databases. Pro is for teams running Postgres in production. Team adds SSO and twelve hours of onboarding.
Free
Two databases. No credit card.
- ✓ 2 environments
- ✓ Daily scans
- ✓ 7 days of drift history
- ✓ Email alerts
- ✓ GitHub Action
- ✓ Community support
Pro
For teams shipping Postgres changes weekly.
- ✓ 10 environments
- ✓ Hourly scans
- ✓ 90 days of history
- ✓ Slack + webhook alerts
- ✓ PR comments
- ✓ Priority support
- ✓ 14-day free trial
Team
For teams that need SSO and onboarding help.
- ✓ Unlimited environments
- ✓ 5-minute scans
- ✓ 1 year of history
- ✓ SSO and audit log
- ✓ Custom integrations
- ✓ 12 hours of onboarding
- ✓ Dedicated support channel
Questions
Catch the next drift before it ships.
Free tier covers two databases. Setup is under five minutes. No credit card.
Join Early Access →