Changelog
What’s new in Squiggle: every feature, every fix and every speed-up, newest first. The desktop app, the CLI, the MCP server and the SDK all ship on one version number, so a release here is a release everywhere — update once and you have all of it.
0.3.024 October 2026
Desktop app
- Newsave the app's current screen and data from the device panel's Capture menu, and load it back in under a second
- Newa Tunings screen shows what
squiggle flow --tuneand--repairmeasured and what they propose - NewPerformance has a Probes section: write a rule, install it on the connected app, and see when it held
- NewProduct has a State section, showing what your app held on each screen
- NewAnalytics names the control each touch landed on, and what each drag was meant to do
- Newthe tour has 25 chapters, folds its sections and shows how much you've read. Every chapter has a hint
- Newmenu items show their keyboard shortcut, such as Show all devices (⌘G)
- NewSettings are grouped into sections, and the simulator stays in view while you change them
- Newa healed step shows how close the match was, and warns when it was close to failing
- FixStudio checks for updates on every launch, and Check for Updates opens the update card
- FixStudio's Replay goes to the flow's start screen first, as
squiggle flowdoes - Fixzooming into a live timeline no longer jumps when the session grows, and a timeline parked at the end follows it
- Fixhover cards on graphs stay above everything and inside the window, and close with the session they describe
- Fixthe inspector's selection box stays inside the device screen and follows a scroll
- Fixthe Renders table keeps the Component column in view while it scrolls sideways
- Fixa popover over the device preview scrolls instead of the device
- FixStudio no longer reloads an app that another tool is driving
- FixStudio removes a recent project whose folder is gone
- PerfStudio's JS thread idles with an app connected: live performance analysis reads only what changed
CLI
- BreakingSquiggle saves an app's runs, recordings and performance data only into the project that owns it: the app is listed under
appsin.squiggle/config.jsonc, or its development build was built inside the project. Any other app still works live, but nothing about it is saved. If an app's data stops appearing, add it toapps - Breakingwith more than one simulator booted, a command that drives a device refuses to pick one and lists them (
E_DEVICE_AMBIGUOUS). Name one with--udid,SQUIGGLE_UDIDorudidin your config. Your agent's tools refuse the same way - New
squiggle cardchecks whether a change is done: it runs the flows that reach the screens you changed, checks what they measured, and lists each problem with the line to fix - New
squiggle add screenwrites a new screen from one of six templates, with a flow that drives it and a renders budget it meets - New
squiggle saveandsquiggle loadkeep the screen the app is on, with the data behind it, and put it back in under a second instead of tapping through screens - New
squiggle bisectfinds the commit that slowed a flow, without rebuilding the app.--hunkssays how much of the slowdown each change in that commit accounts for - New
squiggle bakeoffruns one flow against several revisions and compares pass rate, duration, renders, dropped frames, memory growth and startup in one table - New
squiggle motionrecords how a view moves after a tap and gives you thewithSpringconfig that reproduces it - New
squiggle contracts proposeturns what your passing runs always showed into asserts in your flows, and proposes removing an assert that stopped holding - New
squiggle perf budgetchecks each screen's budget against the newest session, with the margin to each limit.--changedchecks only the screens your branch changed - New
squiggle perf labelsexports every run with its outcome, heals and app state, as JSONL - New
squiggle probe whenruns a rule inside your app and reports when it held.squiggle probe exportkeeps the rule as a detector - New
squiggle store auditlists data in your project that came from an app the project doesn't own.--purgeremoves it - Newthe first
squiggle upin a project saves a baseline namedfirst - Fix
squiggle upgets a development build past the Expo launcher, and reports ready only once the app's JS has connected - Fixevery command uses the port from your config or
SQUIGGLE_PORT, not always 7777 - Fixa YAML syntax error in a flow is reported as one, not as "a bug in Squiggle"
- Fixa Ctrl-C during
--matrixor--repairputs the simulator's appearance and text size back - Fixa
squiggle benchseries with a failed run records the failed run and exits 1
Agents & MCP
- New
report_cardgives your agent the report card - New
bisect_statefinds the store values that make a flow fail, from two save slots - New
what_iftells your agent what a flow did under a repeated tap, a Back press or a bad network, from runs already recorded, without touching the app - New
tunelists and sets the values your app declared tunable - New
product_stateshows what your app held on each screen - New
branchcan start from a save slot, and tries the likeliest alternative first - New
propose_fixturns a--tuneor--repairresult into a code change - Fixan idle
squiggle mcpno longer uses a quarter of a CPU core - Fix
launch_appgets past the development launcher and an "Open in …?" alert, and returns once the first screen is up
Flows & device
- Newflows drive the photo picker, the document picker, the share sheet and permission prompts that iOS shows over your app. Select their controls by the text they show
- New
squiggle flow --twinruns a flow on a working network and again on a slow, flaky, cut-off or offline one, and reports what your app did differently, such as a spinner that never goes away or an empty state shown for a server error - New
--fuzzbreaks each endpoint the flow called, one at a time - New
--racefinds a repeated tap or a Back press, made while a request is in flight, that sends a change twice or navigates after the user left. It writes the shortest flow that reproduces each - New
--chaosruns a flow on a bad network, and--stubsanswers the network from an earlier run. A flow can declarechaosin its config - New
--cache-twins <cold>,<warm>shows which requests a warm app answered from its cache and which it fetched again - New
--bisect-state <green>,<failing>finds the few store values that make a flow fail, and names the lines that write them and the components that read them - New
--matrixruns a flow in each simulator setup, such as dark mode and the largest text size, and lists the layout problems each one adds.--repairsearches the values you declared tunable for a layout with no problem in any setup - New
--tune <name>picks a tunable value, such as a list'swindowSize, by measuring dropped frames at each one - New
--cliff VAR=lo..hifinds the list size where dropped frames start to climb, and what rendered most there - New
--boundarieschecks the edges of every control and reports an edge whose touches land on something else - New
--ax-onlyfinds every control through the accessibility tree alone, the way VoiceOver reaches it - Newthree asserts:
scroll(frame rate, dropped frames, blank cells),smooth(how a region moves through a transition) andmemoryDelta(memory growth since the previous step). Thresholds you leave out come from the screen's budget - New
waitForwaits for a control to appear or go away, so opening a sheet needs no retry - New
swipetakes adurationto drag slowly, and aholdto long-press before dragging, so a flow can reorder a list - New
softKeyboard: truekeeps the on-screen keyboard up while a flow types - Newa near miss says which part of the selector scored what, and how far under the threshold it fell
- Fixa selector with a
testIDandtextneeds both to match - Fixa
typestep waits for the text to land in the field, and checks it - Fixa control whose
testID, label or press handler changes in place is found under its new name - Fixa scroll longer than its list is several drags inside the list
- Fixa held drag starts on the control it holds
- Perfthe wait before each step is 41% shorter, and a relaunch finishes as soon as the app shows its screen
Performance
- Newset a performance budget per screen in your config
- Newstartup is split into phases, each timed by the module that owns it
- Newa JS stall comes with its CPU profile, including the first stall after a fresh launch
- Newa wait that runs long names the component still animating, with its file and line
- Newthe
js-driven-motionfinding catches an animation that moves only while JS runs - Fixcapturing a stall profile can no longer crash your app
- Fixone app launch is one session, whether Studio, the CLI or both watch it
- Fixsamples follow a relaunched app into its new session
- Fixa run that opens the performance store while another is writing to it no longer loses its session
- Fixa long task that repeats is one finding per cause, grouped across sessions
Product analytics
- Newsplit any report by a state sessions reached, with
--where - Newsee which app states friction happens in, the states real sessions reach that no flow tests, and how states drift across releases
- Newan abandoned drag is a friction finding
SDK
- Newdeclare values Squiggle may tune, such as a list's
windowSize, withdefineTunableanduseTunable - Newsave slots capture your Zustand, Legend State and MMKV stores without setup
- Newstate analytics samples what your app held on each screen, as shapes rather than values. It needs a build variable and the user's consent, set with
setStateAnalyticsConsent - Fixgestures in your app run as worklets again with the published SDK
- Fixupgrading Squiggle no longer needs
--clearon Metro - FixZustand stores appear under their own names, such as
useCart - Fixa slow drag keeps its interaction until the finger lifts
Website
- Newevery docs and changelog page has a Markdown copy at its URL plus
.md, and each docs page has Copy as Markdown and View as Markdown, for your coding agent - Newthe templates page runs each template on the demo device and shows its report card
- Newon a phone, the menu and the search can be dragged away
0.2.116 October 2026
Desktop app
- Newa tour of Studio, offered when you finish onboarding
- Newthe Renders tab shows what re-renders, what caused it, and which providers trigger extra renders, and warns you about render loops. The Inspector's Perf tab is now Renders too, and the component tree highlights each re-render
- NewStudio checks performance while you use the app, and tells you about each new problem once
- NewInsights can group recent sessions, so a problem that keeps coming back is one card
- Newthe Performance screen opens on a dashboard
- NewCompare puts several metrics on one chart, with presets. Hover a metric to see what it measures
- NewReplay charts show CPU per thread, dropped frames, garbage-collection pauses and network
- NewReplay draws a recording's touches over the device, and the heatmap follows the playhead
- Newcapture a CPU profile from the Flamegraph panel with one button
- Newthe device menu lists running Mac apps
- Newnotifications survive a restart, and clicking one takes you to what it's about
- NewHardware → Shake shakes the simulator
- FixStudio uses less CPU, and animations and tooltips run at the right speed
- Fixthe Inspector no longer shows "0 nodes" for a connected device after an agent session
- Fixhovering a row in the component tree outlines that component on the device
- Fixexpanding a row in the Network panel no longer shows an error
- Fixa restarted run's charts no longer start with a sample from the previous run
- Fixtaps made by a flow or an agent no longer count as rage taps or dead zones
CLI
- Breaking
install-macos-agent.shis gone. Squiggle adds the agent to your Mac app's Debug build for you, so remove any build step that runs the script - New
squiggle initfinishes setting up an Expo app, adding the Babel config and entry file if they're missing. Anything it can't change safely, it lists for you to do - New
squiggle initno longer creates a.envfile. Your iOS app finds Squiggle without one - New
squiggle init --agent claudealso installs the Squiggle agent kit into.claude/ - New
squiggle doctoralso checks your licence and the Babel plugin, and says how to fix either - Newwhen your trial or licence expires, Squiggle tells you where to buy a key
- Fix
squiggle perf diff --assertexits with code 1 when a threshold is breached - Fix
squiggle crawlexits with code 1, not 2, when it finds a crash - Fixtwo runs started at the same moment no longer merge into one history entry
Agents & MCP
- New
rendersgives your agent what Studio's Renders tab shows - New
propose_fixturns a performance finding into a plan of code changes - Fix
batchchecks every step before it runs any, so a malformed step no longer runs the steps before it - Fixafter a filtered
describe, the next action no longer reports elements that were already on screen as new - Fixa tap by
refhits that element, even when another one has the same label - Fixthe agent kit's Claude Code hooks run
Flows & device
- Breakinga misspelt key at the top of a flow file, such as
healng:, is an error that lists the valid keys. It used to be ignored - Newtest an iOS app and a Mac app from one project: list both under
appsin the config, and pick one with--platform.squiggle initfills them in - Newresults are kept per platform, so a flow that passes on iOS isn't counted as passing on macOS
- New
squiggle flow --recordworks for Mac apps - NewMac apps with App Sandbox turned on work too
- Fixa run for your iOS app no longer connects to your Mac app, or the other way round
- Fixscrolling works in Mac apps, sideways too
- Fixa Mac app left open no longer slows down the start of a run
- Fix
expectRouteon a tap no longer shows an error in your editor
Performance
- Newfindings link to the line that declares the component
- Newwhen a context value is recreated on every render, the finding names the context and the component that provides it
- Newmemo-miss also catches props that are new objects or arrays with the same contents
- New
nav-loopflags navigation loops your users don't usually take - New
squiggle perf insightslists a session's findings, andsquiggle perf watchshows them as they happen - New
perf diff --assertcan fail when a finding you name appears, withfailOnDetectors - New
perf diffand product analytics compare sessions from one platform at a time. Choose which with--platform
SDK
- Newrage taps and dead zones are detected on every control, not only gesture-handler ones
- Newcomponents wrapped in
memo()orforwardRef()show up under their own names - Fixa button with no label or testID appears once in
describe, not once for each component wrapping it - FixMac apps no longer report an impossible JS FPS
Website
- Newthe docs are rewritten, and cover every MCP tool, agent command and Performance panel
- Newmore docs pages have live demos you can try
- Newsearch (⌘K) finds entries in reference tables
- NewGet Squiggle walks you from install to your first flow
- Fixtooltips no longer stay open after you tap on a phone
- Fixthe phone menu lists every section of Why, Pricing and Download
- Perfsquiggle.sh pages load faster and jump around less while they load
0.2.011 October 2026
Desktop app
- Newagentic flows: a step can be a goal an agent drives. Flows has Scripted and Agentic tabs, shows how many agent steps each flow has recorded, and edits an agent step's prompt, verifier and recording. Intent runs moved here too, replacing the Agents screen
- Newthe Runtime Inspector: a component tree beside four views of the selection — Details, Graph, Perf and Screen map
- NewInspector Details: a component's props, hooks and state, its context and stores, renders, accessibility, style and structure, read live from the app
- Newedit a prop or a hook's state from the Inspector and the app on the simulator changes with it, until it reloads
- Newpick a component by pointing at it on the device mirror; where several are stacked under the pointer, the scroll wheel walks through them and a click lists them all
- NewFollow in app: selecting a component in the tree or the graph brings it on screen, navigating to its screen and scrolling it into view
- Newopen the line that writes an element, or where its component is defined, in your editor
- Newthe Inspector's Graph draws the live component graph as a tree or a force layout, with pan, zoom and the lineage of whatever you hover
- Newthe Screen map: your app's screens and the taps between them, drawn as a roadmap with each navigator's screens grouped under its name, the screen the app is on ringed, and every screen's picture
- NewCrawl the app from the Screen map: it presses each control in turn, maps every screen a press opens and photographs it, signing in with the values your flows type. Crawl from here starts on one screen, and the map fills in as it goes
- NewGo to screen: pick a screen from the map or the menu, and Go there drives the app along the known path to it
- Newfrom any screen on the map, start a scripted flow that taps its way there, or an agentic flow that starts there
- Newthe Screen map shows which screens no flow reaches, filters to the screens reachable from where the app is, and adds the screens you open yourself
- NewReplay, redesigned around what went wrong: Studio keeps the five seconds before a crash, error, stall or spike as an incident, and the player opens on it with a screenshot and a report you can copy
- Newfrom an incident, explain the component it blames, open the run in Performance or Analytics, or make a regression flow from it
- NewReplay's event list says what was tapped, swiped or scrolled, where, and what it led to, and its timeline has metric lanes for frames, activity, memory and latency, each with a legend
- NewDrive device: scrubbing a recording, pressing an event or playing it drives the app on the simulator to the same moment
- Newrecordings are named the way you would describe them, and you switch between them without leaving the player
- Newa gallery for screenshots and screen recordings, with a swipeable, zoomable viewer. Screen recordings are H.264 or HEVC video
- Newsimulator tools and real device skins
- Newcompact mode: a small simulator-only window with its own toolbar, which you customise and reorder, and a row of live graphs
- Newinstalling the app installs the
squigglecommand too: it links itself into your terminal, and offers to add it to your PATH when your shell cannot find it. Settings → Command line removes it - FixStudio no longer runs out of memory while the device mirror streams
- Fixclicks on a menu or tooltip land on it rather than the control underneath, overlays open beside their control, and buttons keep working after compact mode
- Fixthe simulator mirror takes input with no app connected, and an overlay over it no longer passes clicks through to the simulator
- Fixre-running a flow from History uses the settings the run was recorded with
- Fixthe notification bell reports failed runs (flows, benches, crawls, recordings, agent runs) and stays quiet about a command you typed in a terminal, which already showed its error
- PerfStudio's idle CPU dropped from 22% to 6% of a core, and the device mirror costs about 20 points of a core less
- Perfflows run from Studio at the same speed as from the terminal
- Perfa 2,000-node graph pans and zooms at 60 fps, and switching tree and force layouts takes a tenth of the time
- Perfmemory stays flat in a long session: an hour at 60 renders a second holds 11.6 MB instead of 90.7 MB, and a two-hour recording writes 130 MB instead of 968 MB
- PerfStudio uses 43% less CPU while other tools read the app through it
CLI
- Newdrive react-native-macos apps as well as iOS:
--platform macoson every device command, andinstall-macos-agent.sh, shipped beside the binary, puts the agent in your app - New
squiggle flow --recordsaves the run as a video, and an agent can attach it to a pull request - New
squiggle probereads live values from the running app's JavaScript over Metro - New
squiggle crawlwrites screen memory as it goes, andcrawl --changedrevisits only the screens a change touches - Newa failed step says why and what to do next, and
--log <level>streams the run's events as it goes - New
squiggle init --agent claude|copilot|codexregisters the MCP server with the agent you use, for Claude Code, Copilot or Codex - New
squiggle bench --pr <N>posts the result as a sticky comment on the pull request - Fix
scrollno longer crashes the simulator, and it actually scrolls - Fixa tap on an element off screen is refused instead of landing on whatever is there
- Fixback-to-back flow runs pass: no screens left open by the previous run, and each run starts from where its flow expects to
- Fixa run that launched your app gives up on one that never connects, and says why
- Fix
squiggle flowstakes flow files as well as directories, andsquiggle agent run <name>finds a program by name - Fixa react-native-macos app is driven in the background, and an action that did nothing is reported as a failure rather than a success
- Perf
squiggle --versionanswers in about 20 ms
Agents & MCP
- Breakingtool names drop the
squiggle_prefix your client already adds, somcp__squiggle__squiggle_tapis nowmcp__squiggle__tap. Update any permission grant that names a tool.squiggle_execis nowprobe_read - New
run_flowruns agentic flows: your agent drives each agent step once, and every run after that replays it without a model - New
filmstripreads a recording's frames, for defects the graph cannot see - New
describeandfindsee native views, such as an Expo Router native tab bar, thattapcould already reach - Newan action returns the screen it just changed, so the next step needs no second look
- Newevery tool has a display title in your client
- Newevery element knows the line that writes it:
describe {fields: 'source'}shows it, andfind {callSite}shows what a line renders - New
inspectreads a component's live props, hooks and state - Fixno tool call waits forever, and one that hangs no longer blocks the rest
- Fix
input_textwaits for the field to take focus, so the tap after it lands - FixStudio and the CLI take port 7777 back from an idle MCP server
- Fixa flow's secrets never reach the model, the run report or the recording
- Fixthe agent kit's hooks and slash commands run your installed
squiggle, and itsplugin.jsonstarts the server withsquiggle mcp. The kit no longer carries aStophook that only applied to Squiggle's own repository. Regenerate the kit after upgrading - Perfa tap with its observation returns in 110–185 ms, and choosing the target takes 7 ms instead of 300
- Perf
perf_sqland saved queries answer within a 24 KB budget with a truncation note, instead of reading the whole table first
Flows & device
- Breakinga step key that nothing reads is a parse error with its line number. It used to be ignored, and surfaced later as a selector that would not match
- New
agent:steps: a goal an agent drives, checked by a verifier you write, recorded beside the flow as.agent.jsonand replayed from then on - Newdeclared routes, with route hints for agent steps
- Newa flow can declare that it fails by design, or that it runs some other way
- Newa flow's
config:block carries the run settings it needs (scroll mode, settle and step timing,autoScroll,strictAssert), so a suite runs every flow the way it was written to run - Newa recorded tap names the control it pressed
- Fixan app launched without the agent is relaunched with it before a run, instead of running slower without it
- Fix"keep software keyboard: off" keeps it off, and a run never takes over another app on its device
- Perfa login flow runs in about a quarter of the time: the median went from 10.9 s at 0.1.0 to 2.7 s, and 2.3 s with
--direct-scroll - Perf
squiggle flowstarts about 1.4 s sooner, and reconnects after a relaunch in 1.0 s instead of 6.2 s - Perfa suite spends less time resetting between flows, and its shards pull from one queue ordered by each flow's last duration
Performance
- Newwhat Studio derives live (dead zones, scrolls, gesture tracks, the touch heatmap) is stored in
perf.db, so your agent can query it - Perfthe metric store keeps older samples at coarser resolution, so a store that had grown to 1.5 GB now takes about 30 MB. Product reads take under 2 ms, and writes are 4× cheaper
SDK
- NewLegend State stores are instrumented by the Babel plugin, alongside Zustand, MMKV, AsyncStorage and SQLite
- Perfthe SDK does less work on your app's JavaScript thread, and sends about 31% fewer bytes per frame. Encoding a frame takes 122 ns instead of 360, and an app nobody connects to no longer holds 2.3 MB of memory for it
Website
- Newtry Studio in your browser at squiggle.sh/studio, against a live demo app, with a guided tour of 21 chapters across every screen
- Newdocs pages open on live slices of it, and every page's header opens Studio over the page you are on
- Newon a phone, Studio plays its own tour, sized to read, with a chapter menu
Everything else
- Perfa crawl of the example app's 18 screens takes 46 s instead of 94 s, and never leaves the app
- Perfchecking the assertions of 421 recordings takes 3.9 s instead of 209 s, and seeking a recording is about 3.4× faster
Public beta
0.1.016 August 2026
Welcome to Squiggle. This is the first public release, and the whole idea fits in a sentence: your app already knows what it is doing — its component tree, its state, its navigation, its network, its frame times — and until now nothing was asking. Squiggle puts a small SDK inside the running app, streams all of that into one queryable model, and then QA, performance, product analytics and agents stop being four tools that disagree and become four views over the same thing.
That model is the design, not a feature of it. A flow selector resolves against it, so a renamed button re-resolves instead of going red. A slow frame and the render that caused it are two queries over the same data. An agent reads it instead of screenshots — which is why a login journey runs end to end at zero model turns, and why every claim it makes carries the session and event it came from, for you to check rather than believe.
What you install. Six pieces, one version number, one licence. Start with the SDK: everything else is a view over the graph, and nothing produces a graph until the app is instrumented.
@squiggle.sh/react-native- the SDK, and the only Squiggle code that goes inside your app.
bun add @squiggle.sh/react-native, then one side-effecting import at the top ofindex.js. No provider, no config file, no account: the native accelerator and its single peer come along with it, idle cost is approximately zero while nothing is attached, and it checks no licence — the thing that has to be trusted enough to ship in your bundle asks nothing of you. @squiggle.sh/babel-plugin- a devDependency, and strictly optional. It is the difference between a component name and a clickable source location, and — with MMKV v4 — between storage spans and none.
@squiggle.sh/clinpm install -g @squiggle.sh/cli. Sixty-three commands from one typed tree, with an exit-code contract CI can branch on:squiggle initwires the SDK into an existing app,squiggle uprelaunches it with the agent attached and proves it,squiggle flowruns a journey, and--jsonis on everything that returns data.- The desktop app
- the DMG on the download page, for Apple Silicon. The Studio, the Runtime Inspector, the Performance Center and the Agent Center, plus the same
squigglebinary bundled inside the app, so installing one installs both. One licence and one project store across the two. - The MCP server
- already in the CLI, so there is nothing else to install.
squiggle init --mcpmerges the entry into your.mcp.json— your other servers survive untouched — and your agent gets seventy-five tools over one warm session, where a second question costs almost nothing. - The agent kit
squiggle agent kit --installwrites skills, a subagent per mode, hooks and slash commands into your agent, so it learns how to drive your app once instead of being told each time.- A licence
squiggle activate --trialgives you fourteen days with no card. After that a licence verifies offline, on the machine, and CI takes a token instead.
What beta means here. Everything below this line works and is being used daily; beta is about the shape, not the parts. The SDK's public API is what we will be slowest to change, because it lives in your bundle. The CLI's flags, the MCP tool names and the flow vocabulary are where a breaking change is most likely before 1.0 — and every one of them will land here, on this page, with the version that made it.
Desktop app
- Newone-click simulator bring-up, and a live canvas you can drive your app from
- Newthe Runtime Inspector — eleven node kinds, the causality edges between them, and a render-flame tree you can scrub
- Newsix overlay modes on the canvas, and a grid that watches several devices at once
- Newthe Performance Center: flamegraphs, heap diffs, network waterfalls and baselines, side by side
- Newinteraction analytics — a heatmap that knows which component was under the finger, not just where the pixel was
CLI
- Newsixty-three commands from one typed tree, with an exit-code contract CI can branch on
- New
squiggle initwires the SDK into an existing Expo or bare app in one step, and is safe to run twice - New
squiggle uprelaunches your app with the agent attached — and proves it, rather than hoping - New
--jsonon every command that returns data, so a run is pipeable into whatever you already have
Agents & MCP
- Newan MCP server with seventy-five tools over one warm session, so a second question costs almost nothing
- Newa runtime that executes a compiled plan and wakes the model only at the decisions that need one — a login journey runs end to end at zero model turns
- Newevery claim an agent makes carries the session and event it came from, so you can check it instead of believing it
- New
squiggle agent kit --installdrops the skills into your agent, so it knows how to drive the app without being told each time
Flows & device
- Newflows in YAML, with selectors that name what a control _means_ rather than where it sits — a moved button re-resolves instead of going red
- Newrecord a session and replay it offline, as many times as you like, against the same assertions
- Newthree delivery planes, chosen per step, so a run is as fast as it can safely be
Product analytics
- Newfunnels with time-to-convert, cohort retention, feature affinity and release annotations — over the same events everything else reads
SDK
- Newone install and one import. A Babel plugin and an Expo config plugin do the rest, and nothing ships to your users
Licensing
- Newa fourteen-day trial with no card, and a licence that verifies offline once activated