Name My Color is now framework free!

TL;DR: I rewrote Name My Color to use Web Components instead of React!

My anti-web framework kick continues; after using Web Components for the baseball triple crown tracker, I’ve been hoping to start rewriting older projects in a more Web-native way. (honestly, at least part of this is to avoid those annoying GitHub dependabot emails warning me about vulnerabilities in my dependencies!)

The project is fairly straightforward (just a few hundred lines of JS), but I didn’t think I could do this because of the color picker. then I remembered seeing there’s an <input type=”color”>, and it’s well supported!

Of course the flip side is that instead of using a React component that looks the same everywhere, you’re depending on how different browsers implement things, so you have to be OK with the fact that your design isn’t going to be pixel perfect. Firefox’s color picker is platform-specific (the Linux one seems especially basic), although a nicer HTML-based one is coming!

An annoyance was reimplementing the feature that to allow clicking on a color to show the hex color (in case you’re on mobile and can’t see the tooltip). The old version did this in a typical React-ish way, where the component has an expanded boolean in its state, and clicking on it toggles that and shows the color. It hit me that this was really just the same as <details> and <summary> elements, and then I wouldn’t have to track the state! Which was true, except I couldn’t find a way to hide the triangle that opens on Safari, as for some reason it doesn’t support the ::marker pseudo element. I tried some solutions that were supposed to work on Safari but I just couldn’t get it to work and eventually gave up and embraced the “not pixel perfect” lifestyle 🙂 Edit: I did figure this out a few days later!

As I’ve been trying to do with my personal projects, I didn’t use any LLMs in doing this…except for a few things. One was figuring out how to import ESM modules from a CDN (it’s weirder than you think!) because I did want to reuse some libraries for doing the color calculations instead of writing JS like this to convert RGB to CIELAB. Another was getting tests working – I sort of followed this guide, but didn’t really want to test any DOM stuff, so I made it a little simpler then got hopelessly lost and ended up with this spaghetti code. But look at the slick tests page!

Honestly I’m not totally sure why I wrote this originally – I think the basic idea was that you could take a picture of something and then get a name for a color? Although I guess this would require the EyeDropper API and also displaying a picture? But regardless it’s kinda fun to play with, and sometimes the kids will play with it for a few minutes, and that’s good enough for me!

And it is awfully satisfying to have a commit with net -28000 lines 🙂

Some people are really upset about LLM watermarking and I don’t get it

This week Anthropic announced that to comply with an EU AI Act they would watermark text generated by Claude models. A few tech bloggers I respect had strong negative reactions to this, and I wanted to walk through their objections and why I disagree.

Disclosure: I use LLMs for coding stuff at work (mostly Claude Code), and I do use a Claude version occasionally for tech questions at home. (mostly related to administering my Linux machine, which I have become increasingly bad at) I haven’t really used LLMs for coding my home projects apart from the occasional question, and I purposefully don’t use them to write.

Daring Fireball

John Gruber of Daring Fireball wrote Anthropic Posts ‘How Claude Marks AI-Generated Content’ Without Explaining How Claude Marks AI-Generated Content. Note that this post was written before Anthropic released more details about how the watermark actually works; basically when Claude makes a choice about what word to use, it will bias toward some statistical property (a very basic example would be “pick the word that has more ‘e’s”) that can later be detected.

So some of the post is talking about invisible characters, which we now know is not how it works. But Gruber also complains that:

  • If it’s doing this biasing then it’s not making optimal choices for what it outputs – I guess this is technically true, but LLMs can run with different temperatures already which means they won’t make the “most likely” choice. I am skeptical that you could realistically tell the difference between a response that is watermarked and one that is not.
  • What if you copy someone’s text and quote it in something you write? Then your writing will show up as Claude-generated! Yes, but a convincing counterargument is “try running the non-quoted parts through the detector”.
  • “They obviously need to explain exactly what they’re embedding in text if anyone is actually going to detect it, but if they explain it, anyone can simply remove it. Yup, this is why watermarking text is tricky 🙂 And the secret sauce is what statistical choices Claude biases towards, which will presumably not be released.

Rands in Repose

Rands wrote RIP Claude with the following complaints:

  • There’s no way to opt out – Yes, I think this is kinda the point of watermarking! If you can opt out then what would the point be?
  • Many actions, like summarization and critique, will add watermarks Again, I’m not sure what else one would expect. Maybe only generating text from a prompt could be watermarked, but that seems extremely subjective to me.
  • “My writing is my work, and Anthropic’s current strategy is aggressively writer-hostile. Maybe I don’t have the right perspective since I don’t use LLMs for writing, but it seems like Rands wants to be able to use Claude to help with their writing and not have it trigger the Claude detector. I think this is along the lines of this thoughtful Medium post about how there is good writing that uses AI and bad writing that does not use AI. And I guess I can understand if Rands thinks people are going to use the Claude detector alone to determine whether the writing is good or bad. But I think this is still better than the status quo (more below)

My thoughts

Both of these articles seemed much angrier than I would have expected. (they also seem focused specifically at Anthropic instead of the EU law that Anthropic is complying with, which makes me think that OpenAI is going to have to do something similar)

I think it is generally useful to have a tool that can tell you whether words were generated by Claude or not, especially compared with the AI detecting “tools” we have today that are not reliable.

I guess in theory I’m a tiny bit worried that this will be used to stigmatize tiny bits of Claude-written stuff that thoughtful people use sparingly. But I think there’s so much LLM generated slop out there that it will be more useful than harmful.

The Score: How to Stop Playing Somebody Else’s Game (sort of) review

The Score: How to Stop Playing Somebody Else's GameThe Score: How to Stop Playing Somebody Else’s Game by C. Thi Nguyen




(no rating because I didn’t actually finish the book; thanks Goodread’s new Did Not Finish shelf!)

Man, I tried to get into this book, but every time I tried I just could not do it – after a month I wasn’t even up to 30%! The book has interesting ideas but it just seemed so repetitive.

Nguyen’s main idea is that it’s very easy to fall subject to “value capture” – when you start being guided by external metrics instead of your own, like a restaurant that stops caring about making good food and starts caring about maximizing its ratings. “Making good food” is a hard thing to measure, and “average rating” is much much easier, so over time it’s easy to focus on the latter and deemphasize the former.

Another interesting bit was about games. We like to play games, but most of the time winning or losing doesn’t matter that much to us. But in most cases you have to try to win to enjoy the game; apparently this is called a “self-effacing end”, which is an end (in this case, enjoyment) that can’t be pursued directly.


View all my reviews

New project: Baseball Triple Crown leaderboard!

Check it out!

Yordan Alvarez of the Astros is making a run at the baseball Triple Crown (leading their league in home runs, RBIs, and batting average), which hasn’t been done since 2012! I wasn’t able to find a quick view of the leaders, so I coded this up over a few evenings.

The tech stack is fairly boring: first, there’s a Python script that uses the package MLB-StatsAPI to gather the data and write it to disk. This script is nice and short, although the league_leader_data() entry point I’m using has a lot of parameters that took some experimenting to find the right ones. (and the cron script to update this every morning is, as always, flaky; hopefully it works tomorrow!)

The frontend just has to fetch those JSON files and show the tables. As I’m on a bit of an anti-framework kick and it seemed like this was going to be very simple, I just used Web Components and my previous learnings to write some pretty simple Javascript code. And let me tell you, being able to change a file and reload the page and have everything update is so nice! I know about dev servers for React and whatnot, but those are always a bit tricky to run from my Windows machine. Admittedly if there were any interactivity this could have gotten complicated fast; for a little project like this it was perfect.

I also didn’t use any LLMs to help me code (or, as always, write this post): surely it would have gone faster if I had, but it felt right given the very lightweight nature of the project, and it also helps me learn more as I go.

And that’s pretty much it! It would be kinda neat to view the leaders over time (sorta like the division race charts), but then the Python script would have been more complex and the frontend would need some kinda slider or something and honestly I just didn’t feel like it. Work and life have been pretty busy this year, so I was happy to scope this down to something simple but useful, and I got the added bonus of proving that I can still work on silly little projects and ship them!