Hi everyone,
We’re building our login experience with Advanced Customizations for Universal Login (ACUL) using React (@auth0/auth0-acul-react), with the identifier-first flow (login-id → login-password). We’re seeing a visual issue that
only shows up in some browsers, and we’d like to know if there’s a recommended approach.
The problem
When a user submits their email on login-id and is redirected to login-password, Safari and Firefox show a blank white page for a moment before the new screen renders. In Chrome and Edge the transition is seamless.
What we think is happening
- Every ACUL screen change is a full-page navigation controlled by Auth0 (form POST → redirect → new document).
- The HTML that Auth0 serves for an ACUL screen has an empty . Our React app only appears after the scripts from head_tags load and render.
- Chrome and Edge use Paint Holding ( Paint Holding - reducing the flash of white on same-origin navigations | Blog | Chrome for Developers ): for same-origin navigations they keep the previous page on screen until the new page has its first contentful paint. That hides the gap.
- Safari and Firefox don’t hold the previous page in the same way (see e.g. Mozilla Bug 1714769 ( 1714769 - Use the Chrome "Paint Holding" to get rid of the white screen )), so the empty document gets painted and users see a white flash.
So the white screen is really the time between “new document committed” and “our JS has rendered something”. Chrome just hides it.
What we’ve already done on our side
We measured this locally with a production build served the same way as head_tags (CSS link + module scripts in , empty body, assets fully cached):
- Before: ~360 ms between DOM ready and first contentful paint.
- After: ~85 ms.
The biggest win came from our own code. Our screen components were behind React.lazy + Suspense, and React holds back the reveal after a fallback, which added roughly 300 ms of empty page. We now resolve the current screen’s
module before the first render, so the first render never suspends.
Part of what’s left is web font loading. We still see a short flash in Safari/Firefox, and we can’t remove it completely from the client side, because the document always starts empty.

Questions
- if we have any proper methods that we can solve the flash issue between login-id and login-password on safari and firefox, and is there a supported way to put initial content in the HTML of an ACUL screen? For example a static shell or skeleton in the , so the first paint isn’t blank while the JS boots.
- Inline styles in head_tags: the content field seems to be limited to 250 characters. Is there a way to include more critical CSS inline (e.g. a layout skeleton drawn with CSS), or is this limit fixed?
- Transitions between screens: is there any way to move between login-id and login-password without a full document navigation (e.g. client-side transitions in the ACUL SDK), or is a full reload always required by design?
- Is this a known issue? Is there any guidance or best practice from Auth0 for avoiding the white flash between ACUL screens in Safari/Firefox?
- Any plans to support things like cross-document View Transitions ( Cross-document view transitions for multi-page applications | View Transitions | Chrome for Developers ) or render-blocking hints (e.g. ) via
head_tags, which could help in supporting browsers?
Environment
- @auth0/auth0-acul-react v1.6.0, React 19, Vite build
- Reproduced on Safari (macOS) and Firefox; not reproducible on Chrome or Edge
Happy to share a minimal reproduction if that helps. Thanks!