Skip to content

fix(happy-app): add error boundaries to contain render crashes#847

Open
EricSeastrand wants to merge 3 commits intoslopus:mainfrom
EricSeastrand:fix/error-boundaries
Open

fix(happy-app): add error boundaries to contain render crashes#847
EricSeastrand wants to merge 3 commits intoslopus:mainfrom
EricSeastrand:fix/error-boundaries

Conversation

@EricSeastrand
Copy link

Summary

  • Adds an ErrorBoundary component with two granularity levels: session-wide (chat view) and widget-level (individual tool views)
  • Session-level boundary keeps the header/back button functional when a chat crashes, so users can navigate away instead of being stuck
  • Widget-level boundaries wrap each tool view (TodoView, EditView, etc.) so a broken widget shows an inline error instead of crashing the whole chat
  • Hardens todos reducer to handle edge cases (null/undefined items) that were causing render crashes
  • Expands error boundaries to cover ChatList and MainView tabs
  • Includes properly translated error strings for all 10 supported languages

Test plan

  • Verify app builds and typechecks cleanly
  • Simulate a render crash in a tool view — should show inline error, not crash the chat
  • Simulate a render crash in chat content — should show error with back button still functional
  • Verify error strings display correctly in non-English locales

🤖 Generated with Claude Code
via Happy

EricSeastrand and others added 3 commits March 13, 2026 09:37
Add two layers of error boundaries to prevent a single component crash
from locking up the entire app:

- Session-level: wraps chat content so header/back button stay functional
  when a chat crashes, letting users navigate away
- Widget-level: wraps each tool view (TodoView, EditView, etc.) so a
  broken widget shows an inline error instead of crashing the whole chat

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Two fixes:

1. session.todos.filter crash: Claude Code sometimes sends TodoWrite's
   todos param as a JSON string instead of an array. Added parseTodos()
   in the reducer to handle string-encoded arrays, and Array.isArray()
   guard in ActiveSessionsGroup to prevent render crashes.

2. Error boundary gaps: The existing boundaries only protected tool
   views and chat content. The home screen sessions list had zero
   coverage — one bad session crashed the entire app. Added boundaries
   around each session card in ActiveSessionsGroup, ActiveSessionsGroupCompact,
   and SessionsList so a single broken session shows an inline error
   instead of the full-screen "Something went wrong" overlay.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Wrap each message in ChatList with an ErrorBoundary so a single
malformed message shows an inline error instead of crashing the
entire chat. Wrap each tab content (Sessions, Inbox, Settings) in
MainView so a crash in one tab doesn't kill the home screen.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant