pulse-sdk
Pulse growth-analytics SDKs and MCP server — web, React Native and a stdio MCP server for AI coding agents. Read-only, offline-first.
Documentation
Pulse SDK
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.
- Tiny. The web SDK is ≤ 10 KB gzipped with zero dependencies.
- Reliable. A persistent, ordered queue survives offline periods and
process death. Delivery is idempotent: retries never duplicate events.
- Honest about privacy. No auto-capture, no fingerprinting, no IDFA/GAID,
no ad SDKs. The SDK sends only the events you send it.
- One protocol, four platforms. Every SDK implements the same
wire protocol and passes the same
conformance fixtures in CI. The Pulse ingestion
server replays those same fixtures — the contract is verified from both
ends.
This repository holds the TypeScript packages. The Swift and Kotlin SDKs live
For AI agents
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.
Packages
| 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` |
Quickstart (web)
npm install @pulse-circle/webimport { Pulse } from '@pulse-circle/web';
Pulse.init('pk_your_api_key');
// Track product events — the SDK batches, persists, and retries for you.
Pulse.track('subscription_started', { plan: 'pro' });
// Tie events to a user after login.
Pulse.identify('user_42');
// On logout, start a fresh anonymous identity.
Pulse.reset();That's the whole API. See each package's README for the platform-specific
install (script tag, Expo, etc.) and the full reference.
The API, everywhere
The five methods are identical across all four platforms, in each language's
idiomatic syntax:
init(apiKey, options?) // configure once
track(event, properties?) // queue an event
identify(userId) // associate the current identity with a user id
reset() // logout: new anonymous identity
flush() // force-send the queue (tests, critical moments)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.
The reliability contract
- Every event gets an `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 queue is persistent (localStorage on web, files on mobile) and ordered.
It survives reloads, crashes, and offline periods up to a per-platform cap,
then evicts oldest-first with a debug warning rather than growing without
bound.
- Retries use exponential backoff with jitter. A batch the server keeps
rejecting (a "poison" batch) is moved aside after 10 attempts so it can
never block everything behind it.
The normative details are in `protocol/PROTOCOL.md`.
Development
npm install
npm test # conformance fixtures + unit tests (vitest)
npm run lint
npm run typecheck
npm run build # tsup builds for every package
npm run size -w @pulse-circle/web # enforce the 10 KB budgetConformance fixtures
`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.
Releasing
Versions are independent per package. Bump the version in the package's
`package.json`, then push a tag:
core-v0.1.0 | web-v0.1.0 | react-native-v0.1.0The publish workflow verifies the tag
matches `package.json`, runs the full test + build + size gate, and publishes
to npm with provenance.
License
MIT © Pulse Circle Studio
Frequently asked questions
What is pulse-sdk?
pulse-sdk is Pulse growth-analytics SDKs and MCP server — web, React Native and a stdio MCP server for AI coding agents. Read-only, offline-first.
How do I install pulse-sdk?
Open the GitHub repository and follow its README. Most MCP servers are added to your client's MCP config, then called by your agent.
Is pulse-sdk open source?
Yes — it is hosted on GitHub at https://github.com/Pulse-Circle-Studio/pulse-sdk.
Related MCP tools
The go-to web for your AI coding agent — local-first search, fetch, crawl & research over MCP. No API keys, no cloud, $0/query. Public beta.
Open-source cross-agent memory layer for coding agents via MCP. Compatible with Claude Code, Codex, Cursor, Windsurf, Gemini CLI, Antigravity, OpenClaw, Hermes Agent, Oh-my-Pi, Pi, Copilot, Kiro, OpenCode, and Trae.
Browser MCP is a Model Context Provider (MCP) server that allows AI applications to control your browser
MCP server that enables AI assistants to interact with Google Gemini CLI, leveraging Gemini's massive token window for large file analysis and codebase understanding
AI Skills, MCP Tools, and CLI for Unity Engine. Full AI develop and test loop. Use cli for quick setup. Efficient token usage, advanced tools. Any C# method may be turned into a tool by a single line. Works with Claude Code, Gemini, Copilot, Cursor and any other absolutely for free.
Cut AI token costs 95%+ on code exploration. The leading MCP server for precise, symbol-level GitHub code retrieval via tree-sitter AST. Works with Claude Code, Cursor & any MCP client. 313B+ tokens saved.
Run your own MCP server? See who uses it and what to fix.
Measure it with TrackMCP