This site uses one functional cookie to keep feature rollouts consistent for you. Nothing is set until you choose. See the privacy notice.
P75 scores from real users. Pages need at least 5 samples to appear in the table.
Showing Web Vitals for version major:5
Largest Contentful Paint
2.0s
P75 · 78 samples
First Contentful Paint
2.5s
P75 · 104 samples
Interaction to Next Paint
64ms
P75 · 49 samples
Cumulative Layout Shift
0.049
P75 · 20 samples
Time to First Byte
482ms
P75 · 102 samples
Largest Contentful Paint
First Contentful Paint
Interaction to Next Paint
Cumulative Layout Shift
Time to First Byte
| Page | LCP | FCP | INP | CLS | TTFB | Samples |
|---|---|---|---|---|---|---|
| / | 3.1s | 2.4s | 32ms | 0.000 | 141ms | 117 |
| /operator | 1.7s | 483ms | 58ms | -- | 143ms | 31 |
| /operator/finance | 539ms | 512ms | 446ms | -- | 22ms | 25 |
| /design-system | 611ms | 8.2s | 16ms | 0.000 | 192ms | 24 |
| /vitals | 1.4s | 1.4s | 62ms | -- | 62ms | 19 |
| /thoughts/design-system-showcase | 450ms | 450ms | 892ms | 0.010 | 54ms | 18 |
| /operator/stores/6c37943c-70e1-409f-993b-6a571a068693 | 901ms | 538ms | 92ms | -- | 106ms | 16 |
| /research | 613ms | 613ms | 92ms | 0.533 | 47ms | 13 |
| /fantasy/nba/cards | 1.0s | 679ms | 72ms | 0.022 | 172ms | 12 |
| /operator/products | 265ms | 568ms | -- | -- | 251ms | 8 |
| /discover | 1.2s | 2.0s | -- | -- | 1.2s | 7 |
ISR + static pre-rendering
High-traffic TCG/Pokedex pages use revalidate = 86400 and generateStaticParams, so the largest painted element is already in a CDN-cached HTML file before the first request arrives.
Code splitting + streaming SSR
next/dynamic with a ThoughtsSkeleton loading fallback splits each write-up into its own chunk. Suspense boundaries stream the skeleton immediately while data fetches resolve in parallel on the server.
Specific transitions + startTransition for non-urgent updates
Replaced transition-all with explicit property lists (transition-[opacity,transform] for entrance animations, transition-[border-color,box-shadow] for hover) so the browser only watches the properties that actually change. startTransition wraps state updates that kick off large re-renders so input events aren't blocked.
Pixel-matched skeletons per view, no unsized content
Each lazy-loaded calendar view (day, week, year) ships with a skeleton that mirrors the real view's exact row heights and grid structure, so the page doesn't shift when the JS chunk arrives. ThoughtsSkeleton mirrors the Summary article layout that thoughts pages open on, so it doesn't flash the chat view first.
Static landing page + CDN caching + connection pooling
The landing page is statically rendered at build time. NBA and TCG proxy routes set public, s-maxage=300/3600 for CDN caching. Railway Postgres uses a connection pool so there is no per-request handshake.