All but React Native are in beta.
All but React Native are in beta.

Your app decides whether Buoy runs, through the guards you put around Buoy.start and the overlay.
Put Buoy.start, and any .buoyDevTools() or Buoy.install(in:), behind #if DEBUG or your own internal-build flag. An environment or user-role badge is presentation, not access control; apply your app's own authorization checks for users who can inspect or change its data.
TestFlight builds use the Release configuration, so a DEBUG guard normally excludes Buoy there. If you want Buoy in an internal TestFlight build, make that opt-in deliberate.
A buoy login dev token opens nothing in a TestFlight build. Testers sign in with a code, so no key goes in the app:
var config = BuoyConfig()
config.signIn = BuoySignInConfig()
Buoy.start(config)
var config = BuoyConfig()
config.signIn = BuoySignInConfig()
Buoy.start(config)
First, add app: and your bundle id at buoy.gg/dashboard/sites. Buoy in a TestFlight build needs a Pro or Business plan. A Pro key passed in with config.licenseKey works there too. See Test builds.
Swift packages cannot be linked only in Debug, so the Buoy framework is embedded in every build configuration. Nothing runs until Buoy.start is called: no URLProtocol registration, no swizzling, no overlay window and no network connection. With both calls guarded, a Release build contains the framework but never executes it.
Buoy 0.1.0 adds about 9 MB to an uncompressed arm64 Release build, measured before App Store thinning and compression.
If you start Buoy in a release build, three tools can fake app state:
They need a paid plan and the Buoy menu on screen. With no paid plan or no menu, saved rules and scenarios do nothing. An amber FAKE NETWORK pill shows while a rule or a speed setting is on. Press and hold it to stop.
UI recording (Scenarios' Record a flow) needs a development build.
Buoy treats the simulator and apps signed with a development provisioning profile as development builds. Ad hoc, enterprise, TestFlight and App Store builds are not.
The framework includes PrivacyInfo.xcprivacy with the app-scoped UserDefaults reason CA92.1. Buoy reads the host app's defaults and stores its own tool preferences there. Review your app's privacy disclosures for the diagnostic data you allow Buoy to capture and send to your broker.