Derive BTC options: 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 4.8 s (median of 5 loads), 2 of 2 BTC options screens, rank 2 is the only one the measurements leave open; after an uncached reload 4.6 s. The largest bottleneck: At least 856 ms of main-thread blocking before the first panel First change to try: Split the startup bundle so the trading screen's first panels do not wait for code they do not use (wallet, settings, other routes); break up the longest tasks.

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 5 uncached reloads

Warm reloadmedian 4.8 s, range 3.3 s–5.7 s; loads: 5.7 s, 4.9 s, 4.8 s, 3.3 s, 3.3 s
Uncached reloadmedian 4.6 s, range 3.2 s–13.8 s; loads: 13.8 s, 3.2 s, 3.7 s, 6.1 s, 4.6 s
Standing2 of 2 by median; rank 2 is the only one the measurements leave open. 2.0 s behind the fastest, Deribit BTC options (2.9 s): 1.7 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, 5 of 5 uncached

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 s4 s
Price2.9 s
Options chain2.9 s +0.0 s
Order form2.9 s +0.0 s
Account panel3.5 s +0.5 s
Trade-ready4.8 s +1.4 s settling
HostRoleCDN edge seenConnectResponse
app.derive.xyzpage—13 ms28 ms
api.lyra.financemarket dataCloudflare Amsterdam13 ms257 ms
api.derive.xyzmarket dataCloudflare Amsterdam13 ms258 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 order

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.1 sHTML arrives
1.4 sFirst market-data request
2.3 sFirst frame sent on a live feed
2.7 sPrice ready
2.7 sOptions chain ready
2.7 sOrder form ready
2.7 sbalances ready
2.7 sTrade-ready

136 requests before trade-ready; 10 long main-thread tasks (over 50 ms) before trade-ready, longest 127 ms; 81 script requests before the first panel; 0 requests over HTTP/1.1.

Request waterfallrecorded warm reload 3 October

60 of the 136 requests (the page itself, the longest and the largest) started before trade-ready in the warm reload recorded on 3 October, 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.

Data requestPageScriptImagewaiting for the serverdownloading

0 s0 s1 s1 s2 s2 s1host masked107 ms2app.derive.xyz · trades17 kB1155 ms3app.derive.xyz38 ms4app.derive.xyz29 ms5app.derive.xyz29 ms6app.derive.xyz30 ms7app.derive.xyz29 ms8app.derive.xyz30 ms9app.derive.xyz30 ms10app.derive.xyz30 ms11app.derive.xyz30 ms12app.derive.xyz30 ms13app.derive.xyz30 ms14app.derive.xyz29 ms15app.derive.xyz29 ms16app.derive.xyz29 ms17app.derive.xyz28 ms18app.derive.xyz29 ms19app.derive.xyz29 ms20app.derive.xyz29 ms21app.derive.xyz29 ms22app.derive.xyz29 ms23app.derive.xyz29 ms24app.derive.xyz29 ms25app.derive.xyz88 B84 ms26api.lyra.finance299 B295 ms27app.derive.xyz8 kB404 ms28api.lyra.finance200 B252 ms29api.lyra.finance260 B255 ms30app.derive.xyz19 kB233 ms31app.derive.xyz8 kB192 ms32app.derive.xyz · trades8 kB180 ms33app.derive.xyz · history8 kB174 ms34app.derive.xyz8 kB202 ms35app.derive.xyz8 kB798 ms36app.derive.xyz · trades8 kB172 ms37app.derive.xyz8 kB339 ms38app.derive.xyz8 kB192 ms39app.derive.xyz8 kB199 ms40app.derive.xyz8 kB175 ms41app.derive.xyz8 kB318 ms42app.derive.xyz9 kB64 ms43api.lyra.finance179 B280 ms44api.lyra.finance161 B278 ms45api.lyra.finance298 B326 ms46api.lyra.finance154 B257 ms47api.lyra.finance147 B360 ms48api.lyra.finance · history177 B357 ms49api.lyra.finance119 B353 ms50app.derive.xyz177 B63 ms51app.derive.xyz8 kB65 ms52host masked4 kB185 ms53app.derive.xyz78 B29 ms54app.derive.xyz8 kB141 ms55app.derive.xyz8 kB306 ms56app.derive.xyz8 kB89 ms57host masked196 B30 ms58app.derive.xyz8 kB129 ms59app.derive.xyz8 kB140 ms60app.derive.xyz8 kB293 msprice 2.7 s
Download this figure as an image:

Bottlenecks and fixes, largest firstrecorded warm reload 3 October

1At least 856 ms of main-thread blocking before the first panelgrade B
Evidence
10 long tasks (over 50 ms) before trade-ready, longest 127 ms; 81 script files were requested before the first panel showed. Counts cover the 10 longest tasks only.
Holds back
Not established: the captures do not show which panel waits for this.
Fix
Split the startup bundle so the trading screen's first panels do not wait for code they do not use (wallet, settings, other routes); break up the longest tasks.
Verify
DevTools → Performance, record a reload, open the Main track: long tasks show a red corner; the Bottom-up tab names the scripts.

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.

How this was measured

Timings: 5 warm and 5 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.