Skip to content
NewNow inside Claude, ChatGPT and Codex

See what your pull request breaksacross every repository

AfterMerge checks your change against every dependent service and shows which user flows break, down to the line of code.

Reads services written in

  • TypeScript
  • JavaScript
  • Python
  • Ruby
  • Java
  • Go

Repositories

  • webStorefront
  • apiOrders API
  • billing-workerPayments
  • mobileiOS + Android
api#482+38 −21

Rename user_id to account_id on orders

UserID    string `json:"user_id"`AccountID string `json:"account_id"`
Checking 5 user flows1 of 5 flows failed

User flows

  • Sign upPassed
  • Checkoutbilling-worker still reads user_idFailed
  • Order historyPassed
  • Download an invoicePassed
  • Refund an orderthe payment webhook isn’t in these reposInconclusive

Code review only sees the diff

Every repository passes its own tests. The break happens in code that depends on yours, and nobody opens that file during review.

  • A field is renamed

    The API now sends account_id. A billing worker in another repo still reads user_id and stops charging cards.

  • An event changes shape

    An order event moves its total into a new field. The service that emails receipts sends them blank.

  • An endpoint moves

    A route is renamed during cleanup. The mobile app already on your users’ phones keeps calling the old path.

  • A shared type changes

    A package every service imports gets a new version. One consumer still compiles, and quietly behaves differently.

How it works

Three steps, and no config files.

  1. Connect your repositories

    Install the GitHub app and pick the repos that talk to each other. There’s nothing to configure inside any of them.

    webapibilling-workermobile
  2. Open a pull request

    Checks start on their own for every new PR, or on any single PR when someone asks for one in a comment.

    @aftermerge-ai reviewAuto-check
  3. Read the result on the PR

    One comment lists every flow that was checked, what broke and why. A GitHub check reports alongside it, and never blocks the merge.

    AfterMerge Review3 passed1 failed1 inconclusive

Every result shows its work

What the user expected, what would actually happen, and the files behind it. Below is the real report, run on a sample pull request.

Rename user_id to account_id on ordersapi #4825 flows · 1 failed

A customer pays for their order at checkout

Failedconfidence 0.91

Expectation

The customer places an order, the billing worker charges their saved card, and the order moves from pending payment to paid within a few seconds.

Prediction

Explanation

The rename is complete inside the api repository, and its own tests pass. billing-worker is a separate repository that consumes the same order payload and was not updated.

  1. Initial State

    A signed-in customer with a saved card has one item in their cart.

  2. Step 1

    The customer submits the order; the API stores it and publishes order.created.

    Predicted State
    • The event payload now carries "account_id" and no "user_id".
    api/internal/orders/order.go:18-24
  3. Step 2

    billing-worker picks up order.created and looks up the customer to charge.

    Predicted State
    • payload.fetch("user_id") raises KeyError; the job is retried.
    Edge Cases
    • Retries exhaust after 5 attempts and the job is dropped.
    billing-worker/app/jobs/charge_order_job.rb:41
  4. Outcome

    The order stays in pending payment and no charge is made.

    Prediction
    Explanation

    The rename is complete inside the api repository, and its own tests pass. billing-worker is a separate repository that consumes the same order payload and was not updated.

Built for changes that span teams

A pull request is rarely the whole story, so AfterMerge follows the work across teams, repositories and tools.

Feature runs

Check every pull request behind a feature together, across repositories, as one change.

web#213api#482mobile#77One check

Codebase chat

Ask how something works across all your repositories. Every answer points to the files it came from.

“Who listens for order.created?”

charge_order_job.rbreceipt_mailer.py

Fix prompts

Each break comes with a prompt for your coding agent that names the files to change and why.

Claude CodeCursorCodex

MCP server

Ask about your repos or check a pull request from Claude, ChatGPT, Codex or Claude Code.

aftermerge.dev/mcp

Bring your own key

Run checks on the default models, or on your own provider key from settings.

AnthropicAnthropicOpenAIOpenAIOpenAI-compatible

Never changes your code

AfterMerge reads your repositories. The only things it writes are its own comment and check on a pull request.

  • Credentials encrypted at rest
  • Data scoped to your organization
  • Removing a repo deletes its data

GitHub app permissions

Contents
Read your code
Read
Metadata
List repositories
Read
Issues
See review requests in comments
Read
Pull requests
Post the result comment
Read & write
Checks
Add the AfterMerge Review check
Write

Frequently asked questions

Still deciding? See a sample run

How is this different from an AI code reviewer?

A code reviewer reads the diff in front of it. AfterMerge follows the diff into the repositories that depend on it and checks whole user flows end to end. It catches the bugs that pass review because the code that breaks was never in the diff.

Will it block my merges?

No. It reports through a comment and a GitHub check, and the check completes successfully even when a flow breaks. Whether to merge is up to you.

Do I have to configure each repository?

No. There are no config files to add. Connect the repositories and AfterMerge works out how they call each other.

Which languages does it read?

TypeScript, JavaScript, Python, Ruby, Java and Go, mixed freely across repositories.

Which Git hosts are supported?

GitHub, for pull request comments and checks. Repositories on GitLab and Bitbucket can be connected too, so they’re included when a GitHub pull request is checked.

Can I use my own model provider?

Yes. Add an Anthropic, OpenAI or OpenAI-compatible key in settings and checks run on it. Without one, AfterMerge uses its default models.

Know what breaks before you merge