On mobile browsers, logging into hesychia.ai shows the UI briefly, then the screen goes white. Pull-to-refresh flashes the UI for a split second before blanking again.
Likely cause
Auth bootstrap reads JWT tokens from localStorage at startup. Some mobile browsers (private mode, blocked storage) expose localStorage but throw SecurityError on access. That uncaught exception crashes React during boot.
Expected behavior
App should render normally (or fall back to unauthenticated sign-in) when storage is unavailable, instead of crashing to a white screen.
Reproduction
Open hesychia.ai on a mobile browser (especially private/incognito).
Sign in.
Observe white screen after initial render flash.
Proposed fix
Wrap all localStorage access in tokenStorage.js with a safe helper that catches storage errors and treats tokens as unavailable.
## Problem
On mobile browsers, logging into hesychia.ai shows the UI briefly, then the screen goes white. Pull-to-refresh flashes the UI for a split second before blanking again.
## Likely cause
Auth bootstrap reads JWT tokens from `localStorage` at startup. Some mobile browsers (private mode, blocked storage) expose `localStorage` but throw `SecurityError` on access. That uncaught exception crashes React during boot.
## Expected behavior
App should render normally (or fall back to unauthenticated sign-in) when storage is unavailable, instead of crashing to a white screen.
## Reproduction
1. Open hesychia.ai on a mobile browser (especially private/incognito).
2. Sign in.
3. Observe white screen after initial render flash.
## Proposed fix
Wrap all `localStorage` access in `tokenStorage.js` with a safe helper that catches storage errors and treats tokens as unavailable.
Recording (Vivaldi Android, logged in, after #55 deploy) still shows solid white page at hesychia.ai. Pull-to-refresh spinner appears; no durable UI.
localStorage guard did not fix this — looking for remount / render crash causes next (notably Outlet key={Date.now()} in App.tsx).
## Follow-up from mobile screen recording
Recording (Vivaldi Android, logged in, after #55 deploy) still shows solid white page at `hesychia.ai`. Pull-to-refresh spinner appears; no durable UI.
localStorage guard did not fix this — looking for remount / render crash causes next (notably `Outlet key={Date.now()}` in `App.tsx`).
key={Date.now()} remounts dashboard on every parent re-render (WS/account/message updates) → flash then white on mobile.
Follow-up PR removes that key + memoizes theme.
## Root cause update (from production + recording)
Recording still solid white at `hesychia.ai` after login (pull-to-refresh only).
`#55` localStorage guard was necessary hygiene but **not** the crash.
Found in **live** prod bundle:
```js
loading ? <div>Loading</div>
: authenticated ? <Outlet key={Date.now()} />
: <Navigate to="/signin/" />
```
`key={Date.now()}` remounts dashboard on every parent re-render (WS/account/message updates) → flash then white on mobile.
Follow-up PR removes that key + memoizes theme.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problem
On mobile browsers, logging into hesychia.ai shows the UI briefly, then the screen goes white. Pull-to-refresh flashes the UI for a split second before blanking again.
Likely cause
Auth bootstrap reads JWT tokens from
localStorageat startup. Some mobile browsers (private mode, blocked storage) exposelocalStoragebut throwSecurityErroron access. That uncaught exception crashes React during boot.Expected behavior
App should render normally (or fall back to unauthenticated sign-in) when storage is unavailable, instead of crashing to a white screen.
Reproduction
Proposed fix
Wrap all
localStorageaccess intokenStorage.jswith a safe helper that catches storage errors and treats tokens as unavailable.Follow-up from mobile screen recording
Recording (Vivaldi Android, logged in, after #55 deploy) still shows solid white page at
hesychia.ai. Pull-to-refresh spinner appears; no durable UI.localStorage guard did not fix this — looking for remount / render crash causes next (notably
Outlet key={Date.now()}inApp.tsx).Root cause update (from production + recording)
Recording still solid white at
hesychia.aiafter login (pull-to-refresh only).#55localStorage guard was necessary hygiene but not the crash.Found in live prod bundle:
key={Date.now()}remounts dashboard on every parent re-render (WS/account/message updates) → flash then white on mobile.Follow-up PR removes that key + memoizes theme.