Concepts

A project is one app. A build is a version of it – an uploaded file, a store link, a repository commit or a URL. A test run combines a build, your objectives and an environment. The AI agent plans test cases, executes them on devices provided by hosts, and records findings with evidence.

Run lifecycle

QUEUED → PREPARING (device reserved, app installed) → PLANNING (test cases drafted from your brief and the first screen) → RUNNING → ANALYZING → PASSED | FAILED. A run fails if any test case fails or a critical/high finding is recorded. The score (0–100) is the priority-weighted pass rate minus penalties for findings.

Host agent

The host agent runs on any machine with devices attached. It opens an outbound WebSocket to Repaw, reports its devices and executes a fixed, safe set of device commands (install, launch, screenshot, accessibility tree, tap, swipe, type, logs). It never runs arbitrary shell commands from the server.

Install

Create a host under Devices → Add host, then run the shown command on the machine:

npx repaw-agent connect --server wss://repaw.app/agent --enroll rpe_… --name "QA Mac mini"

The issued host token is stored in ~/.repaw/agent.json. Later, simply run npx repaw-agent connect.

Requirements

  • Android: platform-tools (adb) on PATH or in ANDROID_HOME; emulators running or devices connected with USB debugging.
  • iOS Simulator: macOS with Xcode; boot the simulators you want to expose. UI automation uses idb.
  • Check your setup with npx repaw-agent doctor; list visible devices with npx repaw-agent devices.

Backends & safety

Every run declares which backend the build talks to:

  • Sandbox ready – the agent may create data and use the test payment methods you provide.
  • Sandbox needs configuration – your notes tell the agent how to switch (debug menu, flag, URL). Until confirmed it behaves as in production.
  • Production (protected) – no purchases, deletions, cancellations, outgoing messages or account-security changes. Such cases end as “blocked”.

Credentials are encrypted with AES-256-GCM. The model only sees placeholders like {{credential:password}}; values are substituted on the way to the device and redacted from logs.

Languages

The Repaw interface is available in English and German. It follows your browser language until you pick one in the language menu; the choice is saved to your profile.

  • Report language – the agent writes the test plan, verdicts, findings and summary in the run’s report language. It defaults to your organization’s setting and can be changed per run.
  • Device languages – add one or more device languages (e.g. de-DE, ar-SA) to a run and the plan is executed under each of them. The agent then also checks for missing translations, truncated text, wrong date/number formats and broken right-to-left layouts, and records them as localization findings.

REST API

Authenticate with an API token from Settings → API tokens.

Authorization: Bearer rpw_live_…

Error messages follow the Accept-Language header; the code field is stable and language-independent.

Endpoints

GET/api/projectsList projects
POST/api/projectsCreate a project
POST/api/projects/:id/builds/upload?fileName=…Upload a build (raw body)
POST/api/projects/:id/buildsAdd a STORE, URL or REPOSITORY build
POST/api/runsStart a test run
GET/api/runs/:idRun with test cases, steps and findings
GET/api/runs/:id/eventsServer-Sent Events stream
GET/api/runs/:id/reportMarkdown report
POST/api/runs/:id/cancelCancel a run
GET/api/findingsFindings (filter by projectId, severity, status)

CI/CD

Upload the build produced by your pipeline, start a run and fail the job if Repaw does not pass it:

BUILD=$(curl -sf -X POST "https://repaw.app/api/projects/$PROJECT/builds/upload?fileName=app.apk&version=$VERSION" \
  -H "Authorization: Bearer $REPAW_TOKEN" --data-binary @app/build/outputs/apk/release/app.apk | jq -r .build.id)

RUN=$(curl -sf -X POST "https://repaw.app/api/runs" -H "Authorization: Bearer $REPAW_TOKEN" -H "content-type: application/json" \
  -d "{\"projectId\":\"$PROJECT\",\"buildId\":\"$BUILD\",\"objectives\":\"$(git log -1 --pretty=%B)\",\"backendMode\":\"SANDBOX_READY\"}" | jq -r .run.id)

while true; do
  STATUS=$(curl -sf "https://repaw.app/api/runs/$RUN" -H "Authorization: Bearer $REPAW_TOKEN" | jq -r .run.status)
  case $STATUS in PASSED) exit 0;; FAILED|ERROR|CANCELLED) echo "Repaw: $STATUS"; exit 1;; esac
  sleep 20
done