LLM-native E2E for Expo & React Native

Anyone who writes tickets can write end-to-end tests.

Open-source, self-healing E2E testing for React Native & Expo.

Describe the scenario in plain prose; klera compiles it into a self-healing flow that runs on real devices. No API key, no it() blocks, no QA bottleneck.

flows/sign-in.flow.mdfixtures/test-account.yaml agent · writing
Waiting for the agent to draft the flow…
·Metro is watching. Save to compile.
9:41
Home
@morgan3m
Just shipped klera v0.4 — drift recovery in CI.
flow passed · 1.2s
01same prose · three redesigns

The same prose flow ran through three redesigns. Nobody touched the test.

One file, three months apart. The button got renamed twice and moved once; the prose stayed the same. The matcher walks a strategy ladder and recovers across drift it can resolve.

v1·launched in march
flows/sign-in.flow.mdunchanged across all three
Enter the test fixtures, tap sign-in, then assert the home feed loads.
running on Sign In
fixtures/test-account.yamltest data
email: test@klera.dev
password: hunter2-pass
9:41
Welcome back
Sign in to keep your trips synced.
test@klera.dev
••••••••
Welcome back
Pick up where you left off.
test@klera.dev
••••••••
Hi again.
Pick up where you left off.
test@klera.dev
••••••••
02about that LLM dependency

The LLM compiles your prose. It never runs your tests.

The planner is a build-time compiler. The runtime is a deterministic IR walker. Unplug the model and your existing flows still pass.

01Compile-time only

The LLM never sees a passing run.

Run an LLM call once when you save a .flow.md. Commit the IR cache. From then on, runs are deterministic — same input, same output.

runtime: 0 LLM calls
02Your code stays local

Source code never leaves your machine.

The planner sees the prose flow and the element-graph snapshot — nothing else. Secrets are scrubbed from every wire-bound payload before it leaves the process.

snapshot only · zero source access
03Swap any planner

Four interchangeable transports. Free under your existing CLI.

Anthropic API, your local Claude / Codex / Gemini CLI, an MCP server, or paste-into-any-chat. All produce identical IR. Edit one config line to switch. No vendor lock-in.

apivia-clivia-mcpmanual
03analytics on every failure

Every failure ships with a full forensic record.

A verdict, a suspect commit, frames, and a written narrative. Open the report and you know whether to revert, update the flow, or rerun.

failureflows/checkout-android.flow.mdstep 4 of 6 · failed at 00:12.4 · 2026-04-29
last frame · captured
verdict
regressiondriftflakedata

The runtime tapped “Place order”, but the next screen never mounted. The element graph shows the button transitioning to disabled — no navigation event followed.

suspect commit
a1c4f29checkout: gate submit on payment-method validity@miyu · 2h ago · packages/checkout/src/PlaceOrderButton.tsx · first flow run after this commit to fail
proposed fix · pick a payment method before tapping
- Tap “Place order” and confirm the order receipt appears.
+ Pick a saved card, tap “Place order”, and confirm the order receipt appears.
Open PR with this fix View element graph__failure-evidence__/checkout-android/14-22
07 / parity
framework comparison

Where every framework agrees, and where they don't.

CapabilitykleraDetoxMaestroAppium
Prose-first authoring (no API key)
Save-on-compile dev loop (Metro plugin)
Coding-agent integration (AGENTS.md)
Self-healing under UI drift
Auto-triage on failure
Visual flow-diff in PRs
Reads existing Maestro YAML flows
Visual regression diff
Network mocking + assertions
tap (by testID / label / text)
type text into input
swipe (direction or coordinate)
Hardware back (Android only)
Permission grant (Android runtime)
supported partial not supported
See the full compatibility matrix →
04 / install

Try it on a flow tonight.

One command and a flows/ directory. Works against bare Expo and managed RN projects. Free, MIT licensed, no account.

$ npx @klera/cli init

klera init scaffolds the prose flow, the IR cache, the Metro plugin, and the AGENTS.md brief. After it finishes, save a prose change and watch the flow run.