Loading the analysis.
66 days until Shopify stops accepting non-expiring offline tokens
Voeu keeps them working, and proves it. It reads your source, runs your application against the provider’s real contract, and writes the patch — then re-checks the patch with the same frozen checks that justified it.
Starting with Shopify’s expiring offline access tokens.
shopify-app-rails · text-level analysis only b227f8042738
FAILEDshopify_api 14.8.0 predates expiring-token support
Gemfile.lock:898 shopify_api (14.8.0)
UNPROVENNo expiring-offline-access-token configuration found
1 failed · 1 unproven · exit 1 4.4s
Not a mockup. That is a public repository, at that commit, with a breakage still open upstream.
Remix 836 of 886 · React Router 101 of 370 · none estimated
// Five commands //
Reads your source. Finds where the token lifecycle touches your session storage, your workers and your API calls.
$ npx @voeu/cli inspect --repo .
Runs your application against a simulated Shopify — expiry, single-use refresh, the 30-day recovery window, and the failures you cannot provoke yourself: 5xx, timeouts, and lost responses where the provider commits and your code never learns what happened.
$ npx @voeu/cli verify --repo .
Emits a patch for what is deterministic, then re-runs the same checks over the patched tree and reports only what the re-check confirms.
$ npx @voeu/cli fix --repo .
Re-reads every provider document the contract cites, nightly, and downgrades the checks that rested on a phrase which has disappeared. Shopify moved the refresh recovery window on 28 August 2026 with nothing to migrate; this is the command that would have noticed.
$ npx @voeu/cli watch --repo .
Prints every rule the simulator encodes as data: the statement, the Shopify document it came from, the constant it became, and the checks that stop being believable if it moves. --open lists only the claims that rest on a reading rather than a rule.
$ npx @voeu/cli contract --open
A developer implementing this found the token exchange needs an expiring=1 field that was not documented — and omitting it failed silently. The call appeared to succeed and returned the wrong token format.
An engineer, or a coding agent, working from the official documentation would have written that code exactly the same wrong way, because the documentation was incomplete. Generation is not the bottleneck. The only thing that catches a gap like that is running the code against the provider and observing what actually comes back.
Shopify also changed refresh recovery on 28 August 2026, with no migration required and no reason for anyone to notice. Voeu pins the contract with the date it was checked, so when a provider moves, the divergence is a finding rather than a surprise.
| Reading the docs | Running the app |
|---|---|
| The token exchange looked complete without expiring=1 | The exchange returns the legacy token shape and verify says so |
| A refresh that times out reads as a failure | A lost response is retried inside the recovery window, once |
| A page that moved on 28 August is still the page you read | watch re-reads every cited document nightly and downgrades what rests on it |
| A credential in a queue payload looks like a convenience | The job runs an hour later with a token that has expired |
The behaviour held under the programmed conditions.
It did not. There is a reproduction.
The check does not bind this application.
The check could not be decided - an adapter member is missing, a fault never fired, the scenario itself errored. Not decided is not the same as passed, and no report here says otherwise.
A single rate cannot be checked by anybody. The split is here so a visitor who maintains one of each can test the number against their own repository in four seconds. Last scanned 11 September 2026.
| Framework | Assessed | Exposed | No finding | Exposed % |
|---|---|---|---|---|
| Remix | 886 | 836 | 50 | 94% |
| React Router | 370 | 101 | 269 | 27% |
| All frameworks | 1,274 | 937 | 337 | 74% |
// Pricing //
CLI
Freeforever
inspect, verify, fix, watch and contract on any repository you can clone.
Cloud
$29per repository · month
What a model drafts and the harness checks: the verify adapter written for you, a fix pull request behind every inspection, and a patch for the findings the deterministic fixer declines, run in your CI before it opens. Fourteen days on trial first.
Team
$199per organisation · month
Cloud on every repository in the installation, present and future, and a named contact who reads your runs.
Enterprise
Custom
A contract pack for your provider, a private deployment, and the harness pointed at whatever you integrate with next.
shopify.app.toml has no distribution field. The setting lives in the Dev Dashboard and is not recoverable from source, so findings are conditional until you say.
Fourteen behaviours held against a simulator. Webhook verification, online sessions, billing and every other Admin API operation are out of scope.
Where it diverges from Shopify, these results are wrong with it. Every report says so, on the artifact, not in a footnote.
The adapter pull request adds one workflow. It runs on push to your default branch, brings up the services your app declares, runs verify through the Action, and reports the run to your repository's page using GitHub's own id-token. Nothing in it needs a secret.
It never applies a patch, opens a pull request you did not ask for, deploys, or converts a merchant token. It reads your repositories, runs nothing of yours on its side, and never merges.
Every figure on this page is a count from a file this repository produced - the corpus summary from a scan of 1,274 public repositories on 11 September 2026, or a run artifact. None is estimated, and tests refuse a sentence that quotes a measurement the code no longer holds.