← SkillSafe / Migration Gate

Find out what your migration locks before production does

Paste the migration — raw SQL, a Django migration, a Kysely or Drizzle file, a golang-migrate pair, a Prisma migration.sql. You get every statement with the lock it takes, a safe / caution / block verdict against your table size and your downtime budget, the findings with corrected SQL, an expand-contract rollout with the deploy gates between steps, the migration rewritten safely, and the queries that prove it landed.

Both examples ship with a saved model run, so you can see the whole audit — including the rewritten migration — without signing in and without spending a credit.

nothing pasted yet
Drag your migration files in, or Everything is read in your browser. Nothing uploads until you run.
Paste a migration to price the run.

What this does, and what it does not

The prescan is a real statement splitter, not a keyword search. It walks the paste character by character, so a semicolon inside a string literal, inside a $$ … $$ function body or inside a comment is not mistaken for a statement boundary — which matters immediately, because the batched-backfill loop the good version of this migration uses is one statement containing several. Each statement is then classified by the lock PostgreSQL or MySQL actually takes for it, and every flag it raises is handed to the model as a fact it must reconcile one by one. If the audit skips a flag, this page says so.

The check that matters most runs after the answer arrives: the rewritten migration is fed back through the same analyzer, so “this rewrite is safe” is something the page verifies rather than repeats. A rewrite that still contains a plain CREATE INDEX is reported as such, above the block, before you copy it.

It reads; it does not connect to your database, it never runs anything, and it cannot see your row counts, your index bloat or your replication lag — which is why the form asks how big the table is and why the verification queries exist. This is a review of pasted text, not a rehearsal on production-sized data, and it is not a substitute for one.

Nothing to hand? Load the , a four-statement golang-migrate file that adds a NOT NULL column, builds an index and backfills 40M rows in one transaction, or the , an expand-phase migration that is mostly right and wants a second opinion. Both replay a saved run for free.