v0.26.0 · free to use · source-available CLI (BSL 1.1), MIT agent

Flutter E2E tests in
plain English

Write tests your whole team can read. Execute with direct widget-tree access — no accessibility layer, no WebDriver overhead.

login.probe
test "user can log in"
  open the app
  tap "Sign In"
  type "user@test.com" into "Email"
  type "secret" into "Password"
  tap "Continue"
  see "Dashboard"         <!-- 7 lines. Done. -->
Get StartedQuick Start Guide
~2x
0 of 20
Flaky FlutterProbe runs in that benchmark
3
Device kinds: emulators, simulators, physical
7
Migration formats

Architecture

Two components. One WebSocket. Zero flakiness.

probe CLI

Parses .probe files, manages devices, dispatches commands, generates reports

Go · 15MB binary
⇌JSON-RPC 2.0WebSocket :48686

ProbeAgent

Runs inside your app. Walks widget tree, executes actions, captures screenshots

Dart · dev dependency

Everything you need

No plugins to install. No extra packages. Batteries included.

N Natural language

ProbeScript reads like English. No locators, no async/await. QA, product, and engineering can all read the tests.

⚡ Direct widget-tree access

The Dart agent in your app reads the live widget tree. No XPath, no accessibility bridge, and widget keys work as selectors.

↻ Watch mode

Re-runs on file save with hot-reload awareness. No recompilation of the test between runs.

⊕ Cross-platform

Same tests on Android emulators, iOS simulators, and physical devices. WiFi mode for physical iOS devices. Permissions, lifecycle, and platform quirks handled automatically.

◉ Test recording

Record taps, swipes, and text input on a real device. FlutterProbe writes the .probe file as you interact. probe test --record also keeps a step-by-step recording of each test: screenshots, widget trees and the app's Dart HTTP calls, viewable offline.

△ Visual regression

Screenshot baselines with configurable pixel thresholds — full screen or cropped to a single widget. Catch unintended UI changes before they ship.

⬡ HTTP mocking

Mock API responses directly in test files. No external packages, no separate mock server.

✨ AI assertions, local-first

see "checkout looks correct" with ai — against your own OpenAI/Anthropic key or a fully local model. Screenshot redaction built in; nothing routes through our servers.

◼ Native UI automation

Drive pickers and share sheets outside the Flutter tree with tap native and see native. Android via uiautomator — no extra dependencies.

⍔ CI/CD ready

JUnit XML, JSON, HTML reports. Official Docker image. GitHub Actions workflow included. Test sharding with --shard N.

Side by side

Same login test. Different experience.

FlutterProbe7 lines
test "user can log in"open the app tap "Sign In"type "user@test.com" into "Email"type "secret" into "Password"tap "Continue"see "Dashboard"
flutter_test13 lines
testWidgets('user can log in', (t) async {
app.main();
await t.pumpAndSettle();
await t.tap(find.text('Sign In'));
await t.pumpAndSettle();
await t.enterText(
find.byType(TextField).first,
'user@test.com');
await t.enterText(
find.byType(TextField).last,
'secret');
await t.tap(find.text('Continue'));
await t.pumpAndSettle();
expect(find.text('Dashboard'),
findsOneWidget);
});

Migrate from anything

probe-convert handles 7 source formats. 100% construct coverage.

Maestro
Gherkin
Robot Framework
Detox
Appium Python
Appium Java
Appium JS

Zero to tests in 4 steps

01

Install

Single binary. No runtime deps.

brew install AlphaWaveSystems/tap/probe
02

Init

Scaffolds config and test directory.

probe init
03

Write

Plain English in a .probe file.

tests/login.probe
04

Run

Against any connected device.

probe test tests/ -v

FAQ

Can I test on physical iOS devices?

Yes. FlutterProbe supports physical iOS devices via USB or WiFi. WiFi is recommended — it provides a stable, drop-free connection. USB-C cables can cause intermittent disconnects due to charge/data mode switching. Build with --dart-define=PROBE_WIFI=true and connect with --host <device-ip>.

Why does my USB connection keep dropping?

USB-C cables switch between charging and data transfer modes, which momentarily disconnects the device. FlutterProbe auto-reconnects (up to 2 retries), but this adds latency. Switch to WiFi testing to eliminate drops entirely, or use a USB-A cable which doesn’t have this issue.

Does restart the app work over WiFi?

Yes. The CLI pre-shares a token with the agent before restarting. After restart, the agent uses the pre-shared token — no USB log reading needed.

What operations are unsupported on physical devices?

clear app data, allow/deny permission, and set location are skipped with a warning on physical iOS devices (no simulator sandbox access). On Android physical devices, only set location is unsupported. All other operations work normally.

Do I need to modify my Flutter app?

Add flutter_probe_agent as a dev dependency and call ProbeAgent.start() in your main entrypoint, guarded by --dart-define=PROBE_AGENT=true. No other changes needed. The agent is stripped from release builds.

Can I run tests in CI/CD?

Yes. FlutterProbe includes GitHub Actions workflows for Android (ubuntu + emulator) and iOS (macOS + simulator) with 3-way test sharding, automated app build, and HTML report generation. Use --format junit -o results.xml for CI integration.

Probe Cloud design partners

Probe Cloud, hosted test reports, is a preview and the service is not live yet. The first 10 teams try it free during the beta and get 50% off for life when paid plans launch, in exchange for feedback. The CLI stays free.

Try it now

$ brew install AlphaWaveSystems/tap/probe

Free to use for any purpose, including production, except offering a competing hosted testing service (the CLI is under BSL 1.1; the Dart agent is MIT).