Yes, this is the world's most boring time machine.
Yes, this is the world’s most boring time machine.

Doctor, Who?

The Doctor has always fascinated me as a character or concept. They are a one-off, unique lifeform unlike any other in the universe, and each generation of the Doctor is also unique.

The OpenAPI Doctor is named partially after my love of character, as well as because it’s a literal heath-check, testing, and monitoring application for OpenAPI.

FYI: I am not a fan of the current generation of Doctor Who.


The Doctor has a time and space machine, a spaceship that allows time travel and offers seemingly unlimited internal space. A long-running joke of the show is that when anyone new is introduced to the Doctor and the TARDIS, they are shocked at how much bigger it is on the inside, giving rise to the phrase:

“It’s bigger on the inside.”

The ship is called the TARDIS (Time And Relative Dimensions In Space), a living organism (in a sense).

This article isn’t about Dr Who or any more of the lore but about the OpenAPI Doctor and the latest available feature: The TARDIS.


A Time Machine for OpenAPI

Explore changes in an OpenAPI spec like never before

Tracking changes to an OpenAPI specification is critical in any API lifecycle and governance model.

Knowing when something has changed is important, but knowing if it’s broken your downstream consumers of that contract (like SDK generators, documentation, language bindings, and more).

Diffing with a difference

In January 2025, I started building The TARDIS, essentially a complete rebuild of openapi-changes but with a much more advanced model powering it.

Every time the OpenAPI Doctor requests a diagnosis, the changes between each edit are captured and processed via libopenapi and the what_changed module.

Like with openapi-changes, that change model is used to render out the changes, except the difference between the Doctor and openapi-changes is that the Doctor weaves the changes into the graph, allowing us to see the changed model and how it changed.


Weaving trees

Under the hood, the OpenAPI Doctor is doing a ton of work to determine how to render the changes in multiple dimensions. It first builds out a high-level model of the document using a core library (named doctor) based on-top of libopenapi.

The Doctor’s core library has powerful features that are unavailable under the same MIT license as libopenapi..

It’s like a turbocharged version of libopenapi., available under the BUSL 1-1 license.

The Doctor then looks back in your document’s history to extract the last change made and does the same thing, but with the older version.

These left (old) and right (modified) documents are compared using libopenapi’s what-changed module.

This module will create a walkable tree of typed and structured changes that allows any application to make a change report in any way.

The Doctor’s core library has a feature called ‘The Changerator’ that weaves the change tree into the Doctor’s model using the visitor pattern.

What we end up with is a model that contains a tree of all the objects, and each object has a list of all the changes that apply specifically to that object.

We can now build features like the TARDIS that go beyond what openapi-changes can do alone.


View changes in a more meaningful way

List out changes or explore them as a changelog, or a graph

The OpenAPI specification timeline updates with every change or block of changes, and by clicking on the timeline, we can explore each change in multiple ways.

Statistics inform us of the number of modifications, additions and removals, and breaking changes made to each change.

A change tree shows the objects (and their ancestors) that changed. We can view that change tree via the explorer view, which visualizes it. New icons showcase which objects in the tree changed.


Spot the difference

Really see what has changed, no more deciphering diffs

By clicking on any of these changes in the tree or the explorer graph, the TARDIS will render that selected object in the inspector on the right and show the properties that changed and how they changed.

There is also diff control that shows how each property was modified, highlighting the changed parts of the property (either added or removed).

Track changes, violations, and quality over time

With each change, the Doctor also tracks each diagnosis score and all the violations recorded for each rule.

The timeline history composes these numbers into a few charts, making it easy to see how an OpenAPI specification changes over time.


Why not just integrate openapi-changes instead

The openapi-changes tool uses libopenapi to parse the difference between a left and right OpenAPI spec; it then renders out results based directly on what comes out of libopenapi.

The Doctor takes these raw results and processes them further by weaving them into the higher-level model used by the Doctor (it does the same thing with results from vacuum).

A very high-level TARDIS workflow

The Doctor’s core library adds a richer model to libopenapi, and the changes for each object are added alongside violations from vacuum.

The higher-level model provides a much richer set of meta-data to create useful renderings of how things have changed.

I plan to port this upgraded experience back into openapi-changes in the future.


What is available now is still early, more power is coming soon.

  • Restore any change-set or any individual property.
  • Import from github and generate an entire change timeline automatically.
  • Export changes to a repo via a PR, bundling up or keeping changes as is.
  • Track changes automatically from a repo.
  • Create workspaces for multiple specs.
  • Publish a public report changelog.
  • Full supported API.
  • Integration with CI/CD.

Give it a try and leave some feedback