MIT LICENCED · v0.9.4 · 3.1k STARS

A migration tool that refuses to guess.

Tessera diffs your schema against production and writes the migration itself — then refuses to run anything it cannot reverse. No shadow database, no ORM lock-in, no 400-line generated file you have to read at 4pm on a Friday.

3.1k
Stars
214
Contributors
0
Dependencies

$ tessera plan --against prod

+ CREATE INDEX CONCURRENTLY idx_orders_placed_at ON orders (placed_at)

~ ALTER TABLE orders ALTER COLUMN status TYPE text [reversible]

! DROP COLUMN orders.legacy_ref [BLOCKED]

refusing: no reverse migration for a destructive change. pass --i-mean-it

Three decisions everything else follows from

Reversible or refused

Every generated migration ships with its inverse. If Tessera cannot write the down, it will not write the up.

Reads your database, not your models

No decorators, no metaclass magic, no framework. Point it at a connection string and it works with anything speaking Postgres.

Locks are the whole problem

Tessera estimates the lock each statement takes and blocks anything that would hold ACCESS EXCLUSIVE for more than 200 ms.

BENCHMARK · 1.2M ROW TABLE · POSTGRES 16

0.4 s
Plan generation
200 ms
Max lock held
100%
Migrations reversible
0
Downtime windows used

Contributing

  • Good first issues are labelled and actually good — we curate them weekly
  • Every PR gets a review within three working days or the maintainer buys you a coffee
  • No CLA. Your commits stay yours
  • Docs contributions count as contributions and get the same badge

“We migrated 340 tables across eleven services with it and did not take a single maintenance window. The refusal to guess is the feature.”

AP

Arun Pillai

Platform lead, Kettle

Does it work with MySQL?+

Not yet. Postgres and CockroachDB today; MySQL is the most-requested issue and has a design doc but no owner.

Is there a hosted version?+

No, and there is no plan for one. Tessera is a binary you run in CI. If that ever changes it will be a fork, not a rug-pull.

Who pays for this?+

Nobody. Two maintainers work on it on Fridays. There is a GitHub Sponsors page; it currently covers the domain and about half the CI bill.

How stable is 0.x?+

The plan format is frozen and has been since 0.6. We will cut 1.0 when MySQL lands, not when it feels ready.