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 and 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, with 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.