Skip to Content
DocsStart hereCompatibility matrix

Compatibility matrix

How klera compares to the major mobile E2E frameworks for React Native and native iOS / Android apps. Rows are graded against what an adopter actually ships against today — not what a roadmap promises.

Legend: ✅ shipped · ◐ partial / platform-limited · 🔜 deferred · ⛔ out-of-scope (not shipped by any framework on the list)

klera requires React Native New Architecture (Bridgeless / Fabric, default since RN 0.74). Old Architecture is not supported — the runtime probes global.RN$Bridgeless at startup and refuses to register otherwise.

Gestures and element interaction

CapabilitykleraDetoxMaestroAppium
Tap by testID / label / text
Long-press by element
Type text into input
Scroll
Swipe (direction or coordinate)
Tap at raw coordinate
Multi-touch / pinch / zoom
Self-healing strategy ladder

The matcher walks testID → accessibilityLabel → role + text → fuzzy text on every step, with bounded drift recovery and a full trace per attempt. Detox, Maestro, and Appium all couple to the first matching strategy and fail hard when it breaks.

Assertions and introspection

CapabilitykleraDetoxMaestroAppium
assert visible / notVisible
assert hasText
Per-step screenshot
Visual regression diff
State assertions (JS eval)

Detox image diffing requires the separate detox-snapshot-diff plugin. klera ships pixel-diff visual regression as a first-class IR step (visualSnapshot) with a baseline → actual → diff PNG triplet on mismatch and configurable tolerance.

State assertions (assertJS) run a sandboxed read-only expression against the runtime’s JS context — useful for asserting Redux state shape or computed properties without coupling to a UI selector.

Synchronisation

CapabilitykleraDetoxMaestroAppium
Animation-idle wait
Network-idle wait
Flaky retry / self-heal

A single waitForIdle step gates on animations + network. The runtime owns the activity counters: Animated / LayoutAnimation / rAF for animations; wrapped fetch / XHR / WebSocket for network. The engine owns the timeout.

Device state

CapabilitykleraDetoxMaestroAppium
setOrientation
Clipboard get / set
openURL deep link
Set location (simulator)
Set biometric result (simulator)
Camera frame injection
Microphone audio injection
Set location / biometric on device

iOS and Android do not expose public APIs for injecting camera frames, microphone audio, or sensor streams. Apps that need to exercise those flows solve it at the application-architecture layer with a debug-build fake — the same answer Detox, Maestro, and Appium give.

System UI

CapabilitykleraDetoxMaestroAppium
Dismiss native Alert
Dismiss ActionSheet
Dismiss soft keyboard
Hardware back (Android)
Permission prompts (simulator)
Permission prompts (device)
Permission grant (Android runtime)
Share sheets / pickers🔜
Cross-app / Springboard🔜

App lifecycle

CapabilitykleraDetoxMaestroAppium
backgroundApp
foregroundApp
Relaunch with launch args / URL
Push-notification payload🔜

Authoring modes

ModekleraDetoxMaestroAppium
Free-form prose flows (lead surface)
Run-time intent-drift recovery
In-app recorder (Cmd+Shift+R)
Recording mode (capture → .flow.md)
YAML steps (power-user opt-in)
Reads existing Maestro YAML flows
Code-based steps (JS / Swift)

Maestro Studio surfaces prose hints during authoring, but flows execute as committed YAML — intent isn’t preserved at run time, so its recordings break on the first UI change. klera records via the runtime’s existing event-synthesis layer and compiles to free-form prose plus a .flow.json cache; recordings inherit the same drift recovery prose flows get.

klera is declarative-only by design. Code-based steps remain the territory of Detox and Appium.

Observability and CI

CapabilitykleraDetoxMaestroAppium
JSON report artefact
HTML report (visual + sync)
Failure evidence capture
Auto-triage on failure
Cross-platform divergence (lockstep)
Network mocking + assertions
Proactive PR-time maintenance
JUnit XML output
OpenTelemetry-native runs
Watch-mode authoring
Zero-config adoption (klera init)
CI workflow scaffolds (klera ci)
JSON Schema for editor autocomplete
Live video recording🔜

Secrets, fixtures, and BYO-LLM

CapabilitykleraDetoxMaestroAppium
Data fixtures + secret refs
Secret redaction at every wire egress
BYO-LLM prose authoring
Local CLI planner (claude / codex / gemini)
MCP server for editor agents

Every framework on the list lets you reference env vars or a dotenv loader for credentials — that’s the basic ◐ row. None of them automatically scrubs the resolved value from snapshots, videos, or test traces. klera redacts at every wire sink by construction: ${secret:KEY} values never leak past the process boundary, so failure-evidence dumps, OTel spans, and reports are safe to upload without per-CI gating.

What’s NOT supported

These rows are real gaps. If you need them today, klera isn’t the right choice yet:

  • Code-based steps. No JS / Swift authoring path, and we don’t plan one. Adopters who need imperative tests stick with Detox or Appium.
  • Camera / microphone / ARKit injection. No public iOS or Android API exists. Solve at the app layer with a debug-build fake.
  • Set location / biometric on a physical device. Simulator-only; not a klera limitation, an OS one.
  • Live video recording during runs. Tracked but no committed schedule. PNG triplets per failure step ship today; a continuous MP4 doesn’t.
  • Push-notification payload injection. Tracked.
  • Share sheets and Springboard cross-app interactions. Tracked.
  • Hermes heap telemetry. CPU profiling ships as a read-only observability side-channel; heap inspection is deferred.

Driver selection

The engine picks a device driver per run:

  1. Native module (preferred). App has @klera/native-driver-ios or @klera/native-driver-android linked. Requires a dev client, not Expo Go. Engine sends device_action over the existing bridge; the native module answers directly. Zero external tooling, full parity, works on simulator and device.
  2. idb / adb fallback (Expo Go path). App has no native driver linked, so the runtime replies capability_unsupported. Engine falls through to Meta’s idb (iOS) or adb (Android). Simulator / emulator only; covers dismissAlert plus a subset of device state.
  3. Sim-host driver. xcrun simctl (iOS) or adb emu (Android) handles setLocation, setBiometric, and relaunch with launch args / URL.

klera doctor reports which driver is active before flows run, so surprises surface before the run, not during it.

Coming from another framework?

The Maestro-compatibility loader is a one-way bridge: klera detects Maestro-shape YAML at load time, converts to klera IR in memory, and runs it through the same Zod validator. Existing Maestro flows execute as-is; klera-only features (self-healing matcher, network mocking, parallel divergence detection, OTel-native runs, prose authoring, fixtures + secrets) require klera-shape authoring.

What “feature parity” means here

For a flow author, parity means: anything you’d write against Detox or Maestro, you can write against klera without reaching for shell scripts or out-of-band tooling. That’s the bar for the ✅ rows.

For 🔜 rows, we have a clear path but no shipped work yet — often because the demand hasn’t surfaced from real adopters. File an issue if you hit one.

Last updated on