ChangelogReact web apps
0.4.0
Released 27 October 2026.
Squiggle drives React web apps. Open any react-dom app with squiggle up --url and the flows you wrote for your iOS app run on it unchanged, with nothing to install in the app. Studio, your agent's tools, performance and product analytics all work on a browser tab, and the CLI runs on Linux.
Desktop app
- NewStudio lists each browser tab that
squiggle up --urlopens beside your simulators. It mirrors the tab, and you can click, type and scroll in it, pick components and record taps - Newthe Devices list has a Web filter while a tab is open
- NewPerformance has a Web Vitals lane, and LCP, INP and CLS tiles when a session recorded them. The platform filter offers Web
- Fixa device whose app isn't connected says Waiting for app, not another device's app
CLI
- New
squiggle up --url <address>opens a React web app in a Chrome, Chromium or Edge window that Squiggle drives, with nothing installed in the app.squiggle up 5173works too, and in a project whose app is a web app, a baresquiggle upfinds its dev server - Newname a web app's address, browser, channel and window size under
webin.squiggle/config.jsonc - New
--productiondrives a production build you serve locally, and--maps <dir>reads its source maps when the server keeps them back - New
--browserpicks the browser by path or command name - New
squiggle initsets up a Vite or Next.js app, andsquiggle doctorsays why a web page doesn't connect and how to fix it - New
squiggle add screenwrites the web version of each template, and a Next.js page for it - New
squiggle crawl,squiggle motion,squiggle probe,squiggle saveandsquiggle loadwork on a browser tab. A save keeps the page, its stores, local and session storage, cookies and IndexedDB - New
squiggle flows --shards Nruns N flows at a time on a web app, andsquiggle bisectandsquiggle bakeoffwith--platform webserve each commit from its own dev server - New
squiggle benchmark --suite webscores your agent on a browser tab - New
squiggle probe replay --udid web:<origin>replays a flow in Studio on a browser tab Studio has focused - Newthe CLI runs on Linux, x64 and arm64:
npm install -g @squiggle.sh/cli. A Linux machine is licensed by its machine ID - New
squiggle benchstarts each run in a series a random 1.5 to 3 s apart, and records the machine's load beside each run - Fix
squiggle gate relaunchlistens on the port from your config - Fix
squiggle probe replay --udidrefuses a device Studio isn't focused on, instead of failing to find Studio - Fix
squiggle up --urlstarts Chrome again when it hangs before opening
Agents & MCP
- Newyour agent drives a browser tab the same way it drives an app:
target,status,describe,find,tap,screenshot,inspectand the rest - New
deterministic_sessionturns off a tab's animations and pins its locale - Fix
probe_readanswers a program whose data is large, instead of waiting until its deadline - Fix
report_cardruns its flows instead of failing to connect
Flows & device
- New
emulate: { userAgent }sets the browser tab's user agent, itsUser-Agentheader and the client hints it implies.emulatealso takesviewport,colorSchemeandlocale - New
launchApp: { seed: { cookies, localStorage, sessionStorage } }opens a web app with cookies and storage already in place, so its first page load reads them. Cookies take the same fields as Playwright'saddCookies - Newthe device commands run on a browser tab: location, orientation, offline, permissions, scripts, screenshots, recordings and file uploads
- New
addMediaputs a flow's files in the iOS simulator's photo library and On My iPhone, where the photo and document pickers find them - Newselectors take
checked,selectedandexpanded, such as{ testID: remember, checked: true }, on a web app - Newa route selector such as
(tabs)/indexmatches a web address that never spells the group, so your iOS flows' routes work on the web - Newnetwork stubs, chaos and
--twinwork on a browser tab, including requests a service worker answers from its cache - New
assert smooth, the scroll blank-area check andmemoryDeltameasure a browser tab - Fixa tap on an iOS 26.4 share sheet lands on the control it names
- Fixa hidden match no longer makes a visible one ambiguous
- Fix
squiggle flow --headlessdrives the simulator--udidnames - Fixa selector with a field Squiggle doesn't know points you to the selectors page on squiggle.sh
Performance
- Newa browser tab records Web Vitals, its frame rate, CPU and heap, network requests with their phases, storage reads and writes, console lines and errors
- Newthe detectors fire on a web app: slow screens, stalls, memory leaks, request waterfalls, JS-driven animation, render storms and memo misses, each naming your source line
- Newa stall on a web app arrives with its CPU profile, named by the hook and line that ran
- New
perf profile,perf heap,perf crashesandperf symbolicatework on a browser tab, through its source maps - Fixa symbolicated JS frame names the column the code is at, not the one after it
- Fixa stretch over which the frame rate held steady reports that rate, not "frames unmeasured"
Product analytics
- Newtaps and drags on a web page are captured, so recordings, the heatmap and friction findings work on the web
- Newthe
--platformfilter acceptsweb
SDK
- New
@squiggle.sh/reactconnects your own browser, or any browser, to Squiggle. Add its plugin for Vite (@squiggle.sh/react/vite), Next.js (@squiggle.sh/react/next), webpack and Rspack (@squiggle.sh/react/webpack), or esbuild and Bun (@squiggle.sh/react/esbuild). It runs only in development: a production build carries none of it - New
transport: 'proxy'connects a page through its dev server, for HTTPS and other machines - Newwith a plugin, Zustand stores are named after the variable they are assigned to, and Legend State stores are observed
- Newon a web app,
describe,findandinspectshow the line that renders each element and name each hook, with no Babel plugin - NewRedux and Jotai stores are observed, in React Native and web apps. TanStack Query is observed in web apps
- Newroutes come from React Router, TanStack Router and Next.js's App and Pages Routers
- Newin a React Native development build, call sites, definitions and hook names still show when the Babel plugin's source lines are off
- Newthe Babel plugin is also at
@squiggle.sh/react-native/babel, installed with the SDK - Fixa bare React Native app links Squiggle's native code
- FixSquiggle's app port refuses requests from web pages, so a page you visit can't pose as your app