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
- 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. - Open a new tab, paste the same URL and press Enter.
- Actual: the centered progress circle spins forever. We observed it for over 30 minutes. Pressing F5 in that tab loads normally.
- 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.