@radiate-so/browser-sdk
v0.1.1
Published
Radiate tracking SDK for the browser. Adds queue + storage + lifecycle on top of @radiate-so/js-sdk.
Maintainers
Readme
@radiate-so/browser-sdk
Browser tracking SDK for Radiate. Wraps @radiate-so/js-sdk and adds the lifecycle the core deferred:
- In-memory queue with batched flush on size, interval, and
pagehide - Anonymous-ID persisted in
localStorage - Session-ID in
sessionStoragewith idle refresh - Identified user state stored locally and auto-attached to events
- Auto-context capture: page URL/path/referrer/title, screen, language, timezone
- Reliable unload via
fetch(..., { keepalive: true })
Install
pnpm add @radiate-so/browser-sdkQuick start
import { RadiateBrowser } from '@radiate-so/browser-sdk'
const radiate = new RadiateBrowser({ publicKey: 'pk_...' })
radiate.identify('usr_123', { email: '[email protected]' })
radiate.track('signup', { plan: 'pro' })
radiate.page() // captures page context automatically
// On logout
radiate.reset()Why a separate package?
The core SDK is stateless — same code in browser, Node, and Workers. Browser-specific concerns (localStorage, unload listeners, page context) would either bloat the core or have to be guarded by env detection. Splitting keeps each layer doing one job.
Identify semantics
identify() here is client-side only — it stores the user's identifiers locally and attaches them to subsequent track() calls. It does not call /v1/identify because public keys can't (the server returns 403). To write traits on the server, your backend should use @radiate-so/js-sdk with a secret key.
Configuration
new RadiateBrowser({
publicKey: 'pk_...', // required — secret keys rejected
baseURL: 'https://api.radiate.so',
batchSize: 20, // flush at this many queued events
flushInterval: 10_000, // flush this often (ms)
sessionIdleMinutes: 30, // refresh session_id after idle window
storageKeyPrefix: 'radiate', // localStorage / sessionStorage namespace
autoContext: true, // attach page/screen/language/tz to events
})