A GitHub check for your docs

Your docs, never stale

Every pull request, checked against your docs.

Start checking pull requestsSee a sample report

14-day money-back guarantee · cancel in one click

The problem

Every merge makes your docs a little less true.

None of it fails a test.

  1. 01

    Your new hire

    The setup guide is wrong.

    README.md · STRIPE_KEY → STRIPE_SECRET_KEY

  2. 02

    A customer

    The API docs describe a dead endpoint.

    docs/api.md · GET /v1/invoices/:id — removed

  3. 03

    Your support team

    The bug was a stale page.

    docs/config.md · billing.retry_limit — renamed

How it works

Install the GitHub App. Open pull requests as usual.

  1. 01

    Read the diff

    OnPair reads the diff.

    Env vars, routes, config keys, exports.

    config/mail.ts+3 −1
    start/env.ts+1 −1
    app/config/billing.ts+2 −2
    docs/operations.mduntouched
  2. 02

    Match the docs

    It finds the docs that disagree.

    README, docs folder, .env.example, changelog.

    docs/operations.md
    17Outgoing mail is configured in config/mail.ts.
    18Set MAIL_DRIVER to smtp to send for real.
    19In development, messages are written to the log.

    MAIL_DRIVER was renamed to MAIL_TRANSPORT in start/env.ts

  3. 03

    Report on the PR

    Findings land on the PR.

    A GitHub check, with severity and a suggested fix.

    OnPair · Documentation integrityFailed
    BlockingMAIL_TRANSPORT is not in .env.example
    Warningbilling.graceDays is still documented
  4. 04

    Settle it

    Fix it, or say why it's fine.

    Push the fix, or dismiss it with a reason.

    Fixeda3f9c21 · adds MAIL_TRANSPORT
    Dismissedbilling.graceDays · not relevant

What it catches

The changes that break docs without touching them.

Blocking findings fail the check. Warnings don’t.

  • BlockingHigh confidence

    QUEUE_REDIS_URL is required, and .env.example never mentions it

    A new or renamed variable that setup guides never mention.

    Changed in start/env.ts

    REDIS_URL: Env.schema.string(),

    QUEUE_REDIS_URL: Env.schema.string(),

    Still documented in .env.example:7
    REDIS_URL=redis://localhost:6379
    Suggested fix
    QUEUE_REDIS_URL=redis://localhost:6379

Automations

Docs go stale outside pull requests too.

An upstream release or an incident opens a docs PR for you.

How Automations work

  1. Upstream watch

    acme/payments-sdk @ main

    Rename retry option to maxRetries

    commit a41c9e2 · 2 minutes ago

    acme/docs #512Opened

    docs: sync with acme/payments-sdk a41c9e2

    onpair/sync-payments-sdk → main

    • docs/payments/retries.md+4 −4
    • docs/payments/webhooks.md+1 −1

    Instructions Check the retry and webhook sections against the new release.

  2. Status webhook

    Better Stack · incident posted

    Checkout API degraded

    investigating · 09:14 UTC

    acme/runbooks #88Opened

    docs: record the checkout incident of 12 March

    onpair/sync-status → main

    • status/2026-03-12-checkout.mdnew
    • runbooks/checkout.md+6 −1

    Instructions Add a status note and link the runbook step that fixed it.

Pricing

Priced on repositories and analyses, not seats.

Every feature on every plan. One analysis is one commit reviewed.

Starter

$39/month

A small team shipping on a handful of repositories. Enough analyses to review every pull request without treating OnPair as a background process.

Repositories
5
Analyses per month
750
Recommended

Growth

$79/month

Several active repositories and a busier merge queue. The default for a team that wants every pull request read, not a sample of them.

Repositories
15
Analyses per month
3,000

Scale

$199/month

A larger surface area — many repositories, many authors, no appetite for a cap getting in the way mid-sprint.

Repositories
50
Analyses per month
10,000

14-day money-back guarantee · cancel in one click

Full pricing details

FAQ

Before you install

Something missing? Email [email protected].

Which languages and frameworks does it understand?
Route detection covers Node (Express, Fastify, AdonisJS and similar routers), Laravel, Rails, Django, Flask and FastAPI, Spring and Go. Environment variables are read from Node, Deno, Vite, Python and any env() helper. The documentation review pass works on any language, because it reads the diff and your docs side by side.
Does it work with monorepos?
Yes. Point the documentation and contract globs in .onpair.yml at each package, and OnPair checks every pull request against the docs that belong to the code it touches.
Does it work on private repositories?
Yes. You install the GitHub App on the repositories you choose, private or public, and OnPair only ever sees those.
What is .onpair.yml?
An optional file at the root of your repository. It says which files count as documentation and where your API and environment contracts live. Without it, OnPair reads README.md, docs/**, .env.example and CHANGELOG.md.
What if it's wrong?
Only blocking findings fail the check; warnings leave it neutral. A failed check stops a merge only if you make it a required check. Any finding can be dismissed with a reason from your dashboard.
What counts as an analysis?
One analysis per commit OnPair reviews on a pull request. Pushing twice is two analyses; reopening a pull request is none, because that commit was already read. If you run out, new analyses pause until the period rolls over or you move up a plan. Nothing is billed by surprise.
What is sent to the AI model?
The pull request diff, the list of changed files and excerpts of the documentation that matched, capped at 60 KB. Your code is not used to train models, and OnPair does not keep a copy of it. The full details are on the security page.
Can I get a refund?
Yes. Every new subscription has a 14-day money-back guarantee. Email [email protected] within 14 days of your first payment for a full refund, for any reason. You can cancel from the billing page in one click.

Catch the next stale doc before it merges.

Start checking pull requestsSee a sample report

14-day money-back guarantee · cancel in one click