NEW Multi-tenant runner v0.1 — now in private beta

Test automation,
built for white-label crypto exchanges.

One control plane for every tenant. Schedule and run end-to-end checks against your exchange — login, balance, orders, withdrawals — and catch regressions before your users do.

oxoqa · runs run #1042 running
binance-fork-tr · qa env
01 api_login 218 ms
02 ui_set_auth 12 ms
03 ui_navigate /trade/btc-usdt 642 ms
04 ui_inspect_page 380 ms
05 api_place_order limit 0.001 BTC-USDT 312 ms
06 assert_equals order.status == filled running
07 api_cancel_order

Trusted by exchange operators in production

  • exchange.tr
  • fork.io
  • trade.eu
  • vault.fi
  • spot.tr
  • broker.xyz
The Platform

Everything the QA team stopped doing by hand.

Five primitives. One platform. Built specifically for the multi-tenant reality of running white-label crypto exchange software.

01 Scenarios

Write scenarios in YAML — or have AI write them for you.

Compose end-to-end checks from a versioned action catalog: api_login, ui_navigate, api_place_order, assert_equals. Monaco-powered editor, schema validation, AI scaffolding from your page catalog. No bespoke test runner per tenant.

spot-trade-happy-path.yaml yaml
name: spot-trade-happy-path
prod_safe: false

steps:
  - action: api_login
    inputs:
      email: ${test_user.email}
      password: ${test_user.password}
      expect_envelope_success: true
      unwrap_data: true
    save_as: auth

  - action: api_place_order
    inputs:
      token: ${auth.token}
      side: buy
      type: limit
      pair: BTC-USDT
      amount: 0.001
      price: 30000
    save_as: order

  - assert: equals
    inputs:
      actual: ${order.status}
      expected: filled
What's inside

Built for the realities of running an exchange.

Each primitive solves a problem we hit ourselves running QA on white-label exchange forks. Nothing is generic. Everything is operator-tested.

01 Feature

Bootstrap any exchange in minutes

The runner ships a one-shot page cataloger (ui_inspect_page) that walks your panel, extracts interactive elements, and seeds page_selectors automatically. Plug in a tenant, click Bootstrap, write scenarios.

02 Feature

AI-generated scenarios

From a page catalog + a one-line intent, generate a draft YAML scenario. You stay in control — the AI pipes through Monaco for review, schema validation, and edit before save.

03 Feature

Hybrid API + UI tests

Bridge auth between API and UI with ui_set_auth. Skip the brittle login UI, run business logic against api_*, then jump into ui_* for the things only the browser can verify.

04 Feature

Captures stored privately

Screenshots, HAR, and network bodies land in private buckets — pulled on failure, expired on a schedule. Three buckets, three TTLs. Storage doesn't grow forever.

05 Feature

Twilio SMS for OTP-gated flows

auth_wait_sms polls a Twilio inbox webhook for the OTP code your exchange just texted. Authenticator App? auth_solve_totp handles that too. 2FA-protected scenarios run unattended.

06 Feature

Realtime streaming

Steps, captures, and assertions stream over Supabase Realtime. Live console renders them as they happen — no polling, no refresh dance, no log tailing.

Action Catalog

36 curated actions. One YAML grammar across every tenant.

The runner ships a versioned catalog of test primitives — not a general-purpose Playwright wrapper. Each action is purpose-built for exchange flows: login, balance, orders, withdrawals, KYC, 2FA. Versioned. Documented. Schema-validated in the editor.

API 9

HTTP against your exchange backend

  • api_request
  • api_login
  • api_logout
  • api_get_balance
  • api_get_user_info
  • api_get_kyc_status
  • + 3 more
UI 13

Browser interactions via Playwright

  • ui_navigate
  • ui_wait_for
  • ui_click
  • ui_click_if_visible
  • ui_click_and_expect
  • ui_type
  • + 7 more
Assert 12

Verify your data is correct

  • assert_equals
  • assert_not_equals
  • assert_defined
  • assert_undefined
  • assert_truthy
  • assert_falsy
  • + 6 more
Auth 2

TOTP + SMS 2FA helpers

  • auth_solve_totp
  • auth_wait_sms
For Production

Built for the operators
actually shipping exchanges.

Tenant-scoped RLS at the database. Three private capture buckets with enforced TTLs. Admin / QA / Viewer role separation. Audit log for every trigger. Production-mode scenarios refuse destructive actions unless explicitly whitelisted.

100%

Tenant isolation

RLS-backed, per-org buckets

5 min

To first run

Bootstrap → scenario → trigger

0

Lines of bespoke code

Per new white-label

Stop testing your exchange
by hand.

Book a 20-minute demo. We'll bootstrap one of your tenants live and show you the first scheduled smoke check running against it.