LookInside 3.0 shipped on October 7. It is a rewrite of the Mac app in Swift, it runs activation inside the app instead of through a separate helper, and it adds Gesture Debug: a panel that shows which SwiftUI responders handled a tap, outlines the hit regions in your running app, and flags targets that are too small. This post covers why we rewrote the app, what changed, and what you need to know before updating.
Why rewrite
LookInside started from Lookin, and until 2.3 the Mac app was still the Objective-C codebase it inherited: ReactiveObjC for data flow, a vendored Peertalk for the USB transport, and a set of Objective-C dependencies around them. That was fine for a view-tree inspector. It was not fine for where we wanted to go. Multi-window support, Private Discriminator, the MCP server, and Gesture Debug each had to carry the old patterns along, and each one made the next harder.
So 3.0 moves the Host, the shared LookinCore models, and the activation code to Swift. ReactiveObjC and the vendored Peertalk are gone. The USB transport is now our own usbmuxd client, and the frame transport is ours as well. The Server side went through the same change: LookInside Server 1.0 is written in Swift with its own transport layer.
The rule for the rewrite was that the bytes on the wire do not change. A Server from 0.2.9 or earlier still connects to LookInside 3.0, Server 1.0 still connects to LookInside 2.3.12, and the request type numbers upstream Lookin defined are untouched. That is what let us ship the Mac app and the Server package as separate releases without forcing anyone to update both on the same day.
Activation is built in
2.3 installed a small helper app that held your activation and answered license checks. 3.0 does that work in the LookInside process. It reads the same state file and the same keychain key, so an existing activation carries over without re-entering anything, and going back to 2.3.x keeps working too.
One thing to watch for: the first time 3.0 signs with that key, macOS asks for your login keychain password. Choose Always Allow. If you choose Allow, macOS asks again every time LookInside connects to an app.
Gesture Debug
When a tap in a SwiftUI app goes to the wrong view, or nowhere, the view hierarchy alone does not tell you why. The answer is in the responder chain SwiftUI built for that event, and SwiftUI can log it, but reading those logs by hand is slow.
Open Gestures in the toolbar and start a capture. The Server turns on SwiftUI event logging in the target, reads the records back, and LookInside shows each interaction as an event with its responder tree, gesture nodes and phases, and the binding that won. With gesture borders on, the Server draws the observed regions inside your app, including the real path of a Circle, Capsule, Ellipse, or Rectangle content shape, and fills a region for a moment when an event binds to it.
Two tabs do not depend on a logged event. Native lists the UIKit controls and list rows on the current page with their handlers. Suggestions lists every target on the page that is smaller than 44 points on iPhone or 28 points on Mac, with the measured size and where the geometry came from. Both keep updating while the capture runs, so you can navigate through an app and read the warnings page by page.
Gesture Debug needs LookInside Server 1.0.0 or later in the inspected app, and readable event details need a small log privacy setting in the app's Debug Info.plist. The Gesture Debug guide has the setting, the tabs, and the current limits, the main one being that events arrive through the system log with a delay, so the panel is a record of recent interactions rather than a live gesture state.
Also in 3.0
Attach to App on Device inspects an app on a connected iPhone or iPad that runs the LookInside Injector.
MCP is still included. The lookinside-mcp executable is bundled at the same path, and existing Claude, Codex, Cursor, and VS Code configurations keep working.
Before you update
- LookInside 3.0 needs macOS 14 or later.
- LookInside Server 1.0 needs iOS 15 or macOS 14 in the inspected app. If your app still supports iOS 13 or 14, stay on Server 0.2.9; it connects to LookInside 3.0, but without Gesture Debug.
- Swift Package Manager does not move a
from: "0.2.0"requirement to 1.0 on its own. Change it tofrom: "1.0.0". For CocoaPods, set the tag to 1.0.0 or later. - Server 1.0 also removes a test-only hook that shipped in 0.2.9 and earlier, so upgrade if your deployment target allows it.
The full list of changes is on the 3.0.0 release page.