The Blogroll

My website has been gaslighting you

I have a confession to make. You probably sensed it, but weren’t able to articulate what was happening. Your loved ones think you’re losing your grasp on reality. For the last six months I’ve been incrementally changing the color scheme on my website every single day. I boiled you like a frog! Mu-wa-ha-ha. Don’t believe me? Try for yourself…

At the center of this CSS-trick is setting a --hue variable and rotating the hue about 1deg each day to make it 360º around the color wheel over the year. Because I like blue, I set the default --hue to 196 and add the current day’s --hue-rotate value to calculate my final --rotated-hue value.

--hue: 196;
--hue-rotate: <Floor ( CurrentDayOfYear * 365 / 360 )>; /* Math goes here */
--rotated-hue: calc(var(--hue) + var(--hue-rotate, 0)); /* Rotate it */

The math for the --hue-rotate isn’t that complex, but since CSS doesn’t have a Date() function, I set the initial --hue-rotate value inside my Liquid template when I generate the site with Jekyll.

{% assign yearProgress = 'now' | date: '%j' %}
<style>
  :root {
    --hue-rotate: {{ yearProgress | times: 360 | divided_by: 365 }};
  }
</style>

But I don’t post here every day, so I also update it with some JavaScript in the footer…

const dayOfYear = date => Math.floor(
  (date - new Date(date.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24)
);

const yearProgress = dayOfYear(new Date()) / 365;

document.documentElement.style.setProperty(
  '--hue-rotate', 
  Math.floor(yearProgress * 360)
);

Now my --rotated-hue value nudges itself every day starting from the base hue.

X-axis labelled “days of the year” and a y-axis labelled “hue”. The hue value starts in the middle of the y-axis and goes all the way up to the limit of 360 at half way through the year. Then it drops down vertically to zero and continues up at the same prior to the drop.

Background hue over time

I put --rotated-hue inside an hsl() and it worked okay, but was decidedly boring. I needed a way to make it more dynamic.

The next bit of magic was to use a slightly more complicated calc() function for the saturation value. Using some of the new CSS math functions, I take the cos() of the --rotated-hue to get a value between 1 and -1, then multiply that by 45% which is my “base saturation” for my light mode theme. That gives me a value between -45% and +45%, so I double it and add another 45% to avoid the gray zone of negative saturation.

:root {
  color-scheme: light dark;
  --hue: 196;
  --rotated-hue: calc(var(--starting-hue) + var(--hue-rotate, 0));
  --hue-rotate-deg: calc(var(--hue-rotate * 1deg)); /* Convert to degrees */
  --hue-rotate-cos: cos(var(--hue-rotate-deg)) /* Magic */
  
  --bg: hsl( 
      var(--rotated-hue)
      calc(45% * var(--hue-rotate-cos) + 45%) 
      96.5%
  );
}

That creates the following effect over time…

X-axis labelled days of the year and y-axis labelled saturation. An inverted parabola starts at 0.9 and dips down to zero in the middle of the year and then gently curves back up to 0.9

Background saturation over time

For my dark mode I wanted a darker website, so I lowered the base saturation to 25%

@media (prefers-color-scheme: dark) {
  :root {
    --bg: hsl( 
      var(--rotated-hue)
      calc(25% * var(--hue-rotate-cos) + 12.5%) 
      18.5%
    );
  }
}

Astute readers will notice I don’t add the full base saturation back to the value. This was intentional because as I slid the --hue value around I came across an ugly “background radiation” zone when --rotated-hue enters the green color space (h=75-115). For a month or two my site looked like dogshit. I minimized the undesired effect by letting it dip down into the gray in dark mode.

A shallower inverted parabola starts at 0.375 and dips down to -0.125 in the middle of the year and slopes back up.

Dark mode background saturation over time

As you can see in the chart above, lowering the base saturation creates a less dramatic wave function dipping below the 0% saturation. The resulting effect is that my light and dark mode now share the same --rotated-hue but have pretty different vibes. When I plot the two background saturations next to each other, you can see the relationship.

The previous two inverted parabolas layered on top of each other. The dark mode saturation curve sits below the light mode.

Light and dark mode background saturation over time

If someone asked me today “What color is your website?”, I sort of love the fact that I don’t know. In fact, I’d almost have to consult a chart on any given day…

The hue graph and hte background saturation curves overlayed on the same graph.

Hue, saturation, and lightness for light and dark mode over time.

Ah yeah. It makes perfect sense. It’s materialized color operating on the 49th vibration, you would make that conclusion walking down the street or going to the store.

Updating my accent color

The final step was improving my accent color. Finding a static color that had proper color contrast and worked well with every background color was difficult. I was hoping to find a shortcut but all roads led to making my accent color dynamic as well. How do I pick a color that works with every color? After some experiments, I leaned heavily on some third-grade art class color theory.

I found that rotating the --rotated-hue another 240º to get a triadic tone on the color wheel gave the accent color the best chance at standing out in both light and dark mode. You can see the relation to the background and accent hue when I plot them next to each other.

The previous background hue chart overlayed with the accent color hue that has the same curve but starts 120 points lower on the y-axis and follows the same zig zag diagonal pattern, but offset about 33%

Background and accent hue over time.

I decided to use oklch() instead of hsl() for my accent color because I wanted the vibrancy that can only come from the p3 color space.

--accent: oklch(
    75% 
    0.18
    calc(var(--rotated-hue) + 240) / 1
);

I tinkered with picking the color by hand so that I could try and maximize the number of days my accent color punches up into the p3 space.

Two color space representations next to each other. The first is the chroma value of 0.18 depicted by a rainbow gradient with red on left and violet on right but with a curving jagged peaks. A faint white line shows the boundary between rgb and p3 color space. Next is the hue of 196 representation but the slider has missing values where p3 is unable to render the color.

The oklch color graph from oklch.com for the accent color hue and chroma values

It’s more art than science here but I feel good about the results.

The accent color hue zig-zag graph with static chroma and lightness values forming horizontal lines near the bottom and top (respectively)

Accent Color (OKLCH)

Rotating colors is fun but not without its challenges

As far as challenges go, accessibility and proper color contrast is a concern. Contrast checkers don’t work the best with p3, but I’m sure that’s solvable. One challenge was my button text which I set in #FFFFFF in attempt to maximize contrast. It’s not perfect but it’s right more than its wrong. This is one place where Safari’s CSS color-contrast() would be welcome to have in all browsers.

I’ve also scoped my theme to two dynamic colors; adding more is difficult. I re-did my syntax highlighting theme and it’s doing okay (I used the other triadic tone), but more colors is more problems and the complexity balloons quick. Having some shades of gray in the style of Open Props would be helpful, so I may pursue that.

I’m happy with how it turned out but there’s plenty of room for improvement. I doubt I will ever stop obsessively tweaking the color formulas to get it juuuust right. One thing that bothers me now are the puke yellows in my accent color (like today’s) and the greens in the background color aren’t my favorite. I’m embracing the randomness, but I’d love a yellow like Piccalilli’s website. It might be possible to bump up the oklch() brightness in certain parts of the color journey, but requires more math.

It would also be awesome to figure out how to change colors over a custom gradient as opposed to the hue wheel. Could I use a step-frame animation but grab a point on a conic gradient? Hm…

Was it worth it? Did anyone notice? Yes, one person noticed. My coworker John is the only person who said anything. Good eye, John.

All said and done, I like my little rotating color scheme. It’s fun waking up and wondering what color my website is today. If you’re having fun with color on your website I’d love to see it. I want all the p3 inspiration I can get.

Chris’ Corner: HTML

HTML is fun to think about. The old classic battle of “HTML is a programming language” has surfaced in the pages of none other than WIRED magazine. I love this argument, not even for it’s merit, but for the absolutely certainty that you will get people coming out of the woodwork to tell you that […]

Elektra

I’ve been reading lots of modern takes on Greek classics. So when I saw that there was going to be a short of run of Sophocles’s Electra at Brighton’s Theatre Royal, I grabbed some tickets for the opening night.

With Brie Larson taking on the title role in this production, it’s bound to be popular.

I didn’t know anything about this staging of the play—other than it was using the Anne Carson translation—which is how I like it. I didn’t know if it was going to be modern, retro, classical or experimental.

It turned out to be kind of arty, but not in a good way. Arty like art school with all the clichés.

The production somehow managed to feel packed with gimmicks but also seriously underbaked at the same time. There must have a been a lot of “yes, and…”s during the workshopping, but no subsequent round of “no, but…”s. So we got lots of ideas thrown at the wall like spaghetti. Very few of them stuck.

Instead of enhancing the core text—which is, thankfully, indestructable—most of the gimmicks lessened it. It’s like they were afraid to let the play speak for itself and felt like they had to do stuff to it. Most of it ended up creating an emotional distance from the story and the characters.

It wasn’t bad, per se, but it definitely wasn’t good. It was distinctly mediocre.

Now, take all of this with a big pinch of salt because this is just my opinion. The very things that turned me off might tickle your fancy. Like the way it was half way to being a musical, with characters singing their dialogue in that monotone way that they do in Les Mis (but this is like Les really Mis). And the vocal effects that did nothing for me might be quite effective for you.

Even as I was watching it, I was thinking to myself, “Well, this isn’t really for me, but I can kind of appreciate that they’re trying to experiment.”

But then towards the end of the play, it went too far. Over the PA came samples of reporting of recent news stories; graphic, grisly, and crucially, real. If you’re going to attempt something like that, you need to earn it. Otherwise you’re just cheapening the real-world suffering. This play absolutely did not earn it.

Elektra has finished its run in Brighton and is now heading to London where it’s supposed to play until April. I’m curious to see how it goes.

How the #BrokenTimes covers the fascist oligarchy

Two days to go until the fascist oligarchy comes to power in the United States and this is how our once-greatest newspaper, The New York Times, is covering what could end in the fall of American democracy. To The Times, all the world’s Trump’s stage and they’re merely spectators. On the socials, I started to […]

The post How the #BrokenTimes covers the fascist oligarchy appeared first on BuzzMachine.

Changing

It always annoys me when a politician is accused of “flip-flopping” when they change their mind on something. Instead of admiring someone for being willing to re-examine previously-held beliefs, we lambast them. We admire conviction, even though that’s a trait that has been at the root of history’s worst attrocities.

When you look at the history of human progress, some of our greatest advances were made by people willing to question their beliefs. Prioritising data over opinion is what underpins the scientific method.

But I get it. It can be very uncomfortable to change your mind. There’s inevitably going to be some psychological resistance, a kind of inertia of opinion that favours the sunk cost of all the time you’ve spent believing something.

I was thinking back to times when I’ve changed my opinion on something after being confronted with new evidence.

In my younger days, I was staunchly anti-nuclear power. It didn’t help that in my younger days, nuclear power and nuclear weapons were conceptually linked in the public discourse. In the intervening years I’ve come to believe that nuclear power is far less destructive than fossil fuels. There are still a lot of issues—in terms of cost and time—which make nuclear less attractive than solar or wind, but I honestly can’t reconcile someone claiming to be an environmentalist while simultaneously opposing nuclear power. The data just doesn’t support that conclusion.

Similarly, I remember in the early 2000s being opposed to genetically-modified crops. But the more I looked into the facts, there was nothing—other than vibes—to bolster that opposition. And yet I know many people who’ve maintainted their opposition, often the same people who point to the scientific evidence when it comes to climate change. It’s a strange kind of cognitive dissonance that would allow for that kind of cherry-picking.

There are other situations where I’ve gone more in the other direction—initially positive, later negative. Google’s AMP project is one example. It sounded okay to me at first. But as I got into the details, its fundamental unfairness couldn’t be ignored.

I was fairly neutral on blockchains at first, at least from a technological perspective. There was even some initial promise of distributed data preservation. But over time my opinion went down, down, down.

Bitcoin, with its proof-of-work idiocy, is the poster-child of everything wrong with the reality of blockchains. The astoundingly wasteful energy consumption is just staggeringly pointless. Over time, any sufficiently wasteful project becomes indistinguishable from evil.

Speaking of energy usage…

My feelings about large language models have been dominated by two massive elephants in the room. One is the completely unethical way that the training data has been acquired (by ripping off the work of people who never gave their permission). The other is the profligate energy usage in not just training these models, but also running queries on the network.

My opinion on the provenance of the training data hasn’t changed. If anything, it’s hardened. I want us to fight back against this unethical harvesting by poisoning the well that the training data is drawing from.

But my opinion on the energy usage might just be swaying a little.

Michael Liebreich published an in-depth piece for Bloomberg last month called Generative AI – The Power and the Glory. He doesn’t sugar-coat the problems with current and future levels of power consumption for large language models, but he also doesn’t paint a completely bleak picture.

Effectively there’s a yet-to-decided battle between Koomey’s law and the Jevons paradox. Time will tell which way this will go.

The whole article is well worth a read. But what really gave me pause was a recent piece by Hannah Ritchie asking What’s the impact of artificial intelligence on energy demand?

When Hannah Ritchie speaks, I listen. And I’m well aware of the irony there. That’s classic argument from authority, when the whole point of Hannah Ritchie’s work is that it’s the data that matters.

In any case, she does an excellent job of putting my current worries into a historical context, as well as laying out some potential futures.

Don’t get me wrong, the energy demands of large language models are enormous and are only going to increase, but we may well see some compensatory efficiencies.

Personally, I’d just like to see these tools charge a fair price for their usage. Right now they’re being subsidised by venture capital. If people actually had to pay out of pocket for the energy used per query, we’d get a much better idea of how valuable these tools actually are to people.

Instead we’re seeing these tools being crammed into existing products regardless of whether anybody actually wants them (and in my anecdotal experience, most people resent this being forced on them).

Still, I thought it was worth making a note of how my opinion on the energy usage of large language models is open to change.

But I still won’t use one that’s been trained on other people’s work without their permission.

The Garden vs The River

Robin Rendle quoting Chris Armstrong: I have these two opposing thoughts: The difference, I suppose, is that a personal blog and a site designed to get people technical information, have different content strategy goals. There are tweener answers as well. Robb Knight has a thought: I like the idea of redirecting /now to the latest post tagged […]

Conference line-ups

When I was looking back at 2024, I mentioned that I didn’t give a single conference talk (though I did host three conferences—Patterns Day, CSS Day, and UX London).

I almost spoke at a conference though. I was all set to speak at an event in the Netherlands. But then the line-up was announced and I was kind of shocked at the lack of representation. The schedule was dominated by white dudes like me. There were just four women in a line-up of 30 speakers.

When I raised my concerns, I was told:

We did receive a lot of talks, but almost no women because there are almost no women in this kind of jobs.

Yikes! I withdrew my participation.

I wish I could say that it was one-off occurrence, but it just happened again.

I was looking forward to speaking at DevDays Europe. I’ve never been to Vilnius but I’ve heard it’s lovely.

Now, to be fair, I don’t think the line-up is finalised, but it’s not looking good.

Once again, I raised my concerns. I was told:

Unfortunately, we do not get a lot of applications from women and have to work with what we have.

Even though I knew I was just proving Brandolini’s law, I tried to point out the problems with that attitude (while also explaining that I’ve curated many confernce line-ups myself):

It’s not really conference curation if you rely purely on whoever happens to submit a proposal. Surely you must accept some responsibility for ensuring a good diverse line-up?

The response began with:

I agree that it’s important to address the lack of diversity.

…but then went on:

I just wanted to share that the developer field as a whole tends to be male-dominated, not just among speakers but also attendees.

At this point, I’m face-palming. I tried pointing out that there might just be a connection between the make-up of the attendees and the make-up of the speaker line-up. Heck, if I feel uncomfortable attending such a homogeneous conference, imagine what a woman developer would think!

Then they dropped the real clanger:

While we always aim for a diverse line-up, our main focus has been on ensuring high-quality presentations and providing the best experience for our audience.

Double-yikes! I tried to remain calm in my response. I asked them to stop and think about what they were implying. They’re literally setting up a dichotomy between having a diverse line-up and having a good line-up. Like it’s inconceivable you could have both. As though one must come at the expense of the other. Just think about the deeply embedded bias that would enable that kind of worldview.

Needless to say, I won’t be speaking at that event.

This is depressing. It feels like we’re backsliding to what conferences were like 15 years ago.

I can’t help but spot the commonalaties between the offending events. Both of them have multiple tracks. Both of them have a policy of not paying their speakers. Both of them seem to think that opening up a form for people to submit proposals counts as curation. It doesn’t.

Don’t get me wrong. Having a call for proposals is great …as long as it’s part of an overall curation strategy that actually values diversity.

You can submit a proposal to speak at FFconf, for example. But Remy doesn’t limit his options to what people submit. He puts a lot of work into creating a superb line-up that is always diverse, and always excellent.

By the way, you can also submit a proposal for UX London. I’ve had lots of submissions so far, but again, I’m not going to limit my pool of potential speakers to just the people who know about that application form. That would be a classic example of the streetlight effect:

The streetlight effect, or the drunkard’s search principle, is a type of observational bias that occurs when people only search for something where it is easiest to look.

It’s quite depressing to see this kind of minimal-viable conference curation result in such heavily skewed line-ups. Withdrawing from speaking at those events is literally the least I can do.

I’m with Karolina:

What I’m looking for: at least 40% of speakers have to be women speaking on the subject of their expertise instead of being invited to present for the sake of adjusting the conference quotas. I want to see people of colour too. In an ideal scenario, I’d like to see as many gender identities, ethnical backgrounds, ages and races as possible.

Nest Cams

First, we had the Nest thermostat. Gotta have that, right? The first thermostat in the history of time that feels well-designed. Works great. Pleasure to use and look at. Then we got the smoke alarm. Why not — seems nice. Then we got a free Nest Mini as a promotion when Miranda went Android for […]

Making "this" less annoying

Now that I have a job where I’m writing web components full time, I see the this keyword more than I ever have in my whole life. It’s not a problem, per se, but you can see how it’s a little repetitive. I started wondering what my options were to fix this minor annoyance and the ShopTalk Discord helped me find a simple way and an over-the-top way to fix my issue.

Simple way: Overriding VS Code theme color tokens

By default my Github Light theme makes this a bold dark blue color. I didn’t want to roll my own theme though to scratch this niche itch, so I dug in and found out you can override single tokens in VS Code. Handy. The documentation is a bit opaque but here’s what you need to do:

// settings.json
"editor.tokenColorCustomizations": {
  "textMateRules": [
    {
      "scope": "variable.language.this",
      "settings": {
        "foreground": "#b0b0b0"
      }
    }
  ]
},

Now my this looks like this…

the keyword this in code set in a light gray, almost illegible font color

It’s a calming sensation for me to have repetitive noise dimmed. I liked it so much I dimmed comments to match as well. I may even dim TypeScript because sometimes I wish I could hide the syntax, but keep the squiggles.

Over the top way: Replace this with a custom glyph

Changing colors is cool… but what if you could go one step further and replace this with an icon? What would an icon for this even look like?

I asked the ShopTalk Discord and got some interesting ideas like the “☝️” emoji, which I think is funny in an “I’m with stupid” t-shirt sort of way. Andrew Walpole took it to the next level and designed a custom glyph:

the letter of the word this arranged in a diamond pattern

Alan Smith then figured out how to use Glyphs Mini to add a custom ligature to an open source coding font. Andrew riffed on Alan’s work and exported a custom version of Fira Code with his custom glyph as a ligature. The last step was to install the font update my VS Code settings:

  "editor.fontFamily": "'Fira Code Ligged', monospace",
  "editor.fontLigatures": true

Now my code looks incredibly futuristic…

the this glyph replacing instances of the glyph keyword in code

Abusing typefaces to remove the repetitiveness of programming languages is fun. After seeing the icon in situ, the idea might be a smidge too wild for me due to reduced legibility. While I don’t use the custom glyph on the daily, this experiment does spark a deep desire in me to create a bunch of custom glyphs for common keywords so I can make JavaScript an entirely rune-based programming language.

Custom ligatures with CSS?

A wild idea, but it would be neat if you could create your own custom ligatures in CSS to avoid the need to re-bake custom fonts each time you have a niche typographic need. Here’s a pseudo-syntax of how that might work:

@font-face "Dave Hijinks" {
  match: "this.";
  replace: "☝️.";
}

@font-face "Cloud2Butts" {
  match: "cloud", "AI";
  replace: "butt", url(fart.svg);
}

body {
  font-face: "Dave Hijinks", "Cloud2Butt", sans-serif;
}

Anyways, it’s a thought. Not a serious proposal. This was a fun rabbit hole to travel down with some friends.

1,000 lbs

Rogue has a 1000LB Club. Find your cumulative total of a 1 Rep Max Bench/Squat/Deadlift in one hour I’m not particularly interested in actually doing it. You have to record a video with a bunch of rules and crap. But I heard about it years ago and the general challenge idea stuck in my head. […]

A long-awaited talk

Back in 2019 I had the amazing experience of going to CERN and being part of a team building an emulator of the first ever browser.

Remy was on the team too. He did the heavy lifting of actually making the thing work—quite an achievement in just five days!

Coming into this, I thought it was hugely ambitious to try to not only recreate the experience of using the first ever web browser (called WorldWideWeb, later Nexus), but to also try to document the historical context of the time. Now that it’s all done, I’m somewhat astounded that we managed to achieve both.

Remy and I were both keen to talk about the work, which is why we did a joint talk at Fronteers in Amsterdam that year. We’re both quite sceptical of talks given by duos; people think it means it’ll be half the work, when actually it’s twice the work. In the end we come up with a structure for the talk that we both liked:

Now, we could’ve just done everything chronologically, but that would mean I’d do the first half of the talk and Remy would do the second half. That didn’t appeal. And it sounded kind of boring. So then we come up with the idea of interweaving the two timelines.

That worked remarkably well.

You can watch the video of that talk in Amsterdam. You can also read the transcript.

After putting so much work into the talk, we were keen to give it again somewhere. We had the chance to do that in Nottingham in early March 2020. (cue ominous foreboding)

The folks from local Brighton meetup Async had also asked if we wanted to give the talk. We were booked in for May 2020. (ominous foreboding intensifies)

We all know what happened next. The Situation. Lockdown. No conferences. No meetups.

But technically the talk wasn’t cancelled. It was just postponed. And postponed. And postponed. Before you know it, five years have passed.

Part of the problem was that Async is usually on the first Thursday of the month and that’s when I host an Irish music session in Hove. I can’t miss that!

But finally the stars aligned and last week Remy and I finally did the Async talk. You can watch a video of it.

I really enjoyed giving the talk and the discussion that followed. There was a good buzz.

It also made me appreciate the work that we put into stucturing the talk. We’ve only given it a few times but with a five year gap between presentations, I can confidentally say that’s it’s a timeless topic.

Tech + Pace Layering

Steward Brand has talked about Pace Layering for a long time: Pace layers provide many-leveled corrective, stabilizing feedback throughout the system. It is in the contradictions between these layers that civilization finds its surest health. I propose six significant levels of pace and size in a robust and adaptable civilization With this example: The inner […]

25, 20, 15, 10, 5

I have a feeling that 2025 is going to be a year of reflection for me. It’s such a nice round number, 25. One quarter of a century.

That’s also how long myself and Jessica have been married. Our wedding anniversary was last week.

Top tip: if you get married in year ending with 00, you’ll always know how long ago it was. Just lop off the first 2000 years and there’s the number.

As well as being the year we got married (at a small ceremony in an army chapel in Arizona), 2000 was also the year we moved from Freiburg to Brighton. I never thought we’d still be here 25 years later.

2005 was twenty years ago. A lot of important events happened that year. I went to South by Southwest for the first time and met people who became lifelong friends (including some dear friends no longer with us).

I gave my first conference talk. We had the first ever web conference in the UK. And myself, Rich, and Andy founded Clearleft. You can expect plenty of reminiscence and reflection on the Clearleft blog over the course of this year.

2010 was fifteen years ago. That’s when Jessica and I moved into our current home. For the first time, we were paying off a mortgage instead of paying a landlord. But I can’t bring myself to consider us “homeowners” at that time. For me, we didn’t really become homeowners until we paid that mortgage off ten years later.

2015 was ten years ago. It was relatively uneventful in the best possible way.

2020 was five years ago. It was also yesterday. The Situation was surreal, scary and weird. But the people I love came through it intact, for which I’m very grateful.

Apart from all these anniversaries, I’m not anticipating any big milestones in 2025. I hope it will be an unremarkable year.

Short Life of Trouble

My fiddle player friend Darin sent me this documentary about GB Grayson, which I enjoyed: The documentary talks about how very few people even recognize the name despite all of recorded tunes essentially becoming standards in today’s folk/bluegrass/old-time world and having been covered by extraordinarily huge artists. That’s true for me! I absolutely had never […]

Exploring Hogwarts Puzzle

Over the holiday’s our family did the Exploring Hogwarts puzzle. It was just 500 pieces but took us like… a month? Of course, in the end, there was a missing piece that we absolutely could not find, confirming our conspiracy theories the entire time. It don’t know if that looks hard to you, but my […]

Check-in-the-Mail IRL Spam (Canada Dry)

I just got a big ol’ stack of USPS Priority Mail®️ marked as RETURN TO SENDER. It’s… malicious spam. Physical spam, I suppose. I didn’t send these, of course. But the return address is CodePen Headquarters, so it seems it was just a free way to get spam into our door. The evil schmucks drop […]

CSS Wish List 2025

Back in 2023, I belatedly jumped on the bandwagon of people posting their CSS wish lists for the coming year.  This year I’m doing all that again, less belatedly! (I didn’t do it last year because I couldn’t even.  Get it?) I started this post by looking at what I wished for a couple of […]

Starlink

I don’t actually have Starlink. I was just considering it for a hot second and figured I’d write down the thoughts. I was getting annoyed at our home internet service the other week and started looking into other options. In the end, I called our service provider (TDS) and they were like (1) your modem […]

M4

When the M1 MacBooks dropped, they looked amazing and I picked one up in 2021. It’s 2025 now, so it’s fairly typical of me to be upgrading. It felt a little unnecessary since my M1 was: extremely perfectly fine. It’s an excellent machine really and it will continue to be for it’s next owner for […]

January 7, 2025, 2:20 am M4 >>

Chris’ Corner: User Control

Like Miriam Suzanne says: You’re allowed to have preferences. Set your preferences. I like the idea of controlling my own experience when browsing and using the web. Bump up that default font size, you’re worth it. Here’s another version of control. If you publish a truncated RSS feed on your site, but the site itself […]

When haters deny HTML’s status as a programming language, they’re showing they don’t understand what a language really is. Language is not instructing an interlocutor what to do in a way that leaves no room for other interpretations; it is better and richer than that. Tim Carmody, HTML Is Actually a Programming Language. Fight Me […]

January 6, 2025, 6:34 pm >>

Recreate a Cool Shuffling Effect in Pure CSS

I was on Learn with Jason the other day! Jason and I go way back and it was a dang pleasure getting to hang out with him to chat and build a thing together. We made a light-DOM-y LitElement photo shuffle machine thingy. Mega high five to Toni Lijic where I swiped the whole idea […]

Media Diet

🎥 Get Duked. I liked the cute premise of these hard kids doing a challenging nature walk thing. It was a great little set of actors and it started strong. Then it just went off the rails, as they say. It tried to do too many things and make it feel like a mess and […]

2024

There goes 2024.

It was a year dominated by Ukraine and Gaza. Utterly horrific and unnecessary death courtesy of Putin and Netanyahu.

For me personally, 2024 was just fine. I was relatively healthy all year. The people I love were relatively healthy too. I don’t take that for granted.

Looking back on what I did and didn’t do during the year, here’s something interesting: I didn’t give a single conference talk. I spoke at a few events but as the host: Patterns Day, CSS Day, and UX London. That’s something I really enjoy and I think I’m pretty darn good at it too.

I was wondering why it was that I didn’t give a talk in 2024. Then Rachel said something:

I really miss An Event Apart.

That’s when I realised that An Event Apart would usually be the impetus behind preparing a conference talk. I’d lock myself away and spend ages crafting a presentation to match the calibre of that event. Then, once I had the talk prepared, I could give modified versions of it at other conferences.

With An Event Apart gone, I guess I just let the talk prep slide. Maybe that’ll continue into 2025 …although I’m kind of itching to give a talk on HTML web components.

In most years, speaking at conferences is what allows me to travel to interesting places. But even without being on the conference circuit I still travelled to lovely places in 2024. Turin, Belfast, Amsterdam, Freiburg, west Cork, Boston, Pittsburgh, Saint Augustine, Seville, Cáceres, Strasbourg, and Galway.

A lot of the travel was motivated by long-standing friendships. Exploring west Cork with Dan and Sue. Celebrating in Freiburg with Schorsch and Birgit. Visting Ethan and Liz in Boston. And playing music in Pittsburgh with Brad.

Frostapolooza was a high note:

I felt frickin’ great after being part of an incredible event filled with joy and love and some of the best music I’ve ever heard.

Being on sabattical for all of August was nice. It also meant that I had lots of annual leave to use up by the end of the year, so I ended up taking all of December off too. I enjoyed that.

I played a lot of music in 2024. I played in a couple of sessions for pretty much every week of the year. That’s got to be good for my mandolin playing. I even started bringing the tenor banjo out on occasion.

I ate lots of good food in 2024. Some of it was even food I made. I’ve been doing more and more cooking. I’ve still got a fairly limited range of dishes, but I’m enjoying the process of expanding my culinary repertoire a bit.

I read good books in 2024.

All in all, that’s a pretty nice way to spend a year: some travel, seeing some old friends, playing lots of music, reading books, and eating good food.

I hope for more of the same in 2025.

2024 in review

2024 went fast, and this post looks back at some of the things that featured in another far too busy year. Work Life at Google has not got any less challenging or busy during 2024, but I’m proud of the things my team and I have achieved. Everything that ends up on web.dev or developer.chrome.com […]

2024 in photos

Here’s one photo from each month in 2024

Thank you to @wienerlibrary@zwezo.o-k-i.net for last night’s screening of The Zone Of Interest with director Jonathan Glazer. Pasta Piedmontese Thank you so much to the wonderful speakers and team that made #PatternsDay3 so good! Wednesday session Strolling through the Black Forest. Listening to the brilliant Maggie Appleton at #UXlondon. Flyboys I’m sure my on-stage behaviour at Frostapalooza was total cringe, but I don’t care because I was having a great time! Cairo in Lawrence Of Arabia, Naboo in Attack Of The Clones, Minos’s palace in Kaos. Angels in the architecture Spent the morning rocking out with Salter Cane. Galway session

Public speaking in 2024

In the before times—before COVID, before I was a Google employee, before the seismic shift my life took in 2020 and 2021—I travelled for around half of the year, speaking at conferences and leading workshops. These days, I don’t do as much speaking, but I get to do some, and I’ve had some great opportunities […]

Words I wrote in 2024

People spent a lot of time and energy in 2024 talking about (and on) other people’s websites. Twitter. Bluesky. Mastodon. Even LinkedIn.

I observed it all with the dispassionate perspective of Dr. Manhattan on Mars. While I’m happy to see more people abondoning the cesspool that is Twitter, I’m not all that invested in either Mastodon or Bluesky. Or any other website, for that matter. I’m glad they’re there, but if they disappeared tomorrow, I’d carry on posting here on my own site.

I posted to my website over 850 times in 2024. sparkline

I shared over 350 links. sparkline

I posted over 400 notes. sparkline

I published just one article.

And I wrote almost 100 blog posts here in my journal this year. sparkline

Here are some cherry-picked highlights:

Books I read in 2024

I’ve been keeping track of the books I’m reading for about seven years now. I do that here on my own website, as well as on bookshop.org.

It has become something of a tradition for me to post an end-of-year summary of the books I’ve read in the previous twelve months. Maybe I should be posting my thoughts on each book right after I finish it instead. Then again, I quite like the act of thinking about a book again after letting it sit and stew for a while.

I should probably stop including stars with these little reviews. They’re fairly pointless—pretty much everything I read is right down the middle in the “good” category. But to recap, here’s how I allocate my scores:

  • One star means a book is meh.
  • Two stars means a book is perfectly fine.
  • Three stars means a book is a good—consider it recommended.
  • Four stars means a book is exceptional.
  • Five stars is pretty much unheard of.

No five-star books this year, but also no one-star books.

This year I read about 29 books. A bit of an increase on previous years, but the numbers can be deceptive—not every book is equal in length.

Fiction outnumbered non-fiction by quite a margin. I’m okay with that.

The Wager by David Grann

“A tale of shipwreck, mutiny and murder” is promised on the cover and this book delivers. What’s astonishing is that it’s a true story. If it were fiction it would be dismissed as too far-fetched. It’s well told, and it’s surely only a matter of time before an ambitious film-maker takes on its Rashomon-like narrative.

★★★☆☆

Bridge by Lauren Beukes

I think this might be Lauren’s best book since Zoo City. The many-worlds hypothesis has been mined to depletion in recent years but Bridge still manages to have a fresh take on it. The well-rounded characters ensure that you’re invested in the outcome.

★★★☆☆

The Penelopiad by Margaret Atwood

Part of my ongoing kick of reading retellings of Greek myths, this one focuses on a particularly cruel detail of Odysseus’s return.

★★★☆☆

Elektra by Jennifer Saint

Keeping with the Greek retellings, this was the year that I read most of Jennifer Saint’s books. All good stuff, though I must admit that in my memory it’s all starting to blend together with other books like Costanza Casati’s Clytemnestra.

★★★☆☆

Children Of Memory by Adrian Tchaikovsky

The final book in the trilogy, this doesn’t have the same wham-bam page-turning breathlessness as Children Of Time, but I have to say it’s really stuck with me. Whereas the previous books looked at the possibilities of biological intelligence (in spiders and octopuses), this one focuses inwards.

I don’t want to say anymore because I don’t want to spoil the culmination. I’ll just say that I think that by the end it posits a proposition that I don’t recall any other sci-fi work doing before.

Y’know what? Just because of how this one has lodged in my mind I’m going to give it an extra star.

★★★★☆

Stone Blind by Natalie Haynes

I think this is my favourite Natalie Haynes book so far. It also makes a great companion piece to another book I read later in the year…

★★★☆☆

The Great Hunger by Patrick Kavanagh

I picked up this little volume of poems when I was in Amsterdam—they go down surprisingly well with some strong beer and bitterballen. I was kind of blown away by how funny some of these vignettes were. There’s plenty of hardship too, but that’s the human condition for you.

★★★★☆

Europe In Autumn, Europe At Midnight, Europe In Winter, and Europe At Dawn by Dave Hutchinson

I read the Fractured Europe series throughout the year and thoroughly enjoyed it. I’ll readily admit that I didn’t always follow what was going on but that’s part of the appeal. The world-building is terrific. It’s an alternative version of a Brexity Europe that by the end of the first book starts to go in an unexpected direction. Jonathan Strange meets George Smiley.

★★★☆☆

The Odyssey by Homer translated by Robert Fagles

Seeing as I’m reading all the modern retellings, it’s only fair that I have the source material to hand. This is my coffee table book that I dip into sporadically. I’ve got a copy of the prequel too.

I am not going to assign stars to this.

Faith, Hope and Carnage by Nick Cave and Seán O’Hagan

Fairly navel-gazing stuff, and you get the impression that Nick Cave thinks so too. Just as Neil Young would rather talk about his model trains, Nick Cave would rather discuss his pottery. The music stands on its own, but this is still better than most books about music.

★★☆☆☆

Julia by Sandra Newman

Now this is an audacious move! Retelling 1984 from Julia’s perspective. Not only does it work, it also shines a light on some flaws in Orwell’s original (and I say that as someone who’s read everything Orwell ever wrote). I’m happy to say that the execution of this book matches its ambition.

★★★☆☆

Hamnet by Maggie O’Farrell

So if I’ve been reading alternative perspectives on Homer and Orwell, why not Shakespeare too? This is beautifully evocative and rich in detail. It’s also heartbreaking. A gorgeous work.

★★★★☆

Pandora’s Jar: Women in the Greek Myths by Natalie Haynes

I didn’t enjoy this as much as I enjoyed Natalie Hayne’s novels. It’s all good informative stuff, but it feels a bit like a collection of separate essays rather than a coherent piece.

★★☆☆☆

Best Of British Science Fiction 2023 edited by Donna Scott

I was lucky enough to get a pre-release copy of this from one of the authors. I love a good short story collection and this one is very good indeed.

★★★☆☆

Ithaca and House Of Odysseus by Claire North

Remember how I said that some of the Greek retellings started to blend together? Well, no fear of that with this terrific series. Like Margaret Atwood’s retelling, Penelope is the main character here. Each book is narrated by a different deity, and yet there is little to no supernatural intervention. I’m really looking forward to reading the third and final book in the series.

★★★☆☆

The Shadow Of Perseus by Claire Heywood

This is the one I was hinting at above that makes a great companion piece to Natalie Hayne’s Stone Blind. Two different—but equally sympathetic—takes on Medusa. This one is grittily earthbound—no gods here—and it’s a horrifying examination of toxic masculinity. And don’t expect any natural justice here.

★★★☆☆

Dogs Of War by Adrian Tchaikovsky

Adrian Tchaikovsky has a real knack for getting inside the animal mind. This story is smaller in scale than his Children Of Time series but it succeeds in telling its provocative tale snappily.

★★★☆☆

Reading 84K by Claire North

I described Dave Hutchinson’s Fractured Europe series as Brexity, but this Claire North’s book is one that pushes Tory austerity to its dystopian logical conclusion. It’s all-too believable, if maybe a little over-long. Grim’n’good.

★★★☆☆

Ariadne by Jennifer Saint

The first of Jennifer Saint’s books is also my favourite. There’s a fantasically vivid description of the arrival of Dionysus into the narrative.

★★★☆☆

The Female Man by Joanna Russ

I’ve been meaning to read this one for years, but in the end I didn’t end up finishing it. That’s no slight on the book; I just wasn’t in the right frame of mind for it. I’m actually kind of proud of myself for putting a book down—I’m usually stubbornly completionist, which is stupid because life is too short. I hope to return to this at some future time.

Atalanta by Jennifer Saint

Another vividly-written tale by Jennifer Saint, but maybe suffers from trying to cram in all the varied accounts of Atalanta’s deeds and trials—the character’s motivations are hard to reconcile at different points.

★★★☆☆

Polostan by Neal Stephenson

This was …fine. It’s the first in a series called Bomb Light. Maybe I’ll appreciate it more in its final context. As a standalone work, there’s not quite enough there to carry it (including the cutesiness of making a young Richard Feynman a side character).

★★☆☆☆

Tomorrow, and Tomorrow, and Tomorrow by Gabrielle Zevin

This too was …fine. I know some people really love this, and maybe that raised my expectations, but in the end it was a perfectly good if unremarkable novel.

★★★☆☆

The Fates by Rosie Garland

Pairs nicely with Jennifer Saint’s Atalanta. A decent yarn.

★★★☆☆

Earth Abides by George R. Stewart

I’ve just started this post-apocalyptic classic from 1949. Tune in next year to find out if I end up enjoying it.

Okay, so that was my reading for 2024. Nothing that completely blew me away but nothing that thoroughly disappointed me either. Plenty of good solid books. If I had to pick a favourite it would probably be Maggie Farrell’s Hamnet. And that Patrick Kavanagh collection of poems.

If you fancy going back in time, here are my previous round-ups:

Twenty Twenty-Four

For last year’s check-in, I foreshadowed a year of changes for ol’ Dave Rupert and boy was I not kidding. New job, new car, new pets. But before we get into all that – for accountability’s sake – let’s check in on my resolutions from last year and see how I did…

Final score: 50%-ish. That’s better than I expected. What did I do with the other 50% of my time if I wasn’t crushing it on my SMART goals? Let’s see…

A month-by-month recap

  • Jan-April - Unemployed, interviewing for jobs 👎
  • April - Saw the solar eclipse 👍
  • May - Went to South Dakota for my nephew’s graduation 👍
  • May - Started my new job at Microsoft 👍
  • July - Went to San Diego - first week 👍, second week whole family got sick 👎
  • Aug - Adopted two dogs 👍, they are a handful and I’m allergic 👎
  • Aug - Frostapalooza 👍
  • Sept - Wife had knee surgery 👎
  • Oct - Deleted my Twitter account 👍
  • Nov - Went to Redmond and met my coworkers IRL for the first time 👍
  • Nov - Bought a new car 👍
  • Nov - Moogs passed away 👎
  • Nov - Diagnosed with ADHD 👌

Finding a job dominated the first half of my year. After some ups and downs I ended up in a good place at Microsoft. There’s a lot of positives going from self-employment to the corporate world (hey! actual benefits! stocks even!) but also a lot of organizational bureaucracy that I’m not used to navigating. I’m happy with the work I’m doing and feel lucky to get to work on web components each day.

My wife and I’s trip to Pittsburgh for Frostapalooza was a big crescendo for the year. Months and months of practicing culminating in one big night. It’s hard to describe it other than some kind of nerd-flavored camp reunion but with guitars instead of computers. We had such a good time and the amount of music filling our house on a daily basis has increased ten-fold this year. For that I’m thankful.

I often judge years based on if we hit our health insurance deductible and we hit it again this year. A lot of medium grade background stress: job hunt stress, new job stress, healthcare stress, election stress, etc. Thankfully – and I could be basking in the limelight of a good Christmas holiday and a week off from work – I hardly remember that stress anymore. It feels like I’ve shedded those layers of anxiety.

Stats for 2024

With all the qualitative out of the way, let’s get more quantitative about what we did this year…

  • 52 books - Still in the book-a-week club. I’m comfortable here but need to mix it up. I’m becoming cynical when I hear the same ten facts and sociological studies regurgitated to meet some new popular science zeitgeist. Political biographies are all the same five liberal or conservative party tent poles supported by some personal anecdote. I think I’m going to lean hard into sci-fi “snacks” – short, easy books – for the next year while supplementing with beefier book recommendations from trusted peers.
  • 61 blog posts - Not a record but I’m happy with that number. Over a post a week is a good pace for me, doubly so if you consider that I fell off a blogging cliff since going corporate.
  • 9 gunpla - Way down from my 2023 peak.
  • 3 releases - Mundango, Pentablaster, and Hard Code & Soft Skills. My previous record was one, so this is stellar.
  • 49 episodes of ShopTalk - I love hanging out with my friend Chris.
  • 3 guest appearances - Bad @ CSS, Smashing Hour, and Changelog & Friends.

A pretty good year for me and it’d be great to maintain that pace next year. To be totally honest, my actual goal would be to do less next year. Sounds crazy, I know, numbers should only go up and to the right. But hear me out… what if they didn’t? Have we considered that option?

I didn’t play video games as much as I would have liked to this year, so I’ll need to remedy that. I’ve got a backlog brewing but I’m having a good time making games and that’s a time tradeoff I’m okay with. But from a “great writers read” perspective, I should play more games. Related, I had to quit late night gaming with the boys because it effected my sleep and stress levels, but I want to get back to that. AAA gaming is in a rough state though.

Hopes for 2025

There’s five focus areas I’d like to pursue next year and I already have traction on most of these feel achievable, But I’ve been wrong about that in the past.

Seize work opportunities - It’s been a great first 7 months at Microsoft but I have some big projects shipping in the next quarter so I need to shift out of my “learning the ropes” mode into a more melee combat ready position.

Hunker down and be creative - I’m not excited about the state of the union right now, so I’m going to trust my instinct to burrow. I’ve got some apps, games, and shitty sci-fi ideas that I’d be happy to work on instead of doomscrolling the news. I feel okay about pursuing those ideas rather than getting mired in political headlines.

Slow down to 1x mode - The ability to consume books, podcasts, and videos at 2x is a super power but I feel a nudge to take life slower. Slowing down would hopefully increase the time-cost and make me more discerning about what I choose to consume. The fact that I view listening at 1x as a challenge tells me I should probably pursue it.

Join a club - Inspired by the documentary Join or Die, I think I need to join a club and participate in IRL more. Clubs give me an opportunity to burst my personal/internet bubble and meet people who don’t share my background, income, or political beliefs. But I can’t even think of what I’d want to do. Perhaps something hobby-related? Join a lodge? Volunteer at a food bank? I feel woefully unprepared that I don’t even have the beginning of an answer here.

Understand myself - Beyond work and side projects, the biggest project I’ll be undertaking in 2025 is going to be… me. Since the Summer, I’ve been on a mission to understand myself at a clinical level. Last year I lost a lot of weight, more than half of it has come back without much change in diet. I want to know what’s in this mountain of flesh and bones and brains that God gave me. I want to begin to untangle the Gordian Knot of Anxiety, Weight, and ADHD. This has meant seeing a new doctor, getting blood work done, seeing a therapist, evaluating medication, and a whole lot more. I even made it a “Project” in Notion so I’d actually follow through on it. My ideal outcome is to come up with a plan to get through the next five, ten, fifteen, thirty years and beyond. In the immediate future an unexpected medical malady has presented itself and I’ll probably have to undergo surgery next year.

We’ll take a cup of kindness yet, for auld lang syne

I know some had an awful 2024. I’d say mine was hard but good over the long haul. 2025 seems primed to bring its own existential challenges and I hope you find shelter. Tech is still in shambles right now but I’m starting to see hints of the icy job market thawing, but I’m unsure if it will ever go back to “normal”. And politics… oof. We’re already seeing the outputs of the self-inflicted chaos machine. Keep in mind that chaos is the goal; chaos to exhaust and disarm us, to flood the zone with shit. So hold fast to your principles and conserve energy for the long haul. Keep your hand on the plow and keep your eyes on the prize. Hold on.

Valediction.

What a ride that was.

The post Valediction. appeared first on Jeffrey Zeldman Presents.

Vibe Check №36

Hottest October on record. November weather was much nicer, but lacked the much needed rain. We now pass the solstice and crash into the new year without so much as a sneeze from the gods of winter. My son’s team took second in the Fall baseball championship game. My daughter’s cheer team won their first competition gaining them a bid to nationals in the spring. Exciting times in Rupert family sports, I tell ya.

Three major holidays have passed since the last update so I’m sure it’s going to be too much to distill, but I’ve tried to blog through the bigger vibes like my cat passing away, my ADHD diagnosis, and releasing some games. So with those abstracted out, let’s reminisce on the recent past…

A trip to the mothership

The biggest event was my trip to Microsoft in November. It’s been nearly a decade since I’ve been to the Microsoft campus, but notably this is the first time I’ve met my new coworkers in person! I’m happy to report that my coworkers are all great people. Thankfully my small engineering team as well as the larger design organization is high functioning when it comes to hybrid/remote work, so I don’t feel left out of the on-premise centralized loop that I’ve felt in previous Microsoft engagements. My team made it easy to <slot> (!!!) in and feel welcome.

A printout of my avatar with a speech bubble that says I'm here with opinions

An example, my sweet coworkers hung up a print out of my avatar in one of the conference rooms with a little speech bubble that says “I‘m here with OPINIONS” which I find endearing. The side bonus is that Teams the app sees the avatar and thinks its a person and will zoom-in on it in every meeting. My avatar is an ever-present participant in a lot of meetings to the extent that five different people walked up to me said “Oh, it’s the guy from the conference room!” which is probably the biggest payoff to a long running gag that I’ve seen in my lifetime.

We spent most days strategizing in conference rooms but also did morale building events. One highlight for me was our studio’s tour of the Microsoft Inclusive Tech Lab where I got to talk with Dave Dame. I’ve been a fan of his for awhile now, he has a way of communicating the need to reject “other-ism” that sticks with you. He shared with us some of the challenges he faces as a person with limited mobility and how AI is impacting his life for the better. One night a group of us remote and local employees went out for dinner and ate grasshoppers. Another highlight was sneaking into a demo day event where designers at Edge were prototyping in the browser with web components. This grinch’s heart grew three times that day.

Everyone apologized for the rain while I was there but I loved the soggy weather coming from six months of Texas heat. I found it nothing but charming. Redmond has grown up considerably in the decade since my last visit, and the Microsoft campus is almost unrecognizable to me. Redmond used to be a bunch of small one or two story buildings but now it’s all enormous five story buildings. Redmond was wooing me pretty hard though I won’t lie; next to my hotel was an outdoor mall that had an izakaya, a games shop, a guitar center, and an upscale Hobbytown with Gunpla! It felt like my own personal Disneyland generated from my search history.

Spent a lot of time with work folks, but I caught up with a couple old friends while I was there. One night I met up with Kyle who was the other engineer at Luro who now works at Amazon. We were long overdue to celebrate in person together and close a chapter on the two years of intense sprinting we did together at Luro. Then I got to see Kelly and Charles who I worked with through multi-year engagements on microsoft.com, it’s great to know other people at such a big place like Microsoft. And one night I snuck over to Fremont for a memorable night of playing vintage and indie arcade and pinball games with Adam Argyle. It’s good to have good friends from the internet.

All said, I think the main purpose of my trip – firm handshakes and letting my coworkers know I’m a real person – was a success. Hopefully, I’ll find myself in Redmond more often.

Other major happenings

A speed run of other notable events but in the interest of time we’ll keep it brief:

  • In October I deleted my X account. I call it X because that’s it’s new name and it’s a stupid name for a stupid website. I put 14 years into that site and it’s surprising how easy deleting my account was. Over time logging in felt icky and the “heartbeat of the internet” parts have been co-opted by Russian bot farms. I don’t thrive on the self-created chaos Elon brings and I don’t want to support whatever flavor of white male supremacy is flourishing there. Bluer and calmer skies over on Bluesky and (my favorite) Mastodon.
  • Halloween was a hit. My block does it pretty big and we’re lucky to have hundreds of kids roaming on my street.
  • I only drive about 20 miles a week and I wanted those 20 miles to be fun, so we bought a Jeep. It’s a whole vibe to be honest. You can even make “Jeep” your entire personality if you want. I’m not there yet, but having fun exploring the space.
  • Thanksgiving was low key and bought the Whole Foods pre-made dinner for four. That made prep-day simple and no one got overwhelmed.
  • The last weekend in November our elderly cat Moogs passed away.
  • I got diagnosed with ADHD and started taking meds.
  • We stayed in town for Christmas and that was pretty wonderful. Mrs. Claus did a great job getting presents for the kids.

Recapping three whole months isn’t fun, but spinning off some of the major events into their own posts was pretty efficient so I should do that more.

The more quantifiable parts

🧠 Learning

I’m sure this list is incomplete, but went down some rabbit trails researching health issues like my ADHD but a couple non-health issues as well.

  • ADHD and the different medication options
  • Intermittent fasting and the effects of glucose spikes and insulin resistance.
  • Tone.js - In my side projects I got to play with Tone.js a bit and I love it.
  • Soviet Central Planning - I’m curious why soviet central planning failed. This overlaps with to Stalinist communism, World War II, Russian cosmonauts, and Kremlinology.

🚀 Releases

I got hellbent on releasing some projects this quarter and feel accomplished even if they are small in scope.

I wrote about my little games workshop more in depth if you’re curious about the why or my process. I’m also play testing a game with the ShopTalk Discord and am slowly iterating towards a release.

📖 Reading

Read a lot more than I expected. After multiple recommendations I finally started reading The Murderbot Diaries and holy cow, what a great series. Each book is like a little 150-page snack that I get to enjoy. It feels good to read (e-)paper books again too, not just audiobooks.

Finished

  • Humankind - Finished this book for the second and it’s as great as I remember. I probably need to buy a physical copy that I can highlight up.
  • It’s not you, it’s Capitalism - Marxist communism wrapped in a “You go girl!” blanket. Not for me but a good critique of the capitalist system is in there.
  • Lost in Austin - The history of Austin, as told by an Englishman, focusing on the rapid growth tech boom town era from the early 2000s to present. It’s an ever present fear that Austin is changing too much, but this book makes a good argument that what made Austin cool can’t live in the new upscale downtown and high rents.
  • All Systems Red, The Murderbot Diaries No.1 - A sassy and depressed robot built for murder finds a new life after it hacks its governor module.
  • The Psychology of Money - I thought this was going to be a book about understanding money from a psychological perspective; instead it was a book about how rich people abuse the system and it made me mad.
  • Artificial Condition, The Murderbot Diaries No.2 - Another great sassy robot read.
  • Play Nice - The rise, fall, and collapse of Activision/Blizzard. As someone who plays games by this company, I found it cathartic.
  • Thinking in Systems - I went in hoping for design system inspiration but got mad about the incoming Trump administration because it’s a lot about incentives and guardrails, which will soon flip upside down.
  • Koguchi Magazine #1 - A sci-fi kickstarter comic I backed… not my favorite.
  • Koguchi Magazine #2 - Issue #2 of the sci-fi kickstarter comic I backed… was a little bit better than the first.
  • Life in the Fasting Lane - A book on the benefits of intermittent fasting… not my favorite
  • Fair Play - A subject I care about, the inequality gap between men and women when factoring in all the “glue work” and homemaking tasks that (typically) women absorb as part of their duties… but the husband in this book is such a cringe asshole it’s hard to think a card game is going to solve their problems when what they need is marriage counseling. I don’t want to be in the middle of that relationship so I didn’t finish the book.
  • Glucose Revolution - Either this book is the holy grail to fixing all health problems in America… or it’s a book by someone who took a simple fact (glucose spikes aren’t great for your body) and extrapolated that to be the cause of all health problems ever. I think it’s the latter.
  • Rogue Protocol, The Murderbot Diaries No.3 - More sassy robot. Great.

Started

📝 Blogging

📺 Media Diet

Let’s take a look at what was on the ol’ boob tube.

Movies

  • Join or Die (2024) - Documentary about Robert Putnam’s life work analyzing civil decline. Warning: this will make you want to change your life a bit.
  • PLAY! (2024) - A classic Japanese sports team story but this time with kids from remote Shikoku forming a Rocket League eSports team. It’s not rated well on Letterboxd, but I enjoyed it. Caught this one on a plane.
  • Jingle All the Way (1996) - Rewatched this Christmas classic… and it’s super unhinged.
  • The Best Christmas Pagent Ever (2024) - A sweet Christmas story if you’re into the whole “true meaning of Christmas” message.

TV

  • Interior Chinatown (Hulu) - An all-star cast headed up by Jimmy O. Yang from Silicon Valley. Half procedural cop drama, half Truman show, it all comes together in a way that produces a wonderful commentary on seeing people and cultures that act like background characters behind the scenes.
  • Very Important People S2 (Dropout) - Vic Michelas is as it again.
  • Make Some Noise S3 (Dropout) - This show is really stepping into its own.
  • Ranma ½ (Netflix) - I wanted to see if it was as good as I remembered it… and I’d say yeah. Not for kids tho.
  • Skeleton Crew (Disney+) - This is Goonies in Space and I’ll take it. I haven’t been able to get into any of the extracurricular Star Wars shows but this one hits with me because I think it knows what it needs to be… a Star Wars story that can exist and play in that universe, but break away from the classic Star Wars tropes.

Podcasts

  • The Adventure Zone Abnimals - I don’t know about this one, but is growing on me.
  • Maintenance Phase - Re-listening to a lot of favorite episodes
  • If Books Could Kill - Such a fun look at popular culture through the lens of books. The “shitty person says something shitty” formula is getting tired but… nonetheless.

🎙 Recording

Recorded some great episodes of Shoptalk, chief among them was a live action role play episode of ShopTalk.

🤖 Gunpla and modelling

A teddy bear mech with a bow on its back that looks cute in one photo but angry in the next

Cooled off on Gunpla but have got the bug to pick it back up as work becomes less busy. Exhausted by the slower process of the master grade format, I decided to go back to high grade models to get the passion back.

  • MG Red Frame Astray - stalled
  • Beargguy III - completed
  • AK-47 Rubber band gun - my brother got me this wooden model of an AK-47 rubber band gun and I’m about half way done and it’s been pretty fun.

🌱 Digital Gardening (née Open Source)

Renaming this category because technically work is open source a bit and that’s confusing, so I thought I’d make it more about growing and maintaining web objects.

  • Tinkering on my website in subtle ways
  • Making little web components, per usual
  • Attended some Web Components Community Group meetings.

👾 Video games

Spent more time making games than playing games. My PC had a catastrophic BIOS update failure and the verdict’s still out but I might need to rebuild the whole thing.

  • Brawl Stars - this game is a treadmill I don’t need to be on.

Got an Anbernic RG35XX Plus pocket emulator for Christmas, so hopefully my vintage game plays list will grow.

My little games workshop

I always promised myself that if I was ever unemployed that I’d make a video game. When life dealt me an unpaid work hiatus though, the last thing I wanted to do was code in my spare time1. I worried I would have to let that dream, that part of me, die on the vine. But as interviews started going well the desire to try my hand at making a game came back. And in true adult ADHD fashion I didn’t focus on one game, but rather made a half-dozen different games in different formats and three of those games have made it to the release stage. Here’s an overview of those games and a little background on how I manage to make them.

Mundango, a bingo game about life’s small things

the bingo board ui for mundango

During my unpaid hiatus I found myself getting a lot of pleasure in the small things; seeing a cool bird, staring at trees, or watching animals be animal-like. To not lose sight of those moments and with a desire to replace my social media addiction, I made Mundango, a bingo game about noticing life’s small things.

The icon is a chill turtle because it invokes the feeling of going slow. The font is a playful little handwritten sans. And there’s a (Japan-inspired) minor pentatonic scale that plays as you check items off. I hope you enjoy it but more importantly I hope it nudges you (and myself) to stop doomscrolling on our phones so much and to start looking outside the windows a bit more often.

Hard Code & Soft Skills, a workplace adventure

A character creator tool for hard code soft skills

In January, the unemployment got to my head and I got inspired to make a role playing game called Hard Code & Soft Skills. It’s a workplace-themed2 clone of Lasers & Feelings, a one-pager by John Harper. The original game is loosely based on Star Trek, where you can use lasers or diplomacy to solve your problems. I wanted to flip that a bit and have the game world be a startup because tech needs to realize that soft skills are as valuable as code, so that’s my big social commentary.

It wasn’t labor intensive to clone the original game, but I put a lot of time into building a little one-page website with a character generator. It’s Astro and web components, if you’re curious. I also put a lot of mental energy in planning out the first episode of Hard Code & Soft Skills on Shop Talk. It went better than I could have imagined and what a thrill to get it out the door.

Pentablaster, an instrument with no wrong notes

the UI for pentablaster

The pentatonic scale sound effects in Mundango were a hit with some folks, so I dug in and built a whole instrument that only plays pentatonic scales and called it Pentablaster! It took about a week and I’m pleased with how it turned out. It’s jammy and a little unique. I extended it to allow you to change the key and to choose which pentatonic scale you want to play.

There’s some features I’d like to add, but worry it’ll enter the “so complicated I don’t want to work on it anymore” paradox. I’ll park it for now, but I learned a lot about Tone.js in the process.

An unreleased solitaire game

a skull with the text you died beneath it and a button that says reset game

I went on a short bender learning about Solo RPGs (like Ronin) and that sparked an interest in trying my hand at making one. I challenged myself to prototype the game on pen and paper first to prove the game mechanics. After an evening of brainstorming, I devised a game system based on a standard 52-card deck of playing cards as a prototype. I play-tested it with my son and we both thought that I should make a mobile app version. After some nights and weekends, I had a rough alpha prototype.

I play-tested the game with friends in the ShopTalk Discord and I got great, actionable feedback. They confirmed my suspicion that the RNG (randomness) was too high, creating a lack of decision making agency and thereby ruining the fun. I made some tweaks and the second round of play-tests went much better. It’s feeling pretty good now, but I think there’s one more ingredient needed to tie it all together before public release.

An unreleased Playdate game

Since acquiring a little yellow wind-up boi, it’s been a small dream to write a game for Playdate and I picked the idea that seemed like the easiest and most PlayDate’y and descoped the hell out of it so that I’d have an achievable goal. It’s an office-themed3 RPG type game.

After playing with Playdate’s web-based game editor Pulp and trying PulpScript, I felt the chafing of limitations and wanted to get closer to the metal. I watched every one of SquidGod’s Development Tutorials and decided to download the Playdate SDK and write the game in Lua. This is my first time writing Lua and it’s been interesting because everything in Lua is a table: Arrays are tables, Dictionaries are tables, Objects are tables… tables all the way down. That takes some “undoing” of prior programming best practices to feel comfortable but after awhile you learn to embrace the chaos and for-loopedness.

To short cut some of the player controllers and level building I picked Cotton, a Lua-based framework for Playdate. Cotton uses the LDtk map editor for easier map making and that was a feature I was looking forward to using. However, I encountered a bug somewhere between the framework and LDtk. If I updated the map, my player could no longer get to a different room. Insecurity started to set in:

  • Is this bug because I don’t know Lua?
  • Is this bug because I don’t understand LDtk?
  • Or is this a bug somewhere in Cotton?

Feedback from the Playdate Dev Discord was “Last commit is 2 years ago, project’s dead” and “Use [Framework X] instead”… 😮‍💨 Ugh. I thought only JavaScript dorks did this but apparently Lua dorks do it too. I understand they’re trying to be a version of helpful; but this is terrible advice for someone who is learning. “You need to start over” or in video game parlance “The Princess is in another castle” kills the dopamine rush needed when learning something new.

But I didn’t give up. And after many shower thoughts, I mustered up the energy to do some good ol’ fashioned debugging. The first step was step-by-step isolation where I manually diff’d thousands of lines of JSON line-by-line. That one step taught me there was a change in the exported JSON somewhere between the version of LDtk that Cotton used (v1.3) and the latest version of LDtk (v1.5.3). The primary key for joining map tiles no longer exists in v1.5.3. Then I followed the breadcrumb trail of how Cotton imports LDtk files and I fixed the bug by creating a new table (because Lua) to act as a join table for the neighboring map tiles.

I was able to finish my core game loop and I’m proud of that, but fixing a framework level bug cut the wind out of my sails. I may PR the bug fix… but it’s more of a patch job than a holistic fix and I’m unsure if the author of Cotton is even interested in supporting that on their abandoned project.

Will this game ever come out? I hope so, but it’s emotionally hard to pick up after fighting with it so much. If I buckled down, built some assets, and wrote more NPC dialog I bet I could finish it in a couple human weeks of work. Perhaps I could outsource the asset creation.

How the sausage gets made

I make my games after the kids and spouse go to bed or while the TV runs mindlessly. In some ways I’m borrowing from my own mental health staying up late tinkering with little apps that I’m going to give away for free. But these ideas all occupy brain RAM, so it feels good to chip away at ideas and get them out the door, to make room for more ideas, to chip away at ideas, to get them out the door… it’s a vicious cycle, but I think a net positive for my mental health.

To hedge against wasting my spare time, I get prototypes out for review as soon as possible to gauge interest and invest accordingly. Shopping prototypes curbs emotional over-investment in an idea. Time builds attachment to bad ideas, making them seem good and grander in your head than reality. If you build in secret too long, it ends in disappointment when the public doesn’t understand your genius you spent all your time on.

I default to web tech because it’s what I know best and staying in your wheelhouse means you can move faster with less mystery roadblocks (like the LDtk map issue above). But I’d like NOT WORK to not feel like work and see value in that, so this may change going forward.

At times I create artificial limitations (e.g., limit myself to a single asset pack) because if the scope is overly broad and infinite, that guarantees failure. Having rules, even if arbitrary, allows for play.

The last tool in the toolbelt is scoping the hell out of my ideas. When attention is your biggest limitation (e.g. ADHD) then keeping checkpoints small and achievable are critical. Then once you have the foundations established, do as much as time and ambition allow.

Unsure of what’s next… or how to book all of your free time from now until death with no promise of financial gain.

I have dozens of ideas kicking around in my head at all times, so my main issue is prioritization. Here’s the ideas that occupy a lot of brain RAM:

  • Finishing my son’s Zelda-like
  • An ambitious battle royale that would take a hundred developers a hundred years to finish
  • A platformer with a slime mechanic
  • A local multiplayer game that has a Mario Kart vibe, but isn’t a karting game.
  • A Solid Snake stealth game but for escaping awkward social situations
  • A horror game parody
  • Tim McGraw’s What-if? Trucks: Fates
  • A space shooter / medical sim
  • A Contra-like with a dumb twist

That’s a sampling of what’s going on up in the ol’ electric meatball. Not to be too macabre, but I’m not sure I have the lifespan left to get through even half of that short list. Hopefully there’s a banger billion dollar idea in there that allows me to retire and work on all the non-profitable dumb ideas.

While doing this for a living is far off and/or will never happen I am at least pleased that I lived up to the promise to myself to make games if I had spare time. I made games, smaller in scope than what I had originally imagined, but I’m comfortable with that given the timelines. No regrets there.

Risky as it may be, I may jump to a 3D engine because I’ve had a lot of fun building in environments like Unity in the past. That balloons the scope and raises the level of difficulty beyond my current expertise and it has never worked in the past… but perhaps this time it’ll be different! 😂

  1. I had some big work emotions and burnout to process

  2. I’ve already established that yes, I was processing some work emotions.

  3. Again, processing some work emotions over here.

CSS wants to be a system

I’ve realized something obvious again, this time about CSS; that CSS wants to be a system. At the core of CSS is a series of cascading rules and classes marrying and mingling in an elegant symphony of style application. Dozens and dozens of declarative instructions for painting pixels on the screen come together in under a millisecond. Sometimes it creates magic, other times it creates memes.

CSS is aweso-me

At its core, CSS wants to be a system and – besides its quirky selector power ranking algorithm – it doesn’t come with one out of the box. CSS wants you to build a system with it. It wants styles to build up, not flatten down. It even has layers as a feature! You can start small with a minimalist reset or satisfy your inner typenerd with a typographic default and build up from there. You can make your own reset. You can establish your own naming convention. You can decide to nest or not. You can use IDs. You can use only-classes. You can even dip a toe into the Shadow DOM if you crave the dark arts. Hell, I encourage you to use !important just to feel something.

Not everyone wants to conduct that symphony and I understand that. A nice thing about that CSS is that it’s sharable! Plenty of pre-built systems exist to let you offload that skill. Through the magic of copy-and-paste, you too can have high quality design! But don’t mistake a shortcut as the only valid option. We as humans and technologists like to compare objects and declare winners – to be kingmakers! – but it’s a mistake to shop at only one store and only eat meatballs despite the ubiquitous appeal of Scandinavian design.

CSS wants to be a system and it’s not an impossible task to make your own. Will there be mistakes and bad assumptions? Yeah. Will there be a junk.css file? Probably. Will you commit CSS crimes? Indubitably. Is CSS just thousands of key-value pairs with random collisions implemented in an uneven distribution among a handful of different browsers? It sure is, but I wouldn’t have it any other way.

In all my years of programming I have never loved a language more than CSS. There’s no other programming language that sparks my brain and lights up my imagination like CSS. Even after thirty years, there’s a rush of adrenaline when I see a complex design and I wonder “How am I going to make that happen?” which leads me to “And how am I going to make that happen on a phone and older browsers?” That’s the fun part of the job. And it’s good to know that there are other people out there who are great at CSS, people who can build up and tear down these systems with ease, people I can siphon knowledge from and build up my own skills when a new challenge arises.

So cheers to the CSS folks, the tinkerers. Your obsessive animations, pixel pushing, and system building – both delicate and strong – are fun to see and experience.

A progress update on reading-flow

There’s a First Public Working Draft of CSS Display 4, which includes the work on the new reading-flow property. The property aims to solve the issue where the source (and therefore tab) order of a page gets disconnected from layout when using CSS grid layout or flexbox. This is a problem I’ve been talking and […]

Every token is a feature

I’m in the middle of a design tokens project and I thought I’d share something I’m learning that is probably obvious to everyone else; every design token is a feature.

A token is a magical contract between design and engineering, if we agree to use the same name to abstractly refer to the same value, it will produce a desired outcome. That bridge alone is probably worth the investment, but tokens solve even more organizational problems. The mobile app and the website can look the same by sharing a single JSON file. But wait, there’s more! If the blue a different team chose is not blue enough for you, you can make your own blue and apply it at the global scope or the individual element scope. Tokens as an organizational feature are a powerful concept but there’s tons of nuance packed behind it.

Like features, too many tokens can bloat your system. I recently learned –because I’m lucky to work with people who work on browsers– there’s a not-so-theoretical limit where the browser starts taking a performance hit based purely on the number of CSS variables. There’s no hard upper limit on the number of variables (we drew a line at ~500) because the limit ultimately depends on the size and the depth of your DOM. Style recalcs and tree walking are expensive problems for a browser. Alias tokens like --foo: var(--bar) compound the problem and the more static you can be, like --foo: #bada55, the better. Infinite customizability and peak performance are often at odds.

Like features, too many tokens can create organizational problems! This is the opposite of what I said above, how can that be? It’s possible to generate enough tokens that they become their own hyperobject, impossible to comprehend from the outside, so well-meaning people eject from the system. Detached instances. One-offs. Snowflakes.

Like features, tokens can create little piles of technical debt. “Is anyone still using --color-beefcake-primary-2?” you shout into the void of the team chat. No one responds because no one knows. The person who does know left the company five months ago. Alas, we’ll bolt on more until we find time to fix it. Always adding. Never subtracting.

Like features, some tokens are going to have a massive payoff if implemented and some tokens the user benefit is less clear. You’re passing organizational complexity on to the user. Like features, you can build over-complicated machinery around a simple concept like sharing values. Like features, people will build every part without considering whether they actually need each facet.

Generally speaking, if someone wants to implement hundreds or thousands of little features in an application, that’s probably a red flag. If-statements are expensive over their lifetime. But from my experience, a good system of tokens inside a cascade of meaningful componentry can make a product resonate with consistency across many surfaces, while providing just enough customizability to differentiate when necessary.

Chris’ Corner: Element-ary, My Dear Developer

I coded a thingy the other day and I made it a web component because it occurred to me that was probably the correct approach. Not to mention they are on the mind a bit with the news of React 19 dropping with full support. My component is content-heavy HTML with a smidge of dynamic […]

Choosing a geocoding provider

Yesterday when I mentioned my paranoia of third-party dependencies on The Session, I said:

I’ve built in the option to switch between multiple geocoding providers. When one of them inevitably starts enshittifying their service, I can quickly move on to another. It’s like having a “go bag” for geocoding.

(Geocoding, by the way, is when you provide a human-readable address and get back latitude and longitude coordinates.)

My paranoia is well-founded. I’ve been using Google’s geocoding API, which is changing its pricing model from next March.

You wouldn’t know it from the breathlessly excited emails they’ve been sending about it, but this is not a good change for me. I don’t do that much geocoding on The Session—around 13,000 or 14,000 requests a month. With the new pricing model that’ll be around $15 to $20 a month. Currently I slip by under the radar with the free tier.

So it might be time for me to flip that switch in my code. But which geocoding provider should I use?

There are plenty of slop-like listicles out there enumerating the various providers, but they’re mostly just regurgitating the marketing blurbs from the provider websites. What I need is more like a test kitchen.

Here’s what I did…

I took a representative sample of six recent additions to the sessions section of thesession.org. These examples represent places in the USA, Ireland, England, Scotland, Northern Ireland, and Spain, so a reasonable spread.

For each one of those sessions, I’m taking:

  • the venue name,
  • the town name,
  • the area name, and
  • the country.

I’m deliberately not including the street address. Quite often people don’t bother including this information so I want to see how well the geocoding APIs cope without it.

I’ve scored the results on a simple scale of good, so-so, and just plain wrong.

  • A good result gets a score of one. This is when the result gives back an accurate street-level result.
  • A so-so result gets a score of zero. This when it’s got the right coordinates for the town, but no more than that.
  • A wrong result gets a score of minus one. This is when the result is like something from a large language model: very confident but untethered from reality, like claiming the address is in a completely different country. Being wrong is worse than being vague, hence the difference in scoring.

Then I tot up those results for an overall score for each provider.

When I tried my six examples with twelve different geocoding providers, these were the results:

Geocoding providers
Provider USA England Ireland Spain Scotland Northern Ireland Total
Google 1111117
Mapquest 1111117
Geoapify 0110103
Here 1101003
Mapbox 11011-13
Bing 1000001
Nominatim 0000-110
OpenCage -11000-1-1
Tom Tom -1-100-11-2
Positionstack 0-10-11-1-2
Locationiq -10-100-1-3
Map Maker -10-1-1-1-1-5

Some interesting results there. I was surprised by how crap Bing is. I was also expecting better results from Mapbox.

Most interesting for me, Mapquest is right up there with Google.

So now that I’ve got a good scoring system, my next question is around pricing. If Google and Mapquest are roughly comparable in terms of accuracy, how would the pricing work out for each of them?

Let’s say I make 15,000 API requests a month. Under Google’s new pricing plan, that works out at $25. Not bad.

But if I’ve understood Mapquest’s pricing correctly, I reckon I’ll just squeek in under the free tier.

Looks like I’m flipping the switch to Mapquest.

If you’re shopping around for geocoding providers, I hope this is useful to you. But I don’t think you should just look at my results; they’re very specific to my needs. Come up with your own representative sample of tests and try putting the providers through their paces with your data.

If, for some reason, you want to see the terrible PHP code I’m using for geocoding on The Session, here it is.

Intermittent fasting

A doctor told me to look into intermittent fasting. Not for weight loss, but for ADHD. There’s some new data that suggests a link between ADHD and insulin in the brain. Based on that science, intermittent fasting or a ketogenic diet –which can help improve insulin resistance– might help my brain. I’m a week into it and am seeing some weight loss, but it’s hard to tell with the ADHD without measuring my brainflorps per second. I might be more focused, but hunger and “hangry” bring their own distractions.

I’m skeptical, to say the least. Intermittent fasting makes frequent appearances in my YouTube shorts with balding Joe Rogan clones dressed in all black selling workout supplements. It has a whiff of being a cure-all. To counter that skepticism, I read a book called Life in the Fasting Lane co-authored by Dr Jason Fung, who was specifically recommended to me. It’s a mix of doctorly advice and testimonials from advocates who have had success with fasting. As scientific as the book tries to be, it undoes its own credibility pitching intermittent fasting with all the hallmarks of a fad elimination diet:

  • Lose weight in 30 days
  • Reduce cravings
  • Live longer
  • Reverse diseases
  • Helps you focus at work
  • Improves your sex life
  • Big pharma doesn’t want you to know about this one weird trick!
  • Used by ancient civilizations. Ugh. The appeal to history (ancient, therefore good!) is a major pet peeve of mine.
  • And my least favorite: It doesn’t cure cancer, but it cures obesity, which causes all different kinds of cancer… so we’re not gonna say it cures cancer because that’s a douchebag thing to say, but it doesn’t not cure cancer if you catch our drift (wink).

I do appreciate that the book calls out “Calories-In/Calories-Out” as a myth that works 1% of the time. But it’s hard to shake the feeling that eliminating meals or days worth of food isn’t a macro-version of calories-in/calories-out, where you measure calories in weeks instead of per meal. I suppose the key difference is the duration between meals allows my body to enter ketosis (read: a starving state) which will consume my excess fat stores instead of my morning breakfast tacos adding to those fat stores.

To be honest, I’m a good candidate for this fad diet. I can sustain myself on a couple meals a day. I could skip lunch most days. Skipping breakfast though is hard. Not putting creamer in my morning coffee is hard. Not having a little after dinner snack with the kids is hard. Not eating is not my favorite, but I’m going to trust the process for a bit and hopefully it’ll help a weary brain like mine.

Chris’ Corner: Hot Off The Digital Linotype Machine

Typography stuff! I can’t help it, it’s a part of me. I bookmark great looking new typefaces (according to me) when I see them released or are just seeing them for the first time. Here’s some! Roslindale I think they are kiping this slogan from Caslon and it’s awfully bold to do so. I’m cool […]

Domain harvesting and the Twitter long game in retrospect

Tricking people into seeing unexpected content and converting some of them into customers is a tale as old as the web. It was the perfect model for the takeover.

The post Domain harvesting and the Twitter long game in retrospect appeared first on Jeffrey Zeldman Presents.

I got the ADHD, too

This month I got my official diagnosis for Adult ADHD. It’s fun to share experiences with friends. While ADHD presents some new waters to navigate, it isn’t exactly news to me. Thanks to Dr. TikTok, I’ve suspected this outcome for a few years now. It’s nice to have a proper diagnosis though. If I’m struggling to focus or feeling overwhelmed, I know the probable root cause is how my brain processes dopamine and norepinephrine impacting my executive function.

There are different flavors of ADHD, so I can only describe my experience:

  • I crave “optimal stimulation” – 1 task = too little. 3-5 tasks = perfect, ideal. 6+ tasks = uh-oh, all the spinning plates come crashing down.
  • I experience periods of hyperfocus – I often will lock in on an interesting problem and work for hours and forget to eat.
  • Difficulty with tasks when overwhelmed – When overwhelmed (which is always, I have some generalized anxiety too), I’m unable to summon focus for even the smallest of tasks.
  • Sensitivity to messy environments – Related to optimal stimulation, cluttered and messy environments (a common ADHD issue) creates a feeling of overwhelm for me.
  • Sensory-seeking behaviors and fidgeting (classic restless leg syndrome)
  • I don’t have the hyperactive part of ADHD.
  • I’m pretty attentive and a good listener… until I’m not.

I’ve developed a lot of coping and masking strategies over the years that have allowed me to maintain a decent level of productivity. In my 20s I used to manage this by brute force and caffeine. But now that I’m in my 40s with a lot more responsibilities and spinning plates, I feel the reins slipping a bit. To help with this, I’m trying out a non-stimulant sNRI medication that tries to repair that norepinephrine processing. It takes a week or so to fully activate so it’s not an instant fix, and to be honest I don’t quite know what to expect. I’m excited to see if it makes a difference but even if it doesn’t I’m happy to be on a journey.

Anyways, cheers to unique brains.

The State of UX in 2025: A More Optimistic Perspective

Recent discussions about UX's future paint a gloomy picture, but the reality is more nuanced. Here's why there's still plenty of reason for optimism.

Of Books and Conferences Past

Of books and conferences past: A maker looks back on things well-made but no longer with us.

The post Of Books and Conferences Past appeared first on Jeffrey Zeldman Presents.

Chris Corner: Approaching CSS

We’ve been using Cascade Layers in our CSS here at CodePen quite a bit lately. A pretty clear non-complicated use case is that we tend to apply one class to stuff. That includes a “library” component. So imagine the prototypical Button, which would have a .button selector applying styling to it. But this library component […]

How to Join Blue Beanie Day: Wear and Share!

Saturday, 30 November 2024, marks the 17th annual Blue Beanie Day celebration. It’s hard to believe, but web standards fan Douglas Vos conceived of this holiday way back in ’07: The origin of the name of the holiday is the image of Jeffrey Zeldman on the cover of his book wearing a blue knit cap.[7][8][9] Over the […]

The post How to Join Blue Beanie Day: Wear and Share! appeared first on Jeffrey Zeldman Presents.

Lessons from Cats: Jasper’s Clever Cleanup Routine

My daughter and I have three cats—all rescues: There’s Snow White, our 16-year-old queen and my daughter’s consigliere, who, despite requiring thrice-a-week medication injections to keep her kidneys functioning, rules this place absolutely. There’s subtle Mango, whose first year of life involved struggling to survive—and avoid human contact—in a weedy vacant lot adjoining the United Nations […]

The post Lessons from Cats: Jasper’s Clever Cleanup Routine appeared first on Jeffrey Zeldman Presents.

Goodbye, Moogs

a tuxedo cat with green eyes looking away from the camera

The people who found you in the alley called you Cowboy. We called you Moogs, Moogers, Moogerton, Mr Moogs, Meesta, Two Meestas, Beef, Roast Beef, Roast Beefy Weefy, Kitty, Kitty cat, Long cat, Kitty kitty, Pretty kitty, and Meow meow. Those were all your names.

Today we had to say goodbye to our cat Moogs (pronounced “Moo” like the cow says + “gs”). He was nearly 19 years old, which is about all you can ask for from a great cat. A senior cat with a thyroid problem – so his passing is not an incredible surprise – but he took a sudden downturn over the weekend. He died in his sleep.

My wife adopted him before we were even dating in 2006. I never had a cat, was more of a dog person, and I made it my mission to befriend the cat to win her over. I succeeded in my goal and he let me hold him like a baby. Little did I know he would spend the next 18 years of my life with him sitting on my body for warmth and waking me up at six in the morning.

When we lived in LA he would perch majestically on the sills of the open windows basking in the warm sun’s rays because that’s how LA’s perfect weather works. He’d hop in-and-out of the house, hunting, cruising, and getting into tussles with the other alley cats. We paid a lot in vet bills but he had a good life jumping along the craftsman rooftops.

He didn’t enjoy moving to Austin, he howled the whole 1400 mile journey and when we got to Austin, he hid himself in the exposed soffit of our mid-remodel kitchen. After two weeks he came out and got used to the new home and got comfortable being an indoor-outdoor cat again. He’d spend days in our neighbor Cleo’s wisteria bushes hunting small birds. He was there when we adopted our dog Rudy and learned to hold his own against dogs. And he was there when we brought our babies home from the hospital and he learned to tolerate toddlers.

When we moved a second time to North Austin, he didn’t like that move either. He quit going outside as much and I think after that his quality of life started to decline. Three years ago, I noticed he was losing weight, felt like a skeleton with fur, and was extra ornery about food. The vet diagnosed him with hyperthyroidism and he needed to be on medication.

Moogs was sweet and friendly – well, as friendly as cats can be. When guests came over he would saunter into the room and find the person most allergic to cats and nuzzle them. He had an uncanny talent for that. He was social, but not. He would give an affectionate little headbutt whenever he wanted attention. He’d knead his claws into your thigh when you tried to watch television. And he’d prowl the house at night and wake you up with a butthole to the face. Cats, man. Cats.

Moogs was an incredible cat. My first and probably only cat, to be honest. I won’t miss his howls for breakfast each morning, but I will miss the soft brushes against my legs to say hello. He was a part of our family from the beginning, it will be different without him.

Chris’ Corner: Hurry Toward Maximum Language

Let’s talk HTML this week. The 2024 HTML Survey results are published, so that’s as good a reason as any. I’m a bit too daft to extract anything terribly interesting from the results themselves, but the survey itself acts as a sort of list of things we all might do well to at least be […]

A List Apart contributors list on Bluesky

I’ve started a Bluesky list featuring some of the brilliant writers, designers, coders, editors, and others who’ve contributed to A List Apart “for people who make websites.”

The post A List Apart contributors list on Bluesky appeared first on Jeffrey Zeldman Presents.

Understanding MARTI: A New Metadata Framework for AI

At its core, MARTI is a bridge. It harmonizes with existing metadata standards like the Content Authenticity Initiative, Anthropic’s Responsible Scaling Policy, and the W3C’s PROV. It anticipates the needs of future standards, laws and practices, such as those proposed by the Coalition for Networked Information (CNI), The EU Artificial Intelligence Act, and Making Data FAIR.—Carrie Bickner As I study Carrie […]

The post Understanding MARTI: A New Metadata Framework for AI appeared first on Jeffrey Zeldman Presents.

Chris’ Corner: Well Articulated Demos

I’m so envious of Paul Hebert’s Generating Random Mazes with JavaScript. Paul designed a random maze generator in some pretty easy to reason about JavaScript. It’s on CodePen, naturally. I’m envious because I love mazes. I’d draw them constantly as a kid. The square corner ones or weird wobbly organic ones or perfect circle ones. […]

Designing Experiences: Can We Really Design an Online Experience, and If So, How?

User experience designers often talk of designing experiences, but is that even possible? We we have that level of control? Well, it depends on your definition.

When is the right time to share our excitement about new web features?

When we share content about emerging web platform features, we have to be careful that we aren’t frustrating people with things they can’t use yet. However there is a place for talking about new things, and people who enjoy hearing about them. This post is about some of the ways I try to meet the […]

The Freelancers and Agency Owner’s Secret Weapon: Crafting a Game-Changing Agency Playbook

Discover how an agency playbook can transform your business, streamline operations, and boost client satisfaction.

Taking Control of Your Design Leadership Role: A Comprehensive Guide

Are you struggling to define your design leadership role? I've been there. In this guide, I'll share how you can align with organizational goals, overcome challenges, and lead with real impact.

Chris’ Corner: Our Eras Tour

Kristen’s classification of the four eras of JavaScript frameworks feels intuitively correct. A further simplification is essentially: 1. jQuery 2. Backbone 3. React 4. Next.js. Those were the big names from the eras and the similar technologies feel like obvious siblings. It’s easy to point at shortcomings, but overall I feel similarly positive: Overall, I […]

Veterans Day Remembrance

“The life of an amphibious sailor was estimated at three minutes in combat.”

The post Veterans Day Remembrance appeared first on Jeffrey Zeldman Presents.

It’s the racism, stupid

Every current and common explanation for the reelection of Donald Trump — whether inflation or immigration, culture wars or campaign tactics, blaming Harris or Biden or the party — elides its true and root cause: racism.  The United States is a deeply, fundamentally racist nation and unless and until we in white America admit and address that, our endless […]

The post It’s the racism, stupid appeared first on BuzzMachine.

How Fucked Are We? Very.

Nevermind every other theory or tactical complaint about what happened in this election. Kamala Harris did everything she possibly could to win. The fault is not hers.  The fault is in our nation. We must come to the realization that America is deeply racist and sexist, incapable of electing a Black, Asian woman to its […]

The post How Fucked Are We? Very. appeared first on BuzzMachine.

Web Design Inspiration

If you’re finding today a bit stressful for some reason, grab a respite by sinking into any of these web design inspiration websites.

The post Web Design Inspiration appeared first on Jeffrey Zeldman Presents.

Unlock Your Agency’s True Value: From Web Builder to Strategic Consultant

Tired of being seen as just another web designer? It's time to unlock your true value. Let's explore how to transform your agency into a strategic powerhouse.

Chris’ Corner: Lists

Sometimes a good ol’ list is what we need. I know, I know, this is forever true. But as my friend Dave is wont to say: eliminate nuance. The world doesn’t need nuance on if you should label your inputs by matching the for attribute of the label with the id of the input. You […]

Chris’ Corner: Interesting CSS Explanations

Let’s do CSS stuff this week. Why not — kinda my thing. Did you know Alvaro Montoro has a whole site of comics on the subject of CSS? There is a lot of satire in there, which I really enjoy. So they changed CSS nesting a bit. I heard that the usage of it was […]

I Remember, Part 1

Her voice, when she spoke to us from the doorway, was strange. I was in 3rd Grade. Our teacher went away for a few minutes, then came back, crying. She was a tough public school teacher of the old school, the kind my father’s friends would have called “an old bat.” She was not like […]

The post I Remember, Part 1 appeared first on Jeffrey Zeldman Presents.