Local-first ยท no cloud account ยท MCP-native

Record once.
Replay as a ghost.

The local-first QA agent for SaaS teams. Record browser flows once, replay them in CI, monitor staging, and let AI assistants run your test suite via MCP โ€” all on your machine.

npm install -g ghostrun-cli

Why GhostRun

Nobody else combines these four things

Playwright MCP and Stagehand automate a browser. Reflect, Momentic, and Mabl want an account and a hosted dashboard. GhostRun is the one that's actually local, actually SaaS-specific, and actually speaks to your AI agent.

01

Genuinely local-first

Every app repo gets its own .ghostrun/ workspace. Secrets stay in env vars and CI secrets โ€” never in the npm package, never in a third party's cloud.

02

Built for SaaS staging

OTP bypass for phone/WhatsApp auth. db:assert against staging Postgres for multi-tenant RLS checks. Webhook signature verification for Razorpay, Meta, and custom HMAC.

03

MCP-native, not bolted on

A real MCP server with tools for running suites, inspecting failures, and reviewing repair proposals โ€” not just raw click/type primitives.

04

Self-healing you can trust

Selector repairs are reviewable proposals, never silent mutations. Nothing changes your flow graph in CI without a human saying yes.

How it works

One workspace. Browser, API, and load โ€” together.

  1. Record Click through a real flow once against staging. GhostRun captures selectors, assertions, and API calls.
  2. Replay Run it headless, locally or in CI, against any profile โ€” staging, preview, or production-shadow.
  3. Watch it heal When a selector breaks, GhostRun proposes a fix. You review it โ€” or gate CI on it never applying silently.
  4. Hand it to an agent Connect Claude Desktop or Cursor via MCP. Ask it to run the smoke suite and summarize what broke.
~/your-saas-app
# record a flow against staging
$ ghostrun learn https://staging.yourapp.com

# run it in CI
$ export STAGING_QA_PASSWORD='...'
$ ghostrun run smoke --profile staging --ci --reporter junit

โœ“ checkout-guest       passed ยท 2.1s
โœ“ login-basic          passed ยท 0.8s
โœ“ signup-verify        passed ยท 3.4s

Key commands

A CLI, not a dashboard

Command What it does
ghostrunZero-config home menu
ghostrun learn <url>Record a flow
ghostrun explore <url>Auto-discover flows via BFS crawl + AI
ghostrun run <id> --ciRun a flow in CI mode
ghostrun suite:run smokeRun a named suite
ghostrun repair listReview self-healing proposals
ghostrun auditScan for secret leaks before committing
ghostrun doctorHealth check

Agent-native

Your AI assistant can run the whole thing

Connect Claude Desktop or Cursor and ask it to operate GhostRun directly โ€” run flows, inspect failures, review repairs โ€” through a real MCP server, not a screenshot loop.

claude ยท mcp ยท ghostrun
โ€บ Run the smoke suite against staging and tell me
  what broke, with a proposed fix if there's a selector issue.

โœ“ suite:run smoke --profile staging --ci
โœ“ 7 passed, 1 failed โ€” checkout-guest
โœ“ repair proposal: selector drift on "#submit-btn"
  โ†’ awaiting your review, nothing applied
{
  "mcpServers": {
    "ghostrun": {
      "command": "ghostrun-mcp",
      "cwd": "/path/to/your-saas-app"
    }
  }
}

Pairs with

GhostRun drives the app. Atlas simulates the world it depends on.

Most flaky SaaS tests fail because of the providers behind the app โ€” Razorpay retries, WhatsApp rate limits, delayed webhooks. Atlas is a stateful simulator for exactly those dependencies. Point your staging app at Atlas, then let GhostRun click through the UI and assert on what happens when a payment fails three times in a row.

Explore Atlas โ†’

Get started

Drop it into CI in one job

.github/workflows/qa.yml
jobs:
  qa:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npx playwright install chromium
      - run: ghostrun suite:run smoke --profile staging --ci --reporter junit
        env:
          STAGING_QA_PASSWORD: ${{ secrets.STAGING_QA_PASSWORD }}

MIT licensed. Node โ‰ฅ 20. No account, no telemetry you didn't ask for.