Post

That means you can hand it two versions of a schema in any of the languages it supports, and it'll computes the diff, classify whether the change is breaking, and generate a converter that turns old records into new ones.

What's even better is that adding support for a new schema language just involves writing a description of it. Nothing about the underlying engine needs to change.

The generated converter goes both directions. The forward direction turns an old record into a new one; the backward direction converts it back, recovering whatever the forward path dropped (if anything) via a side channel called a complement.