Your React Native app, tested, profiled and driven from the inside.
Squiggle is one import that lets your tools see what your app is actually doing: every component, route, request, tap and frame. Tests stop breaking on redesigns, slowdowns point at the line that caused them, and your AI agent can use the app like a teammate instead of guessing from screenshots.
The browser demo is the real Studio, driving a live demo app. Nothing to install.
to install
1line1line
One import in index.js. No provider, no config file.
of rewind
5s5s
Kept before every crash, error or stall, ready to replay.
agentic flow, replayed
0turns0turns
Once an agent solves a step, later runs need no model.
agent tap
≤185ms≤185ms
For an agent to tap and see what changed on screen.
01 — The idea
One model of your app, instead of a tool per job
Most tools look at your app from the outside: pixels, coordinates, sampled stacks, hand-written events. Squiggle runs inside it and keeps one live model of what it is doing. Tests, performance, analytics and agents all read that same model, so they agree with each other and with the code.
UI tests that tap coordinates and break on every redesign→Flows that name what a control is, and repair themselves when it moves
A profiler that hands you samples and leaves the detective work to you→Findings that name the component, the request or the line
An analytics SDK you tag by hand, screen by screen→Screens, taps and funnels the app was already reporting
An AI agent squinting at screenshots and guessing coordinates→An agent that reads the app itself and acts by name
02 — Testing
Tests that survive a redesign
A Squiggle flow names a control by what it is, not where it sits. Try it: ship a redesign to this screen, then rename the button's testID, and watch which tests keep passing.
9:41PlexusWelcome backEarn 5% on USDT →EmailPasswordSign in
An agent: step states a goal. Your coding agent drives it once, the assert proves it worked, and every later run replays it with no model.
Terminal
$ squiggle record checkout-bug # use the app by hand, Ctrl-C to stop$ squiggle flow --from-recording .squiggle/recordings/checkout-bug.sqrec \$ -o flows/checkout.yaml # a draft flow of what you did
Use the app by hand and get a draft flow, including an honest list of the taps nothing durable could identify.
A pass means it happened. Assertions look at the app again, because a tap that was sent is not the same as a tap that worked.
Failures explain themselves. The report names the step, what it looked for, what was there instead, and what to try next.
Repairs are reviewable. A healed selector is rewritten in the flow file, so the fix arrives as a diff, and the run says how many heals it took to pass.
03 — AI agents
Your coding agent can finally use your app
Connect Claude Code, Copilot or Codex with one command. Instead of a screenshot-and-guess loop, the agent writes the whole journey as one program. Squiggle runs it and asks the model again only when something needs a decision. Watch where the model turns go:
TaskSign in and check the balance
A typical agent loop
Screenshot, think, act, one action at a time.
look
email
look
password
look
Sign in
look
wait for Home
look
balance
5model turns
Squiggle, first run
One program for the whole journey. The model is woken again only for a decision, like a popup.
plan
email
password
Sign in
wait for Home
balance
1model turn
Squiggle, every run after
The verified steps were saved beside the flow, so they replay with no model at all.
email
password
Sign in
wait for Home
balance
0model turns
01
Reads the app, not pixels
The agent sees the component tree, the route and the state, and taps controls by name. Each action returns what it changed, so the next step needs no extra look.
02
Destructive taps need you
Squiggle refuses risky actions below the model, not in a prompt. You approve each one explicitly, once, and it is logged. Your flow secrets never reach the model.
03
Claims you can check
Everything the agent reports points at the session and event it came from, so you can verify a claim instead of trusting a summary.
04 — Performance
Slowdowns that point at the line
Squiggle records performance all the time, with no profiling session to start. Detectors read it and report what they find in plain words, with the source line, the evidence, and a fix your agent can make. Pick one:
warnrender-storm
PriceTicker rendered 48× in one interaction
Where
src/screens/Markets.tsx:41
Evidence
48 commits after one tap on Markets, each linked to its render row
propose_fix → your coding agent
PriceTicker reads the whole prices store, so every tick renders it. Select only the price it shows, then re-run the flow to confirm the finding is gone.
Live in Studio. Findings appear while you use the app, each announced once, not buried in a report you have to remember to open.
Gate it in CI. Snapshot a baseline, diff a branch against it, and fail the pull request when a number moves the wrong way.
All the way down. Flamegraphs, heap diffs, a network waterfall and symbolicated native crashes, from the same recorded session.
Terminal
$ squiggle perf snapshot --label main# … change something, run the flow again …$ squiggle perf diff --against main --assert thresholds.json # fails CI on a regression
05 — Studio
See inside your app while it runs
Studio is the Mac app around all of this. Every card below opens it right here in your browser, on a live demo app, with a short guided tour.
Works with Expo and bare React Native apps, on iOS simulators and devices, and with react-native-macos apps. Squiggle stays idle until a tool connects to it.
Terminal
$ bun add @squiggle.sh/react-native # the SDK: the only Squiggle code in your app$ npm install -g @squiggle.sh/cli # the squiggle command, and the MCP server$ squiggle init --agent claude # wire it in; or copilot, or codex$ squiggle up &&squiggle flow login # launch with Squiggle attached, run a flow
Public beta · 0.2
Try it on your own app
Squiggle is used every day on a real React Native app, so everything above is in the present tense. The CLI is on npm, the Mac app is signed and notarised, and the trial is fourteen days with no card. If you build React Native on a Mac, come and break it.