Error tracking for Expo — and the same SDK for your web app
Catch JS crashes with readable Hermes stacks, see every failed request, track crash-free sessions and screen views, and collect user feedback tied to the exact error they hit.
Install and initialize
One package, and it detects the runtime for you. On Expo it reads EXPO_PUBLIC_MARSAD_KEY, so you don't pass a key at all.
npx expo install @marsadco/sdkimport AsyncStorage from "@react-native-async-storage/async-storage";
import { init, ErrorBoundary } from "@marsadco/sdk/expo";
// storage keeps queued events across app restarts and offline periods
init({ storage: AsyncStorage });
export default function App() {
return (
<ErrorBoundary>
<RootNavigator />
</ErrorBoundary>
);
}With no fallback, the boundary renders a native “Something went wrong” view with the event's reference code and a one-tap report form — so a user can tell you what they were doing, attached to that exact crash.
Screens and navigation
React Native has no browser history to observe, so two hooks take your router's current path — one records navigation breadcrumbs for the next error, the other records screen views that land on the same Analytics page as your web traffic, attributed to iOS or Android.
import { usePathname } from "expo-router";
import { useNavigationBreadcrumbs, useScreenViews } from "@marsadco/sdk/expo";
export default function Layout() {
const pathname = usePathname();
useScreenViews(pathname);
useNavigationBreadcrumbs(pathname);
// …
}
// React Navigation: pass useRoute().name insteadWhat you get
- Every JS-thread error, including fatals, captured through ErrorUtils with the breadcrumbs that led there.
- Hermes stack traces symbolicated server-side — upload your source maps and minified bytecode frames resolve to your real files and lines.
- Network capture: every fetch and XHR with method, status and duration, and secrets scrubbed before anything leaves the device.
- Sessions and crash-free rate, so you can see release health per deploy.
- Screen views and custom track() events, next to your web traffic.
- A drop-in FeedbackWidget built from native primitives, and feedback linked to the issue by reference code.
- Persisted, retried delivery — events survive app restarts, flaky networks and crashes.
What we don't do yet
Native crashes — iOS signals and NSException, Android JVM crashes and ANRs — happen below the JS thread and need a native module. That module isn't in the package yet, so those aren't captured today. If native crash capture is your main requirement, we're not the right tool yet, and we'd rather tell you now than have you find out from an empty dashboard.
Symbolication of native debug files already works, so dSYM and ProGuard uploads you wire into CI now will pay off when capture lands.
One SDK, web and mobile
The same package instruments your Next.js app — errors, traces, Web Vitals and cookieless analytics — so your web and mobile projects sit side by side in one dashboard instead of two vendors. Free plan includes 5,000 errors and 10,000 views a month, no credit card; paid plans are flat per-organization from $9/mo, never per seat.
Start watching your apps in minutes
Install the SDK, trigger a test error, and watch it arrive symbolicated. Free plan, no credit card.