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 OpenAI or Gemini API key — only needed for the AI Coach features.

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 → Coach and paste your API key, then pick a provider and model. The key is stored in the iOS Keychain and never leaves the device except to call the model you chose.

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