cc0933c514
CI/CD / CI · API (dotnet build + test) (push) Successful in 42s
CI/CD / CI · Admin API (dotnet build) (push) Successful in 31s
CI/CD / CI · Dashboard (tsc) (push) Successful in 1m4s
CI/CD / CI · Admin Web (tsc) (push) Successful in 36s
CI/CD / CI · Website (tsc) (push) Successful in 45s
CI/CD / CI · Koja (tsc) (push) Successful in 48s
CI/CD / Deploy · all services (push) Successful in 2m35s
The (fullscreen) layout redirected to /login whenever user.accessToken was falsy — but on a page refresh that fires before Zustand finishes rehydrating the persisted auth from localStorage, so an authenticated user was bounced to login on every refresh. Gate the redirect on _hasHydrated (and show a loader while rehydrating), matching RouteGuard. Tokens themselves are already long (30d access / 365d refresh), so sessions now survive refreshes as expected. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>