1. Image Optimisation (Biggest Win)

Images are typically 60–80% of a page's total download size. Optimising them is the single highest-impact performance change you can make.

2. Font Loading

<!-- Preconnect to font origin -->
<link rel="preconnect" href="https://fonts.googleapis.com"/>
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin/>

<!-- Add display=swap to prevent invisible text -->
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap" rel="stylesheet"/>

font-display: swap shows a system font immediately, then swaps to your custom font when it loads. This prevents the "invisible text" problem where content is unreadable while the font downloads.

3. Critical CSS

CSS blocks rendering — the browser won't paint anything until all CSS is loaded. For large stylesheets, inline the CSS needed for above-the-fold content and defer the rest:

<head>
  <!-- Inline critical CSS (hero, nav, fold content) -->
  <style>
    /* Only the styles needed for above-the-fold content */
    body { margin: 0; font-family: sans-serif; background: #060b14; }
    header { position: sticky; top: 0; height: 56px; }
  </style>

  <!-- Defer full CSS -->
  <link rel="preload" href="/css/main.css" as="style" onload="this.onload=null;this.rel='stylesheet'"/>
  <noscript><link rel="stylesheet" href="/css/main.css"/></noscript>
</head>

4. Script Loading

<!-- Defer non-critical scripts -->
<script src="/js/analytics.js" defer></script>

<!-- Async for independent scripts (e.g. ads, chat widgets) -->
<script src="/js/widget.js" async></script>

<!-- Never block rendering with scripts in <head> without defer/async -->
AttributeDownloadsExecutesBlocks HTML?
(none)ImmediatelyImmediatelyYes
deferIn parallelAfter HTML parsedNo
asyncIn parallelAs soon as downloadedPossibly

Core Web Vitals

MetricMeasuresGood Score
LCP (Largest Contentful Paint)Loading speed of main content≤ 2.5s
CLS (Cumulative Layout Shift)Visual stability — unexpected layout shifts≤ 0.1
INP (Interaction to Next Paint)Responsiveness to user input≤ 200ms
💡 Measure first: Use PageSpeed Insights (free, powered by Google Lighthouse) to get a baseline before optimising. Fix the highest-impact issues first.