<?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-08-26T05:00:00Z</updated>
  <id>https://www.zachleat.com/</id>
  <author>
    <name>Zach Leatherman</name>
  </author>
  <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 clensing 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;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>
  <entry>
    <title>An Official* Logo for HTML</title>
    <link href="https://www.zachleat.com/web/html-logo/" />
    <updated>2026-02-19T06:00:00Z</updated>
    <id>https://www.zachleat.com/web/html-logo/</id>
    <content type="html">&lt;p&gt;*&lt;em&gt;Not official.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I was working on my slide deck for the &lt;a href=&quot;https://2026.stateofthebrowser.com/&quot;&gt;upcoming State of the Browser conference&lt;/a&gt; and ran into what I would classify as a recurring issue: HTML needs a logo. There isn’t a broadly accepted official logo for (version-independent) HTML. There &lt;em&gt;is&lt;/em&gt; a logo for HTML 5, but that versioned marketing term has long fallen out of regular use (and was introduced 18 years ago).&lt;/p&gt;
&lt;p&gt;This is a community solved problem in both the CSS and JavaScript spaces!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CSS: &lt;svg class=&quot;z-icon&quot; width=&quot;20&quot; height=&quot;20&quot;&gt;&lt;use href=&quot;#fab-fa-css&quot; xlink:href=&quot;#fab-fa-css&quot;&gt;&lt;/use&gt;&lt;/svg&gt;, &lt;a href=&quot;https://github.com/CSS-Next/css-next/issues/105&quot;&gt;relevant discussion on &lt;code&gt;CSS-Next&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;JS: &lt;svg class=&quot;z-icon&quot; width=&quot;20&quot; height=&quot;20&quot;&gt;&lt;use href=&quot;#fab-fa-js&quot; xlink:href=&quot;#fab-fa-js&quot;&gt;&lt;/use&gt;&lt;/svg&gt;, &lt;a href=&quot;https://github.com/voodootikigod/logo.js&quot;&gt;relevant discussion on &lt;code&gt;voodootikigod/logo.js&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;HTML 5: &lt;svg class=&quot;z-icon&quot; width=&quot;20&quot; height=&quot;20&quot;&gt;&lt;use href=&quot;#fab-fa-html5&quot; xlink:href=&quot;#fab-fa-html5&quot;&gt;&lt;/use&gt;&lt;/svg&gt;, &lt;a href=&quot;https://www.w3.org/html/logo/&quot;&gt;more info on w3.org&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I wish the classic orange badge hadn’t included a version number, but alas.&lt;/p&gt;
&lt;p&gt;Anyway, I very quickly &lt;a href=&quot;https://fediverse.zachleat.com/@zachleat/116093900452223373&quot;&gt;threw my hat into the ring&lt;/a&gt; and immediately recognized a &lt;a href=&quot;https://indieweb.social/@sstephenson/116098428280403793&quot;&gt;much better option from Sam Stephenson&lt;/a&gt; &lt;a href=&quot;https://sls.name/&quot;&gt;&lt;svg class=&quot;z-icon&quot; width=&quot;20&quot; height=&quot;20&quot;&gt;&lt;use href=&quot;#fas-fa-user&quot; xlink:href=&quot;#fas-fa-user&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;code&gt;sls.name&lt;/code&gt;&lt;/a&gt; that I’ll be considering canon moving forward (and hopefully this blog post puts some weight behind it for others too).&lt;/p&gt;
&lt;p&gt;Here’s what it looks like rendered in your web browser:&lt;/p&gt;
&lt;div class=&quot;flex flex-center&quot;&gt;&lt;a href=&quot;https://indieweb.social/@sstephenson/116098428280403793&quot; style=&quot;all:initial;cursor:pointer;font-size:2rem;width:4em;height:4em;color:blue;text-decoration:underline;display:flex;align-items:center;justify-content:center;background:#ccc;border:.5em outset #aaa;font-weight:900;&quot;&gt;HTML&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;I love the nod to the classic unvisited link color and the heavy outset border that doubles as angle brackets with the right head tilt.&lt;/p&gt;
&lt;p&gt;If you’re interested in the source code, the HTML-only (copy-paste friendly) source code is included below &lt;a href=&quot;https://codepen.io/zachleat/pen/azZggqZ&quot;&gt;&lt;em&gt;(and also on Codepen)&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://indieweb.social/@sstephenson/116098428280403793&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;initial&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;pointer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;2rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;4em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;4em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;blue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;text-decoration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;underline&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;flex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;align-items&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;justify-content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;#ccc&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;.5em outset #aaa&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;900&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;HTML&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>How Eleventy Survived: Funding, Growth, and Open Source Reality</title>
    <link href="https://www.zachleat.com/web/podcast-awesome-eleventy-open-source/" />
    <updated>2026-02-03T06:00:00Z</updated>
    <id>https://www.zachleat.com/web/podcast-awesome-eleventy-open-source/</id>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Eleventy started as a side project. Now it’s a critical infrastructure for thousands of websites.&lt;/p&gt;
&lt;p&gt;TL;DR: Open source isn’t broken. But the way we fund it often is. Let’s talk about what actually works.&lt;/p&gt;
&lt;p&gt;In this episode, we sit down with Zach Leatherman, creator of Eleventy (11ty), to talk honestly about what happens after open source succeeds. From nap-time coding and nights-and-weekends maintenance to venture capital pressure, burnout risk, and the reality of funding long-lived developer tools, this conversation digs into the cultural and financial tradeoffs behind modern open source.&lt;/p&gt;
&lt;p&gt;We cover sustainability, community expectations, funding models that don’t rely on hockey-stick growth, and why “free forever” only works if the people behind the project can stay whole humans.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Listen in: &lt;a href=&quot;https://www.podcastawesome.com/2092855/episodes/18615318-how-eleventy-survived-funding-growth-and-open-source-reality&quot;&gt;How Eleventy Survived: Funding, Growth, and Open Source Reality&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=GrLHE5djtPA&quot;&gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://overcast.fm/+AA-SZeh8B8A&quot;&gt;Overcast.fm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://podcasts.apple.com/us/podcast/how-eleventy-survived-funding-growth-and-open-source/id1660959088?i=1000747878278&quot;&gt;Apple Podcasts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
</feed>