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
        }
    }
}

Run npx --package=@buoy-gg/core buoy login in your project folder. Put the token it writes 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. Each tool works like its React Native version, and the guide says where Swift is different.

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.

Clock

Jump, freeze or speed up the app's time. Your code reads it through BuoyClock.now() and Buoy's timers.

Lifecycle

See what your app does when people leave and come back.

Location

Pin the app anywhere, play routes and set off geofences.

BuoyLocationProvider

Permissions

Test denied, blocked, limited and not-asked states for the checks your app makes through Buoy.

BuoyPermissions.check / request

Bench

A floating speed HUD, plus benchmarks you can record and compare.

Highlight

See which views redraw, and why.

.buoyTrackRenders(...)

Debug Borders

Draw outlines around views to check your layout.

Ask Buoy

Ask about your app in plain English. It can use the other tools for you.

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, such as React Query, Redux, Zustand and Jotai, are React Native only. So are JS Top, Three and Sentry. Where a Swift tool works in a different way, 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. Free includes the basic MCP. Pro adds the full 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 the full 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.