The Blogroll

Chris Corner: Git it

Julia Evans has released what she’s saying is one of her most popular zines to date: How Git Works. I don’t think you’d regret reading it. I imagine most of us get by with knowing just enough Git to do our jobs, but are probably using 5% of what it can really do. Being very […]

How to Set Date Time from Mac Command Line

Working on a web extension that ships to an app store and isn’t immediately modifiable, like a website, can be difficult. Since you cannot immediately deploy updates, you sometimes need to bake in hardcoded date-based logic. Testing future dates can be difficult if you don’t know how to quickly change the date on your local […]

The post How to Set Date Time from Mac Command Line appeared first on David Walsh Blog.

The Best UX Design Tools You Need for Testing

There is no excuse not to test your designs with so many excellent apps available and more being added daily. Here are the best UX design tools I have found to date.

The new pyramid of discovery

I’ve just started using Perplexity’s Discover news application and have to say it is impressive, compiling multiple news reports on a topic and producing a well-organized summary and explanation, giving users the opportunity to query the topic — and providing citations and links to news stories (revealing, by the way, just how repetitive they are). See this […]

The post The new pyramid of discovery appeared first on BuzzMachine.

The machine stops

Large language models have reaped our words and plundered our books. Bryan Vandyke:

Turns out, everything on the internet—every blessed word, no matter how dumb or benighted—has utility as a learning model. Words are the food that large language algorithms feed upon, the scraps they rely on to grow, to learn, to approximate life. The LLNs that came online in recent years were all trained by reading the internet.

We can shut the barn door—now that the horse has pillaged—by updating our robots.txt files or editing .htaccess. That might protect us from the next wave, ’though it can’t undo what’s already been taken without permission. And that’s assuming that these organisations—who have demonstrated a contempt for ethical thinking—will even respect robots.txt requests.

I want to do more. I don’t just want to prevent my words being sucked up. I want to throw a spanner in the works. If my words are going to be snatched away, I want them to be poison pills.

The weakness of large language models is that their data and their logic come from the same source. That’s what makes prompt injection such a thorny problem (and a well-named neologism—the comparison to SQL injection is spot-on).

Smarter people than me are coming up with ways to protect content through sabotage: hidden pixels in images; hidden words on web pages. I’d like to implement this on my own website. If anyone has some suggestions for ways to do this, I’m all ears.

If enough people do this we’ll probably end up in an arms race with the bots. It’ll be like reverse SEO. Instead of trying to trick crawlers into liking us, let’s collectively kill ’em.

Who’s with me?

This is no way to save the news

California legislators have amended a bill written by newspaper lobbyists — and made it worse. New York has enacted a law pushed by newspapers to give tax dollars to newspapers — excluding some broadcasters and the true future of news: digital and not-for-profit newsrooms. And Canada further demonstrates what a disaster its newspaper lobbyists have caused with a law […]

The post This is no way to save the news appeared first on BuzzMachine.

Web App install API

My bug report on Apple’s websites-in-the-dock feature on desktop has me thinking about how starkly different it is on mobile.

On iOS if you want to add a website to your home screen, good luck. The option is buried within the “share” menu.

First off, it makes no sense that adding something to your homescreen counts as sharing. Secondly, how is anybody supposed to know that unless they’re explicitly told.

It’s a similar situation on Android. In theory you can prompt the user to install a progressive web app using the botched BeforeInstallPromptEvent. In practice it’s a mess. What it actually does is defer the installation prompt so you can offer it a more suitable time. But it only works if the browser was going to offer an installation prompt anyway.

When does Chrome on Android decide to offer the installation prompt? It’s a mix of required criteria—a web app manifest, some icons—and an algorithmic spell determined by the user’s engagement.

Other browser makers don’t agree with this arbitrary set of criteria. They quite rightly say that a user should be able to add any website to their home screen if they want to.

What we really need is an installation API: a way to programmatically invoke the add-to-homescreen flow.

Now, I know what you’re going to say. The security and UX implications would be dire. But this should obviously be like geolocation or notifications, only available in secure contexts and gated by user interaction.

Think of it like adding something to the clipboard: it’s something the user can do manually, but the API offers a way to do it programmatically without opening it up to abuse.

(I’d really love it if this API also had a declarative equivalent, much like I want button type="share" for the Web Share API. How about button type="install"?)

People expect this to already exist.

The beforeinstallprompt flow is an absolute mess. Users deserve better.

Space dock

Apple announced some stuff about artificial insemination at their WorldWide Developer Conference, none of which interests me one whit. But we did get a twitch of the webkit curtains to let us know what’s coming in Safari. That does interest me.

I’m really pleased to see that on desktop, websites that have been added to the dock will be able to intercept links for that domain:

Now, when a user clicks a link, if it matches the scope of a web app that the user has added to their Dock, that link will open in the web app instead of their default web browser.

Excellent! This means that if I click on a link to from, say, my Mastodon site-in-the-dock, it will open in The Session site-in-the-dock. Make sure you’ve got the scope property set in your web app manifest.

I have a few different sites added to my dock: The Session, Mastodon, Google Calendar. Sure beats the bloat of Electron apps.

I have encountered a small bug. I’ll describe it here because I have no idea where to file it.

It’s to do with Spaces, Apple’s desktop management thingy. Maybe they don’t call it Spaces anymore. Maybe it’s called Mission Control now. Or Stage Manager. I can’t keep track.

Anyway, here are the steps to reproduce:

  1. In Safari on Mac, go to a website like
  2. From either the File menu or the share icon, select Add to dock.
  3. Click on the website’s icon in the dock to open it.
  4. Using Apple’s desktop management (Spaces?) available through the F3 key, drag that window to a desktop other than desktop 1.
  5. Right click on the site’s icon in the dock and select Options, then Assign To, then This Desktop.
  6. Quit the app/website.
  7. Return to desktop 1.

Expected behaviour: when I click on the icon in the dock to open the site, it will open in the desktop that it has been assigned to.

Observed behaviour: focus moves to the desktop that the site has been assigned to, but it actually opens in desktop 1.

If someone from Apple is reading, I hope that’s useful.

On the one hand, I hope this isn’t one of those bugs that only I’m experiencing because then I’ll feel foolish. On the other hand, I hope this is one of those bugs that only I’m experiencing because then others don’t have to put up with the buggy behaviour.

CSS Day 2024

My stint as one of the hosts of CSS Day went very well indeed. I enjoyed myself and people seemed to like the cut of my jib.

During the event there was a real buzz on Mastodon, which was heartening to see. I was beginning to worry that hashtagging events was going to be collatoral damage from Elongate, but there was plenty of conference-induced FOMO to be experienced on the fediverse.

The event itself was, as always, excellent. Both in terms of content and organisation.

Some themes emerged during CSS Day, which I always love to see. These emergent properties are partly down to curation and partly down to serendipity.

The last few years of CSS Day have felt like getting a firehose of astonishing new features being added to the language. There was still plenty of cutting-edge stuff this year—masonry! anchor positioning!—but there was also a feeling of consolidation, asking how to get all this amazing new stuff into our workflows.

Matthias’s opening talk on day one and Stephen’s closing talk on the same day complemented one another perfectly. Both managed to inspire while looking into the nitty-gritty practicalities of the web design process.

It was, astoundingly, Matthias’s first ever conference talk. I have no doubt it won’t be the last—it was great!

I gave Stephen a good-natured roast in my introduction, partly because it was his birthday, partly because we’re old friends, but mostly because it was enjoyable for me to watch him squirm. Of course his talk was, as always, superb. Don’t tell him, but he might be one of my favourite speakers.

The topic of graphic design tools came up more than once. It’s interesting to see how the issues with them have changed. It used to be that design tools—Photoshop, Sketch, Figma—were frustrating because they were writing cheques that CSS couldn’t cash. Now the frustration is the exact opposite. Our graphic design tools aren’t capable of the kind of fluid declarative design we can now accomplish in web browsers.

But the biggest rift remains not with tools or technologies, but with people and mindsets. Our tools can reinforce mindsets but the real divide happens in how different people approach CSS.

Both Josh and Kevin get to the heart of this in their tremendous tutorials, and that was reflected in their talks. They showed the difference between having the bare minimum understanding of CSS in order to get something done as quickly as possible, and truly understanding how CSS works in order to open up a world of possibilities.

For people in the first category, Sarah Dayan was there to sing the praises of utility-first CSS AKA atomic CSS. I commend her bravery!

During the Q&A, I restrained myself from being too Paxmanish. But I did have l’esprit d’escalier afterwards when I realised that the entire talk—and all the answers afterwards—depended on two mutually-incompatiable claims:

  1. The great thing about atomic CSS is that it’s a constrained vocabulary so your team has to conform, and
  2. The other great thing about it is that it’s utility-first, not utility-only so you can break out of it and use regular CSS if you want.

Insert .gif of character from The Office looking to camera.

Most of the questions coming in during the Q&A reflected my own take: how about we use utility classes for some things, but not all things. Seems sensible.

Anyway, regardless of what I or anyone else thinks about the substance of what Sarah was saying, there was no denying that it was a great presentation. They were all great presentations. That’s unusual, and I say that as a conference organiser as well as an attendee. Everyone brings their A-game to CSS Day.

Mind you, it is exhausting. I say it every year, but it always feels like one talk too many. Not that any individual talk wasn’t good, but the sheer onslaught of deep dives into the innards of CSS has my brain exploding before the day is done.

A highlight for me was getting to introduce Fantasai’s talk on the design principles of CSS, which was right up my alley. I don’t think most people realise just how much we owe her for her years of work on standards. The web would be in a worse place without the Herculean work she’s done behind the scenes.

Another highlight was getting to see some of the students I met back in March. They were showing some of their excellent work during the breaks. I find what they’re doing just as inspiring as the speakers on stage.

In fact, when I was filling in the post-conference feedback form, there was a question: “Who would you like to see speak at CSS Day next year?” I was racking my brains because everyone I could immediately think of has already spoken at some point. So I wrote, “It would be great to see some of those students speaking about their work.”

I think it would be genuinely fascinating to get their perspective on what we consider modern CSS, which to them is just CSS.

Either way I’ll back next year for sure.

It’s funny, but usually when a conference is described as “inspiring” it’s because it’s tackling big galaxy-brain questions. But CSS Day is as nitty-gritty as it gets and I found it truly inspiring. Like, I couldn’t wait to open up my laptop and start writing some CSS. That kind of inspiring.

Chris’ Corner: Let’s Look at Type!

Dan Mall has my favorite post on picking a typeface. I’m no master typographer, but I know enough that I don’t want to be talked to like an absolute beginner where you teach me what a serif is. Dan gets into more realistic decision making steps, like intentionally not picking something ultra popular, admitting that […]

A Decade Later, A Decade Lost

I woke up this morning about an hour ahead of my alarm, the sky already light, birds calling.


I haven’t spoken at any conferences so far this year, and I don’t have any upcoming talks. That feels weird. I’m getting kind of antsy to give a talk.

I suspect my next talk will have something to do with HTML web components. If you’re organising an event and that sounds interesting to you, give me a shout.

But even though I’m not giving a conference talk this year, I’m doing a fair bit of hosting. There was the lovely Patterns Day back in March. And this week I’m off to Amsterdam to be one of the hosts of CSS Day. As always, I’m very much looking forward to that event.

Once that’s done, it’ll be time for the biggie. UX London is just two weeks away—squee!

There are still tickets available. If you haven’t got yours yet, I highly recommend getting it before midnight on Friday—that’s when the regular pricing ends. After that, it’ll be last-chance passes only.

Browser support

There was a discussion at Clearleft recently about browser support. Rich has more details but the gist of it is that, even though we were confident that we had a good approach to browser support, we hadn’t written it down anywhere. Time to fix that.

This is something I had been thinking about recently anyway—see my post about Baseline and progressive enhancement—so it didn’t take too long to put together a document explaining our approach.

You can find it at

We’re not just making it public. We’re releasing it under a Creative Commons attribution license. You can copy this browser-support policy verbatim, you can tweak it, you can change it, you can do what you like. As long you include a credit to Clearleft, you’re all set.

I think this browser-support policy makes a lot of sense. It certainly beats trying to browser support to specific browsers or version numbers:

We don’t base our browser support on specific browser names and numbers. Instead, our support policy is based on the capabilities of those browsers.

The more organisations adopt this approach, the better it is for everyone. Hence the liberal licensing.

So next time your boss or your client is asking what your official browser-support policy is, feel free to use

Tejas Kumar and I talk for 90 Minutes

Right here!

Chris’ Corner: A Variety of Ways to Fail

I’ve done a decent amount of accessibility work in the past few months, largely thanks to a nice fellow who uses JAWS and seems to enjoy our sessions together testing various bits of CodePen, old and new. I use classic tools like the axe and the WebAIM tools to find issues, and still, testing over […]

Reading patterns

I can’t resist bookshelves.

If I’m shown into someone’s home and left alone while the host goes and does something, you can bet I’m going to peruse their bookshelves.

I don’t know why. Maybe I’m looking for points of commonality. “Oh, you read this book too?” Or maybe it’s the opposite, and I’m looking for something new and—pardon the pun—novel. “Oh, that book sounds interesting!”

I like it when people have a kind of bookshelf on their website.

Here’s my ad-hoc bookshelf, which is manually mirrored on

I like having an overview of what I’ve been reading. One of the reasons I started keeping track was so that I could try to have a nice balance of fiction and non-fiction.

I always get a little sad when I see someone’s online reading list and it only consists of non-fiction books that are deemed somehow useful, rather than simply pleasurable. Cameron wrote about when he used to do this:

I felt like reading needed to have some clear purpose. The topic of any book I read needed to directly contribute to being an “adult”. So I started to read non-fiction – stuff that reflected what was happening in my career. Books on management, books on finance, books on economics, books on the creative process. And for many years this diet of dry, literary roughage felt wholesome … but joyless. Each passage I highlited in yellow marker was a point for the scoreboard, not a memory to be treasured.

Now he’s redressing the imbalance and rediscovering the unique joy of entering other worlds by reading fiction.

For a while, I forced myself to have perfect balance. I didn’t allow myself to read two non-fiction books in a row or two fiction books in a row. I made myself alternate between the two.

I’ve let that lapse now. I’m reading more fiction than non-fiction, and I’m okay with that.

But I still like looking back on what I’ve been reading and seeing patterns emerge. Like there’s a clear boom in the last year of reading retellings of the Homeric epics (all kicked off by reading the brilliant Circe by Madeline Miller).

I also keep an eye out for a different kind of imbalance. I want to make sure that I’m not just reading books by people like me—middle-aged heterosexual white dudes.

You may think that a balanced reading diet would emerge naturally, but I’m not so sure. Here’s an online bookshelf. Here’s another online bookshelf. Plenty of good stuff in both. But do either of those men realise that they’ve gone more than a year without reading a book written by a woman?

It’s almost certainly not a conscious decision. It’s just that in the society we live in, the default mode tends towards what’s been historically privileged (see also films, music, and painting).

It’s like driving in a car that subtly pulls to one side. Unless you compensate for it, you’ll end up in the ditch without even realising.

I feel bad for calling attention to those two reading lists. It feels very judgy of me. And reading is something that doesn’t deserve judgement. Any reading is good reading.

Mind you, maybe being judgemental is exactly why I’m drawn to people’s bookshelves in the first place. It might be that I’m subsconsciously looking for compatibility signals. If I see a bookshelf filled with books I like, I’m bound to feel predisposed to like that person. And if I see a bookshelf dominated by Jordan Peterson and Ayn Rand, I’m probably going to pass judgement on the reader, even if I know I shouldn’t.

Applying the four principles of accessibility

Web Content Accessibility Guidelines—or WCAG—looks very daunting. It’s a lot to take in. It’s kind of overwhelming. It’s hard to know where to start.

I recommend taking a deep breath and focusing on the four principles of accessibility. Together they spell out the cutesy acronym POUR:

  1. Perceivable
  2. Operable
  3. Understandable
  4. Robust

A lot of work has gone into distilling WCAG down to these four guidelines. Here’s how I apply them in my work…


I interpret this as:

Content will be legible, regardless of how it is accessed.

For example:

  • The contrast between background and foreground colours will meet the ratios defined in WCAG 2.
  • Content will be grouped into semantically-sensible HTML regions such as navigation, main, footer, etc.


I interpret this as:

Core functionality will be available, regardless of how it is accessed.

For example:

  • I will ensure that interactive controls such as links and form inputs will be navigable with a keyboard.
  • Every form control will be labelled, ideally with a visible label.


I interpret this as:

Content will make sense, regardless of how it is accessed.

For example:

  • Images will have meaningful alternative text.
  • I will make sensible use of heading levels.

This is where it starts to get quite collaboritive. Working at an agency, there will some parts of website creation and maintenance that will require ongoing accessibility knowledge even when our work is finished.

For example:

  • Images uploaded through a content management system will need sensible alternative text.
  • Articles uploaded through a content management system will need sensible heading levels.


I interpret this as:

Content and core functionality will still work, regardless of how it is accessed.

For example:

  • Drop-down controls will use the HTML select element rather than a more fragile imitation.
  • I will only use JavaScript to provide functionality that isn’t possible with HTML and CSS alone.

If you’re applying a mindset of progressive enhancement, this part comes for you. If you take a different approach, you’re going to have a bad time.

Taken together, these four guidelines will get you very far without having to dive too deeply into the rest of WCAG.

Sounds like a TV series title

Multipage Version

Super cool zine from Mat. Me, I like HTML, and I wanted to do something with a little texture to it. So I asked a bunch of people way more talented than I am if they were down to contribute to a zine about heading elements—`h1` and company, here with us for as long as […]

Another speaker for UX London

UX London is just three weeks away! If you haven’t got your ticket yet, dally not.

There’s a last-minute addition to the line-up: Peter Boersma.

Peter is kindly stepping into the slot that Kara Kane was going to be occupying. Alas, since a snap general election was recently announced, Kara isn’t able to give her talk. There’s an abundance of caution in the comms from in this pre-election period.

It’s a shame that Kara won’t be able to speak this time around, but it’s great that we’ve got Peter!

Peter’s talk is perfect for day three. Remember, that’s the day focused on design ops and design systems. Well, Peter lives and breathes design ops. He’ll show you why you should maintain a roadmap for design ops, and work with others to get the initiatives on it done.

You can get a ticket for an individual day of talks and workshops, or go for the best-value option and come for all three days. See you there!

The gift of a three-month sabbatical

It was late winter when my sabbatical began, and it’s late spring as it comes to an end. Next week I return to my post after three months’ paid leave, courtesy of Automattic’s sabbatical benefit. Three months. A season. With full pay, and zero work responsibilities. In a job full of rewards, this is perhaps the greatest […]

The post The gift of a three-month sabbatical appeared first on Zeldman on Web and Interaction Design.

A common web component learning blunder

Through stalking the #WebComponents hashtag and my Frontend Masters course, I’m privy to a lot of developers’ first experiences with web components. There’s a wide range of people digging in, but the most common first-time experience I come across is a developer coming from a classical component framework like React with JSX going straight to writing vanilla Web Components, becoming frustrated, and then deeming web components “not ready for primetime.”

Ignoring for a moment that web components do exist in the primetime and power some big and complex primetime web applications like Adobe’s Photoshop for Web, I half-understand this perspective. I understand the desire to not have a major dependency. I hate this bloated node_modules hellhole we’ve built over the last decade and while I’m not a npm install my problems away guy… I think this puritanical approach to dependencies is a misstep when diving into web components for the first time.

The analogy I’ve been using is that this is like jumping from a tall 130 kilobyte-story building (ReactDOM) right into the zero kilobyte sewers of web components. If you take anything from this post, please understand this: web components (most likely) weren’t designed for you. Not to dissuade you from using them, but they were purposefully designed to be a low-level bare metal primitive for library authors to build on; they were designed to be used with a library, a thin layer of abstraction butter on top.

To understand this disparity further, let’s look at an example of what writing a component in a “modern” framework feels like…

// React
export default function MyApp() {
	handleClick() {
  return (
      <h1>Welcome to my app</h1>
      <button onClick={handleClick}>Im a button</button>

Can you do this in vanilla web components? Sure. But it looks like this…

// Vanilla web component
const myAppTmpl = document.createElement('template')
myAppTmpl.innerHTML = `
  <h1>Welcome to my app</h1>
  <button>I’m a button</button>

class MyApp extends HTMLElement {
	constructor() {
		this._shadowRoot = this.attachShadow({ mode: 'open' })
      .addEventListener('click', this.handleClick);	
	handleClick() {

customElements.define('my-app', MyApp)

This is a boring, imperative set of instructions for building the component with a little bit of dangerouslySetInnerHTML1 mixed in there… and ugchk… it sucks. It’s even more verbose with more interactive elements or a slew of reactive props and attributes.

Let’s see what 7 kilobytes of Lit gets us….

import { LitElement, html } from 'lit'

class MyApp extends LitElement {
	handleClick() {
  render() {
		return html`
      <h1>Welcome to my app</h1>
      <button @click=${this.handleClick}>I’m a button</button>

customElements.define('my-app', MyApp)

Now we have a component that’s almost identical to the familiar world of JSX but without any Babel transforms or build steps. For 7 kilobytes you get a lot more than some syntactic sugar, you get…

  • A thin, tree-shakeable layer of abstraction for a modern developer experience
  • Reactive updates without VDOM
  • A more granular component lifecycle with a render() function
  • A cleaner way of registering and using reactive attributes and properties without overloading the attributeChangedCallback
  • Template directives like @click for event handling and directives for JavaScript values (arrays, objects, etc).
  • And an html tagged template literal with an under-appreciated superpower ✨ that gives your components atomic updates under-the-hood.

There’s value in learning how bare metal vanilla web components work in the same way there’s value in knowing how Intl.RelativeTimeFormat() works, but you probably want to use Day.js for your day-to-day work. You can totally write your own base class abstraction – and I want you to have the JeffElement base class of your dreams, I do – but you may find out (like Cory LaViska from Shoelace found out) that after you write all your little helper functions and utilities that you’ll end up with something almost the exact same size and feature set as Lit, but not as well supported nor as battle-tested.

This makes me sound anti-vanilla web components and I’m not that by any means. Vanilla web components are a perfect fit for standalone components and the Light DOM-forward flavor of “HTML web components”, but I think the people having the most fun in this space are JavaScript minimalists who already prefer writing vanilla JavaScript. People like myself.

“If I have to use a library how is this any different than any other framework lock-in?” This is a valid question and one worthy of its own post, but I think you’ll find the lock-in costs of a web component library pretty minimal. Because all web components libraries extend a common base class, there’s a linear pathway out of vendor lock-in if necessary.

What I’m saying is this; next time you’re thinking about jumping from 130 kilobytes of developer convenience, maybe consider giving yourself a 7 kilobyte landing pad to cushion the fall.

  1. There’s ways around the innerHTML call like by writing the template in your HTML instead.


In their rush to cram in “AI” “features”, it seems to me that many companies don’t actually understand why people use their products.

Google is acting as though its greatest asset is its search engine. Same with Bing.

Mozilla Developer Network is acting as though its greatest asset is its documentation. Same with Stack Overflow.

But their greatest asset is actually trust.

If I use a search engine I need to be able to trust that the filtering is good. If I look up documentation I need to trust that the information is good. I don’t expect perfection, but I also don’t expect to have to constantly be thinking “was this generated by a large language model, and if so, how can I know it’s not hallucinating?”

“But”, the apologists will respond, “the results are mostly correct! The documentation is mostly true!”

Sure, but as Terence puts it:

The intern who files most things perfectly but has, more than once, tipped an entire cup of coffee into the filing cabinet is going to be remembered as “that klutzy intern we had to fire.”

Trust is a precious commodity. It takes a long time to build trust. It takes a short time to destroy it.

I am honestly astonished that so many companies don’t seem to realise what they’re destroying.

Masonry and reading order

I recently wrote a post about the CSS masonry proposal on the Chrome for Developers blog. I was keen not to muddy the waters with anything that wasn’t the main point of that post—which was to explain why the Chrome team felt that masonry should be specified outside of grid. Since then, a couple of […]


Another kid’s device we have that we’ve gotten tons and tons of use out of is the Toniebox. It’s this soft padded box with a speaker on it (or plug in headphones). You place a character on it (a “Tonie”) and it plays the audio associated with that Tonie. It basically tells stories. We heard […]

Puerto Vallarta

Our little family took a quick trip down to Puerto Vallarta, Mexico — meeting my inlaws there for some fun in the sun. We stayed at the Hyatt Ziva. We actually “won” the trip a few years back at a live auction/benefit for the Boys & Girls Club of Bend, so it felt nice to […]


Quick note that I’m totally going to Frostapalooza (and you can too!) Frostapalooza is a giant one-night-only benefit concert-slash-party-slash-happening featuring an amorphous super group of talented musicians from bands like: Brad Frost is turning 40 and throwing this as a massive party/concert. I’ll be playing banjo in the show for a couple of tunes. You’ll […]

Ah yes, the famous “intern did it” syndrome

Poachers, when caught stealing content from our website, always blamed the theft on an “intern” or “freelancer.” We always pretended to believe them.

The post Ah yes, the famous “intern did it” syndrome appeared first on Zeldman on Web and Interaction Design.

Kingdom Rush

I think it was during the ShopTalk with Blake Watson where “tower defense” games briefly came up and someone recommended Kingdom Rush. It’s not exactly new, coming out in 2011, but it was new to me. I played on iOS. It feels like the total classic of tower defense games. Monsters come at you, you […]

Demote the doomsters

This paper in Science on “managing extreme AI risks amid rapid progress” with 25 co-authors (Harari?) is getting quick attention. The paper leans heavily toward the AI doom, warning of “an irreversible loss of human control over AI systems” that “could autonomously deploy a variety of weapons, including biological ones,” leading if unchecked to “a […]

The post Demote the doomsters appeared first on BuzzMachine.

Chris’ Corner: Stand Alones

It continues to be a big year for Web Components. I’m noticing it more this week as it’s effecting some of my friends. My long-time ShopTalk co-host Dave Rupert just got a job at Microsoft working on Fluent UI Web Components. Probably didn’t hurt that he wrote the book on them. I’m stoked that big, […]

It’s a me

Dave Goes Microsoft

Last Monday was my first day as an official employee of Microsoft where I’ll be working on web components as part of the Fluent design system team. As longtime readers already know, I’ve had a long term relationship with Microsoft – from Paravel’s 2012 responsive redesign of the Microsoft homepage to the five year #davegoeswindows stunt –  it feels like a new chapter in the career story arc to finally acquire one of the famous blue badges. I’m still new and have barely setup my computer but so far my team of peers, the larger group, the project itself, and the other folks across Microsoft I’ve connected with are all great.

Going from a company with two coworkers to a company with 200K coworkers is certainly an adjustment. It’s my first job in 18 years where I’m not working for myself but by far the biggest eye-opener throughout this process was doing tech interviews! I learned a lot about myself; like how after decades of coding in a room by myself, performing in front of someone else isn’t natural for me. Weirdly for me, a live demo in front of thousands of people… no problem. A random generated coding challenge in front of one person… palms sweaty, mom’s spaghetti levels of difficult. I also learned that too much caffeine and the panic-flavored adrenaline of interviewing is a lot of chemistry for my active brain to process.

I eventually figured out how to interview and I had a lot of great conversations with great people at great companies. That said, this experience left me with lingering qualms about the tech interview process. A lot of it comes down to the information asymmetry where the seller (the hiring company) has more information than the buyer (the job candidate) and it’s hard to get any feedback for self-improvement. Even in my limited experience, it’s not uncommon to sink 15+ hours into a take home coding test and interview loop only to receive a terse rejection. Granted there’s promise of a six figure salary at the end of the rainbow, these jobs don’t fall out of the sky so you need to put in work, but I think that situation needs to be a bit more equitable to candidates – a Newtonian dynamic of matching effort.

One question they ask you at interviews is “What are you looking for in your next role?” and while that sparks thousands of ideas, I boiled my needs and wants down to two core concepts:

  • Be a part of a larger team of engineers - I’d like to work on a larger team of developers. I want to be in a situation where I can actively and passively learn from other engineers who are subject matter experts in different subjects. As a life-long learner, I’d like to take myself out of the “lone developer” paradigm and absorb as much as I can.
  • Be tangential to the money machine - When you run your own business there’s a tight coupling between how much you work and how much money you make and you’re constantly aware of that fact. After 18 years of running my own business and two particularly intense years of startup burnout, I’d like to try something different and play a more supportive operational role for a bit.

I think I found that in Microsoft. There’s a multitude of people I can ping about niche technology choices. There’s even access to a library of research papers. And already I can see how operating in a product support role seems to provide more opportunity for strategy to the broader needs of the organization as opposed to reactivity to the needs du jour that happen in Productland.

I’m sure throughput will be a bit slower without direct access to the publish to production button. I’m sure there’s topics I won’t be able to talk about on this here blog (but I tend not to blog about specific work-related activities here anyways so that won’t change). And I’m sure I’ll have to put a disclaimer here and there that these ideas are my own and not reflective of my employer. Henceforth and furthermore all bad ideas are copyright of Dave Rupert LLC®.

It’s the end of an era for sure but also the beginning of a new one and potentially the beginning of lots of new ones, who knows. Thanks to Trent and Reagan. Thanks to everyone who provided emotional support on this journey. Thanks to esteemed friends who provided referrals. Given the current macroeconomic situation, I feel lucky to have landed somewhere familiar with great opportunities and many Dave Rupert-shaped problems.

Earned this

Been better about what I eat. Had a great January where I lost around 11 pounds. In Feb and March I became far too lax. Really righted things in late April. Just another 2 to one of my goals. Then another 15 or so.

24 days

I went alcohol free 24 days ago. What’s changed? Quality of life is way better. I’ve still got a long way to go, though.

Chris Corner: Platforms and Tools

Late last year Google made this showcase microsite The Web Can Do What!?. It’s nicely done! I like how it talks about various somewhat-recently unlocked use cases, while itself being a showcase for other rather impressive things you can do on a website (cool usage of sticky sections, view transitions, etc). Google invests a lot […]

How to Retrieve WiFi Password on Windows

Remembering the WiFi password when on a guest network is never easy. Even worse is when it’s no longer posted and someone else is asking you for it. Luckily there’s a built in Windows command to recover the password of a given WiFi network. The Shell Code Open cmd and execute the following command: netsh […]

The post How to Retrieve WiFi Password on Windows appeared first on David Walsh Blog.

Looking at People

At one time I got interested in the “eye contact”, or lack of it, on video calls. I was going to present at an online conference, and I wanted people watching to have it look like I was looking right at them. Plus, possibly even more importantly, one-on-one calls with people. I ended up buying […]


Palestinians and Israelis are two Indigenous peoples occupying the land that is being fought over.

The post Indigenous appeared first on Zeldman on Web and Interaction Design.

Chris Corner: Unusual Ideas with Great Results

SVG Short Circuiting SVG is normally a pretty efficient file format. If an image is vector in nature, leaving it as vector is normally a good plan as it will like scale well and look pretty darn crips. But of course, It Depends. Super complex vector graphics can get huge, and a raster (i.e. JPG, […]

A quick light-dark() experiment

I wanted to experiment with the new CSS function light-dark() and get a sense of how to use it in a CSS architecture of nested (web) components. I think it’s going to be a powerful tool in the new responsive world of component architecture but I don’t want to recommend something unless I have experience with it in a project first.

My first pass was to add light-dark() to my components…

/* global.css */
:root {
  --dark: #000;
  --light: #fff;

/* Inside <my-component>'s Shadow DOM */
:host {
  background-color: light-dark(var(--light), var(--dark));
  color: light-dark(var(--dark), var(--light));

But if every component is in charge of it’s own light-dark() handling for border, background, and color on every element… the codebase will get messy managing dark mode in a lot of different places, leading to a lot of inconsistencies over time. A more elegant solution for me would be to handle this job in a single location at the root scope level and leverage the cascade a bit.

:root {
  color-scheme:  light dark;
  --surface-color: light-dark( #fff, #000 );
  --text-color: light-dark( #000, #fff );

The nice thing about using light-dark() at the root token level is your components can be dumber. You provide default light-dark experience and, like good children, your components abide in their parent’s decision. Of course, due to the nature of CSS custom properties, your components aren’t locked into the system and your component level styles can opt out (read: not include) or override the global variables if necessary.

/* Inside <my-component>'s Shadow DOM */
:host {
  background: var(--surface-color);
  color: var(--text-color);
/* this is a real example from my past */
:host[theme="lunar-new-year"] {
  --surface-color: red;
  --text-color: black;

At this point in the experiment I was pleased with the results… until I deployed it to production. I overestimated the browser support for light-dark() and it didn’t work on my phone running Safari 17.4 (but it’s coming in Safari 17.5). I replicated the issue by changing light-dark() to light-d0rk() to verify and fixed it by adding a tried-and-true CSS @supports query.

:root {
  --surface-color: #000;
  --text-color: #fff;

	/* NOTE: For Safari 17.4 (2024-05) */
  @supports (color: light-dark(black, white)) {
    color-scheme:  light dark;
	  --surface-color: light-dark( #fff, #000 );
	  --text-color: light-dark( #000, #fff );

Now Safari 17.4 and other browsers that lack support will only have a dark theme and newer browsers will get the light-dark() enhancement. I also threw a little NOTE: and datestamp in there so future versions of me will know when and why I built this fence.

Vibe Check №32

An unseasonable gloomy spring in Austin, TX. The kids are nearly done with school for the year and summer plans are shoring up. My son goes to middle school next year. Unbelievable.

We’ve battled some on-and-off sicknesses these past couple months and with all the holidays every week has felt like a false start. But here we are, barreling into summer. I’ve already been out on the lake to surf on my cousin’s boat, so I’ve got that going for me.

The Eclipse

In April my wife’s entire family came out from Arizona to Austin for the eclipse on April 8th. We got a big Vrbo near the lake right in the path of totality. The weather was cloudy and dismal in Austin for the eclipse. But then… ten minutes before full totality, the sky broke open.

I’ve seen partial eclipses before and those were cool. But nothing prepared me for seeing the total eclipse. The complete darkness. The confused birds. The sudden drop in temperature. The fully visible halo effect eminating from the sun. It’s other worldly to see the big space rock that goes around our planet move in front of the big fireball that keeps our planet alive.

Happy to get to celebrate something so cosmic with the family.

44 and there’s so much more

I turned 44 at the end of April and had an uneventful birthday. That’s how birthdays go after the big four-oh. I spent most of my day cleaning the house and watching anime. My family treated me to a “fancy dinner” at a place with cloth napkins and the kids behaved themselves through the whole meal.

The highlight of my birthday was exchanging texts with some old friends who have known me for decades. Old friends like that – even though you often live distant parallel busy lives – have the ability to tap into a deep well of friendship. For that I am thankful.

Making Games

I haven’t talked about it much, because I don’t want to jinx it, but I’ve been making some games in my spare time. And not one style of game either, a big swath of random ideas in different formats.

  • A “Guess Who?”-style game for Panic’s Playdate.
  • A one-page TTRPG. Almost everything is in place for this.
  • A 52-card deck game that I’m turning into a game for your mobile computer.

Making games has been a fun and different way to spend my time. I don’t have much to show for all that tinkering right this minute, but soon maybe?

Waiting for a life-changing email

You know that feeling when your boss emails you and asks “Hey, you got a minute?” and those minutes until you talk to your boss feels like hours as your amygdala floods your limbic system with intense, wet, hot anxiety? That’s more or less what I’ve been feeling for the last two months as I waited for a life-changing email. There were two emails actually. Then that got stressful. Then I had to wait on a package.

To be totally honest, all that waiting nearly broke me. I’m a decently patient person but a giant cloud LOOMING over me every day that I’m unable to control is distressing. Then your friends and family and kids ask you “Hey did that life-changing email come yet?” and you have to say “Nope, not yet” over and over.

But the email did come. And so did the package. And the giant cloud of concern is slowly dissipating. And on Monday I’ll embark on the next big phase of my adult life. Ominous, I know.

Stats and consumption

What you jackals come here for…

🧠 Learning

I took some time to do some deep dives both formally and informally.

  • TypeScript - Almost certain I’ll be using this sometime in the future, so I took a FrontendMasters course to connect all the pieces I had scattered about in my brain.
  • LLM Vector Embeddings - All this LLM search jazz is normal vector search but with special GPT-based embeddings instead of Postgres’s default embeddings. Way less threatening or opaque to me now that I understand it.
  • Solo RPGs - I got a bit obsessed with the idea of playing a TTRPG by yourself and it inspired me to make a game.

💪 Wellness

I’ve put on a bit of weight and that’s frustrating but I think again it’s stress-related.

  • Taking walks
  • Got a weighted vest for “rucking”
  • Rode my new bike once

📖 Reading

Reading is still on a book-a-week clip. This year I’m mulling around tech and ethics, as well as reading about people who created or harnessed a new technology. I also got back into comics and have read some wonderful pieces. If it’s sci-fi themed and has good art, I’m all-in.


  • Doom Guy: Life in First Person by John Romero - An autobiography about the man who created DOOM.
  • Of Boys and Men by Richard V. Reeves - The boys are not alright. A good look at the problems and struggles facing men.
  • Empire of Imagination by Michael Witwer - A well-written biography about Gary Gygax, creator of Dungeons & Dragons.
  • Excellent Advice for Living by Kevin Kelly - I’m a sucker for the “old man shares one-liner quips for living life better” genre. I’m also a big Kevin Kelly fan.
  • The Shame Machine by Cathy O’Neil - The follow up to Weapons of Math Destruction is an illuminating book about the negative impact social media has on our lives.
  • The Coming Wave by Mustafa Suleyman - The new CEO of AI at Microsoft, Mustafa Suleyman, has a history with AI and his work at Google’s Deep Mind which produced the AlphaGo AI. I thought this was going to be all “rah-rah” hypefest about AI, but instead I found it a pretty sober critique with a major theme around “containment” of this new technology.
  • The Hitchhiker’s Guide to the Galaxy by Douglas Adams by Douglas Adams - I as happy to finally read this classic piece of sci-fi. Suprisingly relevant to now… down to the whole idea that politicians like Zaphod Beeblebrox win their office by creating outrage.
  • Moon Man #1-2 by Kid Cudi - An amazing work of art. It’s just getting started, so hop on now!
  • Napalm Lullaby #1-2 - Siblings hellbent on taking down the religious authoritarian regime.
  • We Only Find Them When They’re Dead #4-5 - Having a tough time with how “jumpy” this series is but I picked up the next volume.
  • The Weatherman Vol. 1 - The first issue has an explosive hook and it never stops.
  • The Weatherman Vol. 2 - More of the same great sci-fi thriller.

In Progress

📝 Blogging

Slowed down a lot on blogging. That’s okay. I still have three dozen drafts but I’m being pretty choosy about where I toil. It’s easy for me to lose a weekend tinkering on a handful of posts, or piecing together a giant overly complex post like this. I need to stop doing that. Or I need to do that more often. Who knows.

FrontendMasters Boost (1 post)

This Blog (5 posts)

📺 Media



  • Unlocked: A Jail Experiment (Netflix) - What happens when you don’t make prisoners stay locked up in their cells 23 hours a day? And you let them have free phone calls? The experiment was nearly called off, but the men pulled together to make the best of their situation.



  • Sold a Story Ep10-11 - Follow up to the 2022 exposé on reading eduction and what’s changed.
  • The Adventure Zone Kills Dracula - This is the most surreal of all the series so far.
  • If Books Could Kill… - The recent episode on “Going Infinite” was awesome.
  • Bundyville S1: Bundyville - An investigation into the origin story of an anti-government right wing extremist group. One unexpected twist was though I do not support their beliefs at all, I sympathize how they were setup by the FBI agents… which is unfortunate because all these guys need is a match to start a fire.
  • Bundyville S2: The Remnant - The ripple effects of Cliven Bundy’s extremism.

🎙 Recording

A normal couple months of ShopTalk with some great guests.

🎲 GameDev

Mentioned above, I’ve been making some games.

  • Untitled TTRPG
  • Untitled Card Game
  • Untitled Playdate Game

🤖 Gunpla

three gundam models

A great couple months of Gunpla with some really stellar models.

  • RG Sazabi
  • HG Freedom Strike Rouge
  • MGSD Barbatos

For my birthday I got the Perfect Grade Unleashed RX-78-2 which is like the pinnacle of Gundam models. It’s $300 worth of plastic and I couldn’t be more excited to build it.

👨‍💻 Open source and web community

I hope to pick up again here and I have some projects behind the scenes, but not much to show at this point.

  • Presented “HTML with Superpowers” at Bleeding Edge ATX
  • CSS4 Community Group
  • Web Component Community Group (Open Styleable, Declarative Web Components)

I’m bad at setting calendar reminders for community group meeting times. I hope to be more involved going forward.

👾 Video games

  • Warzone, but probably need to quit for my mental health
  • Reinstalled Overwatch for a friend’s birthday
  • Uninstalled Gundam UC Engage for wasting too much of my time.

If you long for a web of yore were things were better, somehow: The thing is: none of this is gone. Nothing about the web has changed that prevents us from going back. If anything, it’s become a lot easier. We can return. Better, yet: we can restore the things we loved about the old web while incorporating […]

May 3, 2024, 4:16 pm >>

News bills: From bad to worse

I recently wrote an extensive analysis and criticism of a proposed California link tax, offering many alternatives. A state senator just proposed his own alternative — and it is even worse. Sen. Steve Glazer’s SB1327 would tax the collection of data for advertising by large platforms — onlyl those earning more than $2.5 billion in ad revenue — to support a […]

The post News bills: From bad to worse appeared first on BuzzMachine.

How to Fix: Windows WASD Keys Reversed with Arrow Keys

This past weekend I had the opportunity to be what every father wants, if only for a moment: the “cool dad”. My wife was out of town and my youngest son wanted to play PUBG. I caved in, taught him the basic FPS key binds, and he was having a great time. While he was […]

The post How to Fix: Windows WASD Keys Reversed with Arrow Keys appeared first on David Walsh Blog.

Strum Machine

I mostly play old time and bluegrass music. Particularly in old time and fiddle songs, the songs have a fairly rigid and repetitious structure. That’s not to say players don’t do interesting things with it, but unless a song is intentionally crooked, the structure of the song remains the same throughout. A typical structure is […]

Forbidden Links

Malcolm Coles: 10+ years ago I created an annual list of websites that FORBADE you from linking to them, DEMANDED you write to ask for permission or LIMITED links to only their home page. Royal Mail even promised to post me a paper licence. Now a decade has passed, let’s see who’s still doing it … And […]

Chris’ Corner: Design the Job

Y’all use Figma for design work? I’d be willing to bet a lot of you do at your organization. I’m still wrapping my brain around the fact that Adobe has to write a billion dollar check to not acquire it. It’s no wonder why they wanted it — there is a new household name in […]

Thoughts on Cosmotechnics

A fine post by Ethan Marcotte called The negotiation cycle led me to an incredible essay by Alan Jacobs called From Tech Critique to Ways of Living. It references an old idea called “The SCT1” which is new to me but based on thinking by the likes of Ursula Franklin and Neil Postman who I am familiar with. Neil Postman’s Technopoly2 –which I read in March– was one of the best books on technology I’ve ever read, so this is relevant for me.

Jacobs’ essay takes an unexpected yet welcome turn towards Daoism linking to a heavier essay by Yuk Hui called Cosmotechnics and Cosmopolitics. I’m not smart enough to fully understand all these philosophical (epistemological?) arguments3, but reading the word “cosmotechnics” felt like a beacon in the night for a concept I’ve intuitively felt but never had a word to describe. In Hui’s words:

Let me give you a preliminary definition of cosmotechnics: it is the unification of the cosmos and the moral through technical activities, whether craft-making or art-making.

I believe that science and technology are moral. Try as we may to divorce a tool from an outcome, there is always an interplay. As a contrived example, I can make a <Button/> component and it would by itself be morally neutral. But if I make a <Button/> that someone with a disability cannot use, then I have made a moral decision through either action or inaction. Similarly, I can make a <Button/> that puts a stuffed animal in a digital shopping cart, that is morally neutral. But if that stuffed animal is knowingly assembled with child labor and dropshipped from afar with an immense carbon cost relative to the value of the item, I have made an immoral <Button/>. It’s not hard for me to imagine that someone somewhere is making a <Button/> component that launches a nuclear missile…

In the words of Dr. King from his sermon The Three Evils of Society:

“When scientific power outruns moral power, we end up with guided missiles and misguided men.”
– Dr. Martin Luther King, Jr.

But if you believe technology is moral, then the next larger follow up question is “Whose morals?”

This question of “Whose morals?” permeates my thoughts, specifically in regards to global challenges like climate change. Call me unpatriotic, but I don’t think rugged American individualism is going to manifest destiny our way out of the climate crisis. A technological breakthrough seems unlikely. We need to rely on the knowledge and experiences of African, Asian, and Indigenous societies who have a different ontology, a different Dao (a code of behavior that is in harmony with the natural order); one that prioritizes the group over the individual. In less metaphysical terms, I believe we need to listen to societies built on cooperation and sharing of limited resources over societies built on the continuous expansion of dominion through exploitation of markets, labor, and people.

We need a new language of cosmopolitics to elaborate this new world order that goes beyond a single hegemon.4

I agree with Hui that a singular perspective cannot and will not solve the current crisis we are facing. Technology alone will not save us. We need scientific power in the hands of moral-powered men and women. And the longer we wait the more we risk erasing the communities and ancient knowledge we need to find an equitable solution.

Climate change, geopolitical conflict, the rise of authoritarianism brought about by social media companies… these are all large problems that take governments decades to solve. That puts cosmotechnics far away from me, a would-be practitioner. Hui thankfully provides a story from the Zhuangzi; the butcher Pao Ding.

Pao Ding is excellent at butchering cows. He claims that the key to being a good butcher doesn’t lie in mastering certain skills, but rather in comprehending the Dao. Replying to a question from Duke Wen Huei about the Dao of butchering cows, Pao Ding points out that having a good knife is not necessarily enough; it is more important to understand the Dao in the cow, so that one does not use the blade to cut through the bones and tendons, but rather to pass alongside them in order to enter into the gaps between them.

This is the kind of web development I like. It agrees with me. I better understand the Dao of web design. Our apps and websites are like water, flowing in and out of viewports. Contextualizing themselves to the recipient’s limitations or preferences. Those who find the easier paths through the gaps become excellent butchers of websites.

Pao Ding adds that a good butcher has to change his knife once a year because he cuts through tendons, while a bad butcher has to change his knife every month because he cuts through bones. Pao Ding, on the other hand—an excellent butcher—has not changed his knife in nineteen years, and it looks as if it has just been sharpened with a whetstone. Whenever Pao Ding encounters any difficulty, he slows down the knife and gropes for the right place to move further.

Another translation I read phrased the bad butcher as “hacking” through bones and what a serviceable metaphor we’ve found! The knife, a technology. The medium, a cow or software. Our tools will last longer if we learn how to slow down and understand the nature of the medium, the grain, rather than hacking against it.

The hustle and bustle of capitalism and keeping up with the zeitgeist makes this hard. There’s a pressure to keep up, lest you fall off the cliff of irrelevance. After all, technology always only advances and there’s always a better knife in the distance… right?

Over the years I’ve heard myself referred to as a “curmudgeon”, “old guard”, “gatekeeper”, and “dinosaur”. That is due in part to my loudmouthed punditry but also because I dislike a specific technology from an immoral company that does our industry, society, and users irreparable harm. Moving fast and rethinking best practices spawned untold lifetimes worth of human hours dedicated to knife swapping each year. And when tools dull, we throw stones at each other.

I’ve always been overly cautious and considered in the tools I use but I’ve never thought of the tools I use as a moral choice. Perhaps now I will. I’m not a Daoist by any means, but this idea of cosmotechnics begins to provide a mental framework for expressing the relationship between technology and morality. From the large scale of the cosmos to the small scale of the knife, I’m glad to have vocabulary to think about future problems.

  1. The Standard Critique of Technology: “We live in a technopoly, a society in which powerful technologies come to dominate the people they are supposed to serve, and reshape us in their image.”

  2. My library’s copy of Technoloply had a copyright date of 2012. A ten year old book being so relevant to me in 2024 was impressive. But that was the reprint date! The book was actually published almost twenty years before that in 1993 at the advent of the world wide web. I’m still astounded.

  3. Philosophy is a lot of invoking old thoughts to introduce or lend credibility to new thoughts. You need some level of familiarity with the entire corpus of materials to fully grasp the subject and that’s outside of my literary wheelhouse.

  4. One nuanced point I disagree with Hui on is on who should hold the leading power in this new cosmopolitical system. I fully agree we need to grow out of our single hegemony (America), but I’ve heard this “multipolar world’ philosophy echoed by Vladimir Putin before and I don’t believe we should cede moral authority over to authoritarian regimes that slaughter and demonize LGBTQ+ groups and ethnic minorities. We shouldn’t use new technology to reinstate old Cold War era superpowers of oppression. We need something entirely new. That said, I sit in a comfortable seat of privilege and systemic power well within the borders of the American Empire…

The Times is broken

It gives me no satisfaction to say this — indeed it fills me with trepidation for the nation — but The Times is broken.  I know some of you are thinking, “You only now realize this?” No, I’m only now saying it. I have been criticizing The Times for its willful credulity in the face of rising fascism and […]

The post The Times is broken appeared first on BuzzMachine.

Feedbin Email Newsletter… Emails

Feedbin has custom email addresses now so you can use a unique email address for each newsletter and not worry about a spam leak.

Ideas for my dream CMS

Matt Haughey wrote a blueprint for his “Dream CMS” and we had him on ShopTalk to talk about it. That got me thinking about what features I’d want in my dream CMS. It’s fun to think of what a modern CMS might have like inline editing, asset serving, monetization/membership functionality, and more imaginative comment moderation.

Most of my dream CMS features center around improving my writing and content surfacing. All these ideas seem like a pretty good fit for LLMs or AI, even though I don’t drink from that particular well often.

1. On-the-fly fact-checking

As I think more about verifying outputs, I’d love a feedback tool that did a quick fact check before I hit publish. Did I not cite a source? Did I make a false assertion that ruins the credibility of the whole post? Did I not consider some perspective I should have? Am I just bitching and moaning? CMS, help me, please! I’m making an idiot out of myself.

2. Auto-tagging

I write a lot of posts but I’m shit at tagging them. I wish I could tell my CMS “Hey, here’s a general list of topics I write about, please recommend tags before I hit publish.” Then I think it’d be cool if the little robot butler could crawl old posts suggest tags for those or find themes emanating from my subconscious that I hadn’t picked up on.

3. Topic bundling

À la auto-tagging, it would be neat if a CMS observed my content at a high-level and suggested opportunities to bundle posts of a similar theme into an online “zine” to offer new topic-based entry points for new readers. My lists of reverse chronological posts are thematically scattershot and I think some readers might find this more useful.

This idea gets into listicle territory pretty quick, but I often pull on thought threads over the course of months or years but that is entirely unsurfaced on my blog. I’d also love it if the machine could bundle links I share on my Mastodon feed to pull in other perspectives as well.

4. Idea validation

I’d love to know what content is outperforming other content. I’m sure I could piece this together myself with a half-dozen spreadsheets from Google Analytics, but I’d love to log into my CMS and know “Your CSS posts tend to have 10x engagement over your longform thoughtvomit” or “Your shitposts are driving traffic but are negatively impacting the quality of your site”. I don’t play the engagement game much but I’d love some data-driven validation nudging me in a positive direction when I’m discouraged, perhaps it could even suggest a handful of topics.

There’s a gross content farm machine version of this idea that identifies popular topics, suggests titles, an LLM writes posts based on those titles, and Dall-E plops an unsplashy image at the top… but that gives me the ick. At that point, you’re not blogging your thoughts or offering anyone any human value, you’re just clicking ✨ Sparkle Buttons.

For what it’s worth, baking these features into a CMS has little material benefit for me. This site is statically generated from markdown so it’s practically the opposite of a full-featured CMS. Or… perhaps it’s the perfect situation to start exploring some of these ideas.

Suckage begins here: why search engines now prioritize advertising over good UX

In the dying stages of innovation, companies at the top of the heap use their market power to maintain their high profits.

The post Suckage begins here: why search engines now prioritize advertising over good UX appeared first on Zeldman on Web and Interaction Design.

Megan Marie Myers

In Bend, you can’t miss the illustration work of Megan Marie Myers. It’s absolutely everywhere. There are murals. There are calendars for sale everywhere. Prints are hung up at coffeeshops, sometimes as whole exhibitions. She’s got books, stickers, hats, postcards, notecards, and heck, even neck gaiters. If her art wasn’t as charming and well done, […]

Chris’ Corner: Server Side Reconnaissance

If you tend to follow React stuff, you might know that React has a new thing called “Server Components”. Mayank has an excellent blog post about them. It starts out with calling out the nice things about them, and then fairly calls out all sorts of not-so-good things about them. Me, I think it’s all […]

On having no visual memory

I have aphantasia—no ability to create images in my mind, or to remember things in a visual way. For well over half of my life I lived under the assumption that suggestions to visualize things were entirely metaphorical, and also that I was incredibly stupid in certain ways, finding things that everyone else seemed to […]

This Web of Ours, Revisited

Why did leading designers in 2000 look down their nose at the web? And are things any better today?

The post This Web of Ours, Revisited appeared first on Zeldman on Web and Interaction Design.

Don’t bring venture capital to a knife fight

Why you can’t build another Apple with VC bucks.

The post Don’t bring venture capital to a knife fight appeared first on Zeldman on Web and Interaction Design.

Both Sides, No

Even when it’s ugly—especially when it’s ugly—journalists owe readers the truth.

The post Both Sides, No appeared first on Zeldman on Web and Interaction Design.

Newspapers can be jerks

In my paper on the California Journalism Preservation Act (CJPA), I examine the history of newspapers’ hostile reception of new technologies and competitors, reaching back a century to the dawn of radio. NiemanLab published excerpts from the paper on the flaws in the legislation and alternatives. I thought some might enjoy other sections, including this […]

The post Newspapers can be jerks appeared first on BuzzMachine.

Chris’ Corner: Things I Like

I like Melanie Sumner’s coining of the phrase Continuous Accessibility. To me, it’s like a play on the term Continuous Integration (CI) that is very pervasive. We build CI pipelines to lint our code, test our code, and test our code primarily, but all sorts of things can be done. We can test new code […]

HTML popover Attribute

Modals have been an important part of websites for two decades. Stacking contents and using fetch to accomplish tasks are a great way to improve UX on both desktop and mobile. Unfortunately most developers don’t know that the HTML and JavaScript specs have implemented a native modal system via the popover attribute — let’s check […]

The post HTML popover Attribute appeared first on David Walsh Blog.

For love of pixels

Stroll with us down memory lane as we celebrate the pearl anniversary of pixel art creation’s primary progenitor, and some of the many artists and design languages it inspired.

The post For love of pixels appeared first on Zeldman on Web and Interaction Design.

The native app install experience

At the end of each MSNBC YouTube video right now they have a 30 second post-roll of Ali Velshi explaining the 5-step process on how to install the new MSNBC app.

  1. Tap on the App Store on your phone
  2. Hit “Search” on the bottom right corner
  3. Type in “MSNBC”
  4. Click on the MSNBC app
  5. Click on “Get” or the cloud icon

There’s an implied sixth step where you need to actually open the newly installed app. Opening the app for the first time you swipe through a little slideshow that has two more (optional) steps: give your email and turn on notifications. Standard engagement economy tactics.

Hearing the 5-step native app install process a few times a day makes me think we lost something along the way. Remember when the call to action was to visit a URL? Not only is “Visit” more succinct, catchier, private, less prone to user error, and immune to competitive advertisements but it also doesn’t require a paid presenter to coach you through it. Once upon a time users might have needed Ali Velshi’s help getting to a website, but in my experience visiting a website is one of the first computing skills my kids learned without my direct involvement. The URL isn’t a foreign concept anymore.

I know I’m making a mountain out of a “We just want to promote our new app, maaan” molehill here, but even saying “Visit” with a redirect to their actual app download page would be easier. It boggles my mind why you’d push a clunky app store install flow over a five-letter domain name. I’d even bet $5 that the “native app” is actually a bunch of web views in a trench coat. In an even wilder twist, that app download page isn’t linked anywhere on the website! Ughck. I’m 0% invested on what’s happening over at MSNBC but I’m already getting whiffs of misaligned goals, interdepartmental strife, and poorly designed content management systems.

Anyways, websites. They’re old tech but still work great from time to time.

A weighted vest

Illustration of a large round man with a tiny vest in the middle of his chest

I bought a 40 pound weighted vest for $40 dollars on Amazon. The workout term for this is “rucking” and has connotations with being outdoorsy and/or in the military. Load up a backpack full of weights (or in my case, a vest full of sand bags) and head outdoors. The marketing benefits of rucking sound great:

  • It is simple and anyone can do it
  • Gets you outside
  • Active Resistance Training™️
  • Burns up to 3x more calories than walking
  • Good for your back and improves your posture
  • Good for your mental health

A neighbor friend of mine (that’s also a physical therapist) has one and she recommended it. My body is adept at carrying heavy objects1, so this seems like an easy way to squeeze out some gains from my regular walks. Bonus points that it gets me outside and gets rid of my developer hunch. After a handful of walks, I’m enjoying the vest and –as expected– my body handles the weight fine but it’s sweatier and hills knock the wind out of me a bit more.

There’s an army fetish around rucking. It’s hard to tell if that’s fragile male ego in workout culture or if it’s because an armored plate carrier is a well-tested and efficient way to carry weight. My vest doesn’t look that masculine and looks more like I duct taped C4 to my chest. With my uni-bomber glasses, long hair, beard, and resting scowl I don’t need more help looking like a disgruntled domestic terrorist but I suppose this completes the look. If I can sustain the $40 fix, then I’ll upgrade to the $200 plate vest solution.

The cynical side of me wonders if this is more skinny people shit. As I dawn the weighted vest, the irony is not lost on me I used to be about the same amount of weight heavier. Being heavy never helped me lose weight. No one gives you an approving head nod for walking while fat, but velcro a little vest to your torso and people give you the “good for you” pity eyes.

Putting my optimist hat back on, it might work this time. Maybe this is the one weird trick my body needs to activate dormant caveman genetics that will unleash my inner Adonis. Walking in hard mode seems sustainable for the time-being and I can already feel my ass morphing into a perfect badonkadonk.

  1. I cried during the Luisa’s song “Surface Pressure” in Encanto

Akismet means never having to say you’re sorry

The bots who shit in your sandbox are bigger, brassier, and better than ever!

The post Akismet means never having to say you’re sorry appeared first on Zeldman on Web and Interaction Design.

Chris’ Corner: Tricks With CSS

There are plenty of very legit reasons you’d want to have a scrolling element start out scrolled to the bottom, and stay scrolled to the bottom (as long as a user hasn’t scrolled back up). As ever, you could do this with JavaScript, as JavaScript can adjust scroll positions of elements. There is a way […]

The More Things Change… (or: What’s in a Job Title?)

I’m designing for the web. The infinitely flexible web.

The post The More Things Change… (or: What’s in a Job Title?) appeared first on Zeldman on Web and Interaction Design.

Chris’ Corner: Hard Things

Julia Evans has an extremely relatable and extremely charming talk in Making Hard Things Easy. Julia has a way of putting her finger on technology concepts that are notoriously difficult and making them easier to understand. She does this both by sharing her own tactics, like learning a reduced set of options or commands, as […]

Our Lady of Perpetual Profit

A business world with deeply misguided priorities—exemplified by horror stories from the worlds of tech, gaming, and entertainment—accounts for much worker unhappiness and customer frustration.

The post Our Lady of Perpetual Profit appeared first on Zeldman on Web and Interaction Design.


“You know those body builders with the big arms and skinny little legs? Your jaw is like that.”

My dentist is explaining this to me while both her hands are inside my mouth clenching the left and right sides of my jaw. She explains that my right jaw muscle is three times larger than the left. I glurk in agreement that the right side of my jaw does seem to be more problematic, it’s not uncommon for it to make a horrifying pop each morning. Her prescription: a mouthguard for clenching my teeth at night.

“I could sell you a $700 mouthguard that takes two weeks to fit but unless you know you’re going to be the kind of person that sleeps with a mouthguard, you should just buy one on Amazon first.”

I like my dentist’s office. It’s holistic in the sense they care for the whole mouth, not just the teeth bits. It could be my crappy insurance but they’re not concerned with upsells either. And I love the idea of prototyping with a low-fidelity solution first. So I followed their advice and got the Liquid Death of mouthguards and for ~$25 it’s been a pretty big life upgrade.

  1. No jaw pain when I wake up.
  2. No more snoring.
  3. Deeper sleep.
  4. Less getting up in the middle of the night.

All those benefits from sticking a little chunk of chewy plastic in my mouth every night. I assumed putting an obstruction in my mouth would have the opposite effect, make snoring louder or wake me up choking on my own saliva, but nope! I guess I am a mouthguard person. While this won’t cure my nighttime RBF, it will hopefully prevent some of the lopsided side effects.

AI in Reflection

There is so much to parse in this Times column inspired by a paper examining alleged political leanings of large language models. First, the myth of a “center” is imposed on the machine as it is on journalism. That is an impossibility, especially when extremists weigh down the equation & move “center” by gravity downhill, […]

The post AI in Reflection appeared first on BuzzMachine.

Get Started in AI and NFTs with the Limewire API (Sponsored)

AI media creation has expanded to incredible video art and a host of other important improvements, and LimeWire is leading the way in creating an awesome interface for the average user to become an AI artist. Limewire has just released its Developer API, a method for engineers like us to create dynamic AI art on […]

The post Get Started in AI and NFTs with the Limewire API (Sponsored) appeared first on David Walsh Blog.

The Valley of Hidden Sorrows

I have this friend. A mountain of unexpected medical debt buried his family at the start of last year. At the same time, the closing of his business stuck him with six figures of personal debt. Liquidating a retirement account and maxing out credit cards bought him short-term breathing room. Mostly, though, it added interest […]

The post The Valley of Hidden Sorrows appeared first on Zeldman on Web and Interaction Design.

Chris’ Corner: Real World CSS

I enjoyed Lee Robinson’s take on How I’m Writing CSS in 2024. Rather than jump right into tools and syntax, it starts with the user: Agreed! Number 3, and to some degree 4, are almost more in the JavaScript bucket than CSS, but it’s a good starter list. I’d add “The page styles shouldn’t interfere […]

AI Roundup: The Bad, the Ugly, and the Pretty Cool

Pieces of the web that make differing and complementary sense of the threat and promise of AI.

The post AI Roundup: The Bad, the Ugly, and the Pretty Cool appeared first on Zeldman on Web and Interaction Design.

Closing time

I started in September 2001. I was a young single mother with a background as a dancer, staggering out of the dotcom meltdown, with a tiny grant from The Prince’s Trust and a belief that my ability to sniff out and fix problems in code might just pay the bills. I didn’t know what […]

CAPTCHA excludes disabled web users

The W3C explains how CAPTCHA excludes disabled users, and suggests alternatives that may be kinder and more reliable.

The post CAPTCHA excludes disabled web users appeared first on Zeldman on Web and Interaction Design.

How do you verify that?

Hank Green posted a video about four lies he believed. It’s a great video because it’s embarrassing to be wrong on the internet and here is smart person™️ Hank Green admitting he believed some bullshit. As you travel through the internet you’re constantly working against a lot of personal biases, like confirmation bias or the overconfidence bias, and it’s easy to slip up. It’s (biologically) difficult to correct your understanding as new facts invalidate what you believed true.

One simple question I’ve started asking a lot is: “How do you verify that?”

I’ve seen some compelling demos where LLMs take a jumble of text and spit out compelling artifacts like an image, some b-roll, a spreadsheet, a website, or an entire daily news podcast. It’s incredible… until my buzzkill brain starts asking questions. Images are easy to verify: does image look correct or does it contain phantom limbs and have five rows of teeth? Text summary or expansion, also within possibility to verify. A website? I mean… I can tell you if it’s an okay website code-wise but I’m probably an outlier here. Validating the accuracy of a larger corpus of data that got summarized, keyworded, and categorized? Oof. This is where the scales tip for me because it seems improbable. Or at least time consuming. Perhaps as time consuming as it takes to do the work yourself?

To be fair to the robots (why would I ever say this?) I think it’s worth pointing the question at myself. I’ve been thinking about my “old world” method of verifying facts and determined I have the following routine.

  1. I consume a lot
  2. I experiment
  3. I ask experts

When I say “consume a lot”, I mean I read hundreds – sometimes thousands – of articles and watch hundreds of videos each week (cf. novelty seeking, information addiction) as well as my book habit. To make that theoretical knowledge more practical, I prototype and experiment to answer questions. With a basic understanding established, I often ask experts for their perspective. For web tech, that’s lots of open questions or DMs to people I know care about a specific technology. I’ll then sometimes have those people on my podcast to prod them some more.1

Like loose change and shells rattling inside a coffee can, I collect all those informational tidbits and filter them through my years of experience and how my brain works. That produces an outcome I’m generally satisfied with, informed yet potentially wrong. It’s not too different from an LLM where the outputs are only as good as their inputs.

My inputs are sometimes flawed. If Books Could Kill… is a podcast where the hosts do takedowns of my favorite books: self-help pop-psychology airport books. They do an incredible job at on-the-fly fact checking, reading criticisms, scrutinizing every assertion, asking “Hey wait, is that true?” on every page and have nearly ruined the entire genre for me. I assume you learn this brand of skepticism in journalism school and the trade-off is that you’ll never enjoy a book again in your life. But I need to remind myself the goal of a book isn’t to get to the last page, it’s to expand your thinking.

I wish I did better at this (so I don’t repeat falsehoods) but collecting factoids makes me feel smart and I like feeling smart so now they’re insulated inside a little blanket of my personal biases. Fact-checking in realtime doesn’t tickle the ol’ grey matter. It doesn’t have the same dopamine response.

One more story and I’ll let you go. In an effort to not be a total fucking grandpa all the time I’m trying to use AI more while keeping an open mind. It’s been… challenging. But the other day I needed a fact checked – something one of my investors mentioned during our YCombinator application process that was noodling around in my head – and a regular search didn’t return any results, so I tried a trending AI search tool that provides citations.

  • First it told me “Yes, this was true” but cited the wrong reasons.
  • So I hit it with an “Are you sure?” and it changed its answer to “No, it’s not true” but cited a random Hacker News comment that asserted the opposite.
  • So I said “Your source says the opposite” and it KFC doubledown’d and said “No, it’s not true.”
  • So I copy-pasted the text from their own source into the prompt and it said “Yes, this was true.”

That’s a… complex user journey. And it happens to me a lot. I wonder if this tech falls victim to its own compelling demos. The “Time to First Demo” is so short and often so profound, we fill in the possibilities with our own projections and science fiction. It’s harder to question the quality or veracity when our imaginations and our biases get wrapped up in the idea because it might mean questioning ourselves… which is not something humans are biologically engineered to do well.

Okay, this is the last bit I promise. There’s one line from that Hank Green video that stands out to me in this whole self-fact-checking debacle…

I was fine with having the [mis]information put into my head, but when I put it into someone else’s head, I felt a little weird about it so I went to check just in case.

That seems like a humane approach to sharing information. Be liberal in what you accept, fact-check on the way out. I hope I can get better at that.

  1. Asking experts isn’t limited to tech either, if I share an area of interest with someone and they recommend an album, movie, coffee, book, or menu item; I’ll take them up on it. I’ll implicitly trust them to guide my experience. In Japan this is omakase and it’s transcendent.