Local-first API regression checks

One endpoint.
Every payload that matters.

Turn JSON fixtures into a compact payload-by-assertion matrix. Run it locally, spot the one variant that broke, and attach a redacted report to your review.

  • No telemetry
  • CI exit codes
  • OpenAPI optional
Luminous glass matrix planes showing payload rows crossed with pass and fail assertion lights
11 pass 1 regression 184 ms
2 modesNamed + Cartesian
4 assertionsStatus · exists · equals · type
3 outputsTerminal · JSON · HTML
0 uploadsYour fixtures stay local

Browser-only preview

Read the matrix, not a request log.

This demo evaluates a simulated user endpoint entirely in your browser. Edit a fixture, then rerun the matrix—nothing is transmitted or saved.

matrix.jsonLocal
Assertion matrixReady
Ready to run locally.
Fixture assertion results
FixtureStatusJSON bodyOutcome
Run the example to reveal payload-specific results.

The release check

From fixtures to evidence in one command.

  1. 01

    Describe one operation

    Use an explicit HTTP method and URL, or resolve an operationId from local OpenAPI 3 JSON.

  2. 02

    Cross meaningful variants

    Name exact fixtures or combine dimensions. Deep merge creates each deterministic case, capped safely at 1,000.

  3. 03

    Review the semantic diff

    See expected versus actual values, redact sensitive paths, then keep JSON for CI or HTML for the pull request.

Single binary · v0.1.0

Your endpoint is already running.
Prove the edges are, too.

Build from source today. Release binaries can drop into the same zero-telemetry workflow later.

shell
$ cargo install --git https://github.com/B-Divyesh/sf-api-fixture-matrix
$ fixture-matrix init > matrix.json
$ fixture-matrix run matrix.json --html report.html

Small public surface

Enough structure to stay reproducible.

Matrix modes

named preserves hand-picked cases. cartesian deep-merges every value across ordered dimensions.

Assertions

Compare HTTP status, JSON-path exists, semantic equals, or JSON type.

Safety limits

5 MiB inputs and responses, 64 nesting levels, 1,000 cases, bounded timeouts, and redirects disabled.

Useful exit codes

0 all pass. 1 assertion failures. 2 invalid input or transport failure.

Read the complete README