Skip to main content
Taqwright logo✨ Coming soon · now in early access

Taqwright enables reliable end-to-end testing for mobile apps.

Cross-platform iOS & Android testing on the Playwright runner, with a flat mobile locator API on top of Appium 3. Write tests yourself, or let AI agents generate and drive them.

npx taqwright init

Taqwright is in early development (v0.0.x) and available for early piloting. Want to try it on your app? Join the early-access waitlist →

Taqwright SDK

Playwright-style API with auto-waiting, chainable locators, and retrying assertions. Drives native iOS & Android: UIKit, SwiftUI, Jetpack Compose, React Native, and Expo.

await mobile.getByLabel('Username').fill('emma@demoapp.com');
await mobile.getByLabel('Password').fill('10203040');
await mobile.getByLabel('Login').click();
await expect(mobile.getByLabel('View All')).toBeVisible();

Taqwright CLI

Zero-config setup that auto-discovers emulators & simulators. Scaffold, run tests, and verify your environment from the command line.

$ npx taqwright init
$ npx taqwright doctor
$ npx taqwright test
$ npx taqwright show-report

iOS & Android. One API. Real devices.

Any device, one API

Run the same tests across iOS and Android, on emulators, simulators, and real devices. A single flat mobile fixture drives them all.

Playwright runner, Appium engine

The Playwright test runner, reporters, and fixtures you know, driving Appium 3 (uiautomator2 & xcuitest), auto-started for you.

Cloud & parallel ready

Fan out across a local device pool, or run unchanged on BrowserStack and LambdaTest. Each worker gets its own isolated session.

Test the apps you build

Native, cross-platform, and hybrid apps on iOS & Android. If it renders to native components, Taqwright can drive it.

Apple
iOS
Swift
Swift / SwiftUI
Android
Android
Jetpack Compose
Jetpack Compose
React
React Native
Expo
Expo
Flutter
Flutter
Ionic
Ionic

Why Taqwright

Combining the power of Playwright and Appium to drive the device like a real user, with the tooling to prove it.

Complex gestures, first-class

Swipe in and out, pinch to zoom, scroll within a precise region, and drag & drop between elements, plus fully custom, multi-pointer W3C gestures when you need them. Every gesture auto-waits for the target, so flows stay reliable.

See the gesture API
gestures.spec.ts
// Swipe inside a carousel, list, or any element
await mobile.getById('carousel').swipeLeft();

// Pinch to zoom a map or photo
await mobile.getById('map').pinchOut();
await mobile.getById('map').pinchIn();

// Region-scoped, controlled scrolling
await mobile.scroll('down', { from: { y: 0.7 }, to: { y: 0.3 } });
await mobile.getByText('Accept').scrollIntoView();

// Drag and drop
await mobile
.getByText('Ship the release')
.dragTo(mobile.getById('column-done'));

// Custom multi-finger gesture
await mobile.gesture({ pointers });

Everything you need to test mobile, reliably

Auto-wait, no flaky tests

Actions wait for elements to be actionable and expect auto-retries until it passes or times out. No hard-coded sleeps, no race conditions.

Ranked, resilient locators

getById, getByRole, getByLabel, getByText, plus filter, nth, and chaining to pin down exactly the element you mean.

Inspector & codegen

A browser-based inspector mirrors the live device, ranks every locator by stability and uniqueness, and records your interactions into a runnable spec.

Trace & video debugging

Capture a per-action screenshot + page-source timeline as a self-contained trace.html, and screen recordings on failure, straight into the HTML report.

Parallel across a device pool

Declare a pool of devices, bump workers, and each worker gets its own isolated Appium server and device. No port collisions, no double-booking.

Run on real cloud devices

The same specs run unchanged on BrowserStack and LambdaTest: flip the project's provider, export credentials, and ship.

Generate tests from English

Describe a goal in plain language and lime-cli's QA agent drives a real device, returning a runnable Taqwright spec.

Full app lifecycle control

Install, launch, reset, background, and deep-link your app. Set resetBetweenTests for a clean install before every test.

Familiar Playwright API

The same test, expect, fixtures, reporters, and locator model you know from Playwright, now for native mobile.

Resilient • No flaky tests

Locators auto-wait for elements to be actionable before acting, and expect assertions retry until they pass. No more hard-coded sleeps.

Prefer stable locators like getById, getByRole, and getByLabel, ranked for you by the built-in inspector.

Learn more
drag-and-drop.spec.ts
import { test, expect } from 'taqwright';

test('drag a card into the Done column', async ({ mobile }) => {
const card = mobile.getByText('Ship the release');
const doneColumn = mobile.getById('column-done');

// press-and-hold to pick the card up, then drop it on the target
await card.dragTo(doneColumn, { duration: 600 });

// it now lives under the Done column
await expect(doneColumn.locator(card)).toBeVisible();
});