Skip to content

[bug]: Self-hosted v1.3.0 — React hydration error (#418/#423) causes error boundary on mobile browsers #8867

@harshverma250202

Description

@harshverma250202

Description

Self-hosted Plane v1.3.0 Community Edition shows the "Looks like something went wrong!" error boundary page on mobile browsers (tested on iOS Chrome and Safari). Desktop browsers show console errors but recover. The v1.3.0 release notes mention "Fixed logo spinner hydration and theme loading issues", but the fix appears incomplete for self-hosted Docker images.

Steps to reproduce

  1. Deploy Plane v1.3.0 Community Edition self-hosted using makeplane/plane-frontend:stable (or :v1.3.0) Docker image
  2. Open the instance URL on a mobile browser (iPhone Chrome or Safari)
  3. The error boundary page appears: "Looks like something went wrong!"

Desktop browsers show the same React errors in the console but recover and render correctly.

Expected behavior

The app should load on both desktop and mobile browsers without triggering the error boundary.

Console errors

Error: Minified React error #418; visit https://reactjs.org/docs/error-decoder.html?invariant=418
    at gu (index-VH9TOfLF.js:6:4907)
    at sa (index-VH9TOfLF.js:8:45647)
    ...

Uncaught Error: Minified React error #423; visit https://reactjs.org/docs/error-decoder.html?invariant=423
    at sa (index-VH9TOfLF.js:8:45307)
    ...

Root cause analysis

The source code in apps/web/app/root.tsx correctly has suppressHydrationWarning on <html> and <body>, and uses next-themes ThemeProvider. However, the built Docker image's static HTML does not include the pre-rendered HydrateFallback (LogoSpinner) in the body:

Self-hosted HTML (from Docker image):

<body>
  <div id="context-menu-portal"></div>
  <div id="editor-portal"></div>
  <script>/* inline theme script */</script>
  <div></div>  <!-- empty React root -->
</body>

Plane Cloud (app.plane.so) HTML:

<body>
  <div id="context-menu-portal"></div>
  <div id="editor-portal"></div>
  <div style="position:relative;display:flex;height:100vh;...">
    <img src="/assets/logo-spinner-light-..." alt="logo">  <!-- pre-rendered fallback -->
  </div>
</body>

The self-hosted build outputs an empty root div while the Cloud build includes the HydrateFallback content. The theme initialization script modifies <html> attributes before React hydrates, creating a mismatch that triggers the error boundary on mobile.

Environment

  • Plane version: v1.3.0 Community Edition
  • Deployment: Docker (self-hosted via Coolify)
  • Images: makeplane/plane-frontend:v1.3.0 (Docker Hub, digest sha256:5116ac06c2b5f...)
  • Affected: iOS Safari 17+, iOS Chrome — error boundary triggered
  • Not affected: Desktop Chrome, Desktop Safari — console errors only, app recovers
  • Previous version: v1.2.3 loads (same hydrateRoot + theme script) but does not trigger error boundary on mobile

Possible fix

The self-hosted Docker image build should include the HydrateFallback component (LogoSpinner) pre-rendered in the static HTML, matching the Plane Cloud build output.

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions