<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Zehlm Web Development LLC</title>
    <description>The latest articles on DEV Community by Zehlm Web Development LLC (@zehlm).</description>
    <link>https://dev.to/zehlm</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3978402%2Fe679e540-2d1d-429a-8e14-15c9c6f08d3b.jpg</url>
      <title>DEV Community: Zehlm Web Development LLC</title>
      <link>https://dev.to/zehlm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zehlm"/>
    <language>en</language>
    <item>
      <title>5 PageSpeed Optimizations That Took My Client Sites from 56 to 92 on Mobile</title>
      <dc:creator>Zehlm Web Development LLC</dc:creator>
      <pubDate>Wed, 10 Jun 2026 22:09:57 +0000</pubDate>
      <link>https://dev.to/zehlm/5-pagespeed-optimizations-that-took-my-client-sites-from-56-to-92-on-mobile-4ea5</link>
      <guid>https://dev.to/zehlm/5-pagespeed-optimizations-that-took-my-client-sites-from-56-to-92-on-mobile-4ea5</guid>
      <description>&lt;p&gt;If you're building sites for small businesses, PageSpeed scores matter more than ever. Google uses Core Web Vitals as a ranking factor, and a 56 on mobile is quietly killing your client's SEO. Here's exactly what moved the needle for us.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. &lt;strong&gt;&lt;em&gt;Fix Your LCP Image First&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The single biggest win on every project. Largest Contentful Paint is almost always the hero image. Two things that made an immediate difference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Convert to WebP. We target ~45KB desktop, ~22–28KB mobile using a &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element with separate &lt;code&gt;srcset&lt;/code&gt; values.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;fetchpriority="high"&lt;/code&gt; to the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag. This tells the browser to prioritize it above everything else.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;picture&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"hero-mobile.webp"&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(max-width: 768px)"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/webp"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"hero-desktop.webp"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/webp"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"hero-desktop.jpg"&lt;/span&gt; &lt;span class="na"&gt;fetchpriority=&lt;/span&gt;&lt;span class="s"&gt;"high"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Hero image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't lazy-load your LCP image. Ever.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. &lt;strong&gt;&lt;em&gt;Load Your Critical CSS Synchronously&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This one surprises people. We had async preload on our main stylesheet to speed up initial load — it was actually causing CLS (Cumulative Layout Shift) because the page rendered before styles applied.&lt;/p&gt;

&lt;p&gt;The fix: load &lt;code&gt;site.css&lt;/code&gt; as a standard synchronous stylesheet. Yes, it blocks render slightly, but it eliminates the layout shift entirely and the CLS score goes to zero.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Do this --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/css/site.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Not this for critical CSS --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preload"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/css/site.css"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"style"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reserve async preload for non-critical CSS only.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;strong&gt;&lt;em&gt;Defer Third-Party Scripts Aggressively&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Google Analytics was costing us 0.3–0.5s on every page. We moved GA4 behind Cloudflare Zaraz with a 2-second blocking trigger — it fires after the page is interactive, not during load. Scores jumped immediately.&lt;/p&gt;

&lt;p&gt;For anything you can't defer through a tag manager, use the &lt;code&gt;defer&lt;/code&gt; attribute at minimum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"analytics.js"&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it doesn't affect the visible page on load, it shouldn't block render. No exceptions.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. &lt;strong&gt;&lt;em&gt;Preload Your Custom Fonts&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you're self-hosting fonts (and you should be — Google Fonts adds a render-blocking request), preload them in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; with &lt;code&gt;font-display: swap&lt;/code&gt; in your CSS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preload"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/fonts/opensans.woff2"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"font"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"font/woff2"&lt;/span&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@font-face&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Open Sans'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sx"&gt;url('/fonts/opensans.woff2')&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;'woff2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;font-display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;swap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;font-display: swap&lt;/code&gt; ensures text renders in a fallback font immediately while the custom font loads, eliminating invisible text flashes that tank your FCP score.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. &lt;strong&gt;&lt;em&gt;Enable OPcache and HTTP/2 on Your Server&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Front-end optimizations only go so far. On the server side, two quick wins that most shared hosting setups miss:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OPcache&lt;/strong&gt; — caches compiled PHP bytecode in memory. On a PHP 8.x stack this alone can cut TTFB by 40–60ms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP/2&lt;/strong&gt; — enables multiplexing so the browser loads multiple assets in parallel over a single connection instead of queuing them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On Apache, confirm both are active:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php &lt;span class="nt"&gt;-i&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;opcache.enable
apache2ctl &lt;span class="nt"&gt;-M&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;http2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If OPcache isn't enabled, add this to your &lt;code&gt;php.ini&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;opcache.enable&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="py"&gt;opcache.memory_consumption&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;128&lt;/span&gt;
&lt;span class="py"&gt;opcache.max_accelerated_files&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;10000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;Combining all five on a roofing company site: 56 → 92 mobile, 91 → 99 desktop. Core Web Vitals went all green within two weeks of Google recrawling.&lt;/p&gt;

&lt;p&gt;These aren't tricks — they're fundamentals that get skipped when you're moving fast. Slow down on these five and your clients will notice the difference in rankings.&lt;/p&gt;




&lt;p&gt;These are the same techniques we use on every build at &lt;a href="https://www.zehlm.com/morganton-nc" rel="noopener noreferrer"&gt;Zehlm Web Development&lt;/a&gt; — a custom web design and SEO agency based in Morganton, NC.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>css</category>
      <category>pagespeed</category>
    </item>
  </channel>
</rss>
