<!DOCTYPE html><!-- prettier-ignore --><html lang="en"> <head><!-- Global Metadata --><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" type="image/svg+xml" href="/anvil-favicon.svg"><meta name="generator" content="Astro v6.4.4"><!-- rss --><link rel="alternate" type="application/rss+xml" title="RSS" href="https://thudfactor.com/feed.xml"><!-- Webmentions --><link rel="webmention" href="https://webmention.io/thudfactor.com/webmention"><!-- Canonical URL --><link rel="canonical" href="https://thudfactor.com/"><!-- Primary Meta Tags --><title>Welcome to Thudfactor | Thudfactor</title><meta name="title" content="Welcome to Thudfactor"><meta name="description" content="Thudfactor is the personal blog of John Williams, web developer"><meta name="fediverse:creator" content="@thudfactor@hachyderm.io"><link rel="canonical" href="https://thudfactor.com/"><meta name="robots" content="index, follow"><meta property="og:title" content="Welcome to Thudfactor"><meta property="og:type" content="website"><meta property="og:image" content="https://thudfactor.com/images/greybeard.webp"><meta property="og:url" content="https://thudfactor.com/"><meta property="og:description" content="Thudfactor is the personal blog of John Williams, web developer"><meta property="og:site_name" content="Thudfactor"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Welcome to Thudfactor"><meta name="twitter:image" content="https://thudfactor.com/images/greybeard.webp"><meta name="twitter:description" content="Thudfactor is the personal blog of John Williams, web developer"><link rel="stylesheet" href="/_astro/Page.7SnXg-6K.css">
<style>.about-me[data-astro-cid-r5s4b7ev]{margin-block:var(--space-md);display:grid;grid-template-columns:440px 1fr;grid-template-rows:1fr fit-content(20px) 2fr;gap:var(--space-sm);>*{margin:0}.rule-colors{grid-column:1 / span 2;grid-row:2;width:100%}}.headshot[data-astro-cid-r5s4b7ev]{overflow:hidden;padding-inline:var(--space-xl);grid-column:1;grid-row:1 / span 3;align-self:center;margin-block-start:calc(var(--space-xl) * -1);img{margin-block:30px;box-shadow:0 0 0 5px var(--foreground),0 0 0 10px var(--accent-3),0 0 0 15px var(--accent-1),0 0 15px 10px var(--foreground);border-radius:50%;display:block;width:min(calc(100% - 40px),500px);height:auto;aspect-ratio:1;object-fit:cover;margin-inline:auto;transition:border-radius .3s ease}}h1[data-astro-cid-r5s4b7ev]{grid-column:2;grid-row:1;align-self:end}.bio[data-astro-cid-r5s4b7ev]{grid-column:2;grid-row:3}@media(width<900px){.about-me[data-astro-cid-r5s4b7ev]{grid-template-columns:1fr;grid-template-rows:auto auto auto auto;.rule-colors{grid-column:1;grid-row:3}}.headshot[data-astro-cid-r5s4b7ev]{margin-block-start:0;grid-column:1;grid-row:1;padding:0;img{border-radius:50% 50% 0 0}}h1[data-astro-cid-r5s4b7ev]{grid-column:1;grid-row:2}.bio[data-astro-cid-r5s4b7ev]{grid-column:1;grid-row:4}}
</style></head><body> <a href="#main-content">Skip to main content</a> <header id="page-header"> <a id="home" href="/"> <svg width="454" height="66" viewBox="0 0 454 66" fill="none" xmlns="http://www.w3.org/2000/svg" data-astro-cid-zh7tmoie> <g clip-path="url(#clip0_14_194)" data-astro-cid-zh7tmoie> <g clip-path="url(#clip1_14_194)" data-astro-cid-zh7tmoie> <path d="M39.7238 1.67782L38.0327 3.35564H0L0.601304 4.11377C3.39493 7.65583 8.2179 12.5277 11.475 15.1128C14.2435 17.3002 17.3628 19.2017 19.7054 20.1214C21.7974 20.9417 26.3323 22.0727 29.7021 22.6071C33.8361 23.2782 38.183 23.6883 42.9559 23.8623C46.7642 23.999 48.3301 24.1855 50.3344 24.7447C54.744 25.9751 57.5251 28.3987 58.402 31.7916C58.7277 33.0717 58.7277 35.0478 58.3894 36.3652C57.8758 38.3662 56.385 40.7897 54.1678 43.2008C51.1111 46.5316 45.336 50.7447 39.4733 53.9264C38.1704 54.6348 37.8698 54.8709 36.3165 56.3996L34.5877 58.1023V65H51.7249L52.439 64.5774C54.7314 63.1979 59.5795 62.1912 65.9684 61.7562C69 61.5574 76.7669 61.5946 79.8736 61.8308C84.183 62.1539 87.39 62.6759 89.8955 63.4713C91.2609 63.9063 92.8769 64.6272 93.0272 64.8757C93.0774 64.9627 95.9962 65 101.809 65H110.503V58.1893L109.338 57.1205C105.342 53.479 100.669 50.0239 97.0986 48.0975C94.731 46.8298 93.4656 45.6367 92.2381 43.5612C90.8976 41.3117 89.8704 37.5459 89.8203 34.8365C89.8078 33.6558 90.2462 32.2266 91.286 30.0765C93.9668 24.5335 98.6144 20.457 104.44 18.5306C107.834 17.3996 109.701 17.1759 116.391 17.0268C121.289 16.9149 123.331 16.8155 125.974 16.5172C130.07 16.0698 133.277 15.175 134.254 14.2055L134.68 13.783V6.83556L135.031 6.76099C136.058 6.53729 136.346 6.42543 136.835 6.05258C137.136 5.82887 137.511 5.39388 137.687 5.0956C137.975 4.57361 138 4.41205 138 2.85851C138 0.932122 137.9 0.671128 137.023 0.285851C136.522 0.0745698 134.755 0.0621415 88.9559 0.0248566L41.4151 0L39.7238 1.67782Z" class="anvil" data-astro-cid-zh7tmoie></path> </g> <g class="logotype" data-astro-cid-zh7tmoie> <path d="M113 38.56V30.256H141.128V38.56H131.72V63.856H122.408V38.56H113Z" data-astro-cid-zh7tmoie></path> <path d="M149.409 50.464V42.16H175.569V50.464H149.409ZM169.713 30.256H179.025V63.856H169.713V30.256ZM147.153 30.256H156.465V63.856H147.153V30.256Z" data-astro-cid-zh7tmoie></path> <path d="M186.158 30.256H195.47V52.048C195.47 53.584 195.87 54.832 196.67 55.792C197.47 56.72 198.67 57.184 200.27 57.184C201.902 57.184 203.118 56.72 203.918 55.792C204.718 54.832 205.118 53.584 205.118 52.048V30.256H214.43V52.816C214.43 55.088 214.062 57.024 213.326 58.624C212.59 60.224 211.566 61.536 210.254 62.56C208.942 63.552 207.438 64.288 205.742 64.768C204.046 65.248 202.222 65.488 200.27 65.488C198.35 65.488 196.526 65.248 194.798 64.768C193.102 64.288 191.598 63.552 190.286 62.56C189.006 61.536 187.998 60.224 187.262 58.624C186.526 57.024 186.158 55.088 186.158 52.816V30.256Z" data-astro-cid-zh7tmoie></path> <path d="M220.566 30.256H230.214V63.856H220.566V30.256ZM233.142 63.856H226.902V55.696H232.758C233.878 55.696 234.966 55.584 236.022 55.36C237.11 55.104 238.086 54.672 238.95 54.064C239.814 53.424 240.502 52.544 241.014 51.424C241.558 50.272 241.83 48.816 241.83 47.056C241.83 45.296 241.558 43.856 241.014 42.736C240.502 41.584 239.814 40.704 238.95 40.096C238.086 39.456 237.11 39.024 236.022 38.8C234.966 38.544 233.878 38.416 232.758 38.416H226.902V30.256H233.142C236.95 30.256 240.214 30.944 242.934 32.32C245.686 33.664 247.798 35.584 249.27 38.08C250.774 40.576 251.526 43.568 251.526 47.056C251.526 50.512 250.774 53.504 249.27 56.032C247.798 58.528 245.686 60.464 242.934 61.84C240.214 63.184 236.95 63.856 233.142 63.856Z" data-astro-cid-zh7tmoie></path> <path d="M263.335 38.176V30.256H278.359V38.176H263.335ZM263.335 51.232V43.888H277.879V51.232H263.335ZM256.999 30.256H265.927V63.856H256.999V30.256Z" data-astro-cid-zh7tmoie></path> <path d="M289.336 58.432L289.624 51.568H306.856L307.096 58.432H289.336ZM298.12 44.032L293.704 54.112L294.28 56.176L290.392 63.856H279.832L298.12 28L316.456 63.856H305.896L302.056 56.512L302.584 54.112L298.12 44.032Z" data-astro-cid-zh7tmoie></path> <path d="M327.091 47.056C327.091 48.944 327.507 50.56 328.339 51.904C329.203 53.216 330.339 54.224 331.747 54.928C333.155 55.6 334.707 55.936 336.403 55.936C338.003 55.936 339.395 55.728 340.579 55.312C341.763 54.896 342.819 54.368 343.747 53.728C344.675 53.056 345.491 52.352 346.195 51.616V61.408C344.883 62.368 343.427 63.168 341.827 63.808C340.259 64.416 338.243 64.72 335.779 64.72C332.995 64.72 330.435 64.304 328.099 63.472C325.763 62.64 323.763 61.44 322.099 59.872C320.435 58.304 319.139 56.448 318.211 54.304C317.315 52.128 316.867 49.712 316.867 47.056C316.867 44.4 317.315 42 318.211 39.856C319.139 37.68 320.435 35.808 322.099 34.24C323.763 32.672 325.763 31.472 328.099 30.64C330.435 29.808 332.995 29.392 335.779 29.392C338.243 29.392 340.259 29.696 341.827 30.304C343.427 30.912 344.883 31.712 346.195 32.704V42.496C345.491 41.76 344.675 41.072 343.747 40.432C342.819 39.76 341.763 39.216 340.579 38.8C339.395 38.384 338.003 38.176 336.403 38.176C334.707 38.176 333.155 38.528 331.747 39.232C330.339 39.904 329.203 40.912 328.339 42.256C327.507 43.568 327.091 45.168 327.091 47.056Z" data-astro-cid-zh7tmoie></path> <path d="M351.298 38.56V30.256H379.426V38.56H370.018V63.856H360.706V38.56H351.298Z" data-astro-cid-zh7tmoie></path> <path d="M391.979 47.056C391.979 48.848 392.331 50.448 393.035 51.856C393.739 53.232 394.731 54.32 396.011 55.12C397.291 55.888 398.795 56.272 400.523 56.272C402.283 56.272 403.787 55.888 405.035 55.12C406.315 54.32 407.307 53.232 408.011 51.856C408.715 50.448 409.067 48.848 409.067 47.056C409.067 45.232 408.731 43.632 408.059 42.256C407.387 40.88 406.411 39.808 405.131 39.04C403.883 38.24 402.347 37.84 400.523 37.84C398.795 37.84 397.291 38.24 396.011 39.04C394.731 39.808 393.739 40.88 393.035 42.256C392.331 43.632 391.979 45.232 391.979 47.056ZM382.139 47.056C382.139 44.4 382.603 42 383.531 39.856C384.491 37.68 385.803 35.824 387.467 34.288C389.131 32.72 391.067 31.52 393.275 30.688C395.515 29.824 397.931 29.392 400.523 29.392C403.179 29.392 405.611 29.824 407.819 30.688C410.059 31.52 412.011 32.72 413.675 34.288C415.339 35.824 416.619 37.68 417.515 39.856C418.443 42 418.907 44.4 418.907 47.056C418.907 49.68 418.459 52.096 417.563 54.304C416.667 56.512 415.403 58.432 413.771 60.064C412.139 61.664 410.187 62.912 407.915 63.808C405.675 64.672 403.211 65.104 400.523 65.104C397.835 65.104 395.371 64.672 393.131 63.808C390.891 62.912 388.939 61.664 387.275 60.064C385.643 58.432 384.379 56.512 383.483 54.304C382.587 52.096 382.139 49.68 382.139 47.056Z" data-astro-cid-zh7tmoie></path> <path d="M433.503 49.024H443.055L453.135 63.856H442.287L433.503 49.024ZM424.383 30.256H433.695V63.856H424.383V30.256ZM430.335 38.128V30.256H437.583C440.655 30.256 443.183 30.736 445.167 31.696C447.183 32.656 448.671 33.984 449.631 35.68C450.623 37.344 451.119 39.28 451.119 41.488C451.119 43.664 450.623 45.616 449.631 47.344C448.671 49.04 447.183 50.368 445.167 51.328C443.183 52.256 440.655 52.72 437.583 52.72H430.335V45.664H436.815C437.807 45.664 438.639 45.52 439.311 45.232C439.983 44.944 440.495 44.512 440.847 43.936C441.231 43.36 441.423 42.672 441.423 41.872C441.423 41.072 441.231 40.4 440.847 39.856C440.495 39.28 439.983 38.848 439.311 38.56C438.639 38.272 437.807 38.128 436.815 38.128H430.335Z" data-astro-cid-zh7tmoie></path> </g> </g> <defs data-astro-cid-zh7tmoie> <clipPath id="clip0_14_194" data-astro-cid-zh7tmoie> <rect width="454" height="66" fill="white" data-astro-cid-zh7tmoie></rect> </clipPath> <clipPath id="clip1_14_194" data-astro-cid-zh7tmoie> <rect width="138" height="65" fill="white" data-astro-cid-zh7tmoie></rect> </clipPath> </defs> </svg> </a> <nav id="main-nav" aria-labelledby="main-nav-label"> <div class="visually-hidden" id="main-nav-label">Site</div> <ul role="list" class="nav-list"> <li> <a href="/about"> About </a> </li><li> <a href="/posts"> Posts </a> </li><li> <a href="/lyrics"> Lyrics Game </a> </li><li> <a href="/links"> Links </a> </li><li> <a href="/blogroll"> Blogroll </a> </li> <li> <script type="module">const c="theme",o=["light","dark","high-contrast-light","high-contrast-dark"];function r(){try{const e=localStorage.getItem(c);return e&&o.includes(e)?e:null}catch{return null}}function u(e){try{localStorage.setItem(c,e)}catch{}}function l(e){document.documentElement.setAttribute("data-theme",e)}function a(){return r()??"light"}function h(e){const n=e.target.value;o.includes(n)&&(u(n),l(n))}function i(){const e=document.querySelector("#theme-selector");if(!e)return;const t=a();e.value=t,l(t),e.addEventListener("change",h)}i();</script> <noscript><style>
		.theme-selector {
			display: none;
		}
	</style><span>Default Theme</span></noscript><form class="theme-selector"><label class="visually-hidden" for="theme-selector">Change theme</label><select id="theme-selector"><option value="light">Light</option><option value="dark">Dark</option><!-- tktk
		<option value="high-contrast-light">High-contrast Light</option>
		<option value="high-contrast-dark">High-contrast Dark</option>
		--></select></form> </li> </ul> </nav> </header> <main id="main-content">  <section class="stack archive" aria-labelledby="recently-published"> <!--
		  <Hero cover={cover} extraClass="landing" />
	  --> <section class="about-me" data-astro-cid-r5s4b7ev> <div class="rule-colors stack" role="presentation"> <div class="rule-1" role="presentation"></div> <div class="rule-2" role="presentation"></div> <div class="rule-3" role="presentation"></div> <div class="rule-4" role="presentation"></div> </div> <div class="headshot" data-astro-cid-r5s4b7ev> <img src="/_astro/avatar.BV7_vQlQ_Z23npD0.webp" srcset="/_astro/avatar.BV7_vQlQ_XDmuE.webp 400w, /_astro/avatar.BV7_vQlQ_Z1U5j72.webp 800w" alt="A photo of John Williams" sizes="(max-width: 640px) 100vw, 400px" loading="lazy" decoding="async" width="1200" height="1200"> </div> <h1 data-astro-cid-r5s4b7ev>I’m John Williams</h1> <div class="bio" data-astro-cid-r5s4b7ev> <p data-astro-cid-r5s4b7ev>
I build for the web and write about our digital culture. Posts here tend to be about
			whatever’s caught my attention. That usually means front-end development or the intersection
			of technology and the humanities, but sometimes other stuff sneaks in.
</p> <p data-astro-cid-r5s4b7ev>I also run a weekly lyrics guessing-game, because not everything has to be serious.</p> <ul class="cluster socials" role="list" data-astro-cid-upu6fzxr> <li data-astro-cid-upu6fzxr> <a href="https://hachyderm.io/@thudfactor" rel="me" data-service="mastodon" data-astro-cid-upu6fzxr> Mastodon </a> </li><li data-astro-cid-upu6fzxr> <a href="https://letterboxd.com/thudfactor/" rel="me" data-service="letterboxd" data-astro-cid-upu6fzxr> Letterboxd </a> </li><li data-astro-cid-upu6fzxr> <a href="https://bsky.app/profile/thudfactor.com" rel="me" data-service="bluesky" data-astro-cid-upu6fzxr> Bluesky </a> </li><li data-astro-cid-upu6fzxr> <a href="https://github.com/thudfactor" rel="me" data-service="github" data-astro-cid-upu6fzxr> Github </a> </li><li data-astro-cid-upu6fzxr> <a href="/feed.xml" rel="me" data-service="rss" data-astro-cid-upu6fzxr> RSS </a> </li> </ul> </div> </section> <article class="box card-link teaser featured"> <div class="featured-inner"> <img src="/_astro/gull.6xSPTob0_xYntt.webp" srcset="/_astro/gull.6xSPTob0_ZqWK5p.webp 400w, /_astro/gull.6xSPTob0_IRJ31.webp 800w, /_astro/gull.6xSPTob0_xYntt.webp 1200w, /_astro/gull.6xSPTob0_Z1rOJJ2.webp 1600w, /_astro/gull.6xSPTob0_1A3tkJ.webp 2400w, /_astro/gull.6xSPTob0_1ksadp.webp 3200w" alt="Closeup of a seagull in profile, its beak wide open." sizes="(max-width: 640px) 100vw, (max-width: 1024px) 800px, 1200px" style="--focus: 60% 50%" loading="lazy" decoding="async" width="1200" height="800"> <div class="stack"> <span class="label">Latest Post</span> <h2> <a href="/posts/it-happened">Being in the room</a> </h2> <p> <small><time datetime="2026-06-02T12:57:50.000Z"> Jun 2, 2026 </time></small> </p> <p>Eric Schmidt invites graduates to speak, but not anywhere he has to listen to them.</p> </div> </div> </article> <section> <h2 id="recently-published">Recently Published</h2> <section class="grid"> <article class="stack box card-link teaser"> <h3> <a href="/lyrics/through-my-tree">All I see is a young old man with only a dream</a> </h3> <p> <small><time datetime="2026-06-05T11:00:54.000Z"> Jun 5, 2026 </time></small> </p>  <p>Can’t look in her eyes, she’s out of my league</p> <dl class="lyric-stats"> <dt>Remaining:</dt>
				<dd> 2 of 10 lyrics to identify
</dd>  <dt>Leading:</dt>
				<dd> Glen with 4 guesses </dd> </dl> <p class="cta"> <a href="/lyrics/through-my-tree">Play now →</a> </p> </article> <article class="stack box card-link teaser"> <h3> <a href="/posts/automate-vs-delegate">With AI, are we automating? Or are we delegating?</a> </h3> <p> <small><time datetime="2026-05-09T17:57:50.000Z"> May 9, 2026 </time></small> </p>  <p>We keep trying to automate with LLMs. We’re actually delegating, and pretending otherwise makes us bad at it.</p>  </article><article class="stack box card-link teaser"> <h3> <a href="/posts/mordor">Amazon Strolls Into Mordor</a> </h3> <p> <small><time datetime="2026-03-13T14:57:50.000Z"> Mar 13, 2026 </time></small> </p>  <p>They ignored the obvious risks, but now the risks have become consequences and they’re looking for someone else to blame.</p>  </article><article class="stack box card-link teaser"> <h3> <a href="/posts/mercatr">Mercatr, and what it’s there for</a> </h3> <p> <small><time datetime="2026-02-23T11:57:50.000Z"> Feb 23, 2026 </time></small> </p>  <p>Using AI to build an anti-algorithmic music recommendation engine</p>  </article><article class="stack box card-link teaser"> <h3> <a href="/posts/lyrics-these-days">1969 Had Terrible Lyrics Too</a> </h3> <p> <small><time datetime="2025-12-27T14:30:23.000Z"> Dec 27, 2025 </time></small> </p>  <p>In defense of Jack Harlow and “Lovin’ On Me”</p>  </article><article class="stack box card-link teaser"> <h3> <a href="/posts/art-sources">Art sources</a> </h3> <p> <small><time datetime="2025-12-02T12:13:28.000Z"> Dec 2, 2025 </time></small> </p>  <p>Good places to find free(ish) artwork for blog posts.</p>  </article><article class="stack box card-link teaser"> <h3> <a href="/posts/ghost-and-back">Ghost (and back again)</a> </h3> <p> <small><time datetime="2025-12-01T10:27:59.000Z"> Dec 1, 2025 </time></small> </p>  <p>After years of running static sites, I had a brief flirtation with a hosted service.</p>  </article><article class="stack box card-link teaser"> <h3> <a href="/posts/working-with-ai">AI wants to do your work. Ask it to teach you instead.</a> </h3> <p> <small><time datetime="2025-10-27T20:25:05.000Z"> Oct 27, 2025 </time></small> </p>  <p>What happens when you ask AI to slow you down instead of speed you up?</p>  </article><article class="stack box card-link teaser"> <h3> <a href="/posts/how-to-pronounce-gif">How to pronounce GIF</a> </h3> <p> <small><time datetime="2025-10-14T14:01:30.000Z"> Oct 14, 2025 </time></small> </p>  <p>Possible spoiler: I don’t have an easy answer for you.</p>  </article> </section> <nav class="center pagination" aria-label="pagination"> <a href="/posts/2">Read More Posts ⇢</a> </nav> </section> <section> <h2>Recent Friday 10 Games</h2> <div class="grid"> <article class="stack box card-link teaser"> <h3> <a href="/lyrics/not-from-here">I’m not from here, I just live here</a> </h3> <p> <small><time datetime="2026-05-29T11:25:54.000Z"> May 29, 2026 </time></small> </p>  <p>Grew up somewhere far away</p> <p class="game-stats"> 10 of 10 guessed
</p>  </article><article class="stack box card-link teaser"> <h3> <a href="/lyrics/droppin-science">Guess you’d expect to catch the crew rhymin’</a> </h3> <p> <small><time datetime="2026-05-15T12:25:54.000Z"> May 15, 2026 </time></small> </p>  <p>Never let you down with the stereo sound</p> <p class="game-stats"> 7 of 10 guessed
</p>  </article><article class="stack box card-link teaser"> <h3> <a href="/lyrics/pencil">A man cuts in half</a> </h3> <p> <small><time datetime="2026-05-08T12:25:54.000Z"> May 8, 2026 </time></small> </p>  <p>Just like he snaps a pencil</p> <p class="game-stats"> 10 of 10 guessed
</p>  </article> </div> </section> </section>  </main> <footer id="page-footer" class="stack"> <nav aria-labelledby="social-label"> <h2 class="visually-hidden" id="social-label">Social Media Links</h2> <ul class="cluster socials" role="list" data-astro-cid-upu6fzxr> <li data-astro-cid-upu6fzxr> <a href="https://hachyderm.io/@thudfactor" rel="me" data-service="mastodon" data-astro-cid-upu6fzxr> Mastodon </a> </li><li data-astro-cid-upu6fzxr> <a href="https://letterboxd.com/thudfactor/" rel="me" data-service="letterboxd" data-astro-cid-upu6fzxr> Letterboxd </a> </li><li data-astro-cid-upu6fzxr> <a href="https://bsky.app/profile/thudfactor.com" rel="me" data-service="bluesky" data-astro-cid-upu6fzxr> Bluesky </a> </li><li data-astro-cid-upu6fzxr> <a href="https://github.com/thudfactor" rel="me" data-service="github" data-astro-cid-upu6fzxr> Github </a> </li><li data-astro-cid-upu6fzxr> <a href="/feed.xml" rel="me" data-service="rss" data-astro-cid-upu6fzxr> RSS </a> </li> </ul> </nav> <div>&copy; 2018–2026 John W.</div> </footer> </body></html>