Blog

What Changes When Migration Planning Is Offline

Gaman starts from committed history and desired schema, then makes the plan visible before the database is touched.

Database migrations are often treated as a moment of contact with a live database. That is convenient, but it can make the most important question difficult to answer in review: what exactly are we about to do?

Gaman takes a different starting point. It reads the migration history already committed to the repository and the desired schema described in source. From there, it can replay the known history, compare that result with the desired state, and produce a migration plan without opening a database connection.

An abstract diagram showing a desired schema and committed history converging on a reviewed plan

Planning before permission

An offline plan is not just useful when credentials are unavailable. It changes the normal order of work. A developer can generate SQL, inspect the diff, and discuss a migration in a pull request before asking a shared environment to accept it.

That matters most when the database is expensive to disturb. The plan is based on repository state, so it is reproducible for another developer and suitable for CI. A live connection is still needed for actions such as applying a migration or verifying an existing database, but it is no longer the first requirement for understanding the change.

A migration is a reviewable artifact

Gaman turns the result into migration YAML and dialect-specific SQL rather than concealing the result behind a command. The generated artifact can be read, committed, and questioned like the rest of the codebase.

An abstract diagram of a careful review boundary between an intended change and a live database

This does not remove the need for judgement. Data backfills, destructive changes, and application-level rollouts still deserve careful design. A deterministic schema plan is a foundation, not an excuse to stop thinking.

Gaman is an early project and its APIs and file format may evolve before 1.0. The direction is already clear, though: migration tooling should help make change visible, not make it feel magical.

All notes