The iOS (Swift) and Android (Kotlin) SDKs for Pulse analytics. Same API, same wire protocol, and the same conformance fixtures as the web and React Native SDKs — add analytics to your mobile app with a reliable, offline-first event queue and clean identity, and nothing else.
- Privacy-first. No advertising ids, no location, no fingerprinting, no auto-capture. The SDK sends only the events you send it.
- Reliable. A persistent, ordered queue survives offline periods and process death. Delivery is idempotent — retries never duplicate events.
- Lean. iOS: no dependencies. Android: nothing beyond kotlinx-serialization. No background URLSession, no WorkManager.
| Platform | Directory | Distribution |
|---|---|---|
| iOS / Swift | ios/ (package root: Package.swift) |
SPM + CocoaPods |
| Android / Kotlin | android/ |
Maven Central |
- iOS: add the SPM package
https://github.com/Pulse-Circle-Studio/pulse-sdk-native(orpod 'pulse-circle', '~> 0.1'), thenPulse.initialize(apiKey: "pk_...")andPulse.track("event", properties: [...]). - Android: add
studio.pulsecircle.pulse:pulse-sdk-android:0.1.0from Maven Central, thenPulse.init(context, "pk_...")andPulse.track("event", mapOf(...)).
Each SDK is self-contained (default endpoint baked in, no config needed) and sends events from the end user's device at runtime. Agent-readable guide, reachable behind sandbox allow-lists: https://raw.githubusercontent.com/Pulse-Circle-Studio/pulse-sdk-native/main/llms.txt
import PulseSDK
Pulse.initialize(apiKey: "pk_your_api_key")
Pulse.track("subscription_started", properties: ["plan": "pro"])
Pulse.identify("user_42")
Pulse.reset()Install via SPM (https://github.com/Pulse-Circle-Studio/pulse-sdk-native) or
CocoaPods (pod 'pulse-circle', '~> 0.1'). See ios/README.md.
import studio.pulsecircle.pulse.android.Pulse
Pulse.init(context, "pk_your_api_key")
Pulse.track("subscription_started", mapOf("plan" to "pro"))
Pulse.identify("user_42")
Pulse.reset()Install studio.pulsecircle.pulse:pulse-sdk-android:0.1.0 from Maven Central.
See android/README.md.
Both SDKs implement the Pulse wire protocol and pass the conformance fixtures in CI. Those fixtures are a vendored copy of the source of truth in the pulse-sdk repo; CI diffs this copy against the canonical files on every run, so the four platforms can never silently drift apart. The Pulse ingestion server replays the same fixtures — the contract is verified from both ends.
ios/ Swift sources + XCTest conformance suite
android/ Gradle build: :pulse-core (pure JVM) + :pulse-android (AAR)
protocol/ Vendored PROTOCOL.md + FIXTURES.md + fixtures/ (CI-checked)
Per-platform tags trigger the publish workflow:
<version>(bare semver, e.g.0.1.1) — the iOS release. Swift Package Manager resolves this tag directly, so the tag is the SPM release; the same tag pushes thepulse-circlepod to CocoaPods trunk.android-v<version>— publishes the AAR and core JAR to Maven Central.
MIT © Pulse Circle Studio