HyperFlow: where its trading screen loses time, and what to fix

Measured from the Netherlands in a logged-in Chrome, October 2026.

In short. On a warm reload the screen is trade-ready after 3.5 s (median of 5 loads), 6 of 27 perpetual trading screens, possible rank 6 to 8; after an uncached reload 4.1 s. The largest bottleneck: The chart is drawn 1.7 s after the book; its code arrives in a late wave. First change to try: Preload the chart library and its chunks with the first scripts, and send the candle request with the first /info requests at 0.9 s.

Three measurements appear on this page, and their times differ. Rank and results come from the campaign's timed reloads. The diagnostic capture and the recorded reload are single loads made with recording switched on, which slows the page: read them for the order of events and the gaps, not for totals.

Resultscampaign: 5 warm and 6 uncached reloads

Warm reloadmedian 3.5 s, range 3.3 s–3.7 s; loads: 3.7 s, 3.3 s, 3.3 s, 3.5 s, 3.6 s
Uncached reloadmedian 4.1 s, range 3.6 s–8.0 s; loads: 4.2 s, 8.0 s, 4.0 s, 4.4 s, 3.6 s, 3.9 s
Standing6 of 27 by median; possible rank 6 to 8. 1.0 s behind the fastest, Thalex (2.4 s): 1.4 times as long. The possible rank is the range the measurements leave open: it counts only the exchanges that clearly beat this one and those it clearly beats. Exchanges whose ranges overlap cannot be told apart.
Loads ready5 of 5 warm, 6 of 6 uncached
Notesrecent trades not measured: outside viewport

Where the time goescampaign medians, warm reload

Panels in the order they first showed real, usable data on a warm reload. The coloured part of each row is the time that panel added after the one before it. The last row is trade-ready: every panel is ready and the page has stopped moving.

0 s1 s2 s3 s
Order form0.7 s
Account panel0.7 s +0.0 s
Price0.9 s +0.3 s
Order book1.8 s +0.9 s
Chart2.8 s +1.0 s
Trade-ready3.5 s +0.7 s settling

Stack

React, built with Vite, on Vercel; TradingView chart library; viem and ethers; Privy and WalletConnect; trades on Hyperliquid through api.hyperliquid.xyz.

Delivery

hyperflow.fun on Vercel over HTTP/2 with every file served max-age=0, must-revalidate; market data from Hyperliquid's API (api.hyperliquid.xyz), over HTTP/1.1 and without compression.

HostRoleCDN edge seenConnectResponse
hyperflow.funpage—14 ms32 ms
api.hyperliquid.xyzmarket dataCloudFront Amsterdam12 ms230 ms
api-ui.hyperliquid.xyzmarket dataCloudFront Amsterdam12 ms238 ms

Median of up to 10 attempts from the test machine. Response time includes the server's own time, so it is not a distance.

What happened, in orderdiagnostic capture 1 October, uncached

From one uncached diagnostic load recorded on 1 October 2026 (cache disabled, browser extensions active), so totals are slower than the campaign's timed loads; file names, sizes, headers, order of events and main-thread times are what the findings rely on. A main-thread time given for a script counts all the work that starts in that script, including code it calls in other files, so it shows where start-up work begins, not what one library costs. Endpoint paths were masked when the capture was saved.

WhenWhat
0.02 sHTML arrives (Vercel).
0.11–0.45 sindex-DcwWVkXX.js (1.8 MB compressed, 6.2 MB unpacked) with viem and ethers; index starts 1.0 s of main-thread work.
0.51 sFirst paint.
0.91 sThe Hyperliquid feed opens (handshake 1.47 s, first message 1.76 s) and four REST calls go out; the three large ones (72, 64 and 137 KB) are returned uncompressed at 1.55–1.72 s.
0.93 sWalletConnect registry, 1.2 MB unpacked.
1.09 sPage header shows the market; price at 1.50 s.
2.39 sOrder book shows.
4.13 sChart drawn, 1.7 s after the book: trade-ready in this load.

Recorded warm reload, 3 October

One warm reload recorded with Chrome's performance trace. Recording slows the page, so read the order and the gaps, not the total.

WhenWhat
0.0 sHTML arrives
0.7 sOrder form ready
0.7 saccount-table ready
0.7 saccount-info ready
1.0 sPrice ready
1.1 sFirst frame sent on a live feed
1.4 sFirst frame received on a live feed
1.8 sOrder book ready
2.7 sFirst market-data request
2.9 sChart ready
3.5 sTrade-ready

185 requests before trade-ready; 8 long main-thread tasks (over 50 ms) before trade-ready, longest 145 ms; 5 script requests before the first panel; 29 requests over HTTP/1.1.

Request waterfalldiagnostic capture 1 October, uncached

67 of the 101 requests (the page itself, the longest and the largest) started before market data was ready in the 1 October uncached capture, in start order. The outlined part of a bar is waiting for the server; the solid part is downloading. Rows are numbered so a request can be pointed to. The numbers on the right are the size received and the total time. Vertical lines mark when a panel had data in this capture.

PageScriptData requestImageStylesheetwaiting for the serverdownloading

0 s0 s1 s1 s2 s2 s3 s3 s4 s4 s1hyperflow.fun4 kB19 ms2hyperflow.fun/index-DcwWV…1.8 MB341 ms3hyperflow.fun/viem-DJhKPK…80 kB337 ms4hyperflow.fun/ethers-jAd7…130 kB336 ms5hyperflow.fun/charting_li…15 kB653 ms6api.hyperliquid.xyz73 kB642 ms7perps-api.hyperflow.fun721 B392 ms8perps-api.hyperflow.fun871 B393 ms9api.hyperliquid.xyz64 kB638 ms10perps-api.hyperflow.fun2 kB388 ms11api.hyperliquid.xyz18 kB800 ms12api.hyperliquid.xyz137 kB801 ms13perps-api.hyperflow.fun520 B379 ms14explorer-api.walletconnec…173 kB264 ms15hyperflow.fun49 kB42 ms16rpc.hyperliquid.xyz550 B554 ms17auth.privy.io3 kB414 ms18auth.privy.io/cf84a9887e2…408 ms19auth.privy.io/webpack-672…412 ms20auth.privy.io/framework-1…439 ms21auth.privy.io/main-6331d7…438 ms22auth.privy.io/_app-1c4013…428 ms23auth.privy.io/4547731e-8e…438 ms24auth.privy.io/4e7c1bdd-a0…474 ms25auth.privy.io/e488c0c2-20…466 ms26auth.privy.io/50ad770a-f0…469 ms27auth.privy.io/5256-030a49…464 ms28auth.privy.io/2275-fab236…480 ms29auth.privy.io/3833-2bcfe4…469 ms30auth.privy.io/6538-ca2dd9…465 ms31auth.privy.io/8038-417af6…465 ms32auth.privy.io/2637-ab0373…472 ms33auth.privy.io/190-407e619…466 ms34auth.privy.io/2869-55c5f7…466 ms35auth.privy.io/1093-830ca2…466 ms36auth.privy.io/2231-7339b5…466 ms37auth.privy.io/9404-414f32…466 ms38auth.privy.io/5106-ce2b07…470 ms39auth.privy.io/974-9194b1c…467 ms40auth.privy.io/7361-35875e…467 ms41auth.privy.io/7969-9e9cae…477 ms42auth.privy.io/1110-0b7ee6…474 ms43auth.privy.io/1928-086107…470 ms44auth.privy.io/5187-0f00d7…477 ms45auth.privy.io/683-c5ab348…467 ms46auth.privy.io/3185-1fe723…468 ms47auth.privy.io/embedded-wa…468 ms48auth.privy.io/_buildManif…468 ms49auth.privy.io/_ssgManifes…468 ms50tokens.coingecko.com50 kB120 ms51api.hyperliquid.xyz4 kB763 ms52api.hyperliquid.xyz4 kB763 ms53api.hyperliquid.xyz4 kB762 ms54api.hyperliquid.xyz4 kB623 ms55api.hyperliquid.xyz4 kB617 ms56api.hyperliquid.xyz4 kB573 ms57api.hyperliquid.xyz42 kB515 ms58api.hyperliquid.xyz4 kB539 ms59api.hyperliquid.xyz4 kB526 ms60api.hyperliquid.xyz4 kB498 ms61api.hyperflow.fun4 kB521 ms62perps-api.hyperflow.fun584 B514 ms63perps-api.hyperflow.fun520 B526 ms64perps-api.hyperflow.fun529 B512 ms65perps-api.hyperflow.fun518 B526 ms66perps-api.hyperflow.fun540 B524 ms67perps-api.hyperflow.fun735 B499 msprice 1.5 sorder book 2.4 schart 4.1 s
Download this figure as an image:

Bottlenecks and fixes, largest firstdiagnostic capture 1 October, uncached

HF-1The chart is drawn 1.7 s after the book; its code arrives in a late wave.grade C
Evidence
1 October capture: book at 2.39 s, chart at 4.13 s. In the campaign the chart is last in every ready load (warm medians: book 1.8 s, chart 2.8 s). A timed load shows the chart library (library.f5eaeb6901219f861981.js) and its first chunks requested only at 2.23 s and a second group of about 26 chart files at 2.65 s; chart ready at 3.89 s. In the 3 October recording a request classed as history runs from 2.75 to 3.01 s, around the chart's readiness at 2.86 s; the recording does not show that it carries candles or that the chart waits for it.
Gap observed
1.7 s between the order book and the chart
Holds back
Chart (median 2.8 s in the timed loads).
Fix
Preload the chart library and its chunks with the first scripts, and send the candle request with the first /info requests at 0.9 s.
Where
Chart loader and datafeed initialisation; the HTML head.
Verify
DevTools → Network: library.js starts before 0.5 s; no group of chart files after 1.5 s.
HF-2A 6.2 MB main script that is revalidated on every visit.grade B
Evidence
index-DcwWVkXX.js is 6.3 MB unpacked (1.8 MB compressed) and, like every hyperflow.fun file, served with "public, max-age=0, must-revalidate" although its name is content-hashed. 3 October warm reload: of 174 responses, 10 came straight from the browser cache and 97 were re-checked with the server. 1.0 s of main-thread work starts in the index script. viem and ethers are both loaded (assets/viem-DJhKPKUP.js and assets/ethers-jAd7vO1_.js).
Gap observed
1.0 s of main-thread work that starts in the main index script
Holds back
Start-up as a whole; which panel waits for this work is not established.
Fix
Serve hashed assets with max-age=31536000, immutable, and check whether both viem and ethers are needed.
Where
Vercel headers for /assets/; bundle dependencies.
Verify
DevTools → Network on a normal reload: index-*.js shows "(disk cache)", not 304.
HF-3The first Hyperliquid API calls take 0.6 to 0.8 s, uncompressed and over HTTP/1.1.grade B
Evidence
1 October capture: four requests to api.hyperliquid.xyz start at 0.91–0.92 s and take 0.64 to 0.80 s; the three large ones wait 0.58–0.59 s for the first byte, and their responses (72, 64 and 137 KB) carry no content-encoding and were CDN misses. api.hyperliquid.xyz uses HTTP/1.1 (14 requests in the capture, 16 in the 3 October recording), as does app.hyperliquid.xyz (12). Later calls in a timed load take about 0.25 s. The captures hold no connection timing, so they do not show whether the slow first calls are waiting for a new connection.
Gap observed
0.58 s to the first byte of each of the three large first API calls
Holds back
Not established: the captures do not show which panel waits for this.
Fix
Try a preconnect to api.hyperliquid.xyz in the HTML head and see whether the first calls drop to the 0.25 s of the later ones; ask Hyperliquid for compressed responses, or proxy and cache public market data at an edge.
Where
HTML head; requests to api.hyperliquid.xyz.
Verify
DevTools → Network → Timing on the first /info call: connection set-up time; Headers: content-encoding present.
HF-4Trade-ready comes 0.7 s after the chart has its data: the chart is still animating.grade B
Evidence
All 11 ready campaign loads: between the chart having its data and trade-ready (about 0.70 s in 10 of them) the chart panel still has a running animation; in 3 warm loads the account table animates too. One uncached load took 4.3 s: the chart lost its data again and kept animating (trade-ready 7.95 s).
Gap observed
about 0.70 s between the chart and trade-ready in 10 of 11 timed loads
Holds back
Trade-ready itself: the page counts as ready only when nothing in a panel is still animating or loading.
Fix
Record a reload with DevTools → Animations and find what still animates in the chart after the candles are drawn, for example a toolbar loading spinner or a fade-in; end it when the data is in.
Where
The chart panel and its loading states.
Verify
DevTools → Animations during a reload: nothing in the chart container animates after the candles appear.
Likely saving
Up to ~0.7 s
HF-5Wallet and token lists load before the market is on screen.grade C
Evidence
1 October capture: WalletConnect's wallet list (1.2 MB unpacked) at 0.93 s, 31 Privy scripts at 1.5–2.0 s (these came from the browser cache in that capture, so they cost processing, not download), a CoinGecko token list (202 KB) at 1.73 s and a li.quest response (84 KB) at 3.38 s; the book shows at 2.39 s and the chart at 4.13 s.
Measured
a 1.2 MB wallet list, 31 Privy scripts and two token lists before the chart
Holds back
Not established: the captures do not show which panel waits for this.
Fix
Load the wallet list, Privy and the token lists after trade-ready or on the first wallet or swap action.
Where
Wallet provider set-up; the token-list loader (assets/getTokenList-*.js).
Verify
DevTools → Network: no walletconnect, privy, coingecko or li.quest request before the chart is drawn.
Likely saving
Unknown

Grade B: the capture shows the problem directly. Grade C: the order of events in the capture points to it; the dependency is for the team to confirm. The order is our judgement of each finding's effect on trade-ready, largest first; it is not sorted by gap. A gap is the time between two observed events or the time one piece of work takes; gaps overlap and do not add up. Where a finding is about size or count and no time was measured, the row says what was measured instead. Holds back names the panel the finding delays. Nothing here is graded higher, because no fix was confirmed by changing a page and measuring again.

Savings are estimates from the timeline, not measured after a change. They overlap, so they do not add up; the summary gives the combined estimate.

How this was measured

Timings: 5 warm and 6 uncached reloads in a seeded random order across all exchanges, each judged against a checklist frozen for this page before the campaign; trade-ready is the first moment every checklist panel shows real data, nothing is still loading, and the layout holds still for 0.5 s. The findings on this page come from separate recorded loads, which are never part of the timings. Full method.