Download

Three surfaces, one licence

The desktop app, the CLI and the MCP server are the same product with three front doors. Activate once and all three work — there is no second key and no second trial.

Install

Pick your front door

Most people want the desktop app and the CLI. Add the MCP server when you want an agent driving the app rather than you.

Recommended

Desktop app

Eight screens — Devices, Flows, Inspector, Analytics, Performance, Product, Replay and Agent. The CLI is bundled inside it, so installing the app installs both.

Download for macOSApple Silicon · macOS 15+

For the terminal

CLI

Flows, crawls, benches, recordings, perf and product analytics, and the intent runtime — the surface CI talks to. Sixty-three typed leaves under twenty-eight commands.

Terminal
npm install -g squiggle-cli

For agents

MCP server

Registers seventy-five tools with your agent, then writes the matching skills, subagents and slash commands into .claude/.

Terminal
claude mcp add squiggle -- squiggle mcpsquiggle agent kit --install

The desktop app also offers Install CLI in PATH…, which is the shortest route if you already have the app. Checksums for every artifact are published at SHA256SUMS.

Requirements

What you need first

  • An Apple Silicon Mac on macOS 15 or later. The host injects into simulator processes and drives them over real HID, which is Apple-Silicon-only by construction.

  • Xcode. Squiggle drives the iOS simulator, so you already have it — but it is a hard requirement, not a suggestion.

  • A React Native app you can rebuild. The SDK is one import in your entry file; nothing works without it in the app.

Licence

Activate once, work offline

Activation writes a signed grant to ~/.squiggle/license.json. The CLI, the MCP server and the desktop app all read that one file, so no key is ever pasted into a terminal history or an agent conversation.
Terminal
squiggle activate --trialsquiggle activatesquiggle license
entitled
a seat, valid and offline-honoured
trial
a trial in progress, same capabilities
expired
the grant ran out — paid commands refuse
unlicensed
no grant on this machine yet
  • Offline by default. The grant is honoured until it expires with no network at all — a licence check never adds latency to a command and never fails a run that worked a minute ago on a train. Revalidation happens in the background, after the command was already allowed through.
  • It refuses with a reason. squiggle license prints which of the four states you are in and why, and a paid command that refuses names the requirement rather than exiting on a bare code.
  • CI is a separate credential. SQUIGGLE_LICENSE_TOKEN is not machine-bound, because a runner is a new machine on every build.
  • Your key is never stored. Only its last four characters, so the CLI can show you which one is active.

Get started

From zero to a running flow

Three commands, in this order. The second one is the one that saves the afternoon.
  1. Add the SDK, then rebuild

    One import at the top of your entry file. Rebuild rather than reload — the dev agent is native.

    Terminal
    bun add @squiggle/react-native# then, as the FIRST line of your entry file:#   import '@squiggle/react-native';
  2. Prove the plane is live

    The important one. Doctor checks every link in the chain — simulator booted, app installed, agent injected, host reachable — and names the remedy for anything that is not.

    Terminal
    squiggle doctor
  3. Drive it

    A flow by name from .squiggle/flows, or by path. The run is captured, so the failure you see is the one a colleague replays.

    Terminal
    squiggle flow flows/login.yaml