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 --url opens 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

  • Newsquiggle 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 5173 works too, and in a project whose app is a web app, a bare squiggle up finds its dev server
  • Newname a web app's address, browser, channel and window size under web in .squiggle/config.jsonc
  • New--production drives a production build you serve locally, and --maps <dir> reads its source maps when the server keeps them back
  • New--browser picks the browser by path or command name
  • Newsquiggle init sets up a Vite or Next.js app, and squiggle doctor says why a web page doesn't connect and how to fix it
  • Newsquiggle add screen writes the web version of each template, and a Next.js page for it
  • Newsquiggle crawl, squiggle motion, squiggle probe, squiggle save and squiggle load work on a browser tab. A save keeps the page, its stores, local and session storage, cookies and IndexedDB
  • Newsquiggle flows --shards N runs N flows at a time on a web app, and squiggle bisect and squiggle bakeoff with --platform web serve each commit from its own dev server
  • Newsquiggle benchmark --suite web scores your agent on a browser tab
  • Newsquiggle 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
  • Newsquiggle bench starts each run in a series a random 1.5 to 3 s apart, and records the machine's load beside each run
  • Fixsquiggle gate relaunch listens on the port from your config
  • Fixsquiggle probe replay --udid refuses a device Studio isn't focused on, instead of failing to find Studio
  • Fixsquiggle up --url starts 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, inspect and the rest
  • Newdeterministic_session turns off a tab's animations and pins its locale
  • Fixprobe_read answers a program whose data is large, instead of waiting until its deadline
  • Fixreport_card runs its flows instead of failing to connect

Flows & device

  • Newemulate: { userAgent } sets the browser tab's user agent, its User-Agent header and the client hints it implies. emulate also takes viewport, colorScheme and locale
  • NewlaunchApp: { 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's addCookies
  • Newthe device commands run on a browser tab: location, orientation, offline, permissions, scripts, screenshots, recordings and file uploads
  • NewaddMedia puts 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, selected and expanded, such as { testID: remember, checked: true }, on a web app
  • Newa route selector such as (tabs)/index matches a web address that never spells the group, so your iOS flows' routes work on the web
  • Newnetwork stubs, chaos and --twin work on a browser tab, including requests a service worker answers from its cache
  • Newassert smooth, the scroll blank-area check and memoryDelta measure 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
  • Fixsquiggle flow --headless drives the simulator --udid names
  • 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
  • Newperf profile, perf heap, perf crashes and perf symbolicate work 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 --platform filter accepts web

SDK

  • New@squiggle.sh/react connects 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
  • Newtransport: '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, find and inspect show 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