Public app links (/p/...) hang forever on the loading spinner in new tabs: RouterProvider lost-update race

Summary

On a public app link, Retool’s bundled React Router RouterProvider sometimes misses the router’s “initialized” update. The router finishes initializing, but the provider keeps rendering its first snapshot (initialized: false), so the root route’s HydrateFallback spinner stays on screen. Nothing is pending: there are no network requests, no React work and no CPU activity. Re-emitting router state un-sticks the page instantly, which confirms the update was lost rather than never produced.

Steps to reproduce

  1. In Chrome 154 on Windows (Incognito is fine), open a public app link (https://<org>.retool.com/p/<shortlink>/<page>) in a tab. It loads.
  2. Open a new tab, paste the same URL and press Enter.
  3. Actual: the centered progress circle spins forever. We observed it for over 30 minutes. Pressing F5 in that tab loads normally.
  4. Expected: the app loads, as it does in step 1.

On the affected machine this reproduces every time from step 2 onward. It is timing dependent: we could not reproduce it on Chrome 152 / macOS.

Evidence (captured in the stuck tab, without reloading)

Check Result Meaning
Network (HAR and is:pending filter) 43 requests, all finished by 0.72s. Nothing pending afterwards except the periodic /api/ddMetric flush. Not a network or server hang. /api/pages/public/shortlink is never requested.
Performance recording, 21s Scripting 2ms, System 161ms, main thread idle Not a CPU hang
performance.getEntriesByType('navigation')[0] type: navigate, activationStart: 0 Not a prerender or activation issue
import() of the /p/ route chunk (assets_vjs/index-CHsZzm8r.js) Resolves Route chunk loading is fine. No ?t= retries from __CLRP_imp either.
#root DOM Shell providers rendered, then the root route HydrateFallback progress circle Stuck inside RouterProvider
router.state (read via the React fiber on #root) initialized: true, navigation: idle, errors: null, both matched routes (/, p/:shortlink/:screenSlug?) resolved The router has finished
FiberRoot lanes pendingLanes, suspendedLanes, pingedLanes, expiredLanes all 0, no scheduled callback React has no pending or suspended work (not a stuck transition)
RouterProvider hook snapshot (useState(router.state)) initialized: false The provider’s state is stale: lost update
router.navigate(location.pathname + location.search, { replace: true }) Page loads immediately Re-emitting state to the now-subscribed provider fixes it

Additional info:

  • Instance: Cloud hosted
  • Plan: Business
  • Frontend build: 4.67.0-02eb910 (Build 391853)
  • Browser: Chrome 154
  • Operating System: Windows 11
  • App type: classic app opened through its public link (/p/<shortlink>/<page> )
  • Impact: high. Our client’s staff open a public app link many times a day. The page often sits on the Retool spinner indefinitely until someone presses F5. Users experience it as the app “taking minutes to load”.

Workaround

Press F5 if the spinner is still showing after about 5 seconds. It can’t be worked around inside the app, because it happens before any app code or org preloaded JavaScript runs.

Happy to share the org, app and HAR details with the Retool team privately.

@Darren
We talked during office hours yesterday (Tuesday 29/09/2026) on this issue, I am able to consistently replicate the issue now.

1 Like

Summary

On public app links (/p/...), a classic app opened in a new browser tab intermittently hangs forever on the loading spinner because Retool's bundled React Router RouterProvider misses the router's 'initialized' state update (a timing-dependent lost-update race), leaving the HydrateFallback spinner on screen before any app code runs.

AI Response

This matches an actively tracked issue where public/embedded classic apps intermittently get stuck on the infinite loading spinner before the runtime executes any queries, with the frequency tied to the local browser environment (notably new windows/tabs in Chrome). A refresh is the current interim workaround, consistent with the F5 behavior already observed. Retool staff traced a major contributor to service worker page caching and shipped fixes (June 10, June 17, and an additional reliability fix on Aug 30, 2026); a partial mitigation is to disable the 'Cache Service Worker' beta setting in Org Settings and then manually unregister the service worker via DevTools. Note that some reporters still saw occasional hangs after these changes, which aligns with this being a residual timing race rather than a fully closed issue.

Sources

:bookmark: Application not loading for certain users
Directly corroborates the same symptom—public-facing classic apps stuck on an infinite spinner before queries run, more likely in a new window/tab—and documents Retool's investigation, the service-worker-cache root cause, shipped fixes, and the disable-Cache-Service-Worker workaround.

The Community Team is testing out a new automation. Let us know if it's helpful (or not) by leaving a :heart:, :+1:, or :-1:. Or by marking this post as the "Solution"! Let us know if you have any feedback here. :rocket:

Thanks for sharing these findings, @Ahmed_Abdelhamid! You mention "affected machine" in the reproduction steps - are you finding that this is still somewhat device-dependent? And how consistent is the reproduction? Is it happening pretty much every time? I'm still not able to reproduce an infinite hang, even when severely throttling my computer's CPU, but overall load times definitely increase.

Not device dependent but apparently operating-system dependent.
I was able to re-produce it almost every time on a PC running windows, but never on a macbook.
The windows PC has a 3GHz CPU and 32 GB RAM, so I don't think it's a hardware limitation.