<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  
  <title>Zach Leatherman</title>
  <subtitle>A web development blog written by @zachleat.</subtitle>
  <link href="https://www.zachleat.com/web/feed/atom.xml" rel="self" />
  <link href="https://www.zachleat.com/" />
  <updated>2026-09-11T05:00:00Z</updated>
  <id>https://www.zachleat.com/</id>
  <author>
    <name>Zach Leatherman</name>
  </author>
  <entry>
    <title>Trying out a Two-state Dark Mode Toggle</title>
    <link href="https://www.zachleat.com/web/two-state-dark-mode-toggle/" />
    <updated>2026-09-11T05:00:00Z</updated>
    <id>https://www.zachleat.com/web/two-state-dark-mode-toggle/</id>
    <content type="html">&lt;p&gt;Lea Verou sparked some lovely discussions about &lt;a href=&quot;https://lea.verou.me/blog/2026/dark-mode-toggles/&quot;&gt;dark/light mode toggles&lt;/a&gt; by asking a simple question: do these form controls need three options for two user-facing states?&lt;/p&gt;
&lt;p&gt;You have &lt;em&gt;Dark&lt;/em&gt; mode (1). You have &lt;em&gt;Light&lt;/em&gt; mode (2). You have &lt;em&gt;System&lt;/em&gt; mode (inheriting your operating system preference) which is ultimately &lt;em&gt;Dark&lt;/em&gt; (1) or &lt;em&gt;Light&lt;/em&gt; mode (2). Typically the form controls have three options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;System&lt;/em&gt; (auto)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Light&lt;/em&gt; (saved on device as an override)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Dark&lt;/em&gt; (saved on device as an override)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Lea’s proposal, you’d have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;System&lt;/em&gt; (auto)&lt;/li&gt;
&lt;li&gt;Opposite of &lt;em&gt;System&lt;/em&gt; (saved on device as an override)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Toggling back to system/auto should always clear any saved override preference.&lt;/p&gt;
&lt;p&gt;I’ve added a little toggle to the footer of my own site (noting when the system preference matches the current selection with &lt;code&gt;(auto)&lt;/code&gt;) and it looks like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Dark (auto) [Toggle] Light&lt;/code&gt; for users with a &lt;em&gt;Dark&lt;/em&gt; system preference.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Dark [Toggle] Light (auto)&lt;/code&gt; for users with a &lt;em&gt;Light&lt;/em&gt; system preference.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’m enjoying it so far!&lt;/p&gt;
&lt;p&gt;I should also note that &lt;a href=&quot;https://www.bram.us/2026/08/18/the-case-for-tri-state-dark-mode-toggles/&quot;&gt;Bramus did write a criticism&lt;/a&gt; of the approach, noting a special case for users that have their system preference switch automatically (which I do personally use). I do think the simpler control and the simpler interaction (every toggle has a noticeable visual effect on the page) is worth the tradeoff there (personally). The strongest counterargument is that &lt;strong&gt;one of the three options on the tri-state toggle has no visual effect at all.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Related: Lea’s reactions follow-up post: &lt;a href=&quot;https://lea.verou.me/blog/2026/dark-mode-toggles-2/&quot;&gt;The best dark mode toggle is probably none&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>I was tired of building 474 separate pages for Open Graph Images</title>
    <link href="https://www.zachleat.com/web/open-graph-easy-build/" />
    <updated>2026-09-09T05:00:00Z</updated>
    <id>https://www.zachleat.com/web/open-graph-easy-build/</id>
    <content type="html">&lt;p&gt;&lt;em&gt;Prior blog post (if you want the full context): &lt;a href=&quot;https://www.zachleat.com/web/automatic-opengraph/&quot;&gt;If I work really hard on my Open Graph Images, People will share my Blog Posts&lt;/a&gt; (2021 Aug)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here’s the gist:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Open Graph images are those little pictures that show up when your site is shared on social media. […] Each individual blog post (on my website) has a dedicated Open Graph image page.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;These Open Graph pages had the URL shape &lt;code&gt;/web/:title/opengraph/&lt;/code&gt; and there were 474 of them.&lt;/p&gt;
&lt;p&gt;This was great from a purist’s perspective (in that the Open Graph pages were built similarly to how I build other websites) but my perspective has changed a bit. I don’t think that server rendering a static page for each of the 474 blog posts is necessary! 🫣&lt;/p&gt;
&lt;p&gt;Now I use &lt;a href=&quot;https://www.zachleat.com/opengraph/&quot;&gt;&lt;strong&gt;one &lt;code&gt;/opengraph/&lt;/code&gt; page&lt;/strong&gt;&lt;/a&gt; that &lt;strong&gt;client renders&lt;/strong&gt; &lt;em&gt;(the horror!)&lt;/em&gt; the appropriate metadata for the Open Graph image. Client rendering here is an appropriate tradeoff for build time because this page is still going through a Chromium-based screenshot service and the ultimate deliverable is a static image. This page isn’t intended to be consumed by human beings (unless they &lt;em&gt;really&lt;/em&gt; want to, I dunno, I’m not your dad).&lt;/p&gt;
&lt;p&gt;Note that the caching mechanism hasn’t changed: it still lives in the screenshot service and the &lt;em&gt;image&lt;/em&gt; content isn’t being regenerated from scratch (with my old static pages method or this new client rendered method).&lt;/p&gt;
&lt;p&gt;I now use this approach on a few places and it’s made implementing Open Graph support on websites much easier to build and manage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zachleat.com/opengraph/&quot;&gt;zachleat.com&lt;/a&gt; (this is the web site you’re on now)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://build.awesome.me/opengraph/&quot;&gt;build.awesome.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://speedlify.dev/opengraph/&quot;&gt;speedlify.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Importantly, there is no freeform mechanism on these pages to modify the content of the images via URL parameter. There is no &lt;code&gt;?text=…&lt;/code&gt; to control the title text, it’s keyed off of the local page URL and that alone. I don’t want y’all to put whatever text you want next to my picture on my website (you have to do that on &lt;em&gt;your&lt;/em&gt; website 😘).&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Use Speedlify2 to Continuously Measure Website Performance</title>
    <link href="https://www.zachleat.com/web/speedlify2/" />
    <updated>2026-08-26T05:00:00Z</updated>
    <id>https://www.zachleat.com/web/speedlify2/</id>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://www.speedlify.dev/&quot;&gt;&lt;img src=&quot;https://www.zachleat.com/img/built/XeWs_v2xk7-1000.avif&quot; alt=&quot;Speedlify2 screenshot&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1000&quot; height=&quot;960&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://www.speedlify.dev/&quot;&gt;&lt;svg class=&quot;z-icon&quot; width=&quot;20&quot; height=&quot;20&quot;&gt;&lt;use href=&quot;#fas-fa-arrow-right&quot; xlink:href=&quot;#fas-fa-arrow-right&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;strong&gt;&lt;code&gt;speedlify.dev&lt;/code&gt;, now running Speedlify2&lt;/strong&gt;&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The year is 2020. Inspired by a lack of budget for a web performance monitoring tool, the &lt;a href=&quot;https://www.zachleat.com/web/speedlify/&quot;&gt;original Speedlify project&lt;/a&gt; &lt;em&gt;(Speedlify Classic)&lt;/em&gt; was shipped to continuously measure site performance. It ran &lt;a href=&quot;https://developer.chrome.com/docs/lighthouse/&quot;&gt;Lighthouse&lt;/a&gt; against a predetermined list of sites and ranked their performance against each other. Over time, I started to add a few more things to Speedlify.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A &lt;a href=&quot;https://www.zachleat.com/web/lighthouse-in-footer/&quot;&gt;&lt;code&gt;&amp;lt;speedlify-score&amp;gt;&lt;/code&gt; Web Component&lt;/a&gt; was added to show scores on your web site.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://www.zachleat.com/web/eleventy-leaderboard-speedlify/&quot;&gt;Eleventy Leaderboards were migrated to use Speedlify&lt;/a&gt;, running 31 unique contests and testing 1208 unique websites.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As the Leaderboards grew, the work involved in maintaining them scaled similarly. Due to infrastructure build time constraints (a 15 minute build limit) and limitations in how Speedlify executed its measurement step (all sites would run serially and a compare step ran when all measurements had been taken), the Leaderboards needed to run on my own hardware.&lt;/p&gt;
&lt;p&gt;Over six years, it’s pretty natural that some folks would let their websites and domains lapse. A few sites moved away to use other tools. All of which culminated in manual work to publish Leaderboard scores. You could probably see this reflected in how often the Leaderboards were published 🫣 — though in retrospect 31 runs in six years (~2 month cadence on adverage) isn’t bad!&lt;/p&gt;
&lt;h2 id=&quot;better-and-more-automated&quot;&gt;Better and more Automated&lt;/h2&gt;
&lt;p&gt;Regardless, I’m delighted to show off some huge updates and improvements have been made to the brand new Speedlify2. Changes which will ultimately save me a bunch of time and effort!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Speedlify2 is &lt;em&gt;now measuring &lt;strong&gt;1565 sites&lt;/strong&gt;&lt;/em&gt; continuously without requiring any manual work.&lt;/li&gt;
&lt;li&gt;Each category has its own cadence configuration, and the Built Awesome category is currently configured to visit sites once per week to measure and test.&lt;/li&gt;
&lt;li&gt;Everything is static and self contained, deployable via GitHub Actions to GitHub Pages. You can &lt;a href=&quot;https://github.com/zachleat/speedlify2/&quot;&gt;easily deploy your own Speedlify2&lt;/a&gt;. &lt;em&gt;(Run the reset script to start from scratch)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Measurements happen in small chunks in parallel on GitHub Actions. The measurement step is now decoupled from ranking. When the site builds, it pulls from the newest measurements for all steps and ranks them. This is far more robust!&lt;/li&gt;
&lt;li&gt;Sites that move away from Build Awesome (11ty) are now automatically put into an unranked Emeritus category. I went ahead and backfilled the 92 websites that have moved away since we started the showcase in 2018. Emeritus sites &lt;em&gt;can&lt;/em&gt; show up on the Perfect Scores ranking on the home page (though at time of writing only 3 of the 92 of them do).&lt;/li&gt;
&lt;li&gt;Instead of the classic 4-circle Lighthouse design, this adds additional circles for Core Web Vitals (&lt;strong&gt;field data alongside lab data&lt;/strong&gt;) and now explicitly shows the output of a more detailed and rigorous Axe CLI run. Lighthouse does &lt;em&gt;use&lt;/em&gt; Axe internally but doesn’t report everything (Speedlify2 does).&lt;/li&gt;
&lt;li&gt;Adds a new &lt;code&gt;&amp;lt;speedlify2-score&amp;gt;&lt;/code&gt; component.&lt;/li&gt;
&lt;li&gt;The production service has backwards API compatibility with any legacy &lt;code&gt;&amp;lt;speedlify-score&amp;gt;&lt;/code&gt; components using the old speedlify.dev instance as their data source (and all sites measured there are measured on the new speedlify.dev).&lt;/li&gt;
&lt;li&gt;Categories are no longer mutually exclusive. URLs can exist in multiple categories and the home page shows all of the perfect scoring sites across all categories. To avoid extra testing traffic, single measurements are re-used across categories.&lt;/li&gt;
&lt;li&gt;Adds a new randomly selected Perfect Site of the Day.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It might be interesting to look at the report of &lt;a href=&quot;https://www.speedlify.dev/site/www-speedlify-dev/&quot;&gt;Speedlify measuring Speedlify&lt;/a&gt;, which includes measurements before the production domain was moved from Speedlify (classic) to Speedlify2. We can see how the migration went!&lt;/p&gt;
&lt;h3 id=&quot;no-javascript-comparisons&quot;&gt;No-JavaScript Comparisons&lt;/h3&gt;
&lt;p&gt;Speedlify2 also shows screenshots for No-JavaScript and JavaScript-enabled, reporting the visual percentage difference between the two. This does not feeding into rankings (as it isn’t a foolproof measure) but it does have utility!&lt;/p&gt;
&lt;p&gt;Specifically, it can reveal sites that exclusively use client side rendering (&lt;a href=&quot;https://www.speedlify.dev/site/www-solidjs-com/#without-javascript&quot;&gt;&lt;code&gt;solidjs.com&lt;/code&gt; at ∆ 77.4%&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.speedlify.dev/site/www-solidjs-com/#without-javascript&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/T-QrMJHGzn-1000.avif&quot; sizes=&quot;(min-width: 75em) 44.5625em, (min-width: 61.25em) 40.6875em, (min-width: 41.25em) 36.8125em, 96vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/T-QrMJHGzn-1000.jpeg&quot; alt=&quot;With and without JavaScript, the left panel is completely white&quot; width=&quot;1000&quot; height=&quot;517&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It can reveal sites that may have bugs in their dark/light mode switcher (&lt;a href=&quot;https://www.speedlify.dev/site/nuxt-com/#without-javascript&quot;&gt;&lt;code&gt;nuxt.com&lt;/code&gt; at ∆ 99.8%&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.speedlify.dev/site/nuxt-com/#without-javascript&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/-bGZ8jZ9pm-1000.avif&quot; sizes=&quot;(min-width: 75em) 44.5625em, (min-width: 61.25em) 40.6875em, (min-width: 41.25em) 36.8125em, 96vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/-bGZ8jZ9pm-1000.jpeg&quot; alt=&quot;With and without JavaScript, the left panel is light themed and the right panel is dark themed&quot; width=&quot;1000&quot; height=&quot;522&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It can reveal sites that use an announcement bar that causes the entire page to layout shift (&lt;a href=&quot;https://www.speedlify.dev/site/svelte-dev/#without-javascript&quot;&gt;&lt;code&gt;svelte.dev&lt;/code&gt; at ∆ 36.2%&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.speedlify.dev/site/svelte-dev/#without-javascript&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/pVlj4VYSYG-1000.avif&quot; sizes=&quot;(min-width: 75em) 44.5625em, (min-width: 61.25em) 40.6875em, (min-width: 41.25em) 36.8125em, 96vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/pVlj4VYSYG-1000.jpeg&quot; alt=&quot;With and without JavaScript, the right panel has an announcement bar and the content has shifted down&quot; width=&quot;1000&quot; height=&quot;529&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;highlighting-good-sites&quot;&gt;Highlighting Good Sites&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.speedlify.dev/group/11ty-community/&quot;&gt;Built Awesome Leaderboards&lt;/a&gt; are intended to be a very rigorous and competitive leaderboard. The sites that score well here are &lt;em&gt;very&lt;/em&gt; fast.&lt;/p&gt;
&lt;p&gt;But (similarly to the Eleventy Leaderboards before them) we &lt;strong&gt;don’t highlight bad scores&lt;/strong&gt;. The (exhaustively long) list is exclusive to sites with all green circles. With an exception for unknown Core Web Vitals, which requires a level of minimum production traffic in Chrome browsers to show data.&lt;/p&gt;
&lt;p&gt;Sites with yellow or red circles are shown in an overflow list (randomly ordered) with no scores visible. You can navigate through to check your site’s page individually and review the report to learn how you can improve for the next run.&lt;/p&gt;
&lt;p&gt;The other top level categories (&lt;a href=&quot;https://www.speedlify.dev/group/hosts/&quot;&gt;Web Hosts&lt;/a&gt;, &lt;a href=&quot;https://www.speedlify.dev/group/ssg/&quot;&gt;Site Generators&lt;/a&gt;, &lt;a href=&quot;https://www.speedlify.dev/group/builders/&quot;&gt;Website Builders&lt;/a&gt;, &lt;a href=&quot;https://www.speedlify.dev/group/package-managers/&quot;&gt;Package Managers&lt;/a&gt; et al) are for corporate accountability and do show poorly scoring sites. This is a separate tact we want to avoid for personal or individual websites. We can and should hold professional and paid websites to a higher standard!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Am I neglecting my open source projects?</title>
    <link href="https://www.zachleat.com/web/is-this-still-being-maintained/" />
    <updated>2026-08-10T05:00:00Z</updated>
    <id>https://www.zachleat.com/web/is-this-still-being-maintained/</id>
    <content type="html">&lt;p&gt;I have &lt;em&gt;a lot&lt;/em&gt; of open source projects (of varying sizes and shapes).&lt;/p&gt;
&lt;p&gt;At time of writing, I’m currently maintaining ×78 npm packages. Of those, 22 are super lightweight zero-dependency custom elements a.k.a. 🚾 Web Components (&lt;em&gt;love the future compatibility I get with very little maintenance required&lt;/em&gt;). In addition, I also have a few &lt;a href=&quot;https://www.zachleat.com/domains/&quot;&gt;active websites&lt;/a&gt; and starter/template projects that are open source too.&lt;/p&gt;
&lt;p&gt;I usually rotate maintenance on these and needed a way to quickly scan my little ecosystem of packages to know which ones needed love. Thus, a new little dashboard has appeared on my web site that I’m calling:&lt;/p&gt;
&lt;script type=&quot;module&quot; src=&quot;https://www.zachleat.com/static/browser-window.js&quot;&gt;&lt;/script&gt;
&lt;div&gt;&lt;browser-window mode=&quot;light&quot; icon url=&quot;https://www.zachleat.com/projects/&quot; shadow flush style=&quot;--bw-background: oklch(82.691% 0.09444 136.65)&quot;&gt;&lt;a href=&quot;https://www.zachleat.com/projects/&quot; class=&quot;favicon-optout&quot;&gt;&lt;img alt=&quot;Screenshot image for https://www.zachleat.com/projects/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;&quot; src=&quot;https://screenshot.11ty.app/https%3A%2F%2Fwww.zachleat.com%2Fprojects%2F/opengraph/&quot; width=&quot;1200&quot; height=&quot;630&quot;&gt;&lt;/a&gt;&lt;/browser-window&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://www.zachleat.com/projects/&quot; class=&quot;primarylink&quot;&gt;&lt;em&gt;Is this still being maintained??&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The name pays homage to those &lt;s&gt;helpful&lt;/s&gt; passive aggressive comments folks sometimes leave on issue trackers (mirroring a fair question that perhaps I should be asking myself).&lt;/p&gt;
&lt;p&gt;Each project is given a Neglect score that represents how much love it needs. It factors popularity (via npm downloads and GitHub stars) and need (GitHub issues and pull requests, npm audits), and recency (npm publish and GitHub commit dates). It shows how many production dependencies (including transitive ones) that a project uses. It even has a little sparkline to give a little data visualization to how frequently packages are published.&lt;/p&gt;
&lt;h2 id=&quot;a-broader-look&quot;&gt;A broader look&lt;/h2&gt;
&lt;p&gt;The aggregate statistics there were genuinely surprising to me. &lt;em&gt;67 million downloads in the last year&lt;/em&gt; (though this is heavily influenced by dependencies I maintain in Build Awesome/11ty, which are counted separately).&lt;/p&gt;
&lt;p&gt;Over 1.1k published versions, 4.7k closed issues, and 2.2k pull requests merged! &lt;em&gt;(not all by me, of course)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Currently my most neglected package is the &lt;a href=&quot;https://github.com/11ty/eleventy-plugin-vue&quot;&gt;Eleventy Vue plugin&lt;/a&gt; (which owns 31 of my 42 total npm audits) and I’m actively deciding whether to revive it or retire it 🫣.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;All of my 77 other packages only have 11 total npm audit reports!&lt;/strong&gt; I’m feeling extremely proud of that, which feels related to the work I’ve been doing to &lt;a href=&quot;https://www.zachleat.com/web/npm-security/&quot;&gt;lock down publishing workflows&lt;/a&gt; and &lt;a href=&quot;https://www.11ty.dev/blog/dependency-watch/&quot;&gt;reduce dependencies&lt;/a&gt;. Though that number may change over time, I now have an easy centralized place to check it. This report also makes it very obvious the relationship between dependency count and audit reports. &lt;a href=&quot;https://e18e.dev/&quot;&gt;Keep reducing those dependencies, y’all!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The other result of monitoring this report is that I have archived a bunch of old projects that I don’t want to track, which has a nice cleansing feeling to it.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Back Build Awesome Pro and make it easier to build for the web!</title>
    <link href="https://www.zachleat.com/web/build-awesome-pro/" />
    <updated>2026-04-29T05:00:00Z</updated>
    <id>https://www.zachleat.com/web/build-awesome-pro/</id>
    <content type="html">&lt;p&gt;The &lt;a href=&quot;https://www.kickstarter.com/projects/fontawesome/build-awesome-pro?ref=43ttgb&quot;&gt;Build Awesome (11ty) Kickstarter (Final_FINAL_v2)&lt;/a&gt; is live! We’re trying to make it easier for &lt;em&gt;anyone&lt;/em&gt; to build, publish, and maintain web sites!&lt;/p&gt;
&lt;div class=&quot;primarylink&quot;&gt;
	Update: the &lt;a href=&quot;https://www.kickstarter.com/projects/fontawesome/build-awesome-pro?ref=43ttgb&quot;&gt;Kickstarter campaign has concluded&lt;/a&gt; but late pledging (and late pricing) is still available.
&lt;/div&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Go &lt;a href=&quot;https://www.kickstarter.com/projects/fontawesome/build-awesome-pro?ref=43ttgb&quot;&gt;directly to the Kickstarter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Read more on the &lt;a href=&quot;https://www.11ty.dev/blog/build-awesome-pro/&quot;&gt;Blog&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Collaborative Editing as Progressive Enhancement</title>
    <link href="https://www.zachleat.com/web/collaborative-editing/" />
    <updated>2026-04-22T05:00:00Z</updated>
    <id>https://www.zachleat.com/web/collaborative-editing/</id>
    <content type="html">&lt;p&gt;We’re ramping up again to launch the &lt;a href=&quot;https://www.kickstarter.com/projects/fontawesome/build-awesome-pro?ref=43ttgb&quot;&gt;Build Awesome (11ty) Kickstarter Final_FINAL_v2 on &lt;strong&gt;April 28, 2026&lt;/strong&gt;&lt;/a&gt; and in this post I make the case for a new web site builder can layer itself on top of your existing projects as a progressive enhancement. Infrastructure as progressive enhancement!&lt;/p&gt;
&lt;div class=&quot;primarylink&quot;&gt;
	&lt;is-land on:idle on:media=&quot;(prefers-reduced-motion: no-preference)&quot;&gt;&lt;a href=&quot;https://www.kickstarter.com/projects/fontawesome/build-awesome-pro?ref=43ttgb&quot;&gt;Launching &lt;time-difference live units=&quot;milliseconds&quot; mode=&quot;countdown&quot;&gt;&lt;time datetime=&quot;2026-04-28T15:00:00Z&quot;&gt;April 28&lt;/time&gt;&lt;/time-difference&gt;.&lt;/a&gt;&lt;/is-land&gt;
&lt;/div&gt;</content>
  </entry>
  <entry>
    <title>State of the Browser (2026) It’s 10PM: Do You Know Where Your JavaScript Is?</title>
    <link href="https://www.zachleat.com/web/its-10pm/" />
    <updated>2026-04-16T05:00:00Z</updated>
    <id>https://www.zachleat.com/web/its-10pm/</id>
    <content type="html">&lt;p&gt;This talk was given at &lt;a href=&quot;https://2026.stateofthebrowser.com/&quot;&gt;State of the Browser (2026)&lt;/a&gt;. Check out &lt;a href=&quot;https://2026.stateofthebrowser.com/speaker/zach-leatherman/&quot;&gt;the event talk page&lt;/a&gt; (which includes a talk transcript, too).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We’ll talk about best practices to either reduce (or increase!) the JavaScript footprint on your web site to a sweet and very practical spot for best results. It’s far more common to have too much JavaScript on your web site, but can you go too far? Is zero JavaScript a worthwhile goal? Let’s talk about it!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;video&quot;&gt;Video&lt;/h2&gt;
&lt;div&gt;&lt;youtube-lite-player&gt;
&lt;script type=&quot;module&quot; src=&quot;https://www.zachleat.com/static/browser-window.js&quot;&gt;&lt;/script&gt;
&lt;browser-window mode=&quot;dark&quot; flush icon url=&quot;https://youtube.com/watch?v=qIMFhkDTYRM&quot; shadow&gt;
	&lt;is-land on:visible class=&quot;fluid-width-video-wrapper&quot;&gt;
		&lt;lite-youtube videoid=&quot;qIMFhkDTYRM&quot; js-api playlabel=&quot;Play: State of the Browser (2026) It’s 10PM: Do You Know Where Your JavaScript Is?&quot; style=&quot;background-image: var(--yt-poster-img-url); --yt-poster-img-url-lazy: url(&#39;https://v1.opengraph.11ty.dev/https%3A%2F%2Fyoutube.com%2Fwatch%3Fv%3DqIMFhkDTYRM/auto/jpeg/&#39;)&quot;&gt;&lt;/lite-youtube&gt;
		&lt;template data-island=&quot;once&quot;&gt;
			&lt;style&gt;
			lite-youtube {
				max-width: 100% !important;
				background-size: cover;
			}
			/* Plugin bug: clicking the red youtube play icon in the center would navigate to youtube.com */
			lite-youtube:defined .lty-playbtn {
				pointer-events: none;
			}
			&lt;/style&gt;
			&lt;link rel=&quot;stylesheet&quot; href=&quot;https://www.zachleat.com/static/lite-yt-embed.css&quot;&gt;
			&lt;script type=&quot;module&quot; src=&quot;https://www.zachleat.com/static/lite-yt-embed.js&quot;&gt;&lt;/script&gt;
		&lt;/template&gt;
	&lt;/is-land&gt;
&lt;/browser-window&gt;
&lt;youtube-link label=&quot;State of the Browser (2026) It’s 10PM: Do You Know Where Your JavaScript Is?&quot; href=&quot;https://youtube.com/watch?v=qIMFhkDTYRM&quot;&gt;
&lt;a href=&quot;https://youtube.com/watch?v=qIMFhkDTYRM&quot; class=&quot;lite-youtube-link text-ellipsis-multi&quot;&gt;Watch on YouTube: &lt;em&gt;State of the Browser (2026) It’s 10PM: Do You Know Where Your JavaScript Is?&lt;/em&gt;&lt;/a&gt;&lt;/youtube-link&gt;&lt;/youtube-lite-player&gt;&lt;/div&gt;
&lt;h2 id=&quot;slides&quot;&gt;Slides&lt;/h2&gt;
&lt;script type=&quot;module&quot; src=&quot;https://www.zachleat.com/static/browser-window.js&quot;&gt;&lt;/script&gt;&lt;div&gt;&lt;browser-window shadow flush&gt;&lt;is-land on:idle on:visible&gt;&lt;template data-island&gt;&lt;script type=&quot;module&quot; src=&quot;https://www.zachleat.com/static/carouscroll.js&quot;&gt;&lt;/script&gt;&lt;/template&gt;&lt;carou-scroll tabindex=&quot;0&quot; id=&quot;carouscroll-id-web-its-10pm-1-133&quot; class=&quot;carouscroll&quot;&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/Tz-jxC5M52-600.avif 600w, https://www.zachleat.com/img/built/Tz-jxC5M52-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/Tz-jxC5M52-600.jpeg&quot; alt=&quot;A CRT television sits in an alley, its screen reading “10 PM Do you know where your children are?”&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/Tz-jxC5M52-600.jpeg 600w, https://www.zachleat.com/img/built/Tz-jxC5M52-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;The year is 1964. Only 5 years before the Apollo 11 moon landing and the midpoint between the very first release of Internet Explorer (1995) and the current year 2026. &lt;a href=&quot;https://unsplash.com/photos/a-tv-sitting-on-the-ground-in-front-of-a-brick-building-SnewvLPyeAQ&quot;&gt;https://unsplash.com/photos/a-tv-sitting-on-the-ground-in-front-of-a-brick-building-SnewvLPyeAQ&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/Si3-5sPjKC-600.avif 600w, https://www.zachleat.com/img/built/Si3-5sPjKC-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/Si3-5sPjKC-600.jpeg&quot; alt=&quot;The same television, screen dark&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/Si3-5sPjKC-600.jpeg 600w, https://www.zachleat.com/img/built/Si3-5sPjKC-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;The location? Los Angeles, CA (USA).&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/ZybKAWoWsY-600.avif 600w, https://www.zachleat.com/img/built/ZybKAWoWsY-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/ZybKAWoWsY-600.jpeg&quot; alt=&quot;A smiling young man appears on the television screen through the static&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/ZybKAWoWsY-600.jpeg 600w, https://www.zachleat.com/img/built/ZybKAWoWsY-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/EEhBoezIzh-600.avif 600w, https://www.zachleat.com/img/built/EEhBoezIzh-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/EEhBoezIzh-600.jpeg&quot; alt=&quot;The television screen shows a color bars test pattern&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/EEhBoezIzh-600.jpeg 600w, https://www.zachleat.com/img/built/EEhBoezIzh-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Local nightly news anchors for KHJ channel 9 decided to broadcast a PSA or Public Service Announcement (also known as a Public Information Film or PIF) warning to all parents in the area: It’s 10PM. Do you know where your children are?&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/zsTvFqVflP-600.avif 600w, https://www.zachleat.com/img/built/zsTvFqVflP-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/zsTvFqVflP-600.jpeg&quot; alt=&quot;The television screen now reads “10 PM Do you know where your JavaScript are?”&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/zsTvFqVflP-600.jpeg 600w, https://www.zachleat.com/img/built/zsTvFqVflP-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;What kind of parents existed in 1964? What kind of kids? Why did they need this reminder? And today, I bring the developers creating the next generation of JavaScript heavy applications the same call to action: it’s 10PM — do you know where your JavaScript are?&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/9aYYP8T011-600.avif 600w, https://www.zachleat.com/img/built/9aYYP8T011-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/9aYYP8T011-600.jpeg&quot; alt=&quot;Title: 10 PM Do you know where your JavaScript are?&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/9aYYP8T011-600.jpeg 600w, https://www.zachleat.com/img/built/9aYYP8T011-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Today we’re starting a rumor that Americans say that “JavaScript” is plural, just like we do with Math, which JavaScript is also coincidentally kinda bad at.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/boT93XetcJ-600.avif 600w, https://www.zachleat.com/img/built/boT93XetcJ-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/boT93XetcJ-600.jpeg&quot; alt=&quot;Title: 10 PM Do you know where your JavaScript are?&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/boT93XetcJ-600.jpeg 600w, https://www.zachleat.com/img/built/boT93XetcJ-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/VTZ9buPhif-600.avif 600w, https://www.zachleat.com/img/built/VTZ9buPhif-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/VTZ9buPhif-600.jpeg&quot; alt=&quot;The title corrects itself to “Do you know where your JavaScript is?”&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/VTZ9buPhif-600.jpeg 600w, https://www.zachleat.com/img/built/VTZ9buPhif-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/rHW5h7VBOG-600.avif 600w, https://www.zachleat.com/img/built/rHW5h7VBOG-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/rHW5h7VBOG-600.jpeg&quot; alt=&quot;The title corrects itself again to “Do you know where your JavaScripts are?”&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/rHW5h7VBOG-600.jpeg 600w, https://www.zachleat.com/img/built/rHW5h7VBOG-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/27FRsZvLSs-600.avif 600w, https://www.zachleat.com/img/built/27FRsZvLSs-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/27FRsZvLSs-600.jpeg&quot; alt=&quot;A phoropter sits in front of an eye chart&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/27FRsZvLSs-600.jpeg 600w, https://www.zachleat.com/img/built/27FRsZvLSs-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;And to do that, we’ll take a trip to the local optometrist and create a little component that lets us compare two separate images, a before and an after image. &lt;a href=&quot;https://optician-sans.com/&quot;&gt;https://optician-sans.com/&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/C5HyrtwiZS-600.avif 600w, https://www.zachleat.com/img/built/C5HyrtwiZS-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/C5HyrtwiZS-600.jpeg&quot; alt=&quot;The television shows the Web Awesome comparison component—kittens in a basket, half color and half grayscale&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/C5HyrtwiZS-600.jpeg 600w, https://www.zachleat.com/img/built/C5HyrtwiZS-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Here’s what a component like this might look like. This one is a &amp;lt;wa-comparison&amp;gt; custom element from the Web Awesome component library. Today we’re going to walk through 14 different eras of web development as though they were DEFCON levels on a Cold War threat readiness system, and we’ll create 14 different image comparison components to show how far we’ve come and what might come next.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/qLg0NSQTJf-600.avif 600w, https://www.zachleat.com/img/built/qLg0NSQTJf-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/qLg0NSQTJf-600.jpeg&quot; alt=&quot;A Mandalorian stands in a Tatooine street as the Back to the Future DeLorean drives past&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/qLg0NSQTJf-600.jpeg 600w, https://www.zachleat.com/img/built/qLg0NSQTJf-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Let’s hop into our mandalorian time machine and travel back to the year 1991.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/hDQyQhlRxF-600.avif 600w, https://www.zachleat.com/img/built/hDQyQhlRxF-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/hDQyQhlRxF-600.jpeg&quot; alt=&quot;The Back to the Future time circuits read 08:00 PM 1990. Doc Brown, Waldo, and Tim Berners-Lee stand below&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/hDQyQhlRxF-600.jpeg 600w, https://www.zachleat.com/img/built/hDQyQhlRxF-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;The year is 1991, a short 35 years backwards in time, but only 22 years after humanity bravely landed on the moon. One can only assume that dinosaurs had very recently gone extinct. We find a young, spry London-born 36 year old Tim Berners-Lee publishing the very first draft of…&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/icuDqPFvQe-600.avif 600w, https://www.zachleat.com/img/built/icuDqPFvQe-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/icuDqPFvQe-600.jpeg&quot; alt=&quot;HTML, with a beveled 1990s HTML button below it&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/icuDqPFvQe-600.jpeg 600w, https://www.zachleat.com/img/built/icuDqPFvQe-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;HTML. How might one create an image comparison component in HTML? Call it out if you know it:&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/INt70_r0Wn-600.avif 600w, https://www.zachleat.com/img/built/INt70_r0Wn-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/INt70_r0Wn-600.jpeg&quot; alt=&quot;VS Code shows 1-html-only.html containing ASCII art, with the browser rendering below&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/INt70_r0Wn-600.jpeg 600w, https://www.zachleat.com/img/built/INt70_r0Wn-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;That’s right, ASCII art. Unfortunately &amp;lt;pre&amp;gt; was not available to preserve whitespace.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/tV694jxdvU-600.avif 600w, https://www.zachleat.com/img/built/tV694jxdvU-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/tV694jxdvU-600.jpeg&quot; alt=&quot;The 1992 W3C “HTML Tags” page beside the original tag list, with nextid, isindex, hp1, hp2, and dir crossed out&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/tV694jxdvU-600.jpeg 600w, https://www.zachleat.com/img/built/tV694jxdvU-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Here are the originals. Which one could we use? Call it out if you know it &lt;a href=&quot;https://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/Tags.html&quot;&gt;https://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/Tags.html&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/tAkPA0-SUT-600.avif 600w, https://www.zachleat.com/img/built/tAkPA0-SUT-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/tAkPA0-SUT-600.jpeg&quot; alt=&quot;The ASCII art wrapped in a plaintext element; the browser renders BEFORE || AFTER plus a stray closing tag&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/tAkPA0-SUT-600.jpeg 600w, https://www.zachleat.com/img/built/tAkPA0-SUT-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;If you said plaintext, sure!&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/eY6EW5lkWY-600.avif 600w, https://www.zachleat.com/img/built/eY6EW5lkWY-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/eY6EW5lkWY-600.jpeg&quot; alt=&quot;The same file with no closing tag; the browser still renders BEFORE || AFTER&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/eY6EW5lkWY-600.jpeg 600w, https://www.zachleat.com/img/built/eY6EW5lkWY-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;but &amp;lt;plaintext&amp;gt; vacuums up the rest of the document (and doesn’t expect a closing tag), as stated to improve parsing performance. A thousand HTML sanitizer scripts just held this breath, because just like an unclosed &amp;lt;style&amp;gt; element, this behavior will still vacuum everything&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/jQk2EkQFUr-600.avif 600w, https://www.zachleat.com/img/built/jQk2EkQFUr-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/jQk2EkQFUr-600.jpeg&quot; alt=&quot;The same ASCII art wrapped in a listing element instead&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/jQk2EkQFUr-600.jpeg 600w, https://www.zachleat.com/img/built/jQk2EkQFUr-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Let’s swap to &amp;lt;listing&amp;gt;, which is a better fit. I think we’ve exhausted this one. Let’s move on.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/OI5UObk07X-600.avif 600w, https://www.zachleat.com/img/built/OI5UObk07X-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/OI5UObk07X-600.jpeg&quot; alt=&quot;The time circuits read 09:00 PM 1992 with HTML added to the list. The Coneheads and the In Living Color Fly Girls join Doc Brown&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/OI5UObk07X-600.jpeg 600w, https://www.zachleat.com/img/built/OI5UObk07X-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;The year is 1992. Some dude (we needn’t immortalize who) introduced the&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/-VTCHcbP_A-600.avif 600w, https://www.zachleat.com/img/built/-VTCHcbP_A-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/-VTCHcbP_A-600.jpeg&quot; alt=&quot;IMG&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/-VTCHcbP_A-600.jpeg 600w, https://www.zachleat.com/img/built/-VTCHcbP_A-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;`&amp;lt;img&amp;gt;` element, the very first mechanism for displaying images inline in HTML. First available in the Mosaic browser, this first offers us the barest bones featureless image comparison component was first possible. Leaving the viewer to crane their neck left and right to compare images, disgustingly manually.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/sfD1jzh9-t-600.avif 600w, https://www.zachleat.com/img/built/sfD1jzh9-t-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/sfD1jzh9-t-600.jpeg&quot; alt=&quot;VS Code shows 2-img.html with two img tags; the browser renders two frames of the Trojan Room coffee machine&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/sfD1jzh9-t-600.jpeg 600w, https://www.zachleat.com/img/built/sfD1jzh9-t-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Trojan Room Coffee pot at the University of Cambridge by Quentin Stafford-Fraser and Paul Jardetzky Originally created in 1991, put on the web after &amp;lt;img&amp;gt; was introduced; XBM format &lt;a href=&quot;https://en.wikipedia.org/wiki/X_BitMap&quot;&gt;https://en.wikipedia.org/wiki/X_BitMap&lt;/a&gt; though GIF was available at the time (maybe JPEG, though that timeline is much closer) This may not be the first image, a title likely given to a July 1992 image of a Cern-based musical group. &lt;a href=&quot;https://www.cl.cam.ac.uk/coffee/coffee.html&quot;&gt;https://www.cl.cam.ac.uk/coffee/coffee.html&lt;/a&gt; &lt;a href=&quot;https://www.webdesignmuseum.org/web-design-history&quot;&gt;https://www.webdesignmuseum.org/web-design-history&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/GQoaP0zZ2B-600.avif 600w, https://www.zachleat.com/img/built/GQoaP0zZ2B-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/GQoaP0zZ2B-600.jpeg&quot; alt=&quot;The time circuits read 10:00 PM 1995 with IMG added. HAL 9000 and the Macromedia logo flank Doc Brown&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/GQoaP0zZ2B-600.jpeg 600w, https://www.zachleat.com/img/built/GQoaP0zZ2B-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Can anyone guess what happened in 1995?&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/T5XI_Fm6Gy-600.avif 600w, https://www.zachleat.com/img/built/T5XI_Fm6Gy-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/T5XI_Fm6Gy-600.jpeg&quot; alt=&quot;The monolith from 2001: A Space Odyssey, half covered by a yellow JS panel&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/T5XI_Fm6Gy-600.jpeg 600w, https://www.zachleat.com/img/built/T5XI_Fm6Gy-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=5NShEY1ScSY&quot;&gt;https://www.youtube.com/watch?v=5NShEY1ScSY&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/qKRsxVIuwA-600.avif 600w, https://www.zachleat.com/img/built/qKRsxVIuwA-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/qKRsxVIuwA-600.jpeg&quot; alt=&quot;VS Code shows 3.html with Dreamweaver’s MM_swapImage script and an img with an onmouseover handler&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/qKRsxVIuwA-600.jpeg 600w, https://www.zachleat.com/img/built/qKRsxVIuwA-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;For this one, I think it’s prudent that we pay homage to the MM_swapImage script. If you aren’t familiar with this one, it was introduced in Macromedia Dreamweaver to swap image sources when a user interacts with them.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/-eCeNyL9NN-600.avif 600w, https://www.zachleat.com/img/built/-eCeNyL9NN-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/-eCeNyL9NN-600.jpeg&quot; alt=&quot;The television shows the Macromedia Dreamweaver splash screen&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/-eCeNyL9NN-600.jpeg 600w, https://www.zachleat.com/img/built/-eCeNyL9NN-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/MNcsa4eE4I-600.avif 600w, https://www.zachleat.com/img/built/MNcsa4eE4I-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/MNcsa4eE4I-600.jpeg&quot; alt=&quot;The same file annotated—the script is request 1 (JS), the image request 2, the inline handler request 3&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/MNcsa4eE4I-600.jpeg 600w, https://www.zachleat.com/img/built/MNcsa4eE4I-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Let’s start to document our dependencies.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/Xl36kWMclH-600.avif 600w, https://www.zachleat.com/img/built/Xl36kWMclH-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/Xl36kWMclH-600.jpeg&quot; alt=&quot;Two browser windows side by side, one showing the monolith in grayscale and the other in color&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/Xl36kWMclH-600.jpeg 600w, https://www.zachleat.com/img/built/Xl36kWMclH-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/jWrdPjG_y5-600.avif 600w, https://www.zachleat.com/img/built/jWrdPjG_y5-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/jWrdPjG_y5-600.jpeg&quot; alt=&quot;A single browser window showing the monolith in color&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/jWrdPjG_y5-600.jpeg 600w, https://www.zachleat.com/img/built/jWrdPjG_y5-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Cons: not seen by the HTML preload scanner but guess what: we didn’t have a preload scanner then The mm_ scripts did include JavaScript preloading. I know this is a trivial example but it’s important to internalize this concept and how it can represents layout shift.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/hv-kF1yp6l-600.avif 600w, https://www.zachleat.com/img/built/hv-kF1yp6l-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/hv-kF1yp6l-600.jpeg&quot; alt=&quot;A GitHub code search for MM_swapImage returns 134k files, stamped PRESENT DAY over a dumpster fire&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/hv-kF1yp6l-600.jpeg 600w, https://www.zachleat.com/img/built/hv-kF1yp6l-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Anyway, let’s not spend too much time on this one it’s very outdated and not used any more.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/bZBrgWxYej-600.avif 600w, https://www.zachleat.com/img/built/bZBrgWxYej-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/bZBrgWxYej-600.jpeg&quot; alt=&quot;The time circuits read 11:00 PM 1998 with JS added. Wes Bos, Bert Bos, and Håkon Wium Lie join Doc Brown&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/bZBrgWxYej-600.jpeg 600w, https://www.zachleat.com/img/built/bZBrgWxYej-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/1qTdKkt8Qh-600.avif 600w, https://www.zachleat.com/img/built/1qTdKkt8Qh-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/1qTdKkt8Qh-600.jpeg&quot; alt=&quot;The W3C CSS level 2 specification beside the CSS logo, Håkon Wium Lie and Bert Bos, with Wes Bos crossed out&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/1qTdKkt8Qh-600.jpeg 600w, https://www.zachleat.com/img/built/1qTdKkt8Qh-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;&lt;a href=&quot;https://www.w3.org/TR/CSS1/&quot;&gt;https://www.w3.org/TR/CSS1/&lt;/a&gt; Håkon Wium Lie and Bert Bos who as far as I can tell is unrelated to Wes Bos CSS1 was in 96 but we’re going CSS2 in 98 so that we can use position and overflow&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/cVpV49SR27-600.avif 600w, https://www.zachleat.com/img/built/cVpV49SR27-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/cVpV49SR27-600.jpeg&quot; alt=&quot;VS Code shows 4.html—a style block (1, CSS), two images (2 and 3), and an onmousemove script (4, JS)&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/cVpV49SR27-600.jpeg 600w, https://www.zachleat.com/img/built/cVpV49SR27-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/mGoYlUUHUe-600.avif 600w, https://www.zachleat.com/img/built/mGoYlUUHUe-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/mGoYlUUHUe-600.jpeg&quot; alt=&quot;The television shows the comparison demo mid-load, half of it still unstyled white&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/mGoYlUUHUe-600.jpeg 600w, https://www.zachleat.com/img/built/mGoYlUUHUe-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/ps0AWzwvni-600.avif 600w, https://www.zachleat.com/img/built/ps0AWzwvni-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/ps0AWzwvni-600.jpeg&quot; alt=&quot;The time circuits read 12:00 PM 2003 with CSS added. Steven Champeon, a porg, and Nick Finck join Doc Brown&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/ps0AWzwvni-600.jpeg 600w, https://www.zachleat.com/img/built/ps0AWzwvni-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/9FS4lZosBw-600.avif 600w, https://www.zachleat.com/img/built/9FS4lZosBw-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/9FS4lZosBw-600.jpeg&quot; alt=&quot;PE&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/9FS4lZosBw-600.jpeg 600w, https://www.zachleat.com/img/built/9FS4lZosBw-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/MuCwv0_Lnw-600.avif 600w, https://www.zachleat.com/img/built/MuCwv0_Lnw-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/MuCwv0_Lnw-600.jpeg&quot; alt=&quot;The 2003 SXSW deck “Inclusive Web Design For the Future with Progressive Enhancement” by Steven Champeon and Nick Finck, courtesy of the Internet Archive&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/MuCwv0_Lnw-600.jpeg 600w, https://www.zachleat.com/img/built/MuCwv0_Lnw-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/uLf0AnwAsx-600.avif 600w, https://www.zachleat.com/img/built/uLf0AnwAsx-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/uLf0AnwAsx-600.jpeg&quot; alt=&quot;A close-up of the deck’s broken “next slide” and “previous slide” image links, with large red arrows&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/uLf0AnwAsx-600.jpeg 600w, https://www.zachleat.com/img/built/uLf0AnwAsx-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Introduced in a SXSW talk in 2003. Photo via &lt;a href=&quot;https://www.linkedin.com/in/schampeo/&quot;&gt;https://www.linkedin.com/in/schampeo/&lt;/a&gt; Slides: &lt;a href=&quot;https://web.archive.org/web/20141108064903/http://hesketh.com/publications/inclusive_web_design_for_the_future/&quot;&gt;https://web.archive.org/web/20141108064903/http://hesketh.com/publications/inclusive_web_design_for_the_future/&lt;/a&gt; Webmonkey article &lt;a href=&quot;https://hesketh.com/publications/progressive_enhancement_and_the_future_of_web_design.html&quot;&gt;https://hesketh.com/publications/progressive_enhancement_and_the_future_of_web_design.html&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/4RTfyrKR6j-600.avif 600w, https://www.zachleat.com/img/built/4RTfyrKR6j-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/4RTfyrKR6j-600.jpeg&quot; alt=&quot;A diagram—an HTML box with dotted arrows down to CSS and JS, beside the working comparison demo&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/4RTfyrKR6j-600.jpeg 600w, https://www.zachleat.com/img/built/4RTfyrKR6j-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/uwOksIuitB-600.avif 600w, https://www.zachleat.com/img/built/uwOksIuitB-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/uwOksIuitB-600.jpeg&quot; alt=&quot;Three browser windows showing HTML, then plus CSS, then plus JS&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/uwOksIuitB-600.jpeg 600w, https://www.zachleat.com/img/built/uwOksIuitB-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;How it loads is just as important as what is loading. This ties into (not just) Progressive Enhancement, but Browser Support, Performance, FOUC, Layout Shift, et al&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/9nG5XXE4i1-600.avif 600w, https://www.zachleat.com/img/built/9nG5XXE4i1-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/9nG5XXE4i1-600.jpeg&quot; alt=&quot;A single browser window showing the finished comparison&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/9nG5XXE4i1-600.jpeg 600w, https://www.zachleat.com/img/built/9nG5XXE4i1-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/i4MyflzYUD-600.avif 600w, https://www.zachleat.com/img/built/i4MyflzYUD-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/i4MyflzYUD-600.jpeg&quot; alt=&quot;VS Code shows 5.html—an external stylesheet (1, CSS), two images (2 and 3), and an external script (4, JS)&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/i4MyflzYUD-600.jpeg 600w, https://www.zachleat.com/img/built/i4MyflzYUD-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/mRowDygatE-600.avif 600w, https://www.zachleat.com/img/built/mRowDygatE-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/mRowDygatE-600.jpeg&quot; alt=&quot;A loading diagram—the images wait behind hourglasses, and red crosses show what breaks when the CSS or JS never arrives&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/mRowDygatE-600.jpeg 600w, https://www.zachleat.com/img/built/mRowDygatE-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;The link element blocks rendering, waiting for the stylesheet. A script like this in 2003 was blocking, though now we can use modules or asynchronous/defer to better control that behavior. External requests creates a network dependency! In the wild wild west of the world wild web, no network request can be guaranteed to complete so we must think about what happens when resources don’t load or aren‘t supported by the viewer’s browser&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/O69OIegz6t-600.avif 600w, https://www.zachleat.com/img/built/O69OIegz6t-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/O69OIegz6t-600.jpeg&quot; alt=&quot;The same diagram, labeled INTERACTIVE DEAD ZONE after TWILIGHT ZONE and EXTEMPORAL DEAD ZONE are crossed out&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/O69OIegz6t-600.jpeg 600w, https://www.zachleat.com/img/built/O69OIegz6t-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;And even though progressive jpeg was available, I didn’t use it here for dramatic effect and the image content chunks in, line by line, reminiscent of my childhood.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/SDrsX99m0R-600.avif 600w, https://www.zachleat.com/img/built/SDrsX99m0R-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/SDrsX99m0R-600.jpeg&quot; alt=&quot;Chrome DevTools with request blocking turned on&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/SDrsX99m0R-600.jpeg 600w, https://www.zachleat.com/img/built/SDrsX99m0R-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;We should also think about what happens if the network requests complete but are delayed! Just off the cuff and absolutely in no way pun intended, maybe we could call it the extermporal dead zone&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/e61AQbqOur-600.avif 600w, https://www.zachleat.com/img/built/e61AQbqOur-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/e61AQbqOur-600.jpeg&quot; alt=&quot;A service worker, sw.js, that delays responses&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/e61AQbqOur-600.jpeg 600w, https://www.zachleat.com/img/built/e61AQbqOur-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/rQuN9_z7ZU-600.avif 600w, https://www.zachleat.com/img/built/rQuN9_z7ZU-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/rQuN9_z7ZU-600.jpeg&quot; alt=&quot;Markup with delay parameters added to the stylesheet and script URLs&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/rQuN9_z7ZU-600.jpeg 600w, https://www.zachleat.com/img/built/rQuN9_z7ZU-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;SUSPEND REALITY and time warp in a service worker&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/98BveOQp4N-600.avif 600w, https://www.zachleat.com/img/built/98BveOQp4N-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/98BveOQp4N-600.jpeg&quot; alt=&quot;A second service worker file, sw-tax.js&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/98BveOQp4N-600.jpeg 600w, https://www.zachleat.com/img/built/98BveOQp4N-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/4-YcC5Hj-G-600.avif 600w, https://www.zachleat.com/img/built/4-YcC5Hj-G-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/4-YcC5Hj-G-600.jpeg&quot; alt=&quot;The time circuits read 01:00 PM 2008 with PE added to the list&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/4-YcC5Hj-G-600.jpeg 600w, https://www.zachleat.com/img/built/4-YcC5Hj-G-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Have you heard of 56k Fridays? I’m not saying you use this to add a simulated network delay to folks with more CPU cores, but here is a script to do that&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/P_F9JrKg8Y-600.avif 600w, https://www.zachleat.com/img/built/P_F9JrKg8Y-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/P_F9JrKg8Y-600.jpeg&quot; alt=&quot;CDN&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/P_F9JrKg8Y-600.jpeg 600w, https://www.zachleat.com/img/built/P_F9JrKg8Y-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;May 2008 &lt;a href=&quot;https://web.archive.org/web/20081216035512/http://googleajaxsearchapi.blogspot.com/2008/05/speed-up-access-to-your-favorite.html&quot;&gt;https://web.archive.org/web/20081216035512/http://googleajaxsearchapi.blogspot.com/2008/05/speed-up-access-to-your-favorite.html&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/yqp1cqB02N-600.avif 600w, https://www.zachleat.com/img/built/yqp1cqB02N-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/yqp1cqB02N-600.jpeg&quot; alt=&quot;The jQuery, Prototype, and Dojo logos beside Google Hosted Libraries&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/yqp1cqB02N-600.jpeg 600w, https://www.zachleat.com/img/built/yqp1cqB02N-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/lq6EUZh5CB-600.avif 600w, https://www.zachleat.com/img/built/lq6EUZh5CB-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/lq6EUZh5CB-600.jpeg&quot; alt=&quot;6.html loading jQuery from a CDN&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/lq6EUZh5CB-600.jpeg 600w, https://www.zachleat.com/img/built/lq6EUZh5CB-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Google Hosted Libraries popularized this in the jQuery community &lt;a href=&quot;https://developers.google.com/speed/libraries&quot;&gt;https://developers.google.com/speed/libraries&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/cWbOqJ_jxi-600.avif 600w, https://www.zachleat.com/img/built/cWbOqJ_jxi-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/cWbOqJ_jxi-600.jpeg&quot; alt=&quot;The dead zone diagram, now carrying 87 KB of JavaScript&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/cWbOqJ_jxi-600.jpeg 600w, https://www.zachleat.com/img/built/cWbOqJ_jxi-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Though instead of performance savings, there are now performance costs with this approach — though the biggest cost for me is relying on an external third party for your site’s runtime&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/JyNoU-lxb_-600.avif 600w, https://www.zachleat.com/img/built/JyNoU-lxb_-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/JyNoU-lxb_-600.jpeg&quot; alt=&quot;DOUBLE-KEYED CACHE&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/JyNoU-lxb_-600.jpeg 600w, https://www.zachleat.com/img/built/JyNoU-lxb_-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/_OOIUXSBmf-600.avif 600w, https://www.zachleat.com/img/built/_OOIUXSBmf-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/_OOIUXSBmf-600.jpeg&quot; alt=&quot;An article about the polyfill.io supply chain attack&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/_OOIUXSBmf-600.jpeg 600w, https://www.zachleat.com/img/built/_OOIUXSBmf-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;PRIVACY Separate cache for each origin &lt;a href=&quot;https://andydavies.me/blog/2018/09/06/safari-caching-and-3rd-party-resources/&quot;&gt;https://andydavies.me/blog/2018/09/06/safari-caching-and-3rd-party-resources/&lt;/a&gt; &lt;a href=&quot;https://addyosmani.com/blog/double-keyed-caching/&quot;&gt;https://addyosmani.com/blog/double-keyed-caching/&lt;/a&gt; &lt;a href=&quot;https://developer.chrome.com/blog/http-cache-partitioning&quot;&gt;https://developer.chrome.com/blog/http-cache-partitioning&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/gsEplfY-2x-600.avif 600w, https://www.zachleat.com/img/built/gsEplfY-2x-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/gsEplfY-2x-600.jpeg&quot; alt=&quot;SUBRESOURCE INTEGRITY&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/gsEplfY-2x-600.jpeg 600w, https://www.zachleat.com/img/built/gsEplfY-2x-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;&lt;a href=&quot;https://fossa.com/blog/polyfill-supply-chain-attack-details-fixes/&quot;&gt;https://fossa.com/blog/polyfill-supply-chain-attack-details-fixes/&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/PdFzRVSTUH-600.avif 600w, https://www.zachleat.com/img/built/PdFzRVSTUH-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/PdFzRVSTUH-600.jpeg&quot; alt=&quot;The time circuits read 02:00 PM 2008 with CDN added. Matt Mullenweg and Aaron Swartz join Doc Brown&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/PdFzRVSTUH-600.jpeg 600w, https://www.zachleat.com/img/built/PdFzRVSTUH-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Subresource_Integrity&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Subresource_Integrity&lt;/a&gt; the failure mode here is pretty unfriendly.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/EJTVhG_3_E-600.avif 600w, https://www.zachleat.com/img/built/EJTVhG_3_E-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/EJTVhG_3_E-600.jpeg&quot; alt=&quot;SSG&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/EJTVhG_3_E-600.jpeg 600w, https://www.zachleat.com/img/built/EJTVhG_3_E-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;November 2008&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/jKIIif0W7B-600.avif 600w, https://www.zachleat.com/img/built/jKIIif0W7B-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/jKIIif0W7B-600.jpeg&quot; alt=&quot;Jekyll and Tom Preston-Werner&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/jKIIif0W7B-600.jpeg 600w, https://www.zachleat.com/img/built/jKIIif0W7B-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/Ym46osyKV3-600.avif 600w, https://www.zachleat.com/img/built/Ym46osyKV3-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/Ym46osyKV3-600.jpeg&quot; alt=&quot;Aaron Swartz’s “Bake, Don’t Fry”&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/Ym46osyKV3-600.jpeg 600w, https://www.zachleat.com/img/built/Ym46osyKV3-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Cheap server rendering without an application server, popularized via the default option for GitHub Pages&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/vXMQAwE3wy-600.avif 600w, https://www.zachleat.com/img/built/vXMQAwE3wy-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/vXMQAwE3wy-600.jpeg&quot; alt=&quot;7.liquid, an Eleventy template&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/vXMQAwE3wy-600.jpeg 600w, https://www.zachleat.com/img/built/vXMQAwE3wy-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Real OG’s might recognize&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/1SM9fRMVpo-600.avif 600w, https://www.zachleat.com/img/built/1SM9fRMVpo-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/1SM9fRMVpo-600.jpeg&quot; alt=&quot;A closer look at the same template&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/1SM9fRMVpo-600.jpeg 600w, https://www.zachleat.com/img/built/1SM9fRMVpo-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;lol image map&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/-EWIFbuszL-600.avif 600w, https://www.zachleat.com/img/built/-EWIFbuszL-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/-EWIFbuszL-600.jpeg&quot; alt=&quot;The comparison image sliced into pieces&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/-EWIFbuszL-600.jpeg 600w, https://www.zachleat.com/img/built/-EWIFbuszL-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/JJ1aqWMZVo-600.avif 600w, https://www.zachleat.com/img/built/JJ1aqWMZVo-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/JJ1aqWMZVo-600.jpeg&quot; alt=&quot;Eleventy writing out 7-1.html through 7-N.html&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/JJ1aqWMZVo-600.jpeg 600w, https://www.zachleat.com/img/built/JJ1aqWMZVo-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/4fFhq1_bEv-600.avif 600w, https://www.zachleat.com/img/built/4fFhq1_bEv-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/4fFhq1_bEv-600.jpeg&quot; alt=&quot;The television shows the comparison demo, black and white beside color&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/4fFhq1_bEv-600.jpeg 600w, https://www.zachleat.com/img/built/4fFhq1_bEv-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/83lIEuVYqv-600.avif 600w, https://www.zachleat.com/img/built/83lIEuVYqv-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/83lIEuVYqv-600.jpeg&quot; alt=&quot;The dead zone diagram with only the stylesheet blocking&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/83lIEuVYqv-600.jpeg 600w, https://www.zachleat.com/img/built/83lIEuVYqv-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/VPbyIco2uD-600.avif 600w, https://www.zachleat.com/img/built/VPbyIco2uD-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/VPbyIco2uD-600.jpeg&quot; alt=&quot;The time circuits read 03:00 PM 2010 with SSG added to the list&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/VPbyIco2uD-600.jpeg 600w, https://www.zachleat.com/img/built/VPbyIco2uD-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;The PE profile here seems better but the user experience is definitely worse!&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/LZ7kEBqe9s-600.avif 600w, https://www.zachleat.com/img/built/LZ7kEBqe9s-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/LZ7kEBqe9s-600.jpeg&quot; alt=&quot;RWD&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/LZ7kEBqe9s-600.jpeg 600w, https://www.zachleat.com/img/built/LZ7kEBqe9s-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/bRLryT0eLw-600.avif 600w, https://www.zachleat.com/img/built/bRLryT0eLw-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/bRLryT0eLw-600.jpeg&quot; alt=&quot;Håkon Wium Lie’s 1994 “Cascading HTML style sheets” proposal&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/bRLryT0eLw-600.jpeg 600w, https://www.zachleat.com/img/built/bRLryT0eLw-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;though IE9 was first in 2011&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/m2jzIN0DSU-600.avif 600w, https://www.zachleat.com/img/built/m2jzIN0DSU-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/m2jzIN0DSU-600.jpeg&quot; alt=&quot;The W3C Media Queries Working Draft from 2001&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/m2jzIN0DSU-600.jpeg 600w, https://www.zachleat.com/img/built/m2jzIN0DSU-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/cbKqzM85lB-600.avif 600w, https://www.zachleat.com/img/built/cbKqzM85lB-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/cbKqzM85lB-600.jpeg&quot; alt=&quot;Ethan Marcotte’s “Responsive Web Design” on A List Apart&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/cbKqzM85lB-600.jpeg 600w, https://www.zachleat.com/img/built/cbKqzM85lB-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;&lt;a href=&quot;https://www.w3.org/TR/2001/WD-css3-mediaqueries-20010404/Overview.html&quot;&gt;https://www.w3.org/TR/2001/WD-css3-mediaqueries-20010404/Overview.html&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/KOJf8ebSZp-600.avif 600w, https://www.zachleat.com/img/built/KOJf8ebSZp-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/KOJf8ebSZp-600.jpeg&quot; alt=&quot;A media attribute support table beside Scott Jehl&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/KOJf8ebSZp-600.jpeg 600w, https://www.zachleat.com/img/built/KOJf8ebSZp-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;implemented using @media and css background-image &lt;a href=&quot;https://alistapart.com/article/responsive-web-design/&quot;&gt;https://alistapart.com/article/responsive-web-design/&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/yRMAPyxwv6-600.avif 600w, https://www.zachleat.com/img/built/yRMAPyxwv6-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/yRMAPyxwv6-600.jpeg&quot; alt=&quot;The television shows the monolith in black and white&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/yRMAPyxwv6-600.jpeg 600w, https://www.zachleat.com/img/built/yRMAPyxwv6-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Islands architecture popularized by the Astro about ten years after RWD is also in this same league &lt;a href=&quot;https://scottjehl.com/posts/responsive-video/&quot;&gt;https://scottjehl.com/posts/responsive-video/&lt;/a&gt; 2023!&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/A-hEkHrOvw-600.avif 600w, https://www.zachleat.com/img/built/A-hEkHrOvw-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/A-hEkHrOvw-600.jpeg&quot; alt=&quot;The television splits between black and white and color&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/A-hEkHrOvw-600.jpeg 600w, https://www.zachleat.com/img/built/A-hEkHrOvw-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Were CRT televisions 16:9? I don’t remember.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/HGCQHdCGb7-600.avif 600w, https://www.zachleat.com/img/built/HGCQHdCGb7-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/HGCQHdCGb7-600.jpeg&quot; alt=&quot;A GitHub commit diff swapping out an image&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/HGCQHdCGb7-600.jpeg 600w, https://www.zachleat.com/img/built/HGCQHdCGb7-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;You might imagine doing the same with a navigation menu viewable at large viewport sizes but not at small ones.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/Ldlgc-GrDu-600.avif 600w, https://www.zachleat.com/img/built/Ldlgc-GrDu-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/Ldlgc-GrDu-600.jpeg&quot; alt=&quot;Low←Tech Magazine and Kris De Decker&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/Ldlgc-GrDu-600.jpeg 600w, https://www.zachleat.com/img/built/Ldlgc-GrDu-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/NDDlX3zDN_-600.avif 600w, https://www.zachleat.com/img/built/NDDlX3zDN_-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/NDDlX3zDN_-600.jpeg&quot; alt=&quot;The time circuits read 04:00 PM 2008 with RWD added to the list&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/NDDlX3zDN_-600.jpeg 600w, https://www.zachleat.com/img/built/NDDlX3zDN_-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Not just on the client! Servers can make choices like this too: to conserve resources using static assets instead of dynamic pages, to use low-tech features like image dithering to reduce serving costs. &lt;a href=&quot;https://solar.lowtechmagazine.com/&quot;&gt;https://solar.lowtechmagazine.com/&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/7GhDi4p53V-600.avif 600w, https://www.zachleat.com/img/built/7GhDi4p53V-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/7GhDi4p53V-600.jpeg&quot; alt=&quot;SPA&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/7GhDi4p53V-600.jpeg 600w, https://www.zachleat.com/img/built/7GhDi4p53V-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/yMsf-YFv-h-600.avif 600w, https://www.zachleat.com/img/built/yMsf-YFv-h-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/yMsf-YFv-h-600.jpeg&quot; alt=&quot;The Office “find the differences” triangle, labeled SPA, client side rendering / CSR, create-react-app&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/yMsf-YFv-h-600.jpeg 600w, https://www.zachleat.com/img/built/yMsf-YFv-h-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/nbFKxYRRqx-600.avif 600w, https://www.zachleat.com/img/built/nbFKxYRRqx-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/nbFKxYRRqx-600.jpeg&quot; alt=&quot;The react.dev Quick Start page, stamped PRESENT DAY over a dumpster fire&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/nbFKxYRRqx-600.jpeg 600w, https://www.zachleat.com/img/built/nbFKxYRRqx-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;This wasn’t a particularly good time for folks that cared how the web was delivered or rendered. But it was a very popular time for web development!&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/g1PLPpXT6e-600.avif 600w, https://www.zachleat.com/img/built/g1PLPpXT6e-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/g1PLPpXT6e-600.jpeg&quot; alt=&quot;ReactCompare.js rendering two plain img tags&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/g1PLPpXT6e-600.jpeg 600w, https://www.zachleat.com/img/built/g1PLPpXT6e-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/wf9Cva4hc2-600.avif 600w, https://www.zachleat.com/img/built/wf9Cva4hc2-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/wf9Cva4hc2-600.jpeg&quot; alt=&quot;The built index.html with one script and one stylesheet&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/wf9Cva4hc2-600.jpeg 600w, https://www.zachleat.com/img/built/wf9Cva4hc2-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Import your styles, and they get bundled up globally&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/HDoCE6ZTLJ-600.avif 600w, https://www.zachleat.com/img/built/HDoCE6ZTLJ-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/HDoCE6ZTLJ-600.jpeg&quot; alt=&quot;Three browser windows—nothing, then JS, then CSS&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/HDoCE6ZTLJ-600.jpeg 600w, https://www.zachleat.com/img/built/HDoCE6ZTLJ-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/nGwNqFANkL-600.avif 600w, https://www.zachleat.com/img/built/nGwNqFANkL-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/nGwNqFANkL-600.jpeg&quot; alt=&quot;A single faded browser window&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/nGwNqFANkL-600.jpeg 600w, https://www.zachleat.com/img/built/nGwNqFANkL-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/GEZ6x15EeW-600.avif 600w, https://www.zachleat.com/img/built/GEZ6x15EeW-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/GEZ6x15EeW-600.jpeg&quot; alt=&quot;The dead zone diagram carrying 191 KB of JavaScript&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/GEZ6x15EeW-600.jpeg 600w, https://www.zachleat.com/img/built/GEZ6x15EeW-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/3MqjMiI8jt-600.avif 600w, https://www.zachleat.com/img/built/3MqjMiI8jt-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/3MqjMiI8jt-600.jpeg&quot; alt=&quot;A toy Woody figure rides alone on the back of a flatbed trailer&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/3MqjMiI8jt-600.jpeg 600w, https://www.zachleat.com/img/built/3MqjMiI8jt-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;2 network resources on the critical rendering path, including a hefty library This is like strapping your baby into the&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/xp_m0F9ir8-600.avif 600w, https://www.zachleat.com/img/built/xp_m0F9ir8-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/xp_m0F9ir8-600.jpeg&quot; alt=&quot;The time circuits read 05:00 PM 2004 with SPA added to the list&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/xp_m0F9ir8-600.jpeg 600w, https://www.zachleat.com/img/built/xp_m0F9ir8-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;&lt;a href=&quot;https://www.reddit.com/r/mildlyinteresting/comments/133ze96/today_in_minnesota_an_empty_flatbed_with_a_single/&quot;&gt;https://www.reddit.com/r/mildlyinteresting/comments/133ze96/today_in_minnesota_an_empty_flatbed_with_a_single/&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/FDa-TcaENo-600.avif 600w, https://www.zachleat.com/img/built/FDa-TcaENo-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/FDa-TcaENo-600.jpeg&quot; alt=&quot;JS BUNDLERS, CSS-IN-JS&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/FDa-TcaENo-600.jpeg 600w, https://www.zachleat.com/img/built/FDa-TcaENo-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/d8BZYFU-sT-600.avif 600w, https://www.zachleat.com/img/built/d8BZYFU-sT-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/d8BZYFU-sT-600.jpeg&quot; alt=&quot;index.html with the stylesheet link crossed out&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/d8BZYFU-sT-600.jpeg 600w, https://www.zachleat.com/img/built/d8BZYFU-sT-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/DqaScKDW4T-600.avif 600w, https://www.zachleat.com/img/built/DqaScKDW4T-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/DqaScKDW4T-600.jpeg&quot; alt=&quot;The dead zone diagram, 191 KB, with the blocking stylesheet gone&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/DqaScKDW4T-600.jpeg 600w, https://www.zachleat.com/img/built/DqaScKDW4T-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Styled Components 2016–2026 Emotion 2017&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/nU_iCnAykO-600.avif 600w, https://www.zachleat.com/img/built/nU_iCnAykO-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/nU_iCnAykO-600.jpeg&quot; alt=&quot;The dead zone diagram with a single script ahead of the images&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/nU_iCnAykO-600.jpeg 600w, https://www.zachleat.com/img/built/nU_iCnAykO-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;I get it—why not? the JS dependency is already there! It makes sense if you’re already bought in to CSR. 51kb to 61 kb&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/TyIOfHTFtJ-600.avif 600w, https://www.zachleat.com/img/built/TyIOfHTFtJ-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/TyIOfHTFtJ-600.jpeg&quot; alt=&quot;ReactCompare.js rewritten with styled-components&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/TyIOfHTFtJ-600.jpeg 600w, https://www.zachleat.com/img/built/TyIOfHTFtJ-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Turns out JavaScript isn’t good at this, especially against CSS and especially when dealing with frequent rerenders.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/XYlJYmmrdQ-600.avif 600w, https://www.zachleat.com/img/built/XYlJYmmrdQ-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/XYlJYmmrdQ-600.jpeg&quot; alt=&quot;“Forget everything you know about web development. Keep an open mind.”&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/XYlJYmmrdQ-600.jpeg 600w, https://www.zachleat.com/img/built/XYlJYmmrdQ-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;&lt;a href=&quot;https://styled-components.com/&quot;&gt;https://styled-components.com/&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/45PAhcENNf-600.avif 600w, https://www.zachleat.com/img/built/45PAhcENNf-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/45PAhcENNf-600.jpeg&quot; alt=&quot;A minified bundle, faded out&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/45PAhcENNf-600.jpeg 600w, https://www.zachleat.com/img/built/45PAhcENNf-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;&lt;a href=&quot;https://speakerdeck.com/vjeux/react-css-in-js?slide=28&quot;&gt;https://speakerdeck.com/vjeux/react-css-in-js?slide=28&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/M78qGy9mSh-600.avif 600w, https://www.zachleat.com/img/built/M78qGy9mSh-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/M78qGy9mSh-600.jpeg&quot; alt=&quot;The time circuits read 06:00 PM 2016 with BUNDLERS added to the list&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/M78qGy9mSh-600.jpeg 600w, https://www.zachleat.com/img/built/M78qGy9mSh-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/54Vf6-0hCQ-600.avif 600w, https://www.zachleat.com/img/built/54Vf6-0hCQ-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/54Vf6-0hCQ-600.jpeg&quot; alt=&quot;SSR painted on a brick wall&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/54Vf6-0hCQ-600.jpeg 600w, https://www.zachleat.com/img/built/54Vf6-0hCQ-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/qX8qVidN5t-600.avif 600w, https://www.zachleat.com/img/built/qX8qVidN5t-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/qX8qVidN5t-600.jpeg&quot; alt=&quot;“The many definitions of Server-Side Rendering” on zachleat.com&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/qX8qVidN5t-600.jpeg 600w, https://www.zachleat.com/img/built/qX8qVidN5t-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;&lt;a href=&quot;https://unsplash.com/photos/brown-and-black-brick-wall-KREQ7J7nsNw&quot;&gt;https://unsplash.com/photos/brown-and-black-brick-wall-KREQ7J7nsNw&lt;/a&gt; A mea culpa moment for CSR&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/RU6L2z0_8P-600.avif 600w, https://www.zachleat.com/img/built/RU6L2z0_8P-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/RU6L2z0_8P-600.jpeg&quot; alt=&quot;npm install next@1 and a 107.1 MB dependency sunburst&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/RU6L2z0_8P-600.jpeg 600w, https://www.zachleat.com/img/built/RU6L2z0_8P-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Notably here when I’m talking about SSR, I’m using the component definition of SSR, not the application version (which means rendering dynamic HTML on-request). The reason it’s murky is because people are making money from the confusion 😘 &lt;a href=&quot;https://www.zachleat.com/web/ssr-overloaded/&quot;&gt;https://www.zachleat.com/web/ssr-overloaded/&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/ehGSsZMZCR-600.avif 600w, https://www.zachleat.com/img/built/ehGSsZMZCR-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/ehGSsZMZCR-600.jpeg&quot; alt=&quot;Next.js server-rendered HTML output with one stylesheet and four scripts&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/ehGSsZMZCR-600.jpeg 600w, https://www.zachleat.com/img/built/ehGSsZMZCR-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;&lt;a href=&quot;https://github.com/vercel/next.js/tree/1.0.1&quot;&gt;https://github.com/vercel/next.js/tree/1.0.1&lt;/a&gt; used Glamor for first-party CSS&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/um3P0VjflS-600.avif 600w, https://www.zachleat.com/img/built/um3P0VjflS-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/um3P0VjflS-600.jpeg&quot; alt=&quot;More of the same output—scripts 4, 5, and 6&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/um3P0VjflS-600.jpeg 600w, https://www.zachleat.com/img/built/um3P0VjflS-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/2urjFJ_KTh-600.avif 600w, https://www.zachleat.com/img/built/2urjFJ_KTh-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/2urjFJ_KTh-600.jpeg&quot; alt=&quot;The dead zone diagram—one stylesheet, then 22 KB and 328 KB of JavaScript&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/2urjFJ_KTh-600.jpeg 600w, https://www.zachleat.com/img/built/2urjFJ_KTh-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/rdGm73zbov-600.avif 600w, https://www.zachleat.com/img/built/rdGm73zbov-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/rdGm73zbov-600.jpeg&quot; alt=&quot;npx create-next-app@latest on v16, weighing in at 454.6 MB&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/rdGm73zbov-600.jpeg 600w, https://www.zachleat.com/img/built/rdGm73zbov-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;next@1 (2016) 328 KB react@19 (2026) 191 KB next@16 (2026) hello world grown by 30% to 455.3 KB&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/SgLfTIkbnO-600.avif 600w, https://www.zachleat.com/img/built/SgLfTIkbnO-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/SgLfTIkbnO-600.jpeg&quot; alt=&quot;page.tsx using ReactCompareSlider&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/SgLfTIkbnO-600.jpeg 600w, https://www.zachleat.com/img/built/SgLfTIkbnO-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/vT2zdwe3ra-600.avif 600w, https://www.zachleat.com/img/built/vT2zdwe3ra-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/vT2zdwe3ra-600.jpeg&quot; alt=&quot;A wall of preload markup, numbered 1 through 11&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/vT2zdwe3ra-600.jpeg 600w, https://www.zachleat.com/img/built/vT2zdwe3ra-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/fqkqA8iKY0-600.avif 600w, https://www.zachleat.com/img/built/fqkqA8iKY0-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/fqkqA8iKY0-600.jpeg&quot; alt=&quot;The comparison demo arriving from the server, with an eye watching&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/fqkqA8iKY0-600.jpeg 600w, https://www.zachleat.com/img/built/fqkqA8iKY0-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;as we all know, systems typically get less complex over time so this is fine.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/4BI-GX0YHW-600.avif 600w, https://www.zachleat.com/img/built/4BI-GX0YHW-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/4BI-GX0YHW-600.jpeg&quot; alt=&quot;The comparison slider centered, with a pointing finger&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/4BI-GX0YHW-600.jpeg 600w, https://www.zachleat.com/img/built/4BI-GX0YHW-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/BlxJz3galX-600.avif 600w, https://www.zachleat.com/img/built/BlxJz3galX-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/BlxJz3galX-600.jpeg&quot; alt=&quot;The dead zone diagram with eleven numbered scripts and their sizes&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/BlxJz3galX-600.jpeg 600w, https://www.zachleat.com/img/built/BlxJz3galX-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/lB7ak_og2F-600.avif 600w, https://www.zachleat.com/img/built/lB7ak_og2F-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/lB7ak_og2F-600.jpeg&quot; alt=&quot;The time circuits read 07:00 PM 2008 with SSR added to the list&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/lB7ak_og2F-600.jpeg 600w, https://www.zachleat.com/img/built/lB7ak_og2F-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;almost 400 KB of JavaScript between your finger and your eye split across 6 external requests (EACH is required for interactivity), remember the goal is to poke the eye as fast as you can&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/qepbQqSQnu-600.avif 600w, https://www.zachleat.com/img/built/qepbQqSQnu-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/qepbQqSQnu-600.jpeg&quot; alt=&quot;CSS-IN-HTML, with tailwindcss.com&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/qepbQqSQnu-600.jpeg 600w, https://www.zachleat.com/img/built/qepbQqSQnu-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/xyC34HWbAF-600.avif 600w, https://www.zachleat.com/img/built/xyC34HWbAF-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/xyC34HWbAF-600.jpeg&quot; alt=&quot;Linaria, vanilla-extract, and Panda CSS, stamped PRESENT DAY over a dumpster fire&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/xyC34HWbAF-600.jpeg 600w, https://www.zachleat.com/img/built/xyC34HWbAF-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Tailwind 1.0 was released in 2019&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/VtsHRWnv-Y-600.avif 600w, https://www.zachleat.com/img/built/VtsHRWnv-Y-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/VtsHRWnv-Y-600.jpeg&quot; alt=&quot;React 18’s “Library Upgrade Guide, style (most CSS-in-JS libs)” discussion from 2021&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/VtsHRWnv-Y-600.jpeg 600w, https://www.zachleat.com/img/built/VtsHRWnv-Y-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;I could probably write a whole talk about the introduction of this compared with zero runtime CSS in JS tools. Linaria 1.0 was available in 2019 too. I do have opinions, primarily that CSS seems to be shipping wildly fast in a way that abstractions are having trouble keeping up. But the biggest takeaway here is that all of these tools helped move CSS out of the client JS bundle.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/OQfjUbABV7-600.avif 600w, https://www.zachleat.com/img/built/OQfjUbABV7-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/OQfjUbABV7-600.jpeg&quot; alt=&quot;The time circuits read 08:00 PM 2020 with CSS-IN-HTML added to the list&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/OQfjUbABV7-600.jpeg 600w, https://www.zachleat.com/img/built/OQfjUbABV7-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Even React pivoted away from this in 2021. &lt;a href=&quot;https://github.com/reactwg/react-18/discussions/110&quot;&gt;https://github.com/reactwg/react-18/discussions/110&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/u3jtLvyJoL-600.avif 600w, https://www.zachleat.com/img/built/u3jtLvyJoL-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/u3jtLvyJoL-600.jpeg&quot; alt=&quot;WEB COMPONENTS&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/u3jtLvyJoL-600.jpeg 600w, https://www.zachleat.com/img/built/u3jtLvyJoL-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;January 2020, Custom Elements v1 cross-browser available when Edge swapped to Chromium&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/4SVLOJBYcs-600.avif 600w, https://www.zachleat.com/img/built/4SVLOJBYcs-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/4SVLOJBYcs-600.jpeg&quot; alt=&quot;The Web Awesome comparison component documentation, kittens split between color and grayscale&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/4SVLOJBYcs-600.jpeg 600w, https://www.zachleat.com/img/built/4SVLOJBYcs-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/t5LtY9WGri-600.avif 600w, https://www.zachleat.com/img/built/t5LtY9WGri-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/t5LtY9WGri-600.jpeg&quot; alt=&quot;index.html using wa-comparison with two slotted images&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/t5LtY9WGri-600.jpeg 600w, https://www.zachleat.com/img/built/t5LtY9WGri-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;&lt;a href=&quot;https://webawesome.com/docs/components/comparison/&quot;&gt;https://webawesome.com/docs/components/comparison/&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/_jP-SDvurI-600.avif 600w, https://www.zachleat.com/img/built/_jP-SDvurI-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/_jP-SDvurI-600.jpeg&quot; alt=&quot;The dead zone diagram, down to 69 KB of JavaScript&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/_jP-SDvurI-600.jpeg 600w, https://www.zachleat.com/img/built/_jP-SDvurI-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/pew6eHAh5i-600.avif 600w, https://www.zachleat.com/img/built/pew6eHAh5i-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/pew6eHAh5i-600.jpeg&quot; alt=&quot;The SSR and web component demos beside the diagram, now showing both the interactive dead zone and a flash of unstyled content&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/pew6eHAh5i-600.jpeg 600w, https://www.zachleat.com/img/built/pew6eHAh5i-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Smaller JavaScript cost than a jQuery (87 KB)&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/vB8DcpyrKb-600.avif 600w, https://www.zachleat.com/img/built/vB8DcpyrKb-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/vB8DcpyrKb-600.jpeg&quot; alt=&quot;Two versions of fouc.css, cloaking undefined elements with an animation&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/vB8DcpyrKb-600.jpeg 600w, https://www.zachleat.com/img/built/vB8DcpyrKb-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/ChOZJ8OAyK-600.avif 600w, https://www.zachleat.com/img/built/ChOZJ8OAyK-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/ChOZJ8OAyK-600.jpeg&quot; alt=&quot;demostyle.css hiding the before image until the component defines itself, and the flash of unstyled content crossed off the diagram&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/ChOZJ8OAyK-600.jpeg 600w, https://www.zachleat.com/img/built/ChOZJ8OAyK-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Flash of Unstyled Content&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/xjz46gEWY8-600.avif 600w, https://www.zachleat.com/img/built/xjz46gEWY8-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/xjz46gEWY8-600.jpeg&quot; alt=&quot;The time circuits read 09:00 PM 2020 with WEB COMPONENTS added to the list&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/xjz46gEWY8-600.jpeg 600w, https://www.zachleat.com/img/built/xjz46gEWY8-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/LKzEXOchTT-600.avif 600w, https://www.zachleat.com/img/built/LKzEXOchTT-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/LKzEXOchTT-600.jpeg&quot; alt=&quot;IMAGINATION&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/LKzEXOchTT-600.jpeg 600w, https://www.zachleat.com/img/built/LKzEXOchTT-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;Vite released April 2020&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/TRRiwO4F9J-600.avif 600w, https://www.zachleat.com/img/built/TRRiwO4F9J-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/TRRiwO4F9J-600.jpeg&quot; alt=&quot;The same word with IMG marked up as a tag&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/TRRiwO4F9J-600.jpeg 600w, https://www.zachleat.com/img/built/TRRiwO4F9J-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/dVDFWg7fAb-600.avif 600w, https://www.zachleat.com/img/built/dVDFWg7fAb-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/dVDFWg7fAb-600.jpeg&quot; alt=&quot;A row of Wheel of Fortune slot machines labeled PROGRESSIVE ENHANCEMENT&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/dVDFWg7fAb-600.jpeg 600w, https://www.zachleat.com/img/built/dVDFWg7fAb-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/WeW-Z9yWEy-600.avif 600w, https://www.zachleat.com/img/built/WeW-Z9yWEy-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/WeW-Z9yWEy-600.jpeg&quot; alt=&quot;demostyle.css beside index.html, with radio buttons added inside wa-comparison&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/WeW-Z9yWEy-600.jpeg 600w, https://www.zachleat.com/img/built/WeW-Z9yWEy-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;You don’t have to gamble with these slots&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/oA1GVL_Fat-600.avif 600w, https://www.zachleat.com/img/built/oA1GVL_Fat-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/oA1GVL_Fat-600.jpeg&quot; alt=&quot;The markup up close—two slotted images and a form with Grayscale and Color radio buttons&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/oA1GVL_Fat-600.jpeg 600w, https://www.zachleat.com/img/built/oA1GVL_Fat-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/ths86teJy7-600.avif 600w, https://www.zachleat.com/img/built/ths86teJy7-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/ths86teJy7-600.jpeg&quot; alt=&quot;The form markup above a browser showing the kittens with working radio buttons&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/ths86teJy7-600.jpeg 600w, https://www.zachleat.com/img/built/ths86teJy7-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/E9SG-GNDp7-600.avif 600w, https://www.zachleat.com/img/built/E9SG-GNDp7-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/E9SG-GNDp7-600.jpeg&quot; alt=&quot;A range input whose oninput sets a CSS custom property, above the working slider demo&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/E9SG-GNDp7-600.jpeg 600w, https://www.zachleat.com/img/built/E9SG-GNDp7-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;The first party, accessible JavaScript-enhanced experience is the ideal case. But here we provide an interactive middle ground when something in your environment has gone wrong.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/0pKqPLsP0j-600.avif 600w, https://www.zachleat.com/img/built/0pKqPLsP0j-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/0pKqPLsP0j-600.jpeg&quot; alt=&quot;The dead zone diagram at 69 KB, the interactive dead zone still spanning the images&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/0pKqPLsP0j-600.jpeg 600w, https://www.zachleat.com/img/built/0pKqPLsP0j-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;figcaption class=&quot;carouscroll-notes&quot;&gt;This one is using a range input. You could use the :target pseudo selector here as well to make the dead zone interactive again. You could also imagine how this same logic could be applied to a tabs component, notable for making sacrifices in unstyled render or missing interactivity. Web components offer this unique styling and markup enhancement out of the box, and I think that’s great.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/JlVyrgpGe7-600.avif 600w, https://www.zachleat.com/img/built/JlVyrgpGe7-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/JlVyrgpGe7-600.jpeg&quot; alt=&quot;The same diagram with the dead zone arrow gone&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/JlVyrgpGe7-600.jpeg 600w, https://www.zachleat.com/img/built/JlVyrgpGe7-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/6tQf57-JlN-600.avif 600w, https://www.zachleat.com/img/built/6tQf57-JlN-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/6tQf57-JlN-600.jpeg&quot; alt=&quot;The time circuits read 10:00 PM 2020 with IMAGINE added to the end of the list&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/6tQf57-JlN-600.jpeg 600w, https://www.zachleat.com/img/built/6tQf57-JlN-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/zsTvFqVflP-600.avif 600w, https://www.zachleat.com/img/built/zsTvFqVflP-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/zsTvFqVflP-600.jpeg&quot; alt=&quot;The television in the alley reads “10 PM Do you know where your JavaScript are?”&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/zsTvFqVflP-600.jpeg 600w, https://www.zachleat.com/img/built/zsTvFqVflP-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;figure class=&quot;carouscroll-page&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.zachleat.com/img/built/L0jW_Jj8t0-600.avif 600w, https://www.zachleat.com/img/built/L0jW_Jj8t0-1000.avif 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.zachleat.com/img/built/L0jW_Jj8t0-600.jpeg&quot; alt=&quot;Thank you—where to find me&quot; width=&quot;1000&quot; height=&quot;562&quot; srcset=&quot;https://www.zachleat.com/img/built/L0jW_Jj8t0-600.jpeg 600w, https://www.zachleat.com/img/built/L0jW_Jj8t0-1000.jpeg 1000w&quot; sizes=&quot;(min-width: 106.25em) 82.75em, (min-width: 61.25em) calc(91.43vw - 13.25em), 100vw&quot;&gt;&lt;/picture&gt;&lt;/figure&gt;&lt;/carou-scroll&gt;&lt;div class=&quot;carouscroll-meta&quot;&gt;&lt;button type=&quot;button&quot; disabled data-carousel-previous=&quot;carouscroll-id-web-its-10pm-1-133&quot;&gt;&amp;lt; Previous&lt;/button&gt;&lt;output data-carousel-output=&quot;carouscroll-id-web-its-10pm-1-133&quot;&gt;&lt;/output&gt;&lt;button type=&quot;button&quot; disabled data-carousel-next=&quot;carouscroll-id-web-its-10pm-1-133&quot;&gt;Next &amp;gt;&lt;/button&gt;&lt;/div&gt;&lt;/is-land&gt;&lt;/browser-window&gt;&lt;/div&gt;
&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/Tags.html&quot;&gt;HTML Tags 1992&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cl.cam.ac.uk/coffee/coffee.html&quot;&gt;The Trojan Room Coffee Machine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/CSS1/&quot;&gt;Cascading Style Sheets, level 1 - 17 Dec 1996&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20141108064903/http://hesketh.com/publications/inclusive_web_design_for_the_future/&quot;&gt;Inclusive Web Design For the Future with Progressive Enhancement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/speed/libraries&quot;&gt;Google Hosted Libraries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://andydavies.me/blog/2018/09/06/safari-caching-and-3rd-party-resources/&quot;&gt;Andy Davies - Safari, Caching and Third-Party Resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://addyosmani.com/blog/double-keyed-caching/&quot;&gt;Double-keyed Caching: How Browser Cache Partitioning Changed the Web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/http-cache-partitioning&quot;&gt;Gaining security and privacy by partitioning the cache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fossa.com/blog/polyfill-supply-chain-attack-details-fixes/&quot;&gt;Polyfill Supply Chain Attack: Details and Fixes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Subresource_Integrity&quot;&gt;Subresource Integrity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.aaronsw.com/weblog/000404&quot;&gt;Bake, Don’t Fry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/People/howcome/p/cascade.html&quot;&gt;Cascading HTML style sheets -- a proposal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/2001/WD-css3-mediaqueries-20010404/Overview.html&quot;&gt;Media queries W3C Working Draft, 4 Apr 2001&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alistapart.com/article/responsive-web-design/&quot;&gt;Responsive Web Design by Ethan Marcotte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://scottjehl.com/posts/responsive-video/&quot;&gt;We&#39;re Bringing Responsive Video Back!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://solar.lowtechmagazine.com/&quot;&gt;Low←Tech Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://styled-components.com/&quot;&gt;Styled Components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zachleat.com/web/ssr-overloaded/&quot;&gt;The many definitions of Server-Side Rendering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://linaria.dev/&quot;&gt;Linaria - Zero-Runtime CSS in JS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vanilla-extract.style/&quot;&gt;Zero-runtime Stylesheets in TypeScript.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/reactwg/react-18/discussions/110&quot;&gt;Library Upgrade Guide: &amp;lt;style&amp;gt; (most CSS-in-JS libs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webawesome.com/docs/components/comparison/&quot;&gt;Web Awesome Comparison component&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>AMA about Build Awesome, an Open Town Hall at the 11ty Meetup</title>
    <link href="https://www.zachleat.com/web/ama-build-awesome-town-hall/" />
    <updated>2026-03-12T05:00:00Z</updated>
    <id>https://www.zachleat.com/web/ama-build-awesome-town-hall/</id>
    <content type="html">&lt;p&gt;Here I field any and all community questions about the Eleventy rebrand to Build Awesome.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=lA-wD89m6jM&quot;&gt;Watch on YouTube&lt;/a&gt; or below:&lt;/p&gt;
&lt;div&gt;&lt;youtube-lite-player&gt;
&lt;script type=&quot;module&quot; src=&quot;https://www.zachleat.com/static/browser-window.js&quot;&gt;&lt;/script&gt;
&lt;browser-window mode=&quot;dark&quot; flush icon url=&quot;https://youtube.com/watch?v=lA-wD89m6jM&quot; shadow&gt;
	&lt;is-land on:visible class=&quot;fluid-width-video-wrapper&quot;&gt;
		&lt;lite-youtube videoid=&quot;lA-wD89m6jM&quot; js-api playlabel=&quot;Play: AMA about Build Awesome, an Open Town Hall at the 11ty Meetup&quot; style=&quot;background-image: var(--yt-poster-img-url); --yt-poster-img-url-lazy: url(&#39;https://v1.opengraph.11ty.dev/https%3A%2F%2Fyoutube.com%2Fwatch%3Fv%3DlA-wD89m6jM/auto/jpeg/&#39;)&quot;&gt;&lt;/lite-youtube&gt;
		&lt;template data-island=&quot;once&quot;&gt;
			&lt;style&gt;
			lite-youtube {
				max-width: 100% !important;
				background-size: cover;
			}
			/* Plugin bug: clicking the red youtube play icon in the center would navigate to youtube.com */
			lite-youtube:defined .lty-playbtn {
				pointer-events: none;
			}
			&lt;/style&gt;
			&lt;link rel=&quot;stylesheet&quot; href=&quot;https://www.zachleat.com/static/lite-yt-embed.css&quot;&gt;
			&lt;script type=&quot;module&quot; src=&quot;https://www.zachleat.com/static/lite-yt-embed.js&quot;&gt;&lt;/script&gt;
		&lt;/template&gt;
	&lt;/is-land&gt;
&lt;/browser-window&gt;
&lt;youtube-link label=&quot;AMA about Build Awesome, an Open Town Hall at the 11ty Meetup&quot; href=&quot;https://youtube.com/watch?v=lA-wD89m6jM&quot;&gt;
&lt;a href=&quot;https://youtube.com/watch?v=lA-wD89m6jM&quot; class=&quot;lite-youtube-link text-ellipsis-multi&quot;&gt;Watch on YouTube: &lt;em&gt;AMA about Build Awesome, an Open Town Hall at the 11ty Meetup&lt;/em&gt;&lt;/a&gt;&lt;/youtube-link&gt;&lt;/youtube-lite-player&gt;&lt;/div&gt;
&lt;h2 id=&quot;related&quot;&gt;Related:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.11ty.dev/blog/build-awesome/&quot;&gt;Eleventy is now Build Awesome (11ty Blog)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://11tymeetup.dev/events/ep-30-rapid-prototyping-helpers/&quot;&gt;Event page on 11tymeetup.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Eleventy is now Build Awesome</title>
    <link href="https://www.zachleat.com/web/build-awesome/" />
    <updated>2026-03-06T06:00:00Z</updated>
    <id>https://www.zachleat.com/web/build-awesome/</id>
    <content type="html">&lt;p&gt;The Eleventy project is taking up the Awesome banner. To support the project, please sign up to &lt;a href=&quot;https://www.kickstarter.com/projects/fontawesome/build-awesome-pro&quot;&gt;get notified when our Kickstarter campaign launches&lt;/a&gt;!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Speaking at: State of the Browser (2026)</title>
    <link href="https://www.zachleat.com/web/state-of-the-browser/" />
    <updated>2026-02-28T06:00:00Z</updated>
    <id>https://www.zachleat.com/web/state-of-the-browser/</id>
    <content type="html">&lt;p&gt;This is an event post. Also check out &lt;a href=&quot;https://2026.stateofthebrowser.com/speaker/zach-leatherman/&quot;&gt;my individual talk page&lt;/a&gt;.&lt;/p&gt;
&lt;script type=&quot;module&quot; src=&quot;https://www.zachleat.com/static/browser-window.js&quot;&gt;&lt;/script&gt;
&lt;div&gt;&lt;browser-window mode=&quot;light&quot; icon url=&quot;https://2026.stateofthebrowser.com/speaker/zach-leatherman/&quot; shadow flush style=&quot;--bw-background: oklch(76.202% 0.1562 84.861)&quot;&gt;&lt;a href=&quot;https://2026.stateofthebrowser.com/speaker/zach-leatherman/&quot; class=&quot;favicon-optout&quot;&gt;&lt;img alt=&quot;Screenshot image for https://2026.stateofthebrowser.com/speaker/zach-leatherman/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;&quot; src=&quot;https://screenshot.11ty.app/https%3A%2F%2F2026.stateofthebrowser.com%2Fspeaker%2Fzach-leatherman%2F/opengraph/&quot; width=&quot;1200&quot; height=&quot;630&quot;&gt;&lt;/a&gt;&lt;/browser-window&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: As the talk has already been given, you can find &lt;a href=&quot;https://www.zachleat.com/web/its-10pm/&quot;&gt;the talk content published on my web site&lt;/a&gt;.&lt;/p&gt;
&lt;script type=&quot;module&quot; src=&quot;https://www.zachleat.com/static/browser-window.js&quot;&gt;&lt;/script&gt;
&lt;div&gt;&lt;browser-window mode=&quot;light&quot; icon url=&quot;https://www.zachleat.com/web/its-10pm/&quot; shadow flush style=&quot;--bw-background: oklch(82.691% 0.09444 136.65)&quot;&gt;&lt;a href=&quot;https://www.zachleat.com/web/its-10pm/&quot; class=&quot;favicon-optout&quot;&gt;&lt;img alt=&quot;Screenshot image for https://www.zachleat.com/web/its-10pm/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;&quot; src=&quot;https://screenshot.11ty.app/https%3A%2F%2Fwww.zachleat.com%2Fweb%2Fits-10pm%2F/opengraph/&quot; width=&quot;1200&quot; height=&quot;630&quot;&gt;&lt;/a&gt;&lt;/browser-window&gt;&lt;/div&gt;</content>
  </entry>
</feed>