What Happens When You Type a URL and Press Enter
DNS lookups, TCP and TLS handshakes, HTTP requests, servers, and the browser's rendering pipeline. The whole journey of a web page, explained so it finally clicks.
Read →Don't guess at performance. Measure first, then work through server response, images, JavaScript, fonts and third-party scripts in order. A diagnostic guide built around Core Web Vitals.
"The site feels slow" is a symptom, not a diagnosis. The cause could be a slow database query, a 4MB hero image, half a megabyte of JavaScript or a chat widget loading before your content. Random optimisation wastes time. A methodical diagnosis finds the real bottleneck quickly.
Start with PageSpeed Insights on your real URL. It shows two kinds of data:
Then open Chrome DevTools: the Network tab (with throttling enabled) and the Performance panel show exactly what loads and what blocks.
Run lab tests a few times. Scores vary between runs, so look at trends, not a single number.
| Metric | Measures | Good target |
|---|---|---|
| LCP (Largest Contentful Paint) | When the main content appears | 2.5 s or less |
| INP (Interaction to Next Paint) | How quickly the page responds to taps, clicks and keys | 200 ms or less |
| CLS (Cumulative Layout Shift) | How much content jumps around while loading | 0.1 or less |
Each points at different causes, so figure out which one is failing before you start fixing.
Time to First Byte is how long the browser waits before receiving anything at all. If TTFB is slow, nothing else can be fast.
Common causes:
Fix: static generation or caching for public pages, a CDN, indexed queries, and parallel data fetching.
PageSpeed Insights tells you which element is the LCP. Usually it's a hero image or a large heading.
If it's an image:
srcset and sizes), or your framework's image component.fetchpriority="high" to the hero image.If it's text:
font-display: swap or optional, preload the main font file, and limit the number of font weights.opacity: 0. The browser may not count it as painted until the animation runs.JavaScript is the most expensive resource byte for byte. It has to be downloaded, parsed, compiled and executed, often on a slow phone.
Large JavaScript also hurts INP. Long tasks block the main thread, so taps feel laggy. Break up long work, avoid huge re-renders, and defer non-urgent work.
CLS comes from content moving after it first appears:
width and height (or aspect-ratio) so space is reserved.Analytics, tag managers, chat widgets, A/B testing tools, social embeds. Each one adds requests and main-thread work, and you don't control how heavy they are.
defer or async, or after the page becomes interactive.Lab tests on your laptop aren't your users' experience. After shipping fixes:
web-vitals library, sent to your analytics.When everything looks slow, work in this order:
Fix the biggest bottleneck first, re-measure, repeat.
Phones have slower CPUs and often slower networks. Large JavaScript bundles and unoptimised images hurt them most. Test with CPU and network throttling to see what mobile users experience.
They're part of Google's page experience signals. Content relevance matters more, but between similar pages, a faster experience helps, and it improves conversions regardless.
Aim for LCP under 2.5 seconds, INP under 200 milliseconds and CLS under 0.1 for most real visitors, measured at the 75th percentile of field data.
DNS lookups, TCP and TLS handshakes, HTTP requests, servers, and the browser's rendering pipeline. The whole journey of a web page, explained so it finally clicks.
Read →There are dozens of HTTP status codes, but about fifteen cover nearly everything. What each one means, when to return it, and the mix-ups (401 vs 403, 301 vs 302) that confuse everyone.
Read →A, AAAA, CNAME, MX, TXT and NS records in plain English, why DNS changes seem slow, and the troubleshooting commands that tell you what is really going on.
Read →