Viatest

Instrument once.
See every screen.

Drop the SDK into your app, ship opaque tester IDs, and review activity in the workspace.

Viatest workspace Events view with filters and activity table

Quick start

Four steps from empty app to live events in the workspace.

  1. 01

    Create an app key

    In the workspace, open Apps → your program → About. Enable Viatest and copy the generated vt_test_ key.

  2. 02

    Add the SDK

    Android (:viatest-android), web (viatest-web), or React (viatest-react). Initialize once at startup.

  3. 03

    Identify & screen

    Call identify with an opaque tester id, then screen() on each meaningful view.

  4. 04

    Watch it land

    Run viatest-cli locally, exercise the app, and open Workspace → Events.

Android SDK

Initialize once. Identify the tester. Name the screens that matter.

Kotlin Application class initializing the Viatest SDK
Initialize in your Application class — emulator defaults to http://10.0.2.2:8123

Initialize

kotlin
class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        Viatest.initialize(
            context = this,
            apiKey = "vt_test_…",
            debug = BuildConfig.DEBUG,
        )
    }
}

Instrument

kotlin
Viatest.identify("tester_392")
Viatest.screen("Checkout")
Viatest.track(
    "checkout_tested",
    mapOf("payment_method" to "momo")
)
Viatest.flush()

Local project dependency: implementation(project(":viatest-android"))

Web SDK

Same calls as Android. History changes are recorded automatically; screen() sets the name you want in the workspace.

Initialize

typescript
import { Viatest } from "viatest-web";

Viatest.initialize({
  apiKey: "vt_test_…",
  debug: true,
});

Instrument

typescript
Viatest.identify("tester_392");
Viatest.screen("Checkout");
Viatest.track("checkout_tested", {
  payment_method: "momo",
});
Viatest.flush();

vt_test_ keys post to http://127.0.0.1:8123. Pass autoScreens: false to skip URL tracking. Query strings are never sent.

React SDK

Wrap the tree with ViatestProvider. In the Next.js App Router, render that provider from a client component.

tsx
import {
  ViatestProvider,
  useViatest,
  useViatestScreen,
} from "viatest-react";

export function App() {
  return (
    <ViatestProvider apiKey="vt_test_…" debug>
      <Checkout />
    </ViatestProvider>
  );
}

function Checkout() {
  const viatest = useViatest();
  useViatestScreen("Checkout");
  return (
    <button
      onClick={() =>
        viatest.track("checkout_tested", {
          payment_method: "momo",
        })
      }
    >
      Pay
    </button>
  );
}

useViatestScreen(pathname) follows the router. The package depends on viatest-web and reports batches as viatest-react.

Workspace

Staff filters by tester, app, platform, and screen. Testers see only their own activity.

viatest-cli terminal showing accepted screen_view batches
Local loop: run viatest-cli on :8123, then browse Events in the portal

Events

Tables of screens & time

Stats

Graphs across people & apps

Members

Per-tester deep dive

HTTP API

Prefer the SDK. For scripts and other platforms, POST a batch with a Bearer API key.

bash
curl -X POST http://127.0.0.1:8123/v1/events/batch \
  -H "Authorization: Bearer vt_test_…" \
  -H "Content-Type: application/json" \
  -d '{
    "sdk": { "name": "curl", "version": "0.1.0" },
    "events": [{
      "event_id": "evt_demo_1",
      "event_type": "screen_view",
      "timestamp": "2026-09-21T12:00:00.000Z",
      "platform": "android",
      "tester_id": "tester_392",
      "properties": { "screen": "Checkout" }
    }]
  }'
FieldRequiredNotes
event_idyesUnique; used for dedup
event_typeyesscreen_view, custom_event, …
timestampyesISO-8601 UTC
platformyesandroid · ios · flutter · web
tester_idnoOpaque id — never email
properties.screenscreen_viewDisplay name

Security defaults

Built in so you do not have to remember them under pressure.

  • Privacy filterDrops keys like password, token, pin, email from properties.
  • Opaque tester idsRejects emails and odd characters. Use tester_392 style ids.
  • vt_live_ keysRequire HTTPS. Use vt_test_ only for local cleartext.
  • Rate limitAbout 120 requests per minute per API key on the server.

Need help wiring an app? Talk to the team.