Skip to content

Release Health

Release Health measures the stability of every version of your app, with zero configuration. At startup the SDK opens a session (status='ok'); on an unhandled JS crash, it flips it to status='crashed'. The dashboard aggregates these sessions per release and shows the crash-free user rate.

Available from @pionne/react-native@0.7.0. Enabled by default.

import { Pionne } from '@pionne/react-native';
Pionne.init({
token: 'pio_live_…',
release: '1.4.2', // recommended: semantic version of the app
// releaseHealth: false, // to fully disable
});

No other setup. The SDK sends at most two requests:

WhenStatus sent
At initok
On fatal JS crashcrashed
On uncaught errorerrored

In the mobile dashboard, open a project → ⚡ Crash-free icon above the issues list. You’ll see:

  • The crash-free user rate per release (last 14 days)
  • The total / crashed / errored session counts
  • A colored bar: 🟢 ≥ 99 %, 🟡 95-99 %, 🔴 < 95 %

Three methods, rarely useful: the SDK handles everything.

Pionne.endSession(); // force close (status='exited')
Pionne.getSessionId(); // current UUID, for debugging
  • One session = one app start (one call to Pionne.init()).
  • If the same userIdAnon opens 5 sessions and one crashes, that user is counted as a “user who crashed” on the release.
  • The dashboard shows the ratio (users_total - users_crashed) / users_total.

Same protocol, same behavior, same payload:

SDKMin versionNotes
@pionne/react-native0.7.0iOS / Android / web
@pionne/web0.3.0Bonus: ‘exited’ flush via sendBeacon on pagehide
@pionne/node0.3.0’exited’ flush on process.beforeExit
pionne_flutter0.3.0Auto-flip on FlutterError + PlatformDispatcher + runZonedGuarded

The PHP SDK (pionne/pionne) does not expose Release Health: a server-side PHP script lives a few ms and doesn’t map to a user session. Tracking it would just bloat storage with no actionable signal.

The SDK calls POST /api/sessions with your pio_live_* token. The payload is minimal (~150 bytes). See API · Sessions for the details.