Skip to main content
The Orbit SDK is the runtime half of Orbit: it collects what Apple already knows about your app on real devices and sends it to the console, where it is symbolicated, grouped and handed to the agent. One package, one module per surface, zero dependencies.

Products

Depend on Orbit for everything, or on a single module when you want only one surface in your binary.

Install with Swift Package Manager

1

Add the package

In Xcode, File, then Add Package Dependencies, pointed at https://github.com/Parsaa-Company/Orbit-SDK.
2

Pick a product

Add Orbit to your app target, or OrbitVitals or OrbitCapture on their own.
3

Start it once, early

Call Orbit.Vitals.start and Orbit.Capture.start in application(_:didFinishLaunchingWithOptions:) or a SwiftUI App.init. See SDK configuration.
In a Package.swift:

Platforms

A multiplatform app needs no #if of its own on any of them.

Privacy manifests ship with the SDK

Every module carries its own PrivacyInfo.xcprivacy at the root of its resource bundle, as Apple requires of a third party SDK. You do not write or copy one for the SDK’s own behaviour.
  • NSPrivacyTracking is false, with no tracking domains. The SDK never reads the IDFA and never prompts for App Tracking Transparency.
  • OrbitVitals declares CrashData, PerformanceData and OtherDiagnosticData, each linked to the app and never to the person.
  • OrbitCapture declares product interaction and other usage data, plus UserID (because Capture.setUser exists) and PurchaseHistory (because the revenue surface exists). An SDK declares what it can collect, not only what your build happens to use.
  • NSPrivacyAccessedAPITypes is empty, on both. The SDK uses no required reason API: no UserDefaults, no file timestamps, no disk space query, no system boot time. The on-disk queue encodes its timestamps and byte counts in the file names precisely so it never has to ask the file system for them.
Your app still declares its own App Privacy answer. Settings, Analytics in the console generates it from the surfaces you turned on and how you identify a person, with a PrivacyInfo.xcprivacy fragment you can copy.

Binary size

Release __TEXT + __DATA of the module objects, which is what lands in a customer’s binary. The budget is 1 MiB per module. What an app actually links, for the three shapes: OrbitPolicy is the capture policy document and the evaluation both surfaces have to agree on. It is not a product and nothing imports it directly, but it is why OrbitVitals honours the same targets and the same per-session sampling OrbitCapture does, from one implementation rather than two.

Measured overhead

Measured rather than claimed, over a 5-minute scripted session against the same app with the SDK off. iOS Simulator, iPhone18,1 on Apple M1, 300 seconds per configuration, 60 screens, 300 taps, 200 network calls and 1,000 log lines. Against the baseline:
  • Defaults: +0.08 points of CPU, +3.0 MB of peak memory, 26 KB sent per minute.
  • Replay: +0.25 points of CPU, +4.7 MB, 45 KB per minute.
  • Bodies: +0.34 points of CPU, +5.5 MB, 26 KB per minute.
  • Live stream: +0.57 points of CPU, +6.9 MB, 49 KB per minute.
The ring buffer costs 16.5 microseconds per event to append and compresses about 32 times on disk, so 1,000 events are 199 KB raw and 6.2 KB stored. A device recording ten events a second spends roughly 0.017% of one core on the buffer.
The CPU column is the whole process, so the scripted session’s own work is most of it. What the SDK costs is the difference between the rows, and a CI job fails the build if that difference moves past 5 points.

Next

SDK configuration

Every field of CaptureConfiguration and VitalsConfiguration, and where the key comes from.

What the SDK collects

Automatic, explicit, and what never leaves the device.