2026-03-04 03:00:00
The other day I was looking at the team billing section of an AI product. They had a widget labeled “Usage leaderboard”.
For whatever reason, that phrase at that moment made me pause and reflect — and led me here to this post.
It’s an interesting label. You could argue the widget doesn’t even need a label. You can look at it and understood at a glance: “This is a list of people sorted by their AI usage, greatest to least.”
But it has that label.
It could have a different label.
Imagine, for a moment, different names for this widget — each one conjuring different meanings for its purpose and use:
Usage leaderboard implies more usage is better. Who doesn’t want to be at or near the top of a leaderboard at work? If you’re not on the leaderboard, what’s that mean for your standing in the company? You better get to work! Calling it a leaderboard imbues the idea of usage with meaning — more is better! All of that accomplished solely via a name.
Usage dashboard seems more neutral. It’s not implying that usage is good or bad. It just is, and this is where you can track it.
Usage wall of shame sounds terrible! Who wants to be on the wall of shame? That would incentivize people to not have lots of usage. Again, all through the name of the thing!
It’s worth noting that individuals and companies are incentivized to choose words designed to shape our thinking and behavior in their interest. The company who makes the widget from my example is incentivized to call this a “Usage leaderboard” because more usage by us means more $$$ for them.
I’m not saying that is why they chose that name. There may not be any malicious or greedy intent behind the naming. Jim’s law is a variation on Hanlon’s razor:
Don’t attribute to intent that which can be explained by thoughtlessness.
I do find it fascinating how little thought we often give to the words we use when they can have a such a profound impact on shaping our own psychology, perception, and behavior. I mean, how many “word experts” are on your internal teams?
Personally, I know I could do better at choosing my words more thoughtfully.
2026-03-02 03:00:00
For my future self, these are a few of my notes from this book.
A take from one historian on the Luddite movement:
If workmen disliked certain machines, it was because of the use that they were being put, not because they were machines or because they were new
Can’t help but think of AI.
I don’t worry about AI becoming AGI and subjugating humanity.
I worry that it’s put to use consolidating power and wealth into the hands of a few at the expense of many.
The Luddites smashed things:
to destroy, specifically, ‘machinery hurtful to commonality’ — machinery that tore at the social fabric, unduly benefitting a singly party at the expense of the rest of the community.
Those who deploy automation can use it to erode the leverage and earning power of others, to capture for themselves the former earnings of a worker.
It’s no wonder CEOs are all about their employees using AI: it gives them the leverage.
Respect for the natural rights of humans has been displaced in favor of the unnatural rights of property.
Richard Arkwright was an entrepreneur in England.
His “innovation” wasn’t the technology for spinning yarn he invented (“pieced together from the inventions of others” would be a better wording), but rather the system of modern factory work he created for putting his machines to work.
Arkwright’s “main difficulty”, according to early business theorist Andrew Ure, did not “lie so much in the invention of a proper mechanism for drawing out and twisting cotton into a continuous thread, as in […] training human beings to renounce their desultory habits of work and to identify themselves with the unvarying regularity of the complex automaton.” This was his legacy […] for all his innovation, the secret sauce in his groundbreaking success was labor exploitation.
Not much has changed (which is kind of the point of the book).
The model for success is:
As the author says:
[Impose discipline and rigidity on workers, and adapt] them to the rhythms of the machine and the dictates of capital — not the other way around.
2026-02-28 03:00:00
Dave Rupert articulated something in “Priority of idle hands” that’s been growing in my subconscious for years:
I had a small, intrusive realization the other day that computers and the internet are probably bad for me […] This is hard to accept because a lot of my work, hobbies, education, entertainment, news, communities, and curiosities are all on the internet. I love the internet, it’s a big part of who I am today
Hard same. I love computers and the internet. Always have. I feel lucky to have grown up in the late 90’s / early 00’s where I was exposed to the fascination, excitement, and imagination of PCs, the internet, and then “mobile”. What a time to make websites!
Simultaneously, I’ve seen how computers and the internet are a two-edged sword for me: I’ve cut out many great opportunities with them, but I’ve also cut myself a lot (and continue to).
Per Dave’s comments, I have this feeling somewhere inside of me that the internet and computers don’t necessarily align in support my own, personal perspective of what a life well lived is for me. My excitement and draw to them also often leave me with a feeling of “I took that too far.” I still haven’t figured out a completely healthy balance (but I’m also doing ok).
Dave comes up with a priority of constituencies to deal with his own realization. I like his. Might steal it. But I also think I need to adapt it, make it my own — but I don’t know what that looks like yet.
To be honest, I don't think I was ready to confront any of this but reading Dave’s blog forced it out of my subconscious and into the open, so now I gotta deal.
Thanks Dave.
2026-02-24 03:00:00
Over the years, I’ve used different icon sets on my blog. Right now I use Heroicons.
The recommended way to use them is to copy/paste the source from the website directly into your HTML. It’s a pretty straightforward process:
If you’re using React or Vue, there are also npm packages you can install so you can import the icons as components.
But I’m not using either of those frameworks, so I need the raw SVGs and there’s no npm i for those so I have to manually grab the ones I want.
In the past, my approach has been to copy the SVGs into individual files in my project, like:
src/
icons/
home.svg
about.svg
search.svg
Then I have a “component” for reading those icons from disk which I use in my template files to inline the SVGs in my HTML. For example:
// Some page template file
import { Icon } from './Icon.js'
const template = `<div>${Icon('search.svg')} Search</div>`
// Icon.js
import fs from 'fs'
import path from 'path'
const __dirname = /* Do the stuff to properly resolve the file path */;
export const Icon = (name) => fs.readFileSync(
path.join(__dirname, 'icons', name),
'utf8'
).toString();
It’s fine. It works. It’s a lot of node boilerplate to read files from disk.
But changing icons is a bit of a pain. I have to find new SVGs, overwrite my existing ones, re-commit them to source control, etc.
I suppose it would be nice if I could just npm i heroicons and get the raw SVGs installed into my node_modules folder and then I could read those. But that has its own set of trade-offs. For example:
search in one pack and magnifying-glass in another. So changing sets requires going through all your templates and updating references.npm i icon-pack might install hundreds or even thousands of icons I don’t need.So the project’s npm packages don’t provide the raw SVGs. The website does, but I want a more programatic way to easily grab the icons I want.
How can I do this?
I’m using Web Origami for my blog which makes it easy to map icons I use in my templates to Heroicons hosted on Github. It doesn’t require an npm install or a git submodule add. Here’s an snippet of my file:
{
home.svg: https://raw.githubusercontent.com/tailwindlabs/heroicons/refs/heads/master/optimized/24/outline/home.svg,
about.svg: https://raw.githubusercontent.com/tailwindlabs/heroicons/refs/heads/master/optimized/24/outline/question-mark-circle.svg,
search.svg: https://raw.githubusercontent.com/tailwindlabs/heroicons/refs/heads/master/optimized/24/outline/magnifying-glass.svg
}
As you can see, I name my icon (e.g. search) and then I point it to the SVG as hosted on Github via the Heroicons repo. Origami takes care of fetching the icons over the network and caching them in-memory.
Beautiful, isn’t it? It kind of reminds me of import maps where you can map a bare module specifier to a URL (and Deno’s semi-abandoned HTTP imports which were beautiful in their own right).
Origami makes file paths first-class citizens of the language — even “remote” file paths — so it’s very simple to create a single file that maps your icon names in a codebase to someone else’s icon names from a set, whether those are being installed on disk via npm or fetched over the internet.
To simplify my example earlier, I can have a file like icons.ori:
{
home.svg: https://example.com/path/to/home.svg
about.svg: https://example.com/path/to/information-circle.svg
search.svg: https://example.com/path/to/magnifying-glass.svg
}
Then I can reference those icons in my templates like this:
<div>${icons.ori/home.svg} Search</div>
Easy-peasy! And when I want to change icons, I simply update the entries in icons.ori to point somewhere else — at a remote or local path.
And if you really want to go the extra mile, you can use Origami’s caching feature:
Tree.cache(
{
home.svg: https://raw.github.com/path/to/home.svg
about.svg: https://raw.github.com/path/to/information-circle.svg
search.svg: https://raw.github.com/path/to/magnifying-glass.svg
},
Origami.projectRoot()/cache
)
Rather than just caching the files in memory, this will cache them to a local folder like this:
cache/
home.svg
about.svg
search.svg
Which is really cool because now when I run my site locally I have a folder of SVG files cached locally that I can look at and explore (useful for debugging, etc.)
This makes vendoring really easy if I want to put these in my project under source control. Just run the file once and boom, they’re on disk!
There’s something really appealing to me about this. I think it’s because it feels very “webby” — akin to the same reasons I liked HTTP imports in Deno. You declare your dependencies with URLs, then they’re fetched over the network and become available to the rest of your code. No package manager middleman introducing extra complexity like versioning, transitive dependencies, install bloat, etc.
What’s cool about Origami is that handling icons like this isn’t a “feature” of the language. It’s an outcome of the expressiveness of the language. In some frameworks, this kind of problem would require a special feature (that’s why you have special npm packages for implementations of Heroicons in frameworks like react and vue). But because of the way Origami is crafted as a tool, it sort of pushes you towards crafting solutions in the same manner as you would with web-based technologies (HTML/CSS/JS). It helps you speak “web platform” rather than some other abstraction on top of it. I like that.
2026-02-23 03:00:00
SITUATION: there are 14 competing AI labs.
“We can’t trust any of these people with super-intelligence. We need to build it ourselves to ensure it’s done right!"
“YEAH!”
SOON: there are 15 competing AI labs.
(See: xkcd on standards.)
The irony: “we’re the responsible ones” is each lab’s founding mythology as they spin out of each other.
2026-02-19 03:00:00
In this new AI world, “taste” is the thing everyone claims is the new supreme skill.
But I think “care” is the one I want to see in the products I buy.
Can you measure care?
Does scale drive out care?
If a product conversation is reduced to being arbitrated exclusively by numbers, is care lost?
The more I think about it, care seems antithetical to the reductive nature of quantification — “one death is a tragedy, one million is a statistic”.
Care considers useful, constructive systematic forces — rules, processes, etc. — but does not take them as law. Individual context and sensitivity are the primary considerations.
That’s why the professional answer to so many questions is: “it depends”.
“This is the law for everyone, everywhere, always” is not a system I want to live in.
Businesses exist to make money, so one would assume a business will always act in a way that maximizes the amount of money that can be made.
That’s where numbers take you. They let you measure who is gaining or losing the most quantifiable amount in any given transaction.
But there’s an unmeasurable, unquantifiable principle lurking behind all those numbers: it can be good for business to leave money on the table.
Why? Because you care. You are willing to provision room for something beyond just a quantity, a number, a dollar amount.
I don’t think numbers alone can bring you to care.
I mean, how silly is it to say:
“How much care did you put into the product this week?”
“Put me down for a 8 out of 10 this week.”