Plugin Reference
Full app.json options for the @dreamhorizonorg/pulse-react-native Expo config plugin.
Top Level
| Option | Required | Description |
|---|---|---|
endpointBaseUrl | Yes | OTLP / Pulse backend URL |
apiKey | Yes | Project API key |
dataCollectionState | No | "ALLOWED" (default), "PENDING", or "DENIED" |
endpointHeaders | No | Extra HTTP headers sent with every request |
configEndpointUrl | No | Remote SDK config URL |
customEventCollectorUrl | No | Custom events / logs URL |
android | No | Android-specific overrides |
ios | No | iOS-specific overrides |
Top-level endpointBaseUrl and apiKey apply to both platforms. Use android / ios sections to override per platform.
android
Init overrides
| Option | Description |
|---|---|
endpointBaseUrl | Override base URL for Android only |
apiKey | Override API key for Android only |
globalAttributes | Key/value pairs attached to all Android telemetry |
android.instrumentation
| Key | Shape | Description |
|---|---|---|
crash | { "enabled": boolean } | Crash reporting |
network | { "enabled": boolean } | Network monitoring |
activity | { "enabled": boolean } | Activity lifecycle |
fragment | { "enabled": boolean } | Fragment lifecycle |
anr | { "enabled": boolean } | ANR detection |
slowRendering | { "enabled": boolean } | Slow frame detection |
interaction | { "enabled": boolean, "url"?: string } | Interactions + optional config URL |
note
Click tracking (view-click / compose-click) is not configurable via app.json. After prebuild, add the dependencies manually to android/app/build.gradle. See Android Click Tracking.
ios
Init overrides
| Option | Description |
|---|---|
endpointBaseUrl | Override base URL for iOS only |
apiKey | Override API key for iOS only |
globalAttributes | Key/value pairs attached to all iOS telemetry |
ios.configuration
| Key | Type | Description |
|---|---|---|
includeScreenAttributes | boolean | Attach screen metadata to telemetry |
includeNetworkAttributes | boolean | Attach network metadata |
includeGlobalAttributes | boolean | Attach global attributes |
ios.instrumentation
Simple toggles — { "enabled": boolean } each:
crash, appLifecycle, screenLifecycle, appStartup, location
urlSession
| Field | Type | Description |
|---|---|---|
enabled | boolean | Instrument URLSession |
excludeOtlpEndpoints | boolean | Skip your OTLP host from capture |
sessions
| Field | Type | Description |
|---|---|---|
enabled | boolean | Session tracking |
maxLifetimeSeconds | number | Max session length |
backgroundInactivityTimeoutSeconds | number | Background timeout before new session |
shouldPersist | boolean | Persist session across launches |
interaction
| Field | Type | Description |
|---|---|---|
enabled | boolean | Interaction tracking |
configUrl | string | Remote config URL |
uiKitTap
| Field | Type | Description |
|---|---|---|
enabled | boolean | UIKit tap events |
captureContext | boolean | Capture label from view hierarchy |
rage | object | Rage tap config (timeWindowMs, rageThreshold, radiusPt) |
sessionReplay
| Field | Type | Description |
|---|---|---|
enabled | boolean | Session replay |
replayEndpointBaseUrl | string | Upload base URL |
textAndInputPrivacy | string | "maskAll", "maskAllInputs", "maskSensitiveInputs" |
imagePrivacy | string | "maskAll", "maskNone" |
maskViewClasses | string[] | Classes always masked |
unmaskViewClasses | string[] | Classes never masked |
captureIntervalMs | number | Screenshot capture interval |
compressionQuality | number | 0–1 |
screenshotScale | number | Scale factor |
flushIntervalSeconds | number | Flush interval |
flushAt | number | Batch size hint |
maxBatchSize | number | Max batch size |
What's not configurable via app.json
Some things require native code and can't be expressed in app.json:
- Before-send hooks (span/log/metric filtering)
- Custom OTel resource attributes
- Custom tracer/logger providers
- Per-request iOS URL filtering
For these, fall back to manual native initialization — see iOS SDK Initialization and Android SDK Configuration.
Full Example
{
"expo": {
"plugins": [
[
"@dreamhorizonorg/pulse-react-native",
{
"endpointBaseUrl": "https://your-backend.com",
"apiKey": "your-api-key",
"dataCollectionState": "PENDING",
"android": {
"globalAttributes": { "platform": "android" },
"instrumentation": {
"crash": { "enabled": true },
"network": { "enabled": true },
"interaction": { "enabled": true, "url": "https://your-backend.com/v1/interactions" }
}
},
"ios": {
"globalAttributes": { "platform": "ios" },
"configuration": {
"includeScreenAttributes": true
},
"instrumentation": {
"crash": { "enabled": true },
"screenLifecycle": { "enabled": false },
"uiKitTap": { "enabled": true, "captureContext": true }
}
}
}
]
]
}
}