What's new in oasdiff
New analysis capabilities, accuracy improvements, and review-surface changes shipped recently.
- Allreview
🚀 The side-by-side change review is now free for everyone
oasdiff's side-by-side API change review is now free for everyone. See exactly what changed between two API specs, rendered as a full visual diff.
Point it at any two versions of your spec, wherever they live, and open the review three ways:
- Command line:
oasdiff changelog --open(orbreaking --open) - Free GitHub Action: the breaking and changelog actions link straight to the review on every pull request with changes
- Online diff tool: the "Share as a side-by-side review" button
Two things you'll use it for:
- Understand a change in context. Every change is highlighted inside its operation or schema in the full diff, so you see not just what changed but where.
- Share it for review. Send the link to teammates and anyone can open it, with no install and no account. Each change also has its own link, so you can point someone straight at the one you mean.
Your review stays private. What we store is an encrypted blob we cannot read: the one-time key that unlocks it lives only in the review link (the part after the
#) and never reaches our servers. From the command line and the GitHub Action it goes further, since the comparison is computed and encrypted on your own machine, so the specs never leave it in the clear. Links expire after 7 days.Need to act on a review, not just read it? oasdiff Pro lets reviewers approve or reject each change, keeps the merge blocked until every breaking change has been reviewed, and records who approved what, right on the pull request. Try Pro.
Available in oasdiff v1.19.0 and the oasdiff GitHub Action v0.1.0.
- Command line:
- Allcalculator
Copy a clean, shareable report from the diff tool
The diff tool's text output now reads like the CLI: colorized by severity, with the columns aligned. And the copy button gives you clean, paste-ready text, no color codes, tabs expanded to spaces, so a breaking-changes or changelog report drops straight into a PR comment, ticket, or doc and still lines up.
Try it on the diff tool: pick Breaking, Changelog, or Validate, choose the Text format, and copy.
- Allcalculator
Share a comparison as a side-by-side review
Compared two specs in the diff tool? You can now open them as a side-by-side review and share it with your team, instead of copying markdown or HTML into a message.
Click "Share as a side-by-side review" and sign in with GitHub. You land on the review page with the full change list, and each change has a "Copy link to this change" button, so you can point a teammate at one specific change, not just the whole diff. Anyone with a link can open it, no install and no account needed on their end. Links last 7 days.
- Allcli
Let oasdiff fetch missing commits for you with --fetch
When you compare two git revisions, say
oasdiff changelog main:openapi.yaml release:openapi.yaml, and one of the commits is not in your local clone yet, oasdiff used to stop and print thegit fetchcommand for you to run. Add--fetchand oasdiff fetches the missing revisions from origin itself, then runs the comparison in one step. Without the flag it stays read-only, so you decide when your repository is touched.Available in oasdiff v1.18.5.
- Allaction
The oasdiff GitHub Action handles more spec changes without failing
The breaking, changelog, and diff actions could fail unexpectedly on a few specific spec changes, for example an array property that dropped its
items, or a removednot/if/then/elseschema. Those comparisons now run cleanly. The breaking and changelog actions also catch property changes nested inside anotschema, which were skipped before.Available in oasdiff-action v0.0.57.
- Allaction
View breaking changes in a side-by-side review, straight from your PR
When the free oasdiff GitHub Action finds breaking changes, the Checks summary now links straight to a shareable side-by-side review. And when you run the review command locally, oasdiff now tells you the exact
git fetchto run if a commit isn't in your clone yet, instead of a cryptic git error.Available in oasdiff v1.18.4 and oasdiff-action v0.0.56.
- Proreview
Bring a teammate into a review
Reviewing breaking changes is a team decision, so it should be easy to pull the right person in.
Every breaking change on a review now has an Ask a teammate to review action. It creates a single-use invite and copies a link you can paste anywhere (Slack, a PR comment, email). When your teammate opens it, they sign in, join your team, and land directly on that change, ready to approve or reject it. Asking for a second opinion is the invite, so they arrive able to act instead of stuck on a read-only page.
And when someone who is not yet on your team opens a review, they can ask to join. You get an email and a request in your account settings; approve it and they are sent an invite automatically.
- Prosetup
Verify your setup before the first pull request
Setting up oasdiff Pro has a few moving parts: the GitHub App, the repository token, the workflow file, and your spec paths. Until now the first real signal that it all fit together was an actual pull request.
You can now check the whole chain on demand. Open your repository's Actions tab, choose the oasdiff workflow, and click Run workflow. It runs a read-only check (no pull request, no comment, no commit status) and reports a checklist: the workflow ran, the token authenticated, the oasdiff GitHub App is installed, your spec files resolved, and your GitHub sign-in can read the spec.
Results appear both in the run's summary and on your setup page, so you can spot and fix a missing step before it matters on a real PR.
- Allaction
GitHub Action: external $refs are off by default
The oasdiff GitHub Actions now default to
allow-external-refs: false. Because CI commonly runs on pull requests from forks, external$refs in a spec are no longer fetched or resolved by default — the safe choice for untrusted input.Specs loaded the recommended way are unaffected: with the git-ref form (
base: 'origin/main:openapi.yaml'), in-repository$refs — single- or multi-file — resolve viagit show, not as external references.If your spec references an external URL, or you load split multi-file specs by plain file path instead of the git-ref form, opt back in with the new
allow-external-refsinput (available on all five actions):- uses: oasdiff/oasdiff-action/breaking@v0.0.51 with: base: 'origin/${{ github.base_ref }}:openapi.yaml' revision: 'HEAD:openapi.yaml' allow-external-refs: trueFailures now also surface as annotations on the Checks tab, with a one-line hint when a blocked external
$refis the cause. Available in oasdiff-action v0.0.51 (runs on oasdiff v1.18.1).Security: this change also addresses GHSA-fhj3-7267-7vv5. Before v0.0.51, the permissive default could resolve attacker-controlled
$refs on fork pull requests (SSRF, and disclosure of structured files on the runner). The base-image fix is GHSA-2jcc-mxv7-p3f9, in oasdiff v1.18.1. If you pin an older action version, upgrade to v0.0.51. - Freecli
Side-by-side review from your terminal, with --open
oasdiff changelogandoasdiff breakingnow accept an--openflag. After printing the changelog in your terminal, the CLI uploads the two specs to oasdiff.com and opens a side-by-side review in your browser — the same view paying customers see, with the approve / reject buttons present (locked on the free tier) and the diff anchored at each breaking change.oasdiff changelog HEAD~1:openapi.yaml HEAD:openapi.yaml --openThe resulting URL is unguessable and works for 7 days. Paste it into a PR comment or your team's Slack and reviewers can open it directly — no CLI install required on their side, no GitHub OAuth approval. First run prompts for GitHub sign-in (minimal scopes, no
repoaccess) and stores a token locally; subsequent runs skip it.Works against any spec you can
git show— public or private. See /docs/free-review for the full walkthrough. - Allcli
OpenAPI changelog inline in git log
New
oasdiff git-diff-driversubcommand wires oasdiff into git as an external diff driver, sogit log --patch --ext-diffandgit diffrender a human-readable OpenAPI changelog inline instead of a raw YAML text diff.Two config lines:
git config diff.oasdiff.command "oasdiff git-diff-driver" echo "openapi.yaml diff=oasdiff" >> .gitattributesThen:
git log --patch --ext-diff -- openapi.yamlFor each commit that touched the spec, you'll see the same human-readable changelog
oasdiff changelogwould emit, instead of YAML hunks. Added (root commit) and removed files are handled inline; mode-only changes are skipped.Inspired by Jamie Tanna's post on using oasdiff as a git diff driver via a bash wrapper. The wrapper is no longer needed. Available in oasdiff v1.17.0.
- Allaccuracy
Header case differences no longer count as a change
HTTP header names are case-insensitive per RFC 9110, but the diff was treating
Content-Typeandcontent-typeas different headers. Renaming a header to a different case in your spec produced spurious "header removed + header added" findings.That's now the default behaviour. To get the strict, case-sensitive comparison back:
- On /diff: open Comparison options and uncheck Case-insensitive headers.
- On the CLI / GitHub Action: pass
--case-insensitive-headers=false.
- Freecalculator
Six comparison-tuning options exposed in the diff calculator
The /diff calculator now exposes the same fine-tuning knobs the CLI has, under a new Comparison options disclosure:
- Match inline / $ref subschemas — recognise refactors that pull an inline schema into a named component
- Case-insensitive headers — RFC 9110 default
- Flatten allOf — merge
allOfsubschemas before diffing - Flatten path-level parameters — merge path-level params with operation params
- Auto-upgrade to latest 3.x — canonicalise 3.0 specs before diffing (useful for cross-version comparisons)
- Include path parameter names in matching — treat
/pets/{id}and/pets/{petId}as different paths
Defaults match the CLI's, so the result on the page mirrors what
oasdiff diffproduces locally unless you toggle something. - Allaccuracy
Inline ↔ $ref refactors are recognised as equivalent
Refactors that pull an inline subschema into
components/schemasand reference it via$refare now recognised as the same branch insideanyOf/oneOfunions. The compared specs may look different on paper, but if they produce the same wire contract the diff reflects that.This sits in the diff engine itself, so the Diff, Breaking, and Changelog modes on /diff — and the matching CLI subcommands — all benefit consistently.
- Allvalidate
Validate an OpenAPI spec
A new Validate mode is available on /diff. Drop a single spec, get every OpenAPI and JSON Schema violation with its file and line.
The same capability is also in the CLI:
oasdiff validate spec.yamland as a GitHub Action —
oasdiff/oasdiff-action/validate— so you can fail a workflow on invalid specs without writing your own validator. - Proreview
Self-service recovery on /review
The /review page now guides visitors through the common access cases — missing repository permission, SAML authorisation needed, wrong file path — directly on the page:
- A diagnostic panel showing the signed-in user, the repo, each spec file with its status, and a Reference ID for support.
- An ordered recovery checklist filtered to the steps that match the situation.
- A "Contact us" option that pre-fills an email with the diagnostics and Reference ID, so anything that does reach us arrives with everything we need.
Inaccessible
$refsroute through the same surface, so a referenced fragment uses the same recovery flow as the top-level spec. - Freeaction
Free /review links now pin to the immutable base commit
The
/reviewlink that the freebreakingandchangelogactions emit into the GitHub Step Summary used to encode the branch name of the base (typicallymain). Ifmainadvanced past a renamed or moved spec file before someone clicked the link, the link 404'd.The action now writes the immutable base commit SHA into the URL. Once the link is in the Step Summary, it points at the same content forever, even as the base branch moves on.
- Proaction
PR comments scale to repos with very large API surfaces
The
pr-commentaction now renders cleanly on repositories with substantial API surfaces — changelogs of several megabytes are handled the same as small ones, with no special configuration needed.On the service side, when a change table would exceed GitHub's 65 KB issue-comment limit the action posts a summary (severity counts) plus a prominent link to the full review page, which has no size cap.
- Allcalculator
Diff a 3.0 spec against a 3.1 spec
You can now compare an OpenAPI 3.0 spec against an OpenAPI 3.1 spec without converting them by hand.
On /diff: open Comparison options and turn on Auto-upgrade to latest 3.x. The older spec is canonicalised to 3.1 before the comparison runs.
On the CLI / GitHub Action: pass
--auto-upgradeondiff,breaking, orchangelog. A standaloneoasdiff upgradesubcommand is also available if you want the canonicalised spec out for some other use. - Allcli
.oasdiff.yaml config file
Repeated flags can now live in a config file checked into the repo:
# .oasdiff.yaml match-inline-refs: true case-insensitive-headers: true fail-on: error exclude-elements: - description - examplesThe CLI picks it up automatically when you're in the directory, or you can point at one explicitly via
--configor theOASDIFF_CONFIGenvironment variable. The free GitHub Actions read the same file, so one.oasdiff.yamlconfigures both your local runs and your CI. - Freeaction
Side-by-side preview of breaking changes, straight from a PR
After the free
breakingorchangelogactions run on a PR, the GitHub Step Summary now includes a clickable link to a full side-by-side preview of the change:📋 Review & approve these breaking changes → https://oasdiff.com/review?...
Click it to see the diff with inline annotations and the changes laid out next to each other. Useful when the CI annotation tells you that something broke and you want to see exactly what changed before approving the PR — no install needed.
- Allcli
OpenAPI 3.1 support is generally available
OpenAPI 3.1 support is out of beta. Diff, Breaking, and Changelog all work natively against 3.1 specs, with full handling of the new keywords (
prefixItems,dependentSchemas,dependentRequired,if/then/else,contains/minContains/maxContains) and the new type-array nullability shape./diff, the GitHub Actions, and the Pro /review page all read 3.0 and 3.1 transparently. If you have a 3.0 spec to migrate, /docs/openapi-31-migration includes an interactive widget that takes your 3.0 spec and gives you the 3.1 equivalent to copy.