Skip to content

Getting Started on iOS

PulseLoop for iOS is a native SwiftUI app with SwiftData persistence, Live Activities, and a Dynamic Island widget. There are two ways to run it: the upcoming public TestFlight beta, or building from source in Xcode.

Pick a ring first

PulseLoop talks to a real Bluetooth ring. Before you start, check the supported hardware to make sure your ring is one PulseLoop can drive. No ring yet? You can still explore the whole app with demo data.

TestFlight beta

The public TestFlight beta is live. Sign up here to request an invite, or ask on the Discord.

Prefer the raw IPA?

Every release ships a pre-built IPA you can sign with your own Apple ID. See Sideloading the IPA.

56ff ring not receiving any data?

Some users have reported receiving no data when setting the 56ff ring up directly with PulseLoop. If this happens, set the ring up once using the Jring app first, then unpair it from Jring and use it with PulseLoop.

Build from source (Xcode)

Requirements

  • Xcode 16+ on macOS.
  • An iOS 18+ physical device — Bluetooth and Live Activities need real hardware, so the simulator can't reach the ring.
  • A compatible 56ff or Colmi/Yawell BLE ring (see supported rings).
  • An AI provider for the optional Coach. Apple's on-device model and a local / self-hosted server need no cloud API key; hosted providers use the key from that provider.

Run it

  1. Open PulseLoop.xcodeproj in Xcode.
  2. Select the PulseLoop scheme and your physical device as the run target.
  3. Under Signing & Capabilities, set your own Team and a unique Bundle Identifier.

    The Live Activity extension needs this too

    The PulseLoopLiveActivity extension target is a separate target — give it your team and a unique bundle ID as well, or the build will fail to sign.

    WeatherKit capability (optional weather-aware coaching)

    The Coach can share your city name and current weather with the AI provider (opt-in under Settings → Coach → "Use location & weather"). This uses WeatherKit, which needs the WeatherKit capability enabled on your App ID in the Apple Developer portal — the PulseLoop.entitlements already declares com.apple.developer.weatherkit. If you skip this step the coach still works; the weather block is simply omitted. Only the reverse-geocoded city is ever shared — never your precise location.

  4. Build & run (⌘R).

  5. On first launch, complete onboarding, then keep the ring nearby — the app auto-scans and connects when Bluetooth powers on.
  6. To enable the Coach, open Settings → AI Coach, choose a provider and model, then follow its setup. Cloud-provider keys and optional local-server keys are stored in the iOS Keychain.

Demo data (no ring required)

You can explore the whole UI and coach without any hardware:

  • Settings → "Reseed demo data", or
  • Launch with the -seedDemo YES argument.

Running the tests

The unit tests in PulseLoopTests/ are hermetic — in-memory SwiftData and a mocked client, so they need no network and no secrets.

  • In Xcode: ⌘U.
  • From the CLI:

    xcodebuild test \
      -project PulseLoop.xcodeproj \
      -scheme PulseLoop \
      -destination 'platform=iOS Simulator,name=iPhone 16'
    

CI runs this exact suite (plus SwiftLint) on every PR.

Next steps