Hosted Appium runners for CI.
Every CI session boots Appium 3 with the UiAutomator2 driver on Android 12 to 16. Point WebdriverIO, Selenium or any W3C WebDriver client at the session URL. There is no SDK to vendor and no test format to adopt.
At a glance
- Appium
- Appium 3 with the UiAutomator2 8.x driver, pinned in the image
- Clients
- WebdriverIO, Selenium, or an Appium client in any language
- Device
- Android 12 to 16 on a phone or tablet; Android 14 phone is the default
- Artifacts
- Final logcat and a screen recording retained per run on Personal and above; crash reports on Team
- Hobby plan
- 1 parallel runner, 200 device-minutes a month, no card
What a hosted runner is
A hosted runner is one Android device booted for a CI session. SpawnDroid installs the build, exposes an Appium and WebDriver endpoint, and records the outcome, the logcat capture and a screen recording when the run finishes. Your pipeline brings the test framework; SpawnDroid supplies the device.
Two ways to connect
The stable hub
Configure one endpoint and one CI token, then choose the build by capability. The hub allocates a device, installs the build and injects the device serial on the first command. Nothing changes between runs, so there is no URL or device serial to re-derive.
A per-run session
Upload the build with a scoped API key, start a session with the build id, and read the webdriverUrl, device serial and app package from the response. Use this path when you need explicit control over the session or a session-scoped URL you manage yourself.
RESPONSE=$(curl -sS -X POST https://app.spawndroid.io/api/v1/sessions \
-H "Authorization: Bearer $SPAWNDROID_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"artifactId\": \"$APK_ID\"}")
WD_URL=$(echo "$RESPONSE" | jq -r '.webdriverUrl')
UDID=$(echo "$RESPONSE" | jq -r '.device.serial')What your pipeline gets back
- A pass or fail result recorded in the execution history.
- The final logcat capture, downloadable as raw lines or JSON (Personal and above).
- A screen recording of the run, stitched into one mp4 at teardown (Personal and above).
- An optional JUnit XML report, so failed tests are shown by name.
- Signed webhooks for session.started, session.ended and artifact.uploaded (Team).
What it does not do
SpawnDroid runs your Appium suite; it is not an in-process runner like Espresso or Robo. It covers Android 12 to 16, not a large device matrix, and there is no iOS runtime. The build is pre installed, so there is no appium:app capability; set appium:appPackage and appium:appActivity if you want Appium to launch it.
Hobby plan and limits
The Hobby plan includes one parallel runner with 200 device-minutes a month and no card. Concurrency and device-minutes are the limits: a second live session is rejected with a concurrency error until the first is stopped, and new sessions stop when the allowance is used. Hobby keeps 7 days of history, and each build expires 7 days after upload: the app stays in the workspace and runs again once the build is uploaded again. Paid plans always keep the newest release.
Frequently asked questions
Yes. Every CI session is a hosted Appium 3 server with the UiAutomator2 driver. Point any W3C WebDriver client at the session's webdriverUrl: WebdriverIO, Selenium or an Appium client in any language.
Keep reading
Start free
Point your suite at a hosted runner.
Upload a build, start a runner, and connect your existing WebDriver tests. The Hobby plan includes one parallel runner and 200 device-minutes a month, and needs no card.