Swift · Beta

Buoy for Swift: in-app debugging tools for native iOS

Updated September 30, 2026

Buoy for Swift adds developer tools to a SwiftUI or UIKit app: network, console, storage, routes, notifications and more. You inspect them on the device, in Buoy Desktop, or through the Buoy MCP server from your editor. It is one Swift package, installed with Xcode, and it runs in debug builds that you gate yourself. It is in beta.

Install

Buoy for Swift is a Swift package that ships as a prebuilt, signed framework. It needs iOS 16 or later and Xcode 16 or later, and works in apps that use Swift 5 or Swift 6 language mode. In Xcode, choose File > Add Package Dependencies…, enter the URL below and use the rule Up to Next Minor Version from 0.1.0.

https://github.com/Buoy-gg/Buoy-Swift.git

Then start Buoy and add the overlay, both behind #if DEBUG:

import SwiftUI
import Buoy

@main
struct MyApp: App {
    init() {
        #if DEBUG
        var config = BuoyConfig()
        config.licenseKey = ProcessInfo.processInfo.environment["BUOY_LICENSE_KEY"]
        Buoy.start(config)
        #endif
    }

    var body: some Scene {
        WindowGroup {
            #if DEBUG
            ContentView().buoyDevTools()
            #else
            ContentView()
            #endif
        }
    }
}

Put your account key in a BUOY_LICENSE_KEY environment variable in the Xcode Run scheme. UIKit apps call Buoy.install(in: windowScene) from the scene delegate instead of the modifier. The Swift quick start walks through the first captured request.

The tools

The package bundles the tools below in one module, so a single import Buoy brings them all in. Network and Console start with Buoy.start; the others need a line of configuration or a view modifier to reach your app's state. Each card links to its setup and to what the Swift version leaves out compared with React Native.

Network

URLSession requests on default and ephemeral configurations, with headers, bodies, timing and errors. Response overrides and throttling included.

Start Buoy before you create URLSessions.

Console

print output after Buoy.start, plus the app's own Logger, os_log and NSLog entries.

Storage

UserDefaults, keychain items you register and MMKV instances you register, with required-key checks.

Env

The values your app configures, checked against the keys and types you declare.

BuoyEnv.configure(vars:required:)

Impersonate

Search your users and add an impersonation header to captured requests. Your backend authorizes the change.

Image Overlay

Lay a design image over the running app, placed freely or locked to a marked view.

Images

Force loading, failure, blank and replacement states on images drawn with BuoyAsyncImage.

Notifications

Received notifications, presentation decisions, taps and permission status, forwarded to your delegate unchanged.

BuoyNotifications.install()

Routes

Your route patterns and live navigation stack. Desktop and MCP can navigate the app.

BuoyRoutes.configure + .buoyRoute(...)

Scenarios

Repeatable app setups built from tool actions, reviewed on the device before they run. Development builds only.

Time Machine

Snapshots of UserDefaults and MMKV that you restore live, with the screen you were on.

Events

Network, storage and route activity in one timeline you can filter, copy and export.

Assets

Sizes and duplicates of the loose resources in your app bundle, compared against a saved baseline.

Buoy Desktop, MCP and physical devices

A Swift app connects to Buoy Desktop the same way a React Native app does, and appears next to your other devices. In the iOS Simulator it finds Desktop on its own. On an iPhone, set BUOY_SOCKET_URL to your computer's address in the Run scheme and add the local network and App Transport Security entries from the physical devices guide. Buoy prints a [Buoy] setup: line in the Xcode console when one is missing.

With a Pro account, the Buoy MCP server lets an AI agent in your editor read captured requests and logs, tap supported UI elements, navigate between routes and restore Time Machine snapshots in the running app.

Keeping Buoy out of Release

Your app decides whether Buoy runs. Swift packages cannot be linked only in Debug, so the framework is embedded in every build, but nothing runs until Buoy.start is called: no URLProtocol registration, no swizzling, no overlay window and no network connection. Keep both calls behind #if DEBUG and a Release build never executes it. Scenario runs and UI recording also check at runtime that the app is a development build.

The framework adds about 9 MB to an uncompressed arm64 Release build, measured before App Store thinning. The Release builds guide has the details.

If you used Flipper

Flipper was a desktop debugging platform for mobile apps, and its owner has archived the repository on GitHub. Buoy covers part of the same ground for native iOS: it inspects network traffic, logs and stored values from inside a debug build and shows them in a desktop app. It is a different tool with its own setup, so check the Tools guide for what each Swift tool captures before planning a move.

What the beta leaves out

Buoy for Swift runs on iOS devices and the iOS Simulator; Mac Catalyst and macOS are not supported. Tools built on JavaScript stores or React rendering, such as React Query, Redux and render highlighting, are React Native only. Individual Swift tools also do less than their React Native counterparts in places; the Tools guide lists each gap. Report problems on the issue tracker.

Which Xcode and iOS versions does it support?

Apps targeting iOS 16 or later, built with Xcode 16 or later, in Swift 5 or Swift 6 language mode. It runs on iOS devices and the iOS Simulator.

Does it work with UIKit?

Yes. Call Buoy.start early on the main actor and Buoy.install(in: windowScene) from your scene delegate. SwiftUI apps use the .buoyDevTools() modifier instead. Both mount the same overlay.

Is the source code available?

No. Buoy for Swift is proprietary and ships as a prebuilt, signed binary framework through Swift Package Manager.

Does it run in my App Store build?

Only if you call Buoy.start there. With Buoy.start and the overlay behind #if DEBUG, a Release build embeds the framework but never runs it.

Is it free?

A Free account covers the on-device tools and Buoy Desktop at Free limits. Pro adds MCP and paid features.

Try Buoy for Swift

Start with a Free account and follow the Swift quick start. Debug builds you gate yourself; Pro adds MCP.

Quick startgithub.com/Buoy-gg/Buoy-Swift

sources

Capability claims on this page come from each vendor's own documentation, read on the date shown. We did not install and run every tool listed.