The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Pulse listing page.
Open-source analytics SDKs for web, React Native, iOS, and Android. Add analytics to your app with a reliable, offline-first event queue and clean identity — and nothing else.
This repository holds the TypeScript packages. The Swift and Kotlin SDKs live
in pulse-sdk-native.
Install: npm i @pulse-circle/web, then Pulse.init('pk_...') and
Pulse.track('event', {...}). The package is self-contained (zero deps, default
endpoint baked in) and ships llms.txt inside it. Installing needs only npm; event
delivery happens in the end-user's browser at runtime.
| Package | What it's for | Install |
|---|---|---|
@pulse-circle/web | Browser / any web app | npm i @pulse-circle/web |
@pulse-circle/react-native | React Native & Expo | npm i @pulse-circle/react-native |
@pulse-circle/core | Platform-agnostic engine (used by the above) | npm i @pulse-circle/core |
@pulse-circle/mcp | Local (stdio) MCP server — offline setup/connect guides for AI agents | claude mcp add pulse -- npx -y @pulse-circle/mcp |
That's the whole API. See each package's README for the platform-specific install (script tag, Expo, etc.) and the full reference.
The five methods are identical across all four platforms, in each language's idiomatic syntax:
There are deliberately no screen/page auto-tracking and no revenue methods: revenue comes from server-side connectors, so there is exactly one source of truth per number.
idempotency_key and a timestamp at the moment you
call track — never at send time. Retries resend both byte-identical,
and the server's primary key includes both, so a flaky network can never
create a duplicate.The normative details are in protocol/PROTOCOL.md.
protocol/fixtures is the source of truth for
cross-platform behaviour. Each JSON file is a scenario ("these API calls
produce these HTTP requests"); every SDK runs them through a shared
fixture runner, and the server replays them against
real ingestion. Change behaviour by changing a fixture, and every platform's
CI tells you who's out of contract.
Versions are independent per package. Bump the version in the package's
package.json, then push a tag:
The publish workflow verifies the tag
matches package.json, runs the full test + build + size gate, and publishes
to npm with provenance.
MIT © Pulse Circle Studio