Docs
On your phone.
FIXME works on your real iPhone, inside your own app, through a tiny helper that only exists in Debug builds. Your agent gets the exact file and line, the UI tree, the console, the network and clips.
What the helper adds
- A three finger tap (or a small FIXME tab on the screen edge) that opens the circle overlay in your app.
- Shake, or say "FIXME, clip that", to send the last 30 seconds as a clip.
- The UI tree, console, network requests and a timeline of taps and hitches in every ticket.
The helper runs in Debug builds only. It is left out of your release builds, and it only talks to your own Mac.
iOS: SwiftUI and UIKit
Needs iOS 16 or later and Xcode 16 or later.
The easy way
Open FIXME on your Mac. In setup, or later in Settings, General, On your phone, choose Add FIXME to your app. FIXME shows you every change before it makes it, and you can undo it any time.
What it changes, in your Xcode project only:
- Adds the Swift package.
- Links it into Debug builds only, with
-ObjC -framework PointerKitin the Debug configuration's Other Linker Flags. Release builds never contain it. - Adds a Debug Info.plist with the Bonjour service
_pointer._tcpand the Local Network, Microphone and Speech Recognition descriptions iOS asks for.
No source files change, and there's nothing to import or start. The helper starts itself in Debug builds.
By hand
- Add the package.In Xcode, File, Add Package Dependencies, and enter
https://github.com/fixme-dev/fixme-ios. - Pick no target.Add the
PointerKitproduct to no target. - Link it in Debug.In your app target's Build Settings, add
-ObjC -framework PointerKitto Other Linker Flags for the Debug configuration only. - Add the Info.plist keys.For Debug:
NSBonjourServiceswith_pointer._tcp, plusNSLocalNetworkUsageDescription,NSMicrophoneUsageDescriptionandNSSpeechRecognitionUsageDescription.
React Native and Expo
Needs React Native 0.72 or later, or Expo SDK 47 or later. It runs only in development (__DEV__). In production builds every export is a no-op and none of it is bundled.
The easy way
Choose Add FIXME to your app in FIXME's setup, the same as for iOS.
From a terminal
npx fixme-react-native init # adds the dev dependency and one line to your entry file
npx fixme-react-native init --optional # also installs the recommended extras
npx fixme-react-native undo # removes bothThe one line it adds, as the first statement of your entry file:
if (__DEV__) require('fixme-react-native/auto');Expo: for screenshots in a development build, also run npx expo install react-native-view-shot and rebuild once (npx expo run:ios or a new EAS development build). Expo Go already includes it.
Optional extras
Each is detected at runtime. Without one, the helper still works and says what you're missing.
| Package | Adds |
|---|---|
react-native-view-shot | Screenshots, crops and clips |
expo-speech-recognition or @react-native-voice/voice | Talking to the phone ("FIXME, clip that") |
expo-file-system or @react-native-async-storage/async-storage | Tickets kept while your Mac is away |
expo-secure-store or react-native-keychain | The pairing key kept in the Keychain |
react-native-svg | Smoother ink |
expo-haptics or react-native-haptic-feedback | Haptics |
Connect your phone
Run your app's Debug build on a phone or the Simulator, with FIXME open on your Mac. Use the same Wi-Fi, or plug the phone in.
- Add FIXME to your app.Once, with the steps above.
- Run your app.Build the Debug configuration to a phone or the Simulator. A small
FIXME is on
chip shows under the island. - Allow it.The first time, tap Allow when iOS asks to find devices on your network. Then your Mac and the phone show the same 4 digit code. If they match, press Allow on the Mac.


A phone is approved once and remembered. You can forget it in FIXME, Settings, Network. Until a phone is approved, nothing it sends is delivered to your agent.
A plugged-in iPhone is also recorded by your Mac for clips, at full quality. macOS files that under Camera, and FIXME only uses it for that. It never uses your Mac's camera.
Using it
- Circle: tap with three fingers (or the FIXME tab on the edge), circle what's wrong with your finger, say it or type it, and send.
- Clip: shake the phone, or say "FIXME, clip that". Review it on your Mac, circle moments, send.
- Away from home: if your Mac can't be reached on your network, the phone uses an end-to-end encrypted relay, or saves tickets and sends them when your Mac is back.


Release builds
The iOS helper is compiled only when DEBUG is set and linked only in the Debug configuration. The React Native helper swaps itself for a no-op when __DEV__ is false. To check, archive your app and look for the string PointerKit in the binary, or for fixme-react-native in your JavaScript bundle. It should not be there.
Android and Flutter
Helpers for Android (Kotlin, Compose and Views) and for Flutter are on the way and not released yet. Until then, circling on your Mac (⌥ Space) works on anything you can see on your Mac screen.
Troubleshooting
The phone can't find my Mac
Check that both are on the same Wi-Fi and that Local Network is allowed for your app in iOS Settings, Privacy and Security, Local Network. A VPN on either side can hide devices from each other. Plugging the phone in works too. Doctor, in the FIXME menu, shows what it can see.
My phone says it is waiting for approval
Look at your Mac for the approval panel with the 4 digit code. Press Allow if it matches the one on the phone.
Tickets are saved but not sent
They are held in the phone's outbox and sent when your Mac is reachable again. The overlay chip says how many are waiting.