# 0.5.0

Released 29 October 2026.

Adding the SDK is the whole setup for an iOS app: a debug build on the simulator starts Squiggle by itself, so `squiggle up` is optional, the first performance baseline is taken on your first run, and updating Squiggle needs no rebuild. Your agent's MCP server now watches the app the whole time it runs and tells the agent what broke, with a recording of it. Squiggle also runs inside a Niteshift task.

A release build of your app carries no Squiggle unless you set `"release": true` in `.squiggle/config.jsonc`. In CI, the runner must be able to reach `license.squiggle.sh` over HTTPS on its first licensed command.

## Desktop app

- **New**: compact mode has an App menu with Reload JS, Open link from clipboard and your recent links
- **New**: the device heatmap labels the drags Analytics reads as a gesture, such as "Swipe to dismiss"
- **Fix**: Relaunch app, Relaunch injected, the permission switches and the launch after a boot act on your app, not Squiggle's example app
- **Fix**: reloading Studio no longer crashes it or leaves the loading banner stuck

## CLI

- **New**: `squiggle agent watch --incidents` prints one line per recorded incident, so an idle agent can wait for the next one
- **New**: `squiggle release` frees the app from whatever holds it, including a run waiting for an agent's answer
- **Fix**: `squiggle flow --from-recording -o <file>` creates the file's folder when it doesn't exist
- **Fix**: `squiggle crawl` skips controls named "Log out" and "Check out", as it does "logout" and "checkout"
- **Fix**: `--fresh` captures the app's log output, so log asserts work after a relaunch
- **Fix**: every error message names a fix you can run, and an agent port already in use is `E_AGENT_PORT_BUSY`
- **Fix**: a device command on Linux with no device provider says how to reach a device, instead of asking you to build a macOS helper

## Agents & MCP

- **New**: the MCP server watches the app from the moment it starts, the way Studio does. When the app throws, crashes or stalls, it records the moment, and your agent's next tool result says what broke, at which line of your code, and which of its own actions it followed
- **New**: live performance findings, such as a render storm or a long task, reach your agent the same way while the app runs
- **New**: the `incidents` tool lists what was recorded, each one replayable with `replay_recording`, and `squiggle://incidents` serves the newest ones
- **New**: `watch` in `.squiggle/config.jsonc` sets whether the server watches, how it tells your agent (`push`: `notice`, `channel` or `none`), whether it records, and how much it keeps. `SQUIGGLE_WATCH=0` turns it off for one run
- **New**: `publish_evidence` puts screenshots and recordings in the description of a pull request you opened, and needs no app running. `squiggle init --pr-evidence` turns it on
- **Fix**: the safety rail checks the control a tap actually lands on, not only the selector your agent sent

## Flows & device

- **New**: `setLocation` and `setPermissions` run on the iOS simulator
- **New**: `toggleAirplaneMode` is in the published flow schema, so your editor stops flagging it

## SDK

- **New**: a release build gets a stand-in for the SDK: the same exports with none of its code, and Squiggle's native library links into Debug builds only. Set `"release": true` in `.squiggle/config.jsonc` to keep Squiggle in a release build
- **New**: a production build of a web app gets a 10 KB stand-in for `@squiggle.sh/react`, with no setup

## Everything else

- **New**: a debug build of your app on the iOS simulator loads Squiggle's agent by itself, so you no longer run `squiggle up` before driving it. `squiggle init` no longer adds it to your `ios` script
- **New**: your first `squiggle flow`, `squiggle flows` or `run_flow` records the first performance baseline when the project has none
- **New**: after you update Squiggle, the next `squiggle flow` brings your app's copy of the agent up to date and relaunches the app if it still runs the old one. `squiggle doctor --fix` does the same
- **New**: `squiggle flows` launches your app itself, from the `appId` in your flows or `apps.ios` in `.squiggle/config.jsonc`
- **New**: run Squiggle in a Niteshift task: set `"device": { "provider": "niteshift" }`, and the CLI and MCP server on the task's Linux sandbox drive the app on its simulator. Steps outside the app, such as a launch or a system dialog, go to the task's agent
- **New**: in a Niteshift task, nothing leaves the sandbox on Squiggle's initiative: no telemetry, crash reports or update checks, and `publish_evidence` writes its files for the task to attach
- **New**: `squiggle doctor` says when the app's agent comes from another release, and `squiggle bench` never compares a run on a Niteshift simulator with a local one
- **Fix**: a CI runner that can't reach `license.squiggle.sh` stops with `E_LICENSE_UNREACHABLE` (exit 3) and names the host to allow, unless it got a place with the same token in the last 24 hours. Before, it ran unlicensed
- **Fix**: a CI runner is counted by a random ID kept in `~/.squiggle`, never by anything about the machine, and keeps its place for as long as a long run or an MCP session lasts
- **Fix**: a project's `.squiggle/config.jsonc` can turn telemetry and crash reports off for everyone who clones it, never on. Studio asks again when you switch to such a project
- **Fix**: an incident recording stops 20 seconds or 8 MB after its trigger, the same problem again isn't recorded twice, and old data is cleaned up during a long session
