One widget fails. The rest keeps working.
React error boundaries isolate every component. When a widget throws an error, it shows a recovery card — retry, reload, or report. The rest of your page stays fully operational.
This widget encountered an unexpected error. Other widgets are unaffected.
Component-level isolation
Every widget, panel, and section is wrapped in its own React error boundary. Errors are caught at the smallest possible scope. A failing chart widget cannot take down your sidebar, navigation, or any other widget on the page.
- Each dashboard widget has its own error boundary
- Sidebar, header, and navigation have independent boundaries
- Failed components render recovery cards, not blank space
- Surrounding components continue receiving real-time updates
- Error state is local — no global state corruption
- Nested boundaries catch errors at the closest level
Three recovery actions
Every recovery card offers three clear actions. Most issues resolve with a single retry. For persistent errors, the report action sends full diagnostics to the engineering team.
- Retry — resets error state and re-renders the component
- Reload — refreshes the section with fresh data from the server
- Report — sends stack trace, component tree, and context to Sentry
- Recovery reconnects to Convex reactive queries automatically
- No stale state after recovery — always shows current data
- Action buttons are keyboard-accessible
Graceful degradation
Not everything needs to work for the system to be useful. Missing Sentry config? Error tracking silently disables. No AI API key? Content generation shows a setup prompt. Missing integration credentials? The connector pauses. Nothing crashes.
- Missing config silently disables features, never crashes
- Optional features degrade independently
- Core functionality works even when optional services are down
- Fire-and-forget for non-critical operations (analytics, telemetry)
- Error tracking itself is fail-safe — Sentry errors never break the app
- Reduced functionality is always better than no functionality
SENTRY_DSNnot setAI_API_KEYnot setPOSTHOG_KEYnot setSANITY_TOKENnot setHow it feels
Errors are contained, not contagious.
A chart widget hits an edge case? You see a small recovery card in that widget's spot — with a retry button that usually fixes it in one click. Meanwhile, your kanban board is still updating, your sidebar is still navigating, and your AI chat is still responding. One hiccup does not become a full-page crash.
