Sprinter Van Phone Mount + Better CarPlay-Compatible Cable Situation
This is the stock look of my 2021 Sprinter van front console area: If it’s not obvious, there’s no great place for a phone. You’ve got the cup holders. Those are actually sorta workable, except for this boss battle: wired-only CarPlay. Wired CarPlay is not ideal, but that’s all this van has. I expect upgrading […]
From: Chris Coyier
The New Van
I got something I’ve wanted for years and years! A camper van! I’m a camper van guy now! It’s a Mercedes-Benz Sprinter, and even more technically a Winnebago Revel. I scoured Craigslist, Facebook Marketplace, and RV-specific sites for a long time drooling over these things. I’ve rented a half dozen of them on Ourdoorsy over […]
From: Zeldman
Remembrance of zeldman.coms past
Look back in anchor tags: a partial review of my site’s 31-year visual history before diving into the new design.
I've spent years selling quick wins to clients. But, I've started to wonder if I've been quietly part of the problem.
From: Codepen
Chris’ Corner: A11Y
I’ve got a couple of accessibility related articles I thought I’d share this week. I’ve specifically picked them out as examples of well-done accessibility writing. For each, I’ve plucked out a bit I found particularly interesting. But you, you should read the whole thing.
From: Adactio
25 years of The Session
The Session existed in a very basic form since the late 1990s. It was just me posting a different tune every week.
But The Session as it is today—a community website where everyone can add tunes—first went online on June 3rd, 2001. That’s 25 years ago today.
Considering the typical lifespan of a web page, I’m proud of having a website still online and thriving a quarter of a century after launching it.
At this point it’s fair to say that thesession.org is my life’s work. Though, really, I’m just the curator; the site would literally be nothing without all the contributions that people have made to it.
It’s been a great 25 years so far, and I’m looking forward to the next 25.
From: Codepen
427: Next.js and The Journey of SSR
Having that first response from the server to users browsers be, ya know, full of good, useful, renderable HTML is certainly better than an empty <div id="app">. You can feel it and see it in the filmstrip view of the site loading. Not to mention you need it for at least things like <meta> tags […]
From: Chris Coyier
Social RSS (?)
What’s up with this? The spirit, of course, is “I want my Google Reader back.” I should be careful though: I imagine if we really did have it back exactly as it was, it would probably not be as cool as we remember. That was a long-ass time ago and web software just wasn’t as […]
From: Zeldman
She’s the Boss.
She is not here to eat. She is here to ensure my compliance.
I don’t post to or visit the social network formerly known as Twitter, but as a very early Twitter user, I can’t quite bring myself to delete all my old posts. There’s so much history there, not just personal history but the stories of a lot of the work I’ve done. This is the problem […]
From: Adactio
Picture at an exhibition
I few weeks back, I got an email with the subject line, Screenshot in an Exhibition:
I am currently developing an exhibition celebrating the thriving folk musics of these islands for the Royal College of Music Museum and one of the showcases looks at the Sharing of folk music and collections. As an incredible and heavily used repository of tune collections, I would like to print a graphic screenshot of a page from The Session to demonstrate digital dissemination, sharing and preservation of tune collections. Are you happy for me to do so?
I replied that I’d be honoured!
The exhibition opened on May 19th. I just happened to be in London a few days after that for the Gaeltacht cois Tamaise. So I arranged to have a little tour of the exhibition from its curator, Jennifer Brian.
It’s a really nice collection, and it was kind of surreal to see my website in amongst esteemed artifacts of folk music history.
I’m not used to The Session getting recognition from a museum, but I am used to getting kudos when I tell fellow trad musicians that I made the website. I joke that it’s my passport to free pints anywhere there’s a session happening, but it’s true.
The next night when I was playing in the session in the pub, Brendan The Navigator, I outed myself about halfway through the evening when I handed out some stickers for the website. Sure enough, someone immediately asked if they could buy me a pint.
I must admit it’s very gratifying when people appreciate the work that’s gone into building and maintaining The Session.
The exhibition at The Royal College of Music Museum is free and runs until October. If you’re in the neighbourhood, you should drop in and check it out.
From: Meyerweb
Accessible (I Think) Split-Cell Table Headers
A way to create a diagonally split header cell without mangling accessibility, I hope.
From: Codepen
426: Browserslist in CodePen 2.0
Stephen and Chris chat about how the 2.0 editor (well, the compiler really) understands and supports Browserslist, a config format that lives in your package.json file that multiple blocks can understand and make browser support decisions against. Jump Links
From: Chris Coyier
Did your editor font go default serif on WordPress 7.0?
Mine did. Like this: I guess WordPress 7.0 assumes you are using a theme.json file these days. I’m not doing that yet on any of the sites I work on. If you want to embrace that future, you could add a theme.json file to the root of your theme, and put some typography basics only […]
From: Codepen
Chris’ Corner: Finding Type
Finding the typeface you need is a whole thing. You’ll know it when you see it is one approach. Look at a lot of choices. Make sure to save ones that you think are really nice, even if they aren’t the winner this time. On my local machine, I use an app called Typeface. I […]
From: Adactio
Gaeltacht cois Tamaise 2026
Bhí me i Londain an deireadh seachtaine seo caite mar gheall ar an Gaeltacht cois Tamaise. Cúpla lá iontach ba ea iad!
Bhí na ranganna ar siúl Dé Sathairn agus Dé Domhnaigh, ceithre huaire an chloig gach lá, i gColáiste na Rí. Bhí ceithre leibhéal ann—tosathóiri, meanleibhéal-iseal, meanleibhéal-ard, agus an ardleibhéal. Bhí gach rang lán le foghlaimeoirí.
Roghnaigh mé an rang meanleibhéal-ard agus bhí an leibhéal foirfe. D’fhreastail Jessica ar an rang tosathóirí agus dúirt sí go raibh a mhúinteor iontach deas freisin.
Bhraith sé aisteach a bheith ag labhairt Gaeilge i lár na phriomhcathair Shasana, ach bhain mé go leor sult as!
Roimh na ranganna, bhí imeachta ar siúl ar an Embasáid na hÉireann ar an tráthnóna Dé hAoine; taifeadadh beo ar an bpodchraoladh How To Gael le Louis Cantillon agus Doireann ní Ghlacáin. Éistim leis an podchraoladh, mar sin thapaigh mé an deis iad a fheiceáll beo. Mná cliste agus greanmhar is ea iad!
Bhí imeachta eile ar siúl ar an tráthnóna De Sathairn ach ní raibh mé ann. Chuaigh mé go dtí an teach tabhairne Brendan The Navigator i Highgate—i bhfad ó croílár na caithreach!—mar gheall go raibh seisiún ceoil ann. Seisiún iontach iontach deas a bhí ann le daoine fáiltiúil agus go leor poirt áille.
Beidh mé ar ais!
From: Zeldman
Required reading: “The Interracial Cuck Porn Theory of Everything”
Cameron Cummins-Smith’s grand unifying theory connects the far right’s seemingly disparate obsessions—from trans panic and great replacement theory to anti-feminism and white birth-rate anxiety—into a single ideological system fueled by pornographic narratives: In physics there is this idea of a theory of everything: a single, unified model that can describe all physical phenomena in the […]
In this regular “Last week in the studio” series, I write about what I worked on during the previous week. Last week was one without a solid piece of work to tackle. Instead, I spent it on some updates to a client’s design and on making a little website for myself.
More for Black Mountain Honey
Paul and I have been working on Black Mountain Honey for the past few months. Paul’s been on the strategy, while I’ve worked on the visual identity and creative, including the website design.
Black Mountain Honey’s current website is built on Wix Studio, but after looking at solutions that will enable the business to scale, Paul recommended a mix of Circle for the community, WordPress, and WooCommerce for the store.
That meant me redesigning several key pages and producing templates for the WordPress developer to work on.
New page designs for Black Mountain Honey
When these designs were approved, I exported all the assets, optimised them, and added them to the style guide library I’d previously created for Black Mountain Honey.
Style guide library for Black Mountain Honey
Entire Property Direct
After months on hiatus, I received a surprise message on Wednesday from Entire Property Direct asking me to put the website I’d worked on earlier in the year live. Fortunately, the website was already set up on Netlify, so it took only a few minutes to navigate their domain registrar’s control panel.
Website design for Entire Property Direct
A little website for myself
For the past few weeks, I’ve been working on a talk I’ll be giving at a conference in Berlin in a couple of weeks. It’s called The designer’s scrapbook: Rethinking AI as a creative tool.
Slides from my talk, The designer’s scrapbook: Rethinking AI as a creative tool
One example I use to illustrate my process is this animated graphic of my alter ego, Albert Galoshe. It seemed a shame not to use it elsewhere, and as I’d been meaning to make a little website for myself, using Albert felt right.
A little website for myself
There’s nothing much to see or do on this new website, but it was a fun way to spend the end of the week before the long Bank Holiday weekend.
Like The Morrigan, Brigid is modern retelling of Irish mythology, but in a very different time period. Whereas The Morrigan was set in a mythical time of the Fomorians and the Tuatha Dé Danann, Brigid is set in the relatively recent past of early Christian Ireland.
Both, it turns out. The protagonist is the saint, but the narrator is the goddess. And they interact. It’s a clever framing device and for the most part, it works.
There are cameos a-plenty from the Christian pantheon like Patrick and Brendan the navigator but this is not the hagiography we learned in school. All the usual miracles are present and accounted for, but any supernatural powers aren’t ascribed to a Christian deity.
The world of Brigid isn’t so far removed from the world of The Morrigan after all.
Brigid isn’t a ground-breaking book, and it didn’t grab me as much as The Morrigan but it’s an enjoyable read nonetheless.
From: Boagworld
Why UX Should Own Retention
Acquiring a new customer costs about five times more than keeping an existing one. So why do organizations still obsess over the top of the funnel?
From: Codepen
Chris’ Corner: View Transitions
I’ve had View Transitions on the mind a little bit after experimenting with using them to move the focus ring around the page. I found that pretty satisfying, except the part where I was binding events to the tab key myself and keeping track of “focusable” elements. I know better, as that kind of thing […]
From: Stuff & Nonsense
Last week in the studio (CW20-26)
In this regular “Last week in the studio” series, I write about what I worked on during the previous week. Last week was spent on a more business-focused but no less creative project
Week 20, 2026: Aurus
My work weeks often vary between projects where my goal is to bring a brand identity to life or reflect a person’s personality with a design, and ones which are more business-focused. Last week was the latter.
A couple of months ago, property developers Aurus hired me to design a website for their Impact Capital initiative. They already had visual identity guidelines and printed collateral, so my design had to follow their direction. Nevertheless, there were still opportunities for me to work with data visualisations to reduce the written copy and make the information more glanceable.
My design for the Aurus Impact Capital website
Aurus then came back to me for a redesign of their other website. Again, they had similar visual identity guidelines and printed collateral. This time, I used one of their alternative hues to distinguish the two designs. This website includes twice as much copy as before, so I needed to use layout and typographic hierarchy to avoid it feeling overwhelming.
My design for the second Aurus website
Websites like Aurus’ often contain interesting facts and figures, and I like to make them features in my design. In this case, I decided to heavily style their development projects portfolio using iconography and large numerals.
An Aurus portfolio panel design
Then, I made simpler versions for small screens and to include elsewhere on their website,
Two small panel designs
Although developing this website will be someone else’s responsibility, I still wrote CSS and HTML and worked in Eleventy to produce a prototype, which should be ninety-odd per cent towards the final development. When I hand the files over to their developers next week, they can choose to stick with Eleventy or use my templates to create a custom WordPress theme.
After your afternoon workshop there’ll be one final closing talk at the end of each day before we head to the bar.
These closing talks are a way of bringing everyone back into the same space after spending the afternoon in different workshops. It feels right to start the day and end the day with a shared experience.
On day one, discovery day, the closing talk will be delivered by Michael Kibedi. It’s called Whose English gets to be default?
Ben Sauer will be giving the closing talk on day two, design day. His talk is called Story before screens.
Finally, on day three, delivery day, the closing talk will be from Lou Downe. It’s called Bad services, which also happens to be the title of their brand new book!
As you can see, each day at UX London is crafted to be a distinct one-day event, but all three days also flow together nicely.
If you haven’t got a ticket yet, grab one now before the standard pricing ends at midnight. And don’t forget that you can use the discount code JOIN_JEREMY to get a tasty 20% off.
From: Codepen
425: Debug Logs
As we’re getting close to rounding out the Beta period of the 2.0 editor, we’re trying to close out any bugs we find or users report quickly. They could be browser-support related, network conditions related, account capability related, or just bugs in how the 2.0 editor and technology behind it works. It’s complicated enough that […]
From: Codepen
Chris’ Corner: Check It B4 U Wreck It
There is an airport in Bend, Oregon where I live. We’ve got a proper one in Redmond, the next town over, but a little baby municipal one here in Bend. There is a cafe there that I’m only just hearing about: Bend Airport Cafe. Looks nice, I should go! I’m mentioning it for another reason,though. […]
From: Adactio
Gideon The Ninth by Tamsyn Muir
Lesbian necromancers in space. That’s the usual pitch for Gideon The Ninth and it’s not wrong. Though there’s a lot more necromancy than space or lesbianism.
The book begins in an environment fairly dripping with death, all bones and darkness. It sounds like it should be grim, but thanks to the sarcastic attitude of the protagonist, the tone is actually quite fun.
Sassy goth; that’s how I would describe the general vibe. Once I settled into it, I found that tone thoroughly enjoyable.
The bulk of the action takes place in the planetary equivalent of a haunted mansion and the various characters are assembled like the cast of an Agatha Christie mystery.
I must admit that I struggled a bit to distinguish one space necromancer from another. I should’ve payed more attention to the dramatis personae at the front of the book.
The plot kept me intrigued and invested throughout, although it did sometimes feel a bit like a video game with puzzles to be solved in order to unlock the next level.
The driving force of Gideon The Ninth is its excellent world-building. Though you’re dropped into things in media res, the foundations of the world you’re in are revealed piece by piece, and it all adds up to a fascinating premise for this book and its sequels.
I’m already looking forward to reading the next book.
From: Stuff & Nonsense
Websites shouldn’t need maintenance. They need momentum.
I’ve never understood website “maintenance” plans. Websites don’t need oiling. They do need attention, though.
After I finish a design project and hand a website over to a client, there’s rarely much technical support to do. Sometimes there’s the odd CMS question, a small bug fix, or a reminder about how something works, but if the site has been built well, it shouldn’t need constant tinkering just to stay upright.
That’s one reason I like building with Eleventy. There are no plugin updates to babysit, no theme framework to wrestle with, and far fewer moving parts than in a typical WordPress setup. The site can be fast, stable, and simple to host. But stability isn’t the same as success.
A website can be technically fine and still go quiet. No new case studies. No fresh project pages. No useful updates. No idea which pages are attracting attention, where enquiries are coming from, or what people are looking for before they get in touch. That’s the part I want to help with.
Launching a website is a milestone, but it’s not the finish line. The best websites keep moving after they go live, with small improvements, useful publishing, and a clearer understanding of what attracts attention and enquiries.
What happens after launch
There’s usually a burst of energy before a new website goes live. Then, after the site launches, the momentum often disappears. That’s understandable. Clients have businesses to run, customers to look after, music to write, and products to sell. Updating a website doesn’t feel like a priority unless something breaks or a new opportunity appears.
But a website works best when it’s regularly updated. So when a composer finishes a project, they should show it off. When a business completes a piece of work that would make a strong case study, they should publish it. Services change. Products develop. A newsletter needs writing, or a campaign needs a landing page.
Separating support from momentum
I’ve started separating technical support from post-launch momentum because bug fixes are one thing, but helping a website keep earning attention is another. Post-launch momentum is about asking better questions:
Which pages are people visiting?
What kind of enquiries are coming in?
Which projects, products, or services should be easier to find?
What could help people understand the value of the work?
What should be published next?
What changes would make the site more useful?
Those questions are easy to ignore when there’s no structure around them. So I’ve started building that structure into my process. When I quote a new website project now, I include two ways to keep things moving after launch.
90-day visibility starter
The first is a 90-day visibility starter. Once a site is live, we spend 90 days helping it settle in, understand how people are using it, and make small improvements based on what we learn.
This starter phase includes basic analytics and enquiry tracking, a monthly review of what’s happening on the site, and one focused improvement each month. That might be a content update, a small design refinement, a portfolio addition, a service page change, or another useful adjustment to help the site attract better attention and enquiries.
By the end of the 90 days, the client has a clearer picture of how their website is performing, which pages are attracting interest, and what could help it work harder next. It includes:
Analytics and enquiry tracking setup
Subscription to Plausible Analytics
Monthly visibility review
Monthly recommendations
One small website improvement per month
Short summary report at the end of each month
This isn’t meant to be a huge ongoing commitment. It’s a sensible next step after launch, especially when the site is still new, and we’re starting to see how people respond to it.
Website momentum plan
The second option is a website momentum plan. This is for clients who want their website to stay active with planned updates, useful publishing, and regular recommendations based on what the site needs next. Each month, we agree on one substantial website update to create and publish. That might be a case study, portfolio page, service page improvement, landing page, product page, blog/news post, email newsletter design, or homepage refinement.
The plan includes a short strategy session, interview booking, asset gathering, content shaping, publishing, and a monthly report. It’s designed for clients who want their website to keep earning attention, building credibility, and attracting enquiries after launch. It includes:
Subscription to Plausible Analytics
Short strategy session
Interview booking and asset gathering
One substantial visibility asset per month
Content shaping and page structure
Design, build, and publish
Monthly recommendations
Short summary report at the end of each month
Larger additions, campaigns, or more involved publishing work can be quoted separately, but the point of the plan is to make regular progress without turning every small improvement into a separate project.
Why this matters
I don’t want clients to think of launch as the moment a website is finished and forgotten. A good launch gives us a strong foundation. It puts the right structure, design, content, and technology in place. But the real value often comes from what happens next. Not because it needs fixing, but because there’s more to build on.
Keeping momentum going means making sure the website continues to reflect the business, the work, and the people behind it. It means sharpening messaging, improving pages, and learning from what visitors actually do. To me, that’s not oiling; it’s making sure a website doesn’t go quiet after the excitement of a launch.
From: Stuff & Nonsense
Last week in the studio (CW19-26)
In this regular “Last week in the studio” series, I write about what I worked on during the previous week. Last week was partly time away from the studio, so it felt a little disjointed.
We were away on Wednesday and Thursday for Sue’s birthday and our wedding anniversary. They’re conveniently on the same day, so I can only get in trouble once if I forget, which I haven’t yet. I spent the early part of the week tying up a few loose ends and, on Friday, started gathering material for a new conference talk.
I’m booked to speak at a conference in Berlin in June about how I use AI tools in my design process. The talk is still a long way from finished, but the central idea is starting to come together. I’m thinking of AI less as a replacement for making and more as a kind of scrapbook: a place to collect, combine, and develop visual ideas. One of the examples I’ve been working on is an image of my French alter-ego, Albert Galoshe.
One example from my upcoming talk in Berlin
I take a lot of photographs when we travel to France. They won’t win any competitions, but they give me a useful library of doors, windows, signs, shutters, plants, and odd little architectural details.
Photographs from my trips tp France as source material
I started by making very loose pencil sketches in Procreate on my iPad, tracing over some of those photographs to get their shapes.
Initial iPad pencil sketch
Quite often, these sketches are amalgamations of several photographs. I’ll extract the details I want, then scale, skew, and reposition them until they fit the composition.
Adding details from my scource material
Then, I add to the loose sketch. When the perspective or proportions are wrong, I ask AI tools to help correct them.
Adding details from my scource material
My figure drawing isn’t where I want it to be, so when I need to, I give my rough sketches to the tools and ask them to adjust the pose and proportions to fit the scene.
AI tools sometimes help me with poses and proportions
Once the compositional sketch was ready, I moved into Sketch and blocked in the background colours using vector shapes. I try to use simple shapes and as few path points as possible, partly because I like the look and partly because I want the final SVG to stay small. For this illustration style, I kept the colour palette deliberately limited.
Blocking in background colours using vector shapes
Then, I added details in separate layers, again keeping the number of colours and shapes to a minimum.
Details with minimal colours and shapes
Finally, I assembled the elements ready to export as an SVG for animation.
The finished illustration, ready for animation
I’m still conflicted about using generative AI tools, especially for illustration. So, when I work on images like this, I think of my role more as a director than an artist.
I know what I want to achieve. I know how the finished piece should feel. I make sketches that are closer to storyboards than to finished drawings, then use generative tools to correct perspective, improve composition, and fill gaps in my drawing skills. That makes the process iterative, and the tools help me get closer to an idea I already had, rather than inventing one for me.
That’s the topic I want to explore in Berlin: not how AI can make pictures from just a prompt, but how it can help people like me make better what I’ve already made better.
From: Boagworld
From Doer to Director: The AI Mindset Shift
AI is doing more than making us faster. It's changing the fundamental nature of what our work is, and the sooner we adapt, the better.
From: Codepen
Chris’ Corner: Import Maps
<script type="importmap"> Import Maps are pretty great! You get to write import thing from "place"; and then you get to map what you mean by "place". You could map it to a file in your project somewhere, that way you’ve got one place to update it and update it everywhere that imports it. Or you […]
From: Adactio
The schedule for UX London 2026
There’s just under a month to go until UX London 2026—exciting!
You can peruse the full schedule if you need to decide wether you’re coming for just one day or for all three. The event is designed to flow together, from discovery day to design day to delivery day, but each individual day is also designed to be a standalone experience by itself.
Day one on Tuesday, June 2nd has a focus on research:
Maria Isachenko will talk about how You don’t need more research time: You need a system that keeps research in product decisions.
Natasha den Dekker will help you answer the question How well do you know your users? Exploring assumptions through play
Chris How’s workshop is Yippee IA: Information architecture for digital designers
Oore Babatunde will help you put together UX practitioner’s code of ethics.
Lucrezia Ponzano will take you From chaos to clarity: A tactical workshop for real alignment.
Ben Callahan will guide you through Assessing organisational culture.
After your afternoon workshop there’ll be one final closing talk at the end of each day before we head to the bar. I haven’t announced those speakers yet, but believe me when I say they’re going to be quite special!
(And just between you and me, you can use the discount code JOIN_JEREMY to get a whopping 20% off any ticket price!)
From: Dave Rupert
Vibe Check №42
Forgive me, Reader. It’s been five months since my last vibe check. That’s a lot of ground to cover and it’s not possible to get into everything that happened. Like in real life conversations, instead of telling you how I’m doing, I’ll tell you what I’ve been doing these past few months.
A trip to Seattle
An underwhelming, low-res photo I took on my Kodak Charmera
In March I went to Redmond, WA for “Meetup Week” at work. This was my second visit to the mothership in two years of working at Microsoft. Ideally, I’d go up more… but not too much… so this is fine. We’re a high-functioning remote team even though nearly everyone on the team has been RTO’d.
Speaking of my team, the people I get to work with are super great. Talented, friendly people I’m lucky to work with. We’re a scrappy bunch punching above our weight.
The people in my broader design studio are also great. I spent a good chunk of my time helping folks with their vibe-coding setups. Ever since the mandate dropped earlier this year, a lot of my job has been helping to onboard our ~200 new junior designersdevelopers and their agent buddies to developer tools. I will say… it’s real easy to get your computer into a borked state when installing a lot of new tools. Chatbots and emergent AI tools make it worse. Getting comfortable with the terminal was a multi-year process for me and we’re asking “normies” to hot-drop in and approve hundreds of minified bash commands per day. I feel for everyone who is having their boat rocked by all the change.
Meetings and roadmap discussions filled my week. We had a couple memorable team dinners and bar conversations.
My week was super busy but I was able to sneak a couple moments to catch up with some old friends and colleagues in the Puget Sound area. Spent an afternoon with Adam, shared a beer with Kyle, and talked accessibility with Aaron. Good times.
My flight back to Austin got caught in a minor snowpocalypse. My 6pm flight got delayed until midnight which means I didn’t get home until 6:30am. Woof. And my seatmate next to me on the plane –the one with the crinkly bag of food who liked to have full volume conversations with her husband in the seat in front of her– was… ahem… less sensitive to the lack-of-sleep situation we were all in. Oh well.
A trip to Tampa
My daughter’s cheer team made it to the big end-of-season competition in Tampa, FL. We took the whole family and turned it into a mini-vacation. Her team did great and “hit zero” (zero deductions) but so did eight other teams in her division and only seven advanced. I’m proud of my little athlete and she continues to amaze me.
While not in the thundering jock-jam confines of the civic convention center, we took a trip to the beach, saw some movies, and went to Universal Studios Orlando. We aren’t a super theme park family but I was feeling a bit of parental guilt that my kids would be telling their future therapists about how we never took them to theme parks. Knowing my kids don’t love rollercoasters or waiting in lines, we stuck to the main park which has rides for the Minions, Diagon Alley, and the Simpsons. I splurged (read: paid double) for the “express pass” so we could skip the lines whenever possible.
Diagon Alley was the biggest highlight. That comes with some regret because JK Rowling sucks now. But the experience they crafted there is so meticulously well done you can’t help but feel immersed. I admired all the theme park tricks they do to make everything seem bigger. Slanted walls to make it feel fantastical and disorient you combined with how the windows get progressively smaller on the upper stories of the buildings so they seem taller. I spent a good amount of time marvelling at a set of stairs that went to nowhere; there to create an illusion that the town keeps going on forever. I love those details. Then on top of that they add in these immersive wand experience gimmicks (we didn’t buy wands but watched a others cast incantations). Very thoughtful experience design and that’s what I think I liked about it.
I will say that 4D experience rides are not for me. The “DO NOT RIDE IF…” warnings they give at the beginning of each ride are basically a printout of my medical conditions. I know theme parks are doubling down on these because the cost per square foot is too good to pass up, but I’d almost rather sit in The Hall of Presidents and watch animatronics talk to me instead of buckling into a vestibular torture chamber.
Aside from a bad case of ride-induced nausea, I think we had a fun and memorable day.
Another birthday
I turned 46 at the end of April. Huzzah. Another year on this rock, orbiting a star, in the arm of a spiral galaxy with a massive black hole in its center. Birthdays of course lose their sentimentality after you’ve had enough. But I had a nice relaxing day, not too many tickets on my desk, with some gloomy weather to preserve a chill mood.
Coming up
We’re barreling towards the end of the school year. I’m going back to Redmond again. Then to South Dakota to see my nephew graduate. Then my son will play his 80’s rock show. We got grandparents coming into town. A busy month for sure. Then summer officially begins.
Stats
Ok, perverts. Here’s the numbers.
🧠 Health and wellness
Still working on untying the knot of ADHD, anxiety, and weight in my life. I feel like I’ve done well on managing the ADHD. The weight could be better (considering how much I’m spending on GLP-1) but I am seeing progress. The anxiety though is hard to shake.
I watched some Dr. K videos about engineer burnout that resonated with me and another one about ADHD and anxiety where your brain reinforces itself into a state where you feel like there’s always a tiger in the bushes. That’s how I feel. No acute anxiety, but ambient.
Anyways, I’m under doctor’s orders to power down devices at 10:30pm and go to bed. It’s 11:52pm right now. I’ve also resumed going to therapy again (after a bad experience) and hope it sticks this time.
📖 Reading
Dungeon Crawler Carl [In progress] - This is my going to bed book, I’m reading it one page at a time. It’s taking so long.
A Libertarian Walks Into a Bear ★★★★½ - The story of what happens when Libertarians take over a town, deregulate and defund the town with lawsuits, get their small government wishes, and how the local bear population took advantage of the situation. An good story and foreboding allegory on how quickly you can ruin a place with small government.
How to Blow Up a Pipeline ★★★★ - This book is about violence in activism and the lackthereof in climate activism. It argues that violence has a historical track record of being effective against oppression. It even takes another step to say that non-violence is more effective when there’s a violent alternative (e.g. “There’s no MLK without Malcom X”). I’m not running out the door to commit crimes, but it does make me think about opportunities for “Good Trouble”.
The Art of Spending Money ★★★ - This is the book I wanted The Psychology of Money to be, but that one just made me mad about billionaires cheating the system. This is a good book with a lot of practical takeaways you’ve probably heard before. It does seem like it ran out of steam and they chucked a few blog posts on at the end, but would still recommend.
BLAME! Vol. 1 ★★★½ - Confession: I read this in the worst possible format on my iPad Mini. Blame! is about a young man on a mission to traverse the “The City”, a thousand layer megastructure that’s plagued by hoards of assassin robots. A dystopian sci-fi hyperdungeon of the ultimate magnitude. And while I enjoyed it, I think the iPad Mini cheapened the immersion and I may need to re-read this on paper.
Creativity ★★★★ - Learning about creativity from one of the greats. It’s a really short book and worth your time.
The Science of Storytelling ★★★★★ - On its surface this is a great book about crafting compelling narratives, but this book digs deeper and looks at the human psychology of why we like stories, mythos, and religions. I rarely pick books up a second time but I might with this one.
In This Economy? ★★★★ - Kyla Scanlon is one of my favorite economists, with the uncanny ability to breakdown the economic system into simple, understandable, and relatable terms. Being in my 40s, there wasn’t much new knowledge to be gained in this book but this is a book that I wish I read in my twenties. It would have helped me make sense of the larger picture of how all the systems and economic levers are connected.
BLAME! Vol. 2 ★★★★½ - I was hesitant to read this because I sort of struggled through Vol. 1, but this book was incredible. Action-packed and the way Nihei creates enormous worlds and plays with that sense of scale leaves you with a sense of awe.
Mobile Suit Gundam: The Origin, Vol. 4 ★★★★★ - The story of the most consequential battle of the One Year War. The death of a loved one, an intrusion into a secret base, a vulnerable Earth, an incompetent general, and the introduction of my favorite mobile suit, the RGM-79 GM.
High Conflict ★★★★★ - Incredible book. It’s about how conflict arises. How even conflict experts can struggle to reduce conflict. How we become entrenched in gangs or partisan warfare. And how we get out.
A Good Man Is Hard to Find DNF - I avoided Flannery O’Conner because someone in college told me it was depressing… and it is… but not as bad as advertised. I liked it but felt like I got my fill even though I only got half-way through the book. I found the “Southern Gothic” genre to be a mildly entertaining series of macabre little twists like a story from Tales from the Crypt but also a lot of stories about nothing.
Mobile Suit Gundam: The Origin, Vol. 5 ★★★★★ - This book is a prequel on the original Mobile Suit Gundam storyline. It dives into the origin story of the Gundam universe’s most dashing and daring antihero, Char Aznable. This storyline is what makes me love Gundam even more.
Mobile Suit Gundam: The Origin, Vol. 6 ★★★★★ - The prequel continues as more and more people are pulled into the war’s grasp. A lot of space drama and the series is really hitting its stride here.
📝 Blogging
A pile of posts. I’m proud of some of these. Even wrote a series on a new CSS property. And a lot of thoughts about AI.
Rental Family (2025) - Brendan Frazier stars in a movie about connection (and lack there of). Touched some deep memories of loneliness and “otherness” from my time living in Japan. But also has some harmonic notes on the need for human connection.
The Running Man (2025) - Everyone should watch this. A remake of the 1985 Schwarzenegger movie but hits all the notes harder. It’s about how media and our screens lie to us… and the money that’s behind it. An antifascist story for the ages.
Parasite (2019) - I need to watch more Bong Joon Ho. It’s horror, but also a comedy, but also a story about trying to live in a world where the rich have everything. I love how the house is like a character in the film and they dedicate a lot of footage to the perfect home.
Project Hail Mary (2026) - I loved the book and the Ryan Gosling movie lived up to everything I remember and then some. It’s a story that sparks hope about humankind is capable of if we work towards a common goal.
The Super Mario Galaxy Movie (2026) - The second movie in the Mario series was pretty good in my book. Delivered a lot of small nostalgia bits while also weaving a compelling little story.
🎙 Recording
ShopTalk blasted past our 700th Episode 🎉 and it keeps going. We’ve had a nice little run of guest episodes which is nice.
I was also on a St. Patrick’s Day episode of Whiskey Web Whatnot podcast (my second time on the show).
Taking my son to see a ska band (The AuSKAnites) at a dive bar.
🌱 Digital gardening
A big, big redesign for my site pots of small tweaks to type and tags made over time.
Made my logo view transition a little bit juicier
Used @jimniels’ Netlify Image CDN trick to add image optimization.
Homepage image weight went from 229kb to 112kb (-52%)
Homepage average image load times (on fiber+wifi) went from 125ms → 71ms (-44%)
I made a /hire page, a different take on a résumé - Not looking for work but economic anxiety is high, so catharsis.
Moved ~70 drafts to my “Deadpool” and feeling much more focused on what I want to write about. Still 109 drafts tho.
Added a “Other posts in this series” module to my post template. I don’t have a lot of series… but perhaps now I’ll have more.
⌨️ Open source
Been active in standards in the background, giving my thoughts to people who work on Edge. Don’t know if I have the heart for it full time but it does feel good to gather concrete examples of problems and make reduced test cases.
Fluent Web Components v3 is in Release Candidate nearing release… but also finding more bugs as it rolls out. I got the good news that Fluent Web Components are now deploying in the largest Angular app in the world. Neat.
Assisting and giving my team feedback as we gear up for a release of FAST v3.
👾 Video games
Arc Raiders - Played Arc Raiders with the boys and had a great time with this game. The game loop gets repetitive but the moments are so cinematic. There were times I was genuinely spooked to be in an environment with unknown threats (PvE or PvP) lurking around.
Good Sudoku by Zach Gage - Got utterly addicted to this old game. It’s probably been five years since I last played it but the replay-ability of Sudoku is bonkers. Same damn numbers, same damn boxes and rows and columns, but I’m hooked. Kudos to Zach Gage for adding “juice” to Sudoku and helping me learn along the way. So addictive I had to uninstall.
From: Dave Rupert
The duality of language models in the browser
I have complex feelings about Generative AI but one area I find myself weirdly bullish on is small language models (SLMs) in the browser which are available in Chrome and Edge behind an experimental flag.
I know, I know. I know.
AI in the browser reeks of a product manager trying to hit a KPI to shoehorn AI into everything. I understand if you read the phrase “AI in the browser” and involuntarily threw up on your keyboard, said “Fuck this”, and then closed this tab. I will not hold that against you. For the rest of you, hear me out…
There’s an “Always bet on the Web” quality to the idea of browser-based models that I appreciate. There’s a self-hosted vibe to it. I shouldn’t have to pay a billionaire each month to summarize an email or generate a picture of myself with ultra-white teeth, doubly-so when they’re selling our regurgitated data back to us. Those gimmicky use-cases or even the more practical-yet-often-purple-washed “AI for accessibility” use-cases should fall under the Web’s umbrella of universal access.
I like that nobody expects much from them. To the hyper-scalers SLMs will always be the shittier version of LLMs so they’re basically ignored. They dodge the whole “model get better” hype-chamber because they don’t economically depend on the hopium that response quality will get better in the next version. Ironically, there was a breakthrough in small language models last month1, but it barely got a mention on The Verge.
While small models will never compare to their larger siblings, what they can do is generate pure and unadulterated slop examples of what the technology can do without a data center’s worth of gigaflorps burning a hole in the sky. Small language models generally…
So… if there’s a there-there with AI (interpret that how you wish) an ecosystem of small, private, specialized in-browser models seems beneficial. Ideally small models could cover most use-cases outside of long-running workloads that require extremely large context windows. I think electric cars might be a good analogy here; they solve most daily commuting needs at a fraction of the carbon cost. That seems like a win. It’s hard to know for sure, but I reckon I don’t need a one trillion parameter model to fix some red squiggles in my code editor.
I’ve been exploring the Prompt, Summarizer, and Rewriter APIs in Edge to explore some ideas that fit within the generative space. What I’m learning is that you can make a decent, compelling prototype with an in-browser model for free in a CodePen and that’s kind of neat. It stands to reason that scaling up to a large language model might make that idea even better… or not but it cost me nothing to develop. Doing the inverse is much harder; reducing the cost of million context token required workflows is nigh impossible.
The approachability of the Prompt API is great and it demystifies a bit of how LLMs work under the hood. It’s all client-side, no server involved. You pass a prompt to a prompt() method and get a response back. No third-party calls, no API keys, no “Please do not share secrets” in a markdown skill.
That bar lowering is something I’m excited about… but that said…
Single model calcification - Website authors fine tuning prompts for Google’s model, a reboot of the Chrome-only websites problem.
Model neutrality - Google’s TOS becomes the de-facto TOS for all other user agents.
Overstated developer position - An issue with Google citing themselves in their explainer.
Despite my positive sentiment from my little experiments, I agree with Mozilla’s position.
I think the model calcification issue is a real problem to consider. The APIs are generic enough but as Jake mentioned in the issue people will tune prompts to work around model quirks. Given Chrome’s dominance, that’s Google’s model quirks. And Google’s model may change, inheriting new quirks that require we update our magic words. Good standards avoid breaking changes and I don’t see the plans to prevent those in such an evolving landscape.
AI in the browser is essentially a brand new “engine” we’re hot-dropping into in the HTML, CSS, and JavaScript stack; an engine which depending on the model can behave wildly different and give incorrect responses. It’s worth having a big gory discussion on whether it makes sense –at all– to standardize anything around any service/tool that is inherently unpredictable and often flaky. Small language models exacerbate the accuracy problems to the extent that they probably don’t meet the responsible AI considerations a chatbot needs… which is the core use-case for something like the Prompt API.
I am not a lawyer, but Google’s Generative AI Use Policy seems weak and is basically “Pweeeze don’t do iwwegal fings.” Unironically, the list of prohibited uses reads like a writeup of areas where AI has been found to be super effective. You could convince me it’s a point-by-point breakdown of xAI’s entire product roadmap for building a Mecha Hitler.
Another issue is that while I said in-browser models tended to be “free and private”, that comes with an enormous caveat. In-Browser AI is a free and private API… if you can afford a decent device with a GPU. Otherwise, it depends on someone-else’s computer. That seems to violate the principle of universal access.
So, yeah. I’m bullish, but also have concerns. If I were to offer an alternate proposal, it would have the following requirements:
Ensure private capital spend is not conflated with user demand.
Ensure we’re not king-making or entering a model monopoly by preserving model diversity.
Require a bring-your-own (ethically-sourced) SLM marketplace solution where consumers have model choice like they do browser choice.
Create tooling to build your own ethically-sourced SLM on consumer grade hardware that integrates with the browser APIs.
Create access and APIs for in-browser safety classifiers.
Create a stronger fallback story for unsupported devices: even smaller models, free cloud servers, or cheap-to-self-host VMs with isomorphic APIs.
If model foundries cannot solve accuracy problems or models cannot meet the requirements of a shared responsible AI framework, create clear spec-level guidance on areas where you “MUST NOT” use this API.
If model foundries cannot solve accuracy problems or models cannot meet the requirements of a shared responsible AI framework, consider abandoning the spec entirely until the underlying technology progresses.
These are the improvements I’d like to see. This probably takes the spec beyond the realm of a paper thin JavaScript API for interacting with local models. But as stated above, I think this is more than a small API surface, this is adding a new non-deterministic guess-o-matic in the browser. The field of AI –while popular in private capital markets– is still a bit unproven in its economic viability and its future is far from certain. We should tread lightly here.
In March 2026, Google introduced “Turboquant”, a data compression method which shrank model size, memory usage, and increased quality. ↩
One post I read said you could train an SLM in hours on a single consumer GPU. The ecological comparison of a couple rounds of Fortnite. That said, the model card for Phi-4 (the model used in Edge) says it took 1,920 H100 GPUs a total of 21 days to train the model. That’s faster than a large language model, which can take months, but much more than a couple hours. ↩
They are private in the sense they do not “phone home” to a parent server on every request. I assume apps will store conversations and telemetry. ↩
Apologies for being hand-wavy here. I’m making an assumption SLMs can use “the legal parts” of Common Crawl but I’m not an expert here. ↩
Free… except that it does require a decent computer with enough RAM and an on-device GPU. ↩
From: Stuff & Nonsense
Unfinished Business #142: The perfect request for proposal
In this episode of Unfinished Business, Rich and I talk about the best type of RFP (request for proposal) and how Rich got excited when he recently one which stood out from the rest.
The best way to promote your product or service to the Unfinished Business audience of creative professionals, designers, and developers. Sponsors get one exclusive two-minute ad per episode, live read by me or Rich, which feels personal and relatable. We can use your script or ad-lib, and you’ll also receive a link on each episode’s post, as well as a thank-you on our Bluesky and Mastodon accounts. Interested? We’d love to hear from you.
Support Unfinished Business on Patreon
We also have three monthly membership plans so you can support Unfinished Business on Patreon. $5, $10, and $20 if you’re feeling especially generous. All money goes towards podcast editing and hosting. Support Unfinished Business on Patreon.
From: Stuff & Nonsense
Making my view options toolbar more intuitive
The view options toolbar at the bottom of my animated banners has irked me for a while. It had grown one button at a time, and the result looked ill-considered rather than designed. With a few minutes to spare at the end of last week, I finally redesigned it.
The view options toolbar before my redesign
When I first made my current SVG animated banners, I wanted to let people switch off the animations, so I added a play/pause button. Over the past few months, I added a winter theme, then a spring theme, and a character-collecting card game. What started out as play/pause became a toolbar.
Not much affordance showing which options were active
Those animation and theme toggles weren’t clear enough, and there was little affordance showing which options were on or off. So I added new icons to represent the different states.
New icons to show which options are active
With a contrasting background colour, the button states are now much clearer to recognise:
I was already using aria-pressed to describe each button’s state, so I used that same attribute as the styling hook:
Clearer state for the play/pause toggle
It’s also now much more obvious whether the spring or winter themes are active.
Clearer state for the spring and winter themes
Now the buttons looked like a more cohesive collection, I wanted to group them into an unintrusive toolbar that wouldn’t obscure the illustrations behind it.
These are subtle changes, but they scratch an itch that’s been there for a while.
The view options toolbar after my redesign
From: Stuff & Nonsense
Last week in the studio (CW18-26)
In this regular “Last week in the studio” series, I write about what I worked on during the previous week. Last week was quiet enough for me to take an afternoon off to enjoy the sunny weather, but I still got plenty done.
Week 18, 2026: Designing for print
My design for Codeboxx was finished the previous week, and since I’d already made some good progress developing the code, the remaining work was mostly about refinements. I had plenty of time to refine the animations and add more subtlety to the interactions.
Screenshots from my new Codeboxx website design
I hadn’t initially intended my QR code artwork to be used offline, but we decided to turn four of the pieces into a set of postcards, which Codeboxx can include in their deliveries.
Two of my postcard designs, ready to go to press
We ordered 500 of each from Solopress—my regular print supplier—which will be delivered to Codeboxx next week.
Two more postcard designs, ready for printing
I like seeing my work printed. That doesn’t happen often enough. Then, I was reminded that I’d promised Ryan Knaggs a business card design.
Two business card designs for Ryan Knaggs
The card had to be a square, which I always prefer because it makes composition much easier. Ryan’s card needed to include the logo I’d designed, his URL, and a QR code containing his contact information.
Final Ryan Knaggs business card design
We ended up with a design that incorporates those elements, along with his “dramatic music” tagline.
From: Stuff & Nonsense
Militant masthead logo (r)evolution
Militant was a British socialist newspaper associated with the Militant ‘tendency,’ a left-wing political movement whose members were ultimately expelled from the mainstream Labour Party. I looked back at how the Militant masthead logo evolved between 1964 and 1997.
I grew up in a steelmaking town during the late seventies and eighties, at a time when Margaret Thatcher’s Tory government was waging its war against trade unions and the working class. So it’s no surprise I embraced socialist politics, and as a teenager, I joined the Labour Party Young Socialists and at weekends I sold its Militant newspaper.
Militant newspaper, published the day after my birthday in November 1980.
The Militant newspaper was launched in 1964 and took its name from the American Socialist Workers Party’s publication. For the first few years, its masthead logo featured a slab serif typeface and the tagline “For Youth and Labour.”
Slab serif Militant masthead logo 1964–65
The slab serif lasted six years; in June of 1970, it was replaced by a bold sans-serif, uppercase, with kerning between the “A” and “N” that you could drive a coal delivery truck through.
Sans serif masthead logo 1970–71
Less than a year later, in September 1970, the short-lived sans-serif was again replaced with a more characterful, hand-drawn logotype. This included round tittles over the “I”s, one of which cut into the first “T”’s crossbar. Those “T”s are asymmetric, and the lowercase “A” and “N” were slanted.
Hand-drawn masthead logo 1971
Strokes were thickened only a few months later, and while the slanted “A” and “N” were retained, the round tittles were replaced with rectangular shapes, and the apex of the “T”s sat on top of shorter crossbars.
Thick-stroked masthead logo 1972
This logotype was revised again a year later in November 1973, with a smaller closed counter in the “A”, tighter tracking, increased x-height, and far smaller open counters around the “M.”
Revised masthead logo 1973
In early 1978, the masthead logo was altered again, adopting a contemporary, rounded look. Round tittles made a comeback, the “M” was widened, and the two “T”s lost one arm of their crossbars. It was a thorough modernisation, with only the slanted “A” and “N” from the previous version remaining.
Contemporary masthead logo 1978
Seemingly unable to resist iterating on this design, three months later in June of 1978, Militant tightened the tracking and the corner radii, creating a more graphic, solid-looking logotype.
Revised masthead logo 1978
Then, in January of the following year, Militant’s logotype changed again. The circular tittles were gone (again,) and for the first time, there were two different “T” shapes. This time, the first “T” had an asymmetric crossbar to avoid it colliding with the “I”’s now rectangular tittle. Also noticeable was the slight curve at the bottom of its stem to wrap it around the “A.” There was also a new angle added to the “M” and “N”’s strokes.
Angular masthead logo 1979
Clearly happy with these refinements, Militant stuck with this version of their logotype for the rest of the newspapers run, before it became The Paper of the Socialist Party in 1997.
Iconic masthead logo 1979–1997
Only subtle changes to its angles and a more pronounced wrapping of that first “T” underneath the “A” were made over its almost 20-year lifespan.
I know nothing about who designed or worked on Militant’s design over those decades, but I found it fascinating to look back over the choices those people made. If you know anything about Militant’s designers, I’d love to hear from you (or them.)
Note: Marxist.org has an archive of many scanned copies of Militant from its start in 1964 through to 1997.
From: Codepen
424: File List Optimization
The 2.0 Editor can support hundreds of files per Pen, not to mention folders mixed in which don’t count toward that total. This can be pretty weighty on the DOM and thus adversely affect performance. Especially as each file/folder has children, a variety of event listeners, are drag and drop enabled, etc. “Virtualizing” data like […]
From: Chris Coyier
When Sites Need to Walk Away
The Internet Archive has a new book: VANISHING CULTURE. (Digital copy is free.) According to a Pew Research Center report, 26% of pages from 2013-2023 are no longer accessible. But that’s not the whole story. In a new study published in Internet Archive’s book, VANISHING CULTURE, data scientists working with the Wayback Machine have found: […]
From: Codepen
Chris’ Corner: ZIP first?
I love ideas that feel clearly better than what was before. I used to feel that way about curved shower curtain bars. Like, instead of the shower curtain being perfectly straight against the edge of the shower, it curves outward. No harm in functionality, but it gives more space inside the shower. It’s just better. […]
From: Meyerweb
Canvas-ing the Web
A practical use case for rendering HTML+CSS to a canvas, an emerging API being previewed in Chrome.
From: Stuff & Nonsense
Eleventy in a Box—just add water
For the past few years, unless a client insists otherwise, Eleventy has been my go-to for building websites. It gives me complete control without the overhead of a traditional CMS. Recently, I’ve pulled everything I’ve learned into my own Eleventy in a Box system for starting projects quickly, and boy-oh-boy, has it saved me a ton of time.
I like that Eleventy doesn’t force me into someone else’s idea of a theming system. I never got my head around WordPress, so I avoid it like a colonoscopy. With Eleventy, I have absolute control over HTML, CSS, and JavaScript. It’s simple to build with, and simple for clients to use. Most don’t need the complexity of a full CMS anyway. Hosted on Netlify with their editor, they can update content, and nothing else.
The more websites I’ve developed with Eleventy, the more I’ve written the same code over and over. Every new project started the same way: copying files, rewriting patterns, rebuilding features I’d already built dozens of times.
This wasn’t necessarily a deal-breaker, but it was a waste. And honestly, I’d rather spend my time coming up with a great design. So I stopped treating projects as one-offs and started building a system instead. I call it Eleventy in a Box.
Eleventy in a Box with light and dark themes.
I built my system reusing the parts I use on almost every project: boilerplate CSS, layout systems, and a consistent set of naming conventions. That consistency matters. I can move between projects, share code without rewriting it, and switch layouts without renaming components. Now, instead of spending half my time designing and the other half writing code, I’ve reduced development time and can spend more time on design.
Eleventy in a Box layout and contact page.
Using the same codebase doesn’t mean my designs look the same. If anything, it frees me up to push them further. These websites for Bego Pereda, Mountain Duck, Shared Homeland, and Verkehrsteiner all started from the same core, but they don’t look anything alike.
Websites for Bego Pereda, Mountain Duck, Shared Homeland, and Verkehrsteiner.
When clients needed extra functionality like a blog, changelog, FAQs, portfolio, services, or team pages, I stopped baking them into the core. Instead, I broke them out into feature packs. Each pack contains everything it needs—templates, content, styles, and configuration—and knows how to install itself into a project.
Eleventy in a Box portfolio feature pack.
Then, I built an “installer” which copies the packs I need into a project, including specific folders, Markdown files, stylesheets, and templates.
Eleventy in a Box team feature pack.
So instead of manually setting up every project, I describe what I need and let the system do the work. A prompt like this gets things up and running.
Create the new project from the current local boilerplate snapshot.
Feature packs
Install these packs only:
blog
case-studies
changelog
faqs
portfolio
services
team
Use the boilerplate feature-pack installer, for example:
node scripts/add-feature.js <feature>
Let each pack update navigation, CMS config, and feature files through its manifest.
Environment and validation
In the target project:
Install dependencies.
Run a production build.
Handoff
Finish with a short summary:
Project path
Packs installed
Node version used
Build status
Any manual follow-up needed
The most useful next prompt if I’m moving to a new thread
Eleventy in a Box case studies feature pack.
Using this setup means I can spend less time on repetitive code and more time designing, which matters not just for client projects but also for me. After all, there’s absolutely no fun in doing the same thing day in and day out.
For now, Eleventy in a Box is just for me. I might one day package it and share it more widely.
From: Chris Coyier
Bette Midler sings Woodie Guthrie
80 years old and killing it.
From: Chris Coyier
AI & Alignment
Raw coding speed isn’t the bottleneck. Alignment is the bottleneck. That seems to be a zeitgeist-y theme lately. If you’re using AI to code, maybe you’re feeling it. You can code more and faster. And clearly a boatload of other developers are doing that too. But software doesn’t seem to be exploding in quantity or […]
From: Stuff & Nonsense
Last week in the studio (CW17-26)
In this regular “Last week in the studio” series, I write about what I worked on during the previous week. Last week was a good one as I could concentrate on just one thing.
Week 17, 2026: Codeboxx
I like weeks where I can focus on just one project, and last week was all about working for Codeboxx. They sell thermal printers and supplies for the packaging industry to print, amongst other things, barcodes and QR codes. That may sound dull, but there are stories to tell about every business; you just have to find and tell them.
A selection of pages from my designs for Codeboxx
One thing that stood out to me was how the company supplies products which keep production lines running. If there’s a break in supply, those lines could stop. “Knowing what customers will need and when is an art,” they told me. That gave me the idea to recreate famous works of art from QR codes.
QR code art
I made a series of artworks—including the Mona Lisa, Munch’s The Scream, and several by Vincent Van Gogh—by creating a set of QR code textures with different densities from light to dark. Then, I placed these shaders over reproductions of the paintings.
QR code art
Product images from this industry are, well, dull. Even the manufacturers’ own product shots look dreadful. So, instead of showing dozens of printheads and ribbons that all look identical, I made animated graphics that represent each product category.
Codeboxx product animation
This website design is shaping up nicely, and over the next week, I plan to finish the coding and get it online. Hopefully, that week will be just as productive.
From: Chris Coyier
It’s an assumed truth that Safari is better for battery life — without data to support it.
This pseudo-truth just bugs me. I hear it all the the time. People saying they choose Safari as a browser because it’s better for their battery. But there isn’t any data (that I know of) that proves that Safari is more efficient at battery usage than any other browser. I applaud Matt Birchler who did […]
From: Adactio
Summary punishment
In the latest issue of Matthias’s excellent Own Your Web series, he describes the recent betrayal by Google:
The search engine no longer says “here, go read what this person wrote.” It now says “here, I’ve already read it for you.” The contract is broken.
He’s absolutely right.
But…
Have you ever clicked on a result from a search engine? Unless you’re lucky enough to land on a nice personal website, you’re more than likely to be confronted with pop-ups to allow tracking, or a desparate plea to subscribe to a newsletter, or just rubbish ads all accompanied by a slow page loading somewhere in the mix.
Don’t get me wrong. I’m not saying that what Google is doing is okay. But let’s not pretend that everything indexed by Google is just fine and dandy for people to visit.
And of course the main reason why websites are so terrible is because they’ve tied their business model to heaps of behavioral advertising driven by invasive tracking courtesy of …Google.
This reminds me of AMP. Remember Google AMP? It was a terrible solution to a real problem. Web pages were (and still are) bloated and slow. The correct solution would be to encourage people to fix that, but instead Google mandated a proprietary format for your content that had to be hosted on their servers.
AMP was a disaster, both in practical terms and in the reputational damage it did to Google’s developer relations.
Now they’re doing it again, powerwashing away any goodwill they ever had with site owners. Now Google doesn’t even send search engine traffic to the websites that host the ads that Google encouraged people to put on every page.
It’s almost as if Google is a company so large and with so many competing interests that it now suffers from an incurable split personality disorder.
Personally I think they’re missing a trick. They should be using “AI” summaries as a stick.
If your site is slow, or filled with user-hostile annoyances then it should be cockblocked by a hallucinated summary. But a nice fast respectful website? Send the traffic their way! Everyone wins—users, site owners, Google, the World Wide Web.
Could you imagine how quickly this would revolutionise the world of search engine optimisation? They’ve always told us that we should make websites for humans in order to get good Google juice. This would be a way of making it come true, without any of the over-engineered woefulness of AMP.
It’ll never happen of course. But I can dream.
From: Boagworld
Why UX Teams Need a Maturity Audit Right Now
UX is under pressure. A proactive maturity audit gives you a voice before leadership makes decisions about your team without you.
From: Rachel Andrew
What would a 2026 CSS Anthology look like?
In 2004 I published the first edition of The CSS Anthology with Sitepoint. The idea for the book was to take the entire CSS 2.1 specification, and come up with 101 examples to show people how to use all of the CSS that existed. I have a copy on my shelf, but recently discovered you […]
From: Codepen
423: 2.0 Templates
Stephen and Chris hop on the ol’ podcast to talk about all the ways that Templates are way better in 2.0 land. You’ve always been able to make your own templates, but now you can select one even after you’ve arrived in the editor. There is a new place (the create page) which features bookmarked […]
“I end each day exhausted—not from the work itself, but from the managing of the work. Six worktrees open, four half-written features, two ‘quick fixes’ that spawned rabbit holes, and a growing sense that I’m losing the plot entirely.”
As someone with ADHD, this sounds painfully familiar. I’ve been spinning up workloads like that my whole life chasing the dopamine dragon. And as my fellow neuro-spicy siblings all know, there’s the thinnest of lines between “Oh wow I’m going so fast!” having fun being optimally stimulated and “Oh shit fuck no ow help cry ow” collapsing on the floor in desperation. It all reminds me of an old business book…
The Goal by Eliyahu M Goldratt is a charming bit of manager porn on the topic of fixing industrial bottlenecks that I think illustrates the problems of unthoughtful acceleration-ism12. Andrew Murphy cited the same book when he highlighted the problems of more code at the organizational level. More inventory (read: lines of code) does not equal more velocity, it leads to more lingering PRs and CI runs that need rebasing attention. It’s decaying work that creates more work. Each line of code is a future maintenance liability, a future addition to your context window. You didn’t fix the bottleneck, you moved it downstream.
The most eye-opening parts of The Goal for me was understanding that excess inventory isn’t free, it’s a pile of sunk costs that takes up space, costs to store, and takes more time and effort to process. As Andrew puts it, increasing velocity at one end of the production line without actually fixing the bottleneck at the other end…
Congratulations! You’ve built a factory that’s world-class at producing inventory that sits on the floor and rots.
This bottleneck is what’s happening in our brains. When you ask a machine to build infinite apps, it will do that. When you ask a machine that generates more tasks, it will do that. It will churn through it. Ultimately, the backlog of backlogs and all the endless microscopic UI bugs becomes a form of excess inventory you need to manage. It might not seem like a heavy price at first because you’re feeding it back to the machine, but there’s a compounding cognitive load tax that comes from context-switching between major projects. You need to load the entire project state into your context window each time the command line dings and that’s calorically expensive.
I’m not ashamed to admit I’ve abandoned at least two projects because the LLM generated more code than I wanted to read. I looked at all the folders of files and said “Meh” and closed my laptop.
Over-generating code leads to what Margaret Storey calls “Cognitive Debt”, a form of technical debt where the product exists beyond your understanding. This is where security, accessibility, and performance problems lurk. Most engineers have experienced being hot-dropped into a project-on-fire where you have no prior understanding of the codebase… it’s not a fun experience. You spend most of your time building a mental model of the codebase3 for what might be a one-line fix.
At the end of the chain of 10,000-watt GPUs sitting in a data center in Iowa is the 40-watt lump of meat inside your skull. It’s an incredible, efficient, miraculous lump of meat that has millions of years of bio-engineering behind it… but understanding is the new bottleneck. If brains are a scarce resource, then we should take care to not over-produce inventory. That goes for ourselves and our organizations.
If you want a more modern retelling of The Goal centered around a software shop, check out The Phoenix Project. ↩
The first thing I do when paratrooping into a new codebase is to annotate what’s inside each directory. AI can help with this now, but if I do it my mental model grows along with my exploration. ↩
From: Rachel Andrew
The importance of people who care
I had a few days off work last week. My daughter was visiting, and in the evening we sat and watched episodes of Being Gordon Ramsey, a documentary series following the chef as he opens a huge restaurant project in London. It’s an interesting watch, but the thing that comes across through every word and […]
From: Codepen
Chris’ Corner: URLs
In Fixing the URL params performance penalty, Barry Pollard sets up a very clear real-world conundrum. The content at these two URLs is probably the same: The content at these two URLs is probably not: Who cares? Cache cares. Because content with different query params might be different, the various tech that deals with caching […]
From: Zeldman
My UX Superpower: Nothing Works!
Maybe I’m special. Or unlucky. But things that supposedly work intuitively for most users tend to fail spectacularly for me. After stints in academia, journalism, advertising, and music, I poured myself into web design in early 1995. I understood it in a way most designers didn’t, and rose faster than I probably deserved—until the summer […]
[Folk Fest] is not an intellectual experience, it’s an emotional experience. Bob Banghart Visiting Alaska gives me the feeling that people are chasing after when they travel: a little taste of what it’s like to be a part of another world. To live another version of life. Not just looking at it or fantasizing about […]
From: Adactio
Dilation
Nothing can travel faster than light. And if you manage to travel close to the speed of light, things get weird.
Technically, we all experience time differently depending on how fast or slow we’re moving. But the differences are so imperceptible as to be non-existent. That’s how we can describe events as being “simultaneous”, even though according to Einstein’s theory of relativity, there’s no such thing.
It’s thanks to these small relativistic effects that GPS works. But when you approach the speed of light—or get close to something very massive—then the large-scale relativistic effects kick in.
If you travel close to the speed of light for a short time, it will seem like a much longer time to everyone you left behind. This is the twin paradox, which isn’t really a parodox at all, just time dilation in action.
There are some coincidental parallels to this kind of time dilation in old folk tales.
The Japanese tale of Urashima Tarō tells of a fisherman who rescues a sea turtle and is rewarded with a relaxing few days in an underwater kingdom, only to find that when he returns home to his village, 300 years have passed.
The Irish tale of Oisín describes the warrior’s journey to Tir na nÓg, the land of youth. He spends three years there but when he returns to Éire to see his old fighting comrades from the Fianna, 300 years have passed.
This story gives us a wonderfully poetic turn of phrase that’s still used today. The closest English equivalent is “Billy no mates”, a rather cruel term to describe someone with no friends. In Irish, we say:
Mar Oisín i ndiadh na Fianna
Like Oisín after the Fianna.
From: Chris Coyier
Just have such strong nostalgia for this song. Still slaps. Close second from MC Chris. Curious, this record isn’t streaming anywhere, and he just makes the album available as downloadable MP3’s in a Google Drive.
From: Adactio
Finn Mac Cool by Morgan Llywelyn
After reading The Morrigan I was hungry for more retellings of Irish myths and legends. I tracked down the 1994 novel Finn Mac Cool by Morgan Llywelyn.
The biggest difference I’ve noticed is the presence or absence of supernatural intervention. Some of these writers tell their stories with gods and goddesses front and centre. Others tell the very same stories as realistic accounts without any magic.
The Morrigan was dripping in magic. Finn Mac Cool is a more down-to-earth affair.
That’s not to say that magic doesn’t matter. For the characters in this book, their belief in magic is as real as their belief in the weather. But there are no supernatural powers here. If anything, Finn’s superpower is his ability to tell—and believe—tall tales involving supernatural intervention.
All the usual accounts of Finn Mac Cool’s prowess are retold as deeds that may have a basis in reality but then get exaggerated almost immediately.
It’s a framing device that works well. It’s all too easy to believe in the rise to power of a charismatic man skilled in controlling the narrative.
There’s plenty of Machievellian politics at play. There are no outright villains, or even heroes. There’s a pleasing messiness to the forces at work.
Sometimes the author’s research shows a bit too much. There are digressions into explanations of Brehon law that threaten to derail the narrative.
Overall though, this is an engaging and vivid retelling that just makes me want to spend more time in this world.
From: Stuff & Nonsense
I added a spring mode to my animated SVG landscape
I’ve added a “spring mode” to my animated SVG desert. Flowers bloom, colours shift, and the whole scene feels more alive—all without creating a separate version. Instead, I’m layering changes on top of the same SVG and letting CSS and JavaScript do the work.
Flowers are blooming on my website, courtesy of a new ‘Spring mode,’ which adds new colours and animations. Spring’s definitely sprung, and it’s a wonderful time to be in the desert.
My spring home page graphic animation
Visit my home page to see this in action. Flowers bloom on the cacti and between the craggy rocks, turning a dry landscape into something more alive.
Instead of creating a separate version of the animated SVG scene, I treated spring as a new layer of behavioural and visual changes and applied it to the same SVG. That meant I could reuse the structure and progressively enhance it with animation, colour, and details.
How I layered seasonal changes in SVG
Adding spring to my animated SVG landscape meant introducing a few new layers:
A static layer to recolour the background
Blue, purple, red, white, and yellow flowers
The static layer sits above the base illustration. It lightens the clouds, shifts the sky to blue, and warms the rocks into sandier tones. I treat this as a seasonal mode or reusable layer that changes how the same SVG looks and behaves without duplicating it.
I’m layering changes on top, keeping everything flexible and making maintenance easier. This isn’t just about SVG; JavaScript controls the state, and CSS defines how it looks.
Spring mode flowers
How the mode works
JavaScript determines which mode the animated SVG scene is in. It handles switching, prepares the flowers, and remembers a visitor’s choice when they return. CSS handles how that mode looks—changing colours, revealing elements, and animating them into view. This all hinges on adding a spring-mode class to my SVG.
How flowers are animated
Flowers are hidden by default and become visible when spring mode is active. JavaScript assigns each flower a slightly different delay, so they appear in a scattered sequence across the landscape without an obvious pattern. Each flower starts hidden and scaled down:
opacity: 0;
scale: 0;
visibility: hidden;
When spring mode is active and motion is allowed, the flowers play a short “pop” animation:
Animations only run when visitors haven’t asked for reduced motion. If they have, flowers appear without animation. It’s a small detail, but it keeps the experience inclusive without compromising the design.
The result
Spring mode offSpring mode on
Use the flower button to toggle spring mode and see how these layers transform the scene.
Why this approach works
Treating spring as a mode rather than a separate design keeps everything lightweight and flexible. I can evolve the same SVG over time by adding seasonal or thematic variations without rebuilding it from scratch.
Plus, I love that these animated SVGs keep giving me new ways to play with my website.
From: Stuff & Nonsense
Last week in the studio (CW16-26)
I thought it might be interesting to document what I work on during the week, so I started a regular “Last week in the studio” series. Last week was a bit productive but bitty.
Week 16, 2026: Mountain Duck and Ryan Knaggs get finished
I don’t enjoy bitty weeks as much as when I’m able to concentrate on one thing for the entire week. Still, it was satisfying to get a few things tucked away.
Mountain Duck
The fellas at Iterate came back with a couple of corrections and suggestions for their animated graphics. The biggest change meant thinking about how to include the desktop as a destination, as I’d already done with the “cloud,” without altering the composition of my graphics.
Mountain Duck home page animated graphic.
And, of course, I couldn’t resist adding a hidden Easter egg to one of my animations.
Mountain Duck home page Easter egg.
Ryan Knaggs
I’ve been working with Arizona-based composer Ryan Knaggs for the past few weeks, and last week his photographer delivered a stunning set of studio portraits. This meant I could crop, edit, and drop them into my design. They look especially good in the interactive panels on Ryan’s new homepage.
Selection of pages from Ryan Knaggs’ new website.
This meant we could transfer Ryan’s domain name and push his site live, done and dusted within a month. I’ll write a proper post about Ryan’s design, but in the meantime, check it out.
Spring has sprung at Stuff & Nonsense
After my friend Rachael came over—and we spent a day setting up her soon-to-launch wedding planning business with an Eleventy-based website—I had an idea for a new graphic animation for Stuff & Nonsense to celebrate Spring.
The desert comes to life behind my Magnificent 7.
Head to the home page and press the spring flower button to watch the season change and the desert come to life.
From: Zeldman
Pete’s Presence
It was a spring that felt more like winter last week in New York; suddenly it feels like summer. After my air-conditioned bedroom, the living room and kitchen was like a walk-in oven. A weirdly yellow bulb lit the kitchen. The kids must have left it on when they went to bed. I made an […]
I don't want a screenshot of your Claude conversation
The number of screenshots of Claude conversations is going up in my life and it’s beginning to have an impact on my general mood. Most of the time it’s well-intended; coworkers working through a problem with a chatbot before bothering me or someone exploring unconventional ideas before bringing it to a broader audience. Both of those situations seem considerate. A tool for thought, as it were.
It’s probably good practice to do your own research before you rope in another person on a cognitive task. But a small thread in the reliability of these tools-for-thought begins to unwind due to the well-documented sycophantic nature of engagement-thirsty language models. One of my favorite studies is Anthropic’s own study (2023), when asked to review an argument with I wrote this [...], the LLM gave positive feedback. But if you start a new chat with I didn't write this [...] or give any hint of your own personal bias, it provides much more critical feedback. And the ultimate twist is, we prefer models that are super nice to us.
I was telling my son’s friend about this phenomenon and he responded with the perfect GenAlpha summation:
AI is a D1 glazer, bro.
We need to acknowledge that we’re probably getting the answer we want rather than a cold-hard fact. Not to get too serious but when I read about AI psychosis, I think the overly-confident “You’re a genius” style of reply is the point where it all starts to go wrong.
Awhile back Hidde De Vries identified a pain point around LLM-usage in standards work which leads to something I call an asymmetry of thought. In a conversation where one person is a domain expert and one person is copy-pasting ChatGPT responses, it creates an imbalance of effort in the discussion. A second-hand burdening, like Brandolini’s Law, where debunking inaccuracies and subtly-wrongs takes more effort than creating the inaccuracies. We are, in effect, taxing experts to do quality assurance on the model’s responses. When that work is unpaid I believe this is immoral… or at least it’s a breach in social etiquette.
In situations like that where people are using models as a form of appealing to authority, unless both parties have agreed that the LLM is a neutral arbiter, a random noise generator has the same amount of social authority.
So, when a screenshot or copy-pasted block of “Here’s what Claude said…” comes across my screen… I don’t care about the screenshot. I don’t care about the screenshot because I want your thoughts, not Claude’s. I want your unfiltered and half-baked ideas, not Claude’s synthesized extrusions. Instead of a screenshot of a reply, I’d rather have the original prompt so I can just ask the machine myself. At least then I’d know the context you provided the machine and your understanding of the problem, because that matters immensely.
A trite example that I deal with from time to time, if you ask an LLM “React or Web Components?” it will say “React” because that’s what was popular in the 2023 training data. But did you mention anything about different teams on different tech stacks? Anything about hitting memory ceilings? Context is everything to these machines and –as the disclaimers say– they can make mistakes. If we need anything more than an approximation, a language model might not be the right tool for the job.
Anyways, that’s my issue with other people’s chatbots weaving their way into my daily conversations. I’d rather have a human-to-human conversation with you, not a chat with Claude by proxy. What Claude said is an okay chunk of “anecdata”, but it’s not a substitute for our working relationship.
From: Zeldman
The Courage to Stop
Brevity was always a discipline. Now it’s a statement.
Alex and Chris talk about how the 2.0 Editor supports packages from npm. The trick is both simple and complex. The idea is simple. We detect the packages you want to use, list them in an (editable) package.json file, then turn that into a <script type="importmap"> in your HTML files that import those packages from […]
From: Codepen
Chris’ Corner: Share What You Do
I’ve always loved a good blog post of someone just saying what they use and do. Keerthana Krishnan has a good one here with Chrome DevTools Features I Use All the Time (and Why You Should Too). Cheeky parentheticals, Keerthana. Like, sure, I’ll read a blog post about new Chrome DevTools features, but I’m more […]
From: Dave Rupert
When moving fast, talking is the first thing to break
When you make speed and “moving fast” the biggest priority on a project or in an organization, the first thing to breakdown is talking to each other. Talking takes time. Consensus is expensive and slow. In a pressurized environment there’s no time to schedule calls, get input from subject matter experts, or resolve key differences of opinion. ASAP makes a big assumption that all relevant parties are already in the room.
Not everything needs to be a conversation. I’m a firm believer in “get the user something to see if there’s interest”. I’d agree that over-thinking a problem and under-thinking a problem both have pitfalls. But dozens of ways exist to get feedback from users on in-progress work without overcommitting to a particular design. By prioritizing speed over talking, cross-org collaboration suffers and a faulty design can steamroll ahead. I am no soothsayer, but I can tell you that you set your organization up for a messy merge conflict in the future between teams who have been traveling in different directions.
I think the second organizational casualty is “the system”. When speed is the priority, there’s no incentive to improve or invest in the shared system (e.g. a design system or codebase) under a tight deadline. If everyone needs to move fast, even something simple like renaming a folder could have dramatic setbacks. Hypermovers will create a new project folder or detach a Figma component. And that new folder of files grows to create it’s own duplicative system of components that are ever-so-slightly different such that they are incompatible with the rest of the system. Resolving system gaps requires conversations, it’s easier to eject from the system at the slightest inconvenience, duplicate, and go your own way. Effectively hiding the time bomb of technical debt for the next unfortunate sucker.
I think AI exacerbates this problem. I think AI can help you build faster (although data suggest otherwise), but I also believe that LLMs are the ultimate tool in the “Don’t talk to my coworkers” toolchain. Why talk to an expert who might tell me no, when the omniscient machine that always tells me yes is right here? Avoiding that friction doesn’t produce better products faster. It makes future conversations more difficult thanks to higher sunk costs and deeper entrenched opinions.
Other pieces of infrastructure begin to chip away when moving fast too: documentation, security, performance, reliability, the fabric of modern American democracy, and developer satisfaction to name a handful. I’m pro-reducing bullshit, I’m pro-reducing toil. But I’m also pro-slowing the fuck down and doing actual human thinking before pulling a trigger… or sending a laser-guided Tomahawk missile… or whatever action-based analogy works best for your organization.
We all love dopamine, we all love seeing new ideas come to life, but more lines of code and duplicate systems –our own little kingdoms in code– doesn’t produce horizontal strength. The job of Engineering Management is no longer pushing tickets across the board to make executives clap, it’s helping organizations row in the same direction together. It’s relentlessly focusing on your users over lines of code and cool project codenames.
From: Stuff & Nonsense
Last week in the studio (CW15-26)
As well as showing off work in progress on Sho!io, I thought it might be interesting to document what I’ve been working on here. So I’m starting a new regular “Last week in the studio” series.
Week 15, 2026: Mountain Duck
Some weeks are “bitty,” and I need to jump from one thing to another. Those are the weeks I find the hardest. Fortunately, last week wasn’t one of those, as I was able to concentrate fully on a set of animated graphics for a new website design for the Mountain Duck app.
Illustration intended for the Mountain Duck home page
This design and the illustrations that go into it are intended to portray Mountain Duck as a product that lets people work with files in cloud storage and servers, as if they were on a local disc. Everything works transparently in the background, and files always stay in sync, so people never need to worry about where their files are.
So I created a series of duck machines, with this one intended for the home page. Here’s that CSS/JS animated SVG on CodePen:
My intention was to make the illustration feel meaningful, mechanical, and playful using bubbles, moving background elements, and streams of files travelling through different parts of the scene. The result should look effortless, which usually means there’s a lot going on behind the scenes. I built this with inline SVG, CSS, and vanilla JavaScript.
SVG was the right tool
I wanted to target individual parts of the artwork directly, style them with CSS, and use JavaScript only where timing or spawning logic genuinely needed it.
Instead of treating the SVG as one asset, I structured it as a collection of moving parts: bubbles, buttons, cogs, dials, and file icons.
SVG structure matters, so I exported the static elements first and optimised them as much as possible by reducing the number of path points and merging them. Then, I brought in the animated elements one by one, adding CSS animations and the occasional bit of JavaScript as I went. CSS handles motion while JavaScript dictates when things happen and what values each instance should use. I made an initial pass for each animated element, then refined them over several iterations. This is the part I enjoy most. Not just making something move, but making it move in a way that feels intentional and natural.
More work from the week
This home page illustration wasn’t the only animation I made for Mountain Duck last week. There are several others which may find their way onto the new website I’m designing.
Additional Mountain Duck illustrations
All in all, last week was productive, and I feel good about what I achieved.
From: Stuff & Nonsense
Far Right So Wrong; Stop Reform t-shirts are back in my shop
The UK local and Senedd Cymru (Welsh Parliament) elections are a few weeks away. If, like me, you want to say a resounding “no” to far-right Reform and its bigotry, racism, and xenophobia, you might like to show it. My Stop Reform t-shirts are now back in my shop.
I have several Far Right So Wrong designs available, including these four.
Don’t vote for Nazis — £24
FCK RFM tee — £24
Stop Reform’s racism tee — £24
Rock Against Reform tee — £24
Available in sizes XS to 5XL. These organic cotton t-shirts are made from sustainable materials and printed in Teemill’s renewable energy-powered factory.
Every purchase helps fund HOPE not hate, an organisation dedicated to challenging the far right in Britain and building communities based on unity and compassion.
From: Zeldman
Jimmy Carter was right
What Carter did in his speech was something rare in the annals of democratic government: he confronted the people with the truth—about his own failings, about the reality of the world around them, and most importantly about themselves. Even as Americans grow, for the second time, disillusioned with a Trump presidency, we have put drapes […]
Stephen & Chris look at the UI of the 2.0 Editor and show all the control you have over what you’re looking at. Way more control than the Classic editor! We share some of the thinking behind it. Don’t miss the Omnibar! Time Jumps Links
From: Stuff & Nonsense
I got tired of correcting machines, so I gave them five rules
Although I feel deeply conflicted, I’ve been using AI coding tools more often to speed up particular aspects of development. Recently, I added an AGENTS.md to my setup so I don’t need to repeat my preferences.
Judge Dredd. Robot Wars. 2000AD comic.
I started using ChatGPT and DeepSeek to help me fix bugs and debug error messages, especially when I was new to working with Eleventy. I asked them questions, pasted in code, and then copied the result back into my project. Now, I use Codex to clone my boilerplate files and set up new projects. But whenever I started something new, I had to tell the machine my preferences again.
Machines don’t write code the way I do, so I constantly needed to reorder CSS selectors. Machines use too many class attributes and overly specific selectors, and don’t format CSS and HTML the way I like. When I switched to Codex, I realised there was a way to stop repeating myself by telling it ways to make the machine’s code more like mine.
The AGENTS.md file
Codex supports files called AGENTS.md, which is to a machine what a README is to fleshy ones. It can tell an agent what I care about and how I write code. It also defines a set of rules which prevent me from repeating myself at the start of every project.
You can add an AGENTS.md file to any project repo or put one into Codex’s hidden global config folder, which is in the root of your user directory (on a Mac.) Putting preferences there means that every new project starts using them.
~/.codex/AGENTS.md
I included a list of five things I was constantly correcting and needed the machine to stop doing. Here’s my global file:
# AGENTS.md## Core rules
- Prefer plain CSS and vanilla JavaScript.
- Prefer inline SVG when control, styling, or reuse matter.
- Use native platform features. Avoid dependencies and libraries.
- Use semantic HTML.
## CSS rules
- Don’t indent CSS declarations.
- Don’t use the `transform` shorthand property.
- Keep the closing curly brace on the same line as the last property.
- Order all CSS properties alphabetically.
- Prefer shallow selectors and avoid deep selector chains.
- Use individual transform properties (`rotate`, `scale`, `translate`).
## Motion
- Always respect `prefers-reduced-motion`.
- Motion should be subtle, purposeful, and non-disruptive.
- Use CSS for animation and JavaScript for triggers.
## Writing
- Use British English.
- Use sentence case for headings, interface copy, and labels.
Quickly running through that list:
1. By telling Codex I prefer native platform features, I get solutions that rely more on CSS, which is faster and much easier for me to work with.
2. Machines will also happily wrap everything in <div> elements unless I tell it otherwise. I want meaningful structure, so I ask it to prioritise semantic elements like <article>, <header>, <footer>, and <section>. I also work mostly with inline SVG because I need control over animation and styling, so I make that explicit too.
3. I’m especially picky about how I write CSS. Nothing AI did was technically incorrect; it just wasn’t my way of doing things. My AGENTS file tells the machine to write properties in alphabetical order, so I can scan them more quickly. I also want consistent formatting and simple selectors, so code stays easy to read.
4. When I animate, I’m often aiming for ambient motion to add atmosphere. I also need animations that respect someone’s motion preferences, not as an afterthought.
5. Finally, when adding UI copy such as button text and form labels, I want British English spelling in sentence case.
AGENTS.md as a project brief
A global AGENTS file gets used by every project, but putting one in a project repo makes it act more like a brief. Here’s the boilerplate file I use with Eleventy projects:
# AGENTS.md## Overview
- This is an Eleventy project.
- Follow existing patterns in templates, styles, and naming.
- Make the smallest change that solves the problem cleanly.
- Don’t write new code unless absolutely necessary.
## Structure
- `src/` contains all source files.
- `src/_includes/` contains layouts and partials.
- `src/css/` contains global and component styles.
- `src/js/` contains small progressive-enhancement scripts.
## Working approach
- Don’t refactor unrelated code.
- Reuse existing patterns before creating new ones.
## HTML
- Don’t add unnecessary wrapper elements.
- Reuse existing partials where possible.
- Use semantic HTML elements.
## CSS
- Extend existing styles before creating new ones.
- Follow the global AGENTS.md for formatting and style rules.
- Keep selectors shallow and readable.
- Place media queries at the end of stylesheets.
- Use `.alt-*` for variations and `.item-*` for content types when needed.
## JavaScript
- Always use progressive enhancement.
- Don’t use JavaScript if HTML and CSS can solve the problem.
- Keep scripts small and vanilla.
- Scope behaviour to the relevant component or page.
## Eleventy
- Don’t duplicate already defined logic.
- Reuse existing collections, data files, and filters.
- Check if the content fits an existing collection before creating a new one.
## Verification
- Run the local build before finishing.
Wrapping up
I started using AI coding tools to free up time by avoiding repetitive tasks. AGENTS files define the rules the machine should follow, so I don’t have to also spend time editing its code to suit my style.
We rolled out adaptive light-dark() support on our design system themes and it’s been a delightful upgrade. Creating light and dark variable sets isn’t difficult, but delivery has trade-offs. Most apps that do this probably ship both sets of token values in a single stylesheet. That’s fine until you have multiple kilobytes of duplicate definitions. To get around the performance problems we built two separate stylesheets –which is also not great– but my coworker Zacky found a good trick with <link disabled> to make it tolerable. Ultimately, we wanted to offer a single stylesheet for our human (and agent) friends to control theming.
Having light-dark() makes it trivial to support dual color modes in a single stylesheet and doesn’t add too much weight (0.5kb gzip for ~500 variables). It also gives you the ability to switch themes mid-page.
Adding [data-theme="dark"] to the body, or any element with color tokens defined, will force that section to be dark mode. The difference here between hanging variable definitions off a class is that you can respect the user preference without using JS to toggle, light-dark() does all the work.
Adding dark tier on a light theme is dramatic. Adding light tier on a dark theme sure would stand out. But when yielding light and dark modes over to the browser… something changes. In that situation hardcoding a theme mode into HTML loses a bit of meaning because I’m not controlling the theme anymore, the user is. What I actually want is the theme to be “opposite” the current theme. After a handful of attempts I think I came across a solution that’s easy to understand, maintain, and I even wrote a polyfill for you.
The goal was to make it so that when the browser switched from light/dark modes, themed elements would switch to their inverse theme. The trick I uncovered was setting the current theme as a CSS variable:
:root{color-scheme:lightdark;/* Initialize the theme variables */--theme:light;@media(prefers-color-scheme:dark){--theme:dark;}}/* Have data-theme use the variable */[data-theme]{color-scheme:var(--theme);}/* Update hard-coded themes to use the variable */[data-theme="light"]{--theme:light;}[data-theme="dark"]{--theme:dark;}
The reason we use manage --theme variable instead of purely color-scheme is because we can pass that into a style() query. An that’s the magic that enables inverted themes:
Again, the nice thing here is that we’re not creating two different trees of variables or re-redefining variables inside [data-theme="inverted"], we’re relying on light-dark() and color-scheme to do the heavy lifting. We’re contextually updating the color-scheme and letting the browser negotiate the cascade.
I added a .funky card theme to the demo to give an idea of how far you might be able to push this tech. Roman Kamorov noted in his post on Querying the Color Scheme something Vadim Makeev said on a Russian podcast that while this inversion trick is neat, people who prefer dark-mode (e.g. for medical reasons) probably want dark mode and not to be flash-banged mid-page. That’s something to think about and I think I have some ideas about that but I’d love to see/hear yours.
Polyfilling browser support
At the time of writing this trick only works in Safari 18+ and Edge/Chrome 111+. Firefox is the outlier but the good news is container style queries is on the roadmap for Interop 2026 and behind a flag in nightly. That gives you two options:
Roll out a bespoke polyfill for [data-theme="inverted]
Do nothing. Wait it out.
Given that I know the experience will auto-upgrade for Firefox users at some point this year, I’m prone to wait it out per the rules of progressive enhancement. If it falls back to the current theme, I don’t think the world falls over.
However, you probably support browsers outside the latest version and what’s acceptable for a fallback depends on your company’s understanding of the eventual consistency of browsers. iOS devices version-locked at Safari 17.4 are of particular concern for me, so I wrote an inverted theme polyfill.
The CSS style-query-support detection is pretty simple, but quirky.
/* Style query support check */body{--syle-query-support:0;}@containerstyle(--theme){body{--syle-query-support:1}}
There’s a new @supports at-rule() function that would be more idiomatic, but you can’t detect at-rule function support with at-rule() so we have to do this variable hack. Ideally we could do this purely in JS with CSS.supports(), but alas. Booleans in CSS, what could go wrong?
That brings us to the JavaScript part which is pretty simple as well but comes with one big potential tradeoff…
/**
* Polyfill for inverted themes using a `--theme` variable in a style query
* ⚠️ The use of `getComputedStyle` can trigger layout and style recalcs
*/(()=>{constisContainerStyleQueriesSupported=()=>{constbodyElStyle=getComputedStyle(document.body);consthasStyleQueries=bodyElStyle.getPropertyValue("--syle-query-support");if(hasStyleQueries==="1"){returntrue;}returnfalse;}if(!isContainerStyleQueriesSupported()){constinvertedThemes=document.querySelectorAll('[data-theme="inverted"]');invertedThemes.forEach((el)=>{constelTheme=getComputedStyle(el).getPropertyValue("--theme");constinvertedTheme=elTheme=="light"?"dark":"light";el.dataset.theme=invertedTheme;})}})();
Because we need to get the computed value of --style-query-support, getComputedStyle is known to trigger style recalcs and layout reflows, effectively penalizing all users not just browsers that don’t support container style queries. I tested this out by putting the polyfill inside a setTimeout, turning on paint flashing, and checking the Performance Monitor panel and I didn’t see any recalcs or layout reflows, but your mileage may vary depending on your setup.
Anyways, happy inverting! Let me know if you do something cool with it or if you already figured this out 10 months ago and I didn’t see your blog post.
From: Codepen
Chris’ Corner: Design
Perfectionist? So how can you tell when your perfectionist traits, which in many ways have aided your creative prowess, have gone too far? If you’re prone to obsession, especially when it comes to work, there’s always a way to justify why it’s worth the agony. But, as Siqi, renald and Pablo attest, getting bogged down […]
From: Chris Coyier
Help Me Understand How To Get Jetpack Search to Search a Custom Post Type
UPDATE: I’m just gonna put the answer at the top of this blog post to help anyone finding this. Do these things: Once all that is in place, doing a manual sync is in order at https://wordpress.com/settings/manage-connection/{YOUR_DOMAIN} And now the original post… I’ve got a Custom Post Type in WordPress. It’s called docs because it’s for […]
I’ve heard the term “Ozempic face” for awhile. People have opinions about that one, but I tend to feel like we should be comfortable with bodies changing. There’s also “Ozempic butt” and there’s even “Ozempic penis”. I’ll let you search those up on your own but they’re also related to physical changes from losing weight.
I started Wegovy, a GLP-1 like Ozempic, in December and the weight line is trending down down. That’s a good place to be and while I’m not experiencing any of the above symptoms, there has been one noticeable change. One thing I wasn’t prepared for was a change to my dreaming and sure enough “Ozempic dreams” are a thing (at least on Reddit).
Since starting GLP-1 my dreams have been much more vivid. Colors are more colorful. Weirdness more weird. People more real. Dialogue more rich. Storylines are more complex and multi-layered, not linear. If I wake up in the middle of the night I can seamlessly resume at the previous checkpoint.
They nearly fall under the category of “lucid dreams” where you know you’re dreaming and can control them. It’s not every night, but when it happens I sleep harder and wake up more rested. Like most dreams I don’t remember the details after waking up, but I do remember the sensation of “Wow, this is a wild and complex dream.”
I’m curious what’s causing it: change in diet, calorie deficiency, blood sugar, or (as some claim) a hormone in the GLP-1? I don’t know and realize my experience is entirely anecdotal hearsay, but what a weird yet welcome side effect. Is this what dreams are like for people with better peptides?
From: Dave Rupert
Before I go: People like it when other people make things
I’ve watched a billion hours of YouTube and I’ve noticed a common trend: Whether that’s a drawing, a video game, a song, a cake, or a whole-ass off-grid house; I’ve learned that it’s fun to watch people make something. Since the beginning of humanity, the act of slapping two rocks together to make an arrowhead or a fire will draw a crowd. I feel like mankind has an innate curiosity to pause and say “Oooh, whatcha making?” We like it when others make. This might not even be unique to humans, have you ever seen a bowerbird nest? Incredible.
The Maker Movement harnessed that creative attention energy and built an entire subculture around it. I’ve been watching the same guy make a musical marble machine for ten years. Practical effects artists Adam Savage and Jamie Hyneman built their entire TV show Mythbusters around this premise. We are problem solvers, all of us. The process can often be as enjoyable as the final object. I’d go so far to say they built the empires of YouTube, TikTok, and Instagram on the same principle: it’s fun to watch (hot) people make something even if that “something” is a video about fingernails.
I harp on my kids from time-to-time about making. We’re pretty permissive about device time but I frequently try to impart that we give them these devices as tools for creativity, not just brainrot. Kids are innately creative, so they understand my intent. But black rectangles are powerful energy vampires. From time to time though I’m blessed with an artwork, animation, a short film, an overdubbed movie trailer, or a half-built Roblox game. And those go on the proverbial refrigerator in my heart.
I suppose there’s limits to this thesis. Watching someone make a murder machine wouldn’t be fun. Watching someone make war, not fun.
Watching someone make numbers by typing into the random number generator isn’t that fun. But if there’s some novel, reason, or idea behind it… you could convince me it isn’t slop. I don’t particularly find the medium of decoupage enjoyable but with the right artistic mindset, curiosity, or obsession… sure? And if a bird assembles a house from trash, well I love that.
Some like to draw thin blurry lines and some prefer to draw thick crisp lines, I love to see and read both. And I’m glad the term “slop” exists because we as a creative species created a label for the abstract idea of thoughtless outputs from a thoughtless content extruder.
So, make something. Or not. I don’t care. Actually, I do care. Please make something. With your hands, or your brain, or your feet… wait, no that has other connotations.
From: Stuff & Nonsense
How I designed an information-rich website for The Shared Homeland Paradigm
I designed an information-rich website for The Shared Homeland Paradigm, using typography and graphics to clearly and visually explain complex political ideas. Here’s how I approached it.
The Shared Homeland Paradigm is a collaboration between A Land for All, University College London (UCL,) and the University of the Pacific. The project aims to develop a new conceptual basis for configuring space and rights in Palestine-Israel. The project came via a recommendation from ClearLeft.
Typography design
I always start with type, because it sets the tone for everything else, and I’ve developed a process for selecting type that balances personality with readability. For this project, I needed a readable typeface which isn’t overly academic-looking.
That process lets me shortlist a handful of typeface options to present to a client. I don’t ask clients to make the decision, as that’s my job. Instead, I help them respond to how type feels. I asked the team about which typefaces “felt right” to them.
Shortlisting serif typefaces and what they say.
Understanding the voice
Typography isn’t just about readability—it’s about a typeface’s tone of voice. I always demonstrate the characteristics of several typefaces to find out what they say. Are they neutral or opinionated? Approachable but still serious?
Shortlisting sans-serif typefaces and what they say.
I explore how they look in branding, especially an organisation’s name, as that provides the first impression and can set the tone for the rest of a design.
Shortlisting typefaces and discussing what they say.
Then, I test typefaces in real contexts—headlines, lists, and paragraphs—so I can see how they behave in the design, not just in isolation. I create what I call type sheets and always use copy as close as possible to what I’ll be setting in the design. If copy’s not available—which it often isn’t at the start of a project—I write my own, rather than use dummy lorem ipsum.
Close-up of individual letterforms.
I study individual letterforms, looking for specific characters that can either add personality through a distinctive design or could be dealbreakers if they don’t look or feel right.
Checking numerals and special characters.
I also look at the design of numerals and special characters, which is important when client content will contain facts and figures.
Finally, I settled on Bankside Sans—designed by Dalton Maag. Bankside Sans has “clear, classic letter shapes (that) convey intent, while its extreme widths deliver impact.” It has a license fee that’s well worth paying for a variable font that perfectly balances approachability and seriousness.
Working through creative concepts
One of the parts of a project I enjoy the most is thinking of creative ways to tell stories through my choice of graphics, illustrations, and photography. Looking back through my folders, I’m reminded how many ideas never make it past a first iteration—and that’s never a failure. Design decisions are often subjective, so every attempt becomes a conversation.
First concept: Birds from the Middle East.
My first creative concept included illustrations of birds which are native to Israel-Palestine, including the Eurasian Hoopoe and the Palestine Sunbird. Birds cross national boundaries, and using them seemed like a concept worth developing. But the Shared Homeland Paradigm team thought differently.
Second concept: Topographical and ancient maps.
Instead, I incorporated topographical maps of the region and other ancient maps which were drawn before the state of Israel was formed. This idea resonated with the team.
Designing the colour palette
Colour is highly evocative and needs careful consideration, especially when dealing with sensitive subjects like Israel-Palestine. I started by studying the colours in the region’s flags, avoiding Israeli blue, and Arabic green and red.
Flags from the Middle East.
First, I devised a new set of colours which have cultural associations for people in the region and included:
Yellow: Happiness, optimism and warmth
Orange: Love, happiness, humility and health
White: Absence of colour, represents death and mourning
Black: Can represent rebirth and mourning
Colours with cultural associations.
Then, I created a second palette of blues, greens, and greys, which represent the earth, sea, and sky.
Colours with blues, greens, and greys.
This second palette combined well with a set of simplified shapes, which represent populated areas overlaid on a map made before 1948.
Blues, greens, and greys in shapes for the home page banner.
Pulling everything together
The Shared Homeland Paradigm team needed a website on which they could add:
Background papers
Resources
Scenarios for peace in the region
Terms for their Alternative Lexicon
To make that happen, I developed their website using the open source Eleventy CMS (Now Build Awesome.)
When I design content-rich websites, I use layout, typography, and graphics to tell the story—not just the words on the page. This project brought together everything I care about in story-led web design—graphic design, layout, and typography, working together.
Selected pages from my design for The Shared Homeland Paradigm.
My typeface choice echoes their voice, and the SVG graphics help to tell their story. For organisations like The Shared Homeland Paradigm, a website isn’t just about presenting information. It’s about helping people understand complex issues and engage with them. Websites that make more people aware of sensitive subjects, help them understand the issues, and show how we might solve them are always the ones I want to work on.
From: Chris Coyier
Hawai’i
I’m just back from the United States 50th state, a staggering 2,500 miles from the mainland. For the next week or two, I’ll pronounce it Ha-Vie-ee, like how it’s pronounced in the native Hawaiian language. A language, by the way, that only a few thousand people speak natively, no doubt due to the 91 years […]
From: Stuff & Nonsense
A bold new website for the Academy of Scoring Arts
The Academy of Scoring Arts just launched its new website. It’s a community of arrangers, composers, and musicians that helps industry professionals develop their craft through events and video tutorials.
The Academy of Scoring Arts is for professionals at every stage of their careers, so the website needed to do more than present information. It had to clearly communicate the benefits of joining, make video content easier to discover and consume, promote events, and ultimately increase member sign-ups.
A bold new website for the Academy of Scoring Arts
A clearer, more confident direction
This was a redesign of a membership-focused website for a music organisation, with a strong emphasis on conversion, content discovery, and editorial-style layout. The Academy of Scoring Arts’ previous website felt bland and dated. It lacked a clear visual identity, and the benefits of joining weren’t obvious. I wanted to change that. The new design is bold, confident, and more expressive—better reflecting the energy of the Academy’s community while still looking professional.
That meant walking a fine line between personality and professionalism. Too safe, and the design fades into the background. Too expressive, and it risks undermining trust.
Typography as the defining element
Type plays a central role in the design. I chose Bankside Sans by Dalton Maag. It’s an early British grotesque reinterpreted for modern use, with clear letterforms that give it authority, while its extreme widths add impact and flexibility.
I used it to establish a strong, consistent voice across the site:
Bold, condensed headlines
Careful attention to typographic detail
Layouts which rely on type as much as imagery
The result is a design where type isn’t just functional, it’s a defining characteristic.
A restrained colour system
The colour palette I chose is deliberately limited. Light and dark form the foundation, with just two accent colours used sparingly. There’s no shading or visual noise—everything is clean, direct, and intentional. This restraint helps the typography and layout do more of the work, and gives the site a confident, considered feel.
Structured layouts with editorial influence
Unlike some of my more expressive work, this design uses a straightforward 12-column grid. But within that structure, I leaned heavily on modular, editorial-inspired layouts—particularly for the video library and gallery.
These modular systems:
Make content easier to scan
Create rhythm and variation
Allow the design to scale without becoming repetitive
It’s a reminder that even a conventional grid can feel distinctive when it’s used with intent.
Designing for clarity and conversion
The most important goal of this project was to increase member sign-ups. That meant making the value of joining obvious, and reducing friction wherever possible. I focused on:
Better organisation of video content
Clearer messaging around benefits
Deliberate calls to action
Stronger visual hierarchy
The result is a website that looks better—and works harder.
Interaction and detail
The interaction design for The Academy of Scoring Arts is subtle. There are no large animated elements, just micro-interactions and hover effects that add polish without distracting from the content.
Left: My design prototype. Right: The live website.
Bringing it all together
This project reinforces something I believe strongly: even with conventional content and a standard grid, a website can feel distinctive, communicate clearly, and drive real results when design decisions are made with intent. I’m especially pleased at how well Sush Kelly implemented my design into the Academy’s WordPress CMS.
Websites like this, for The Academy of Scoring Arts, is the kind of work I like to focus on—designing websites for creative organisations where editorial layout, typography, and structure work together to improve clarity and conversion.
From: Stuff & Nonsense
How I designed an animated SVG-driven website for composer Begoña Pereda
I designed a website for composer Begoña Pereda using typography and animated SVG graphics to reflect her personality and musical style. Here’s how I approached it.
Living and working in Mexico City, Begoña Pereda is a composer for films and video games. She’s an up-and-coming young artist who collaborates with filmmakers and makes music that supports video gameplay and narratives. Bego came to me on the recommendation of another composer client.
Bego was looking for a website to demonstrate her work and introduce herself to new clients. She wanted something which reflects her interests, personality, and the experience of working with her. This is exactly the type of project I love to work on.
Type design
I always start with type, because it sets the tone for everything else. I’ve developed a process for selecting type that balances personality with readability. The typeface Bego chose for her YouTube showreel gave me some idea of the style she preferred: irregular, quirky, and unconventional.
Inspiration from Bego’s YouTube showreel.
Over the years, I’ve developed a process that lets me shortlist a handful of typeface options to present to a client. When I do that, I don’t ask clients to choose typefaces—that’s my job. Instead, I help them respond to how type feels. I asked Bego about which typefaces “felt right” for her and how she wanted to express herself.
Shortlisting typefaces and discussing how they feel.
Understanding the tone
Typography isn’t just about readability—it’s about how something feels. That can be very subjective, so I always demonstrate the characteristics of several typefaces to find out how they make someone feel. Are they formal or informal? Approachable but still professional?
Shortlisting typefaces and discussing how they feel.
I explore how they look in branding, especially a person’s name, as that is possibly the most personal design element I can work on.
Pairing expressive display type with readable body text.
Testing type in context
I also need to bear in mind other typefaces I might include in a design. In Bego’s case, this involved evaluating how the combination of a highly stylised typeface with another, more readable one for setting longer passages of text.
Ensuring type is legible in both upper and lowercases.
For stylised typefaces like this one, I need to understand how much text I can set and the size I need to make it legible in both upper and lowercase.
Ensuring type is readable at various sizes.
Writing copy for type testing
I always test typefaces in real contexts—names, paragraphs, and combinations—so I can see how they behave in the design, not just in isolation. I create what I call type sheets to determine at what size I should switch to a more readable typeface. I always use copy as close as possible to what I’ll be setting in the design. If copy’s not available—which it often isn’t at the start of a project—I write my own, rather than use dummy lorem ipsum.
Close-up of individual letterforms.
I study individual letterforms, looking for specific characters that can either add personality through a distinctive design or could be dealbreakers if they don’t look or feel right. This can be especially important when considering the letters in a company, person, or product’s name.
Checking numerals and special characters.
I also look at the design of numerals and special characters, which is important when client content will contain facts and figures.
Ensuring full language support, including accented characters.
For someone like Bego, who speaks Spanish, I also need to ensure that any typeface I choose includes any accents, special characters, and punctuation we don’t have in English.
Fido, designed by Canada Type.
Finally, I settled on Fido—designed by Canada Type—for branding, headlines, and short blocks of text, and paired it with Archivo Condensed—by Omnibus-Type—for longer passages of copy. Archivo is available from Google, whereas Fido has a license fee I was happy to pay. This combination gave me a typographic system that felt distinctive but still readable.
Animating SVGs with CSS and JavaScript
I use a combination of CSS and JavaScript to animate SVG graphics—CSS for continuous motion and JavaScript to control when animations start and stop.
Bego loves retro music tech, especially cassette tapes and reel-to-reel tape recorders. I wanted to recreate them both using SVG and explore ways to connect animation with playing her music.
Recreating retro music technology using SVG.
In my cassette tape, I created a base layer which contains its static elements. I optimise SVGs by reducing points, merging paths, and stripping unnecessary data to keep them lightweight. After optimising it with SVGOMG, the cassette graphic weighs less than 12 KB.
Separating animated and static elements in SVG.
I separate every SVG into a static base layer and independent animated elements. That way, I can control motion without affecting the rest of the graphic. Then, I added the animated elements, including the cassette spools and tape, which moves between them.
Bego’s animated SVG cassette tapes.
By naming paths and carefully structuring the SVG, I can reuse the same graphic in multiple variations—changing colours, labels, and details without duplicating the artwork. I was able to make as many cassette versions as I needed, with different colour branding, labels, and plastic cases.
Bego’s animated tape reels and covers.
I used the same approach for Bego’s animated tape reels and covers, where the reel slides out of its cover when the cursor moves over it.
Combining CSS animation with JavaScript control
For more complex interactions, I use JavaScript to control when animations run, rather than how they move. The large reel-to-reel tape recorder on Bego’s home page was by far the most complex graphic, even though it again weighs less than 12 KB.
A more complex SVG built with performance in mind.
I broke this graphic down into its animated and static components.
Breaking the SVG into static and animated parts.
I use CSS for continuous, predictable animation like rotation and movement, and JavaScript to control state—starting and stopping animations based on user interaction or audio playback. CSS handles the motion, while JavaScript adds an is-playing attribute so animations only run when Bego’s music is playing.
Using JavaScript to control when CSS animations run.
Designing for interaction
Static deliverables like PDFs, and even interactive tools like Figma, can give an indication of how a design will feel. But they can’t replicate the experience of interacting with a real website. For that, I need to work in the browser using HTML, CSS, JavaScript, and SVG.
Designing and testing interactions directly in the browser.
I spend several days experimenting with interactions—building, testing, and revisiting a design repeatedly to ensure it still feels right. If it doesn’t feel right in the browser, it isn’t right, no matter how good it looked in a mockup.
Refining interactions through repeated testing.
Bringing it all together
When I design portfolio websites for artists like Bego, I try to express who they are, not just present their work. This project brought together everything I care about in web design—animation, illustration, layout, and typography working as a single system.
The type choices shaped the tone. The SVG graphics gave the design personality, and animation brought it to life—subtly, but meaningfully. For artists like Bego, a website isn’t just a portfolio. It’s an experience. And that experience should reflect not just what they make, but who they are.
That’s what I’m always aiming for.
From: Boagworld
Your AI Toolkit Is Your Competitive Edge
If you’ve followed my work for any length of time, you’ll know I have strong feelings about one-size-fits-all processes. What we bring to the table as UX professionals isn’t a fixed methodology. It’s a toolkit of approaches (top task analysis, persona creation, customer journey mapping, diary studies, surveys) and, more importantly, years of experience knowing […]
My social feed has divided mostly into two camps—those who can now only talk about how excited they are about AI, and those who are refusing to use it at all. I’m somewhat bemused by both of these positions, I see LLMs as a useful tool, in the way that I see spreadsheets as a […]
From: Codepen
Chris’ Corner: Even Grids
It’s always interesting observing multiple people attack the same problem. Sometimes they aren’t even aware of each other. Like how Isaac Newton invented calculus in the mid 1660’s in England, then Gottfried Leibniz did the same a decade or so later, independently (or so it is said). I just read Ibrahim Bendebka’s recent take on […]
From: Zeldman
RSS creator on Bluesky & AT Proto
Bluesky can't abandon the developers who made a bet on AT Proto, so they should give the protocol to a standards body while catching up on UX.—Dave Winer
The Gell-Mann amnesia effect is a cognitive bias describing the tendency of individuals to critically assess media reports in a domain they are knowledgeable about, yet continue to trust reporting in other areas despite recognizing similar potential inaccuracies.
Summarizing, AI sounds like an incredible genius synthesizing the world’s knowledge right up until you ask it about the thing you know about, then it’s an idiot. Even knowing about this phenomenon and having experienced it countless times, LLMs have an intoxicating quality to them.
If there’s one thing LLMs do well, it’s delivering an enormous blast of dopamine if they do a good job on the first try. That “if” does a lot of heavy lifting, but when it happens you start to believe the idea that the multi-modal chat box could make you faster and infinitely capable. A hop and a skip and hundreds of dollars in tokens later, you made something that would take lifetimes of learning to create.
The marketing around Generative AI is that every person can be their own Designer, Developer, Researcher, Content Writer, Video Producer, and Podcast Editor. With the right skills.md files everything will fall into place. We will automate all automatable tasks. The experience will be “frictionless”.
You’ll be able to automate away the jobs you don’t enjoy…
And the jobs you don’t know how to do…
And the people who do those jobs…
The people you don’t enjoy…
You won’t need to talk to or wait on anyone. You can automate away anything or anyone that stands in your way. You will reduce costs. You will be richer. It will be frictionless.
Sometimes I feel like there’s a palpable tension in the air as if we’re waiting to see whether AI will replace designers or engineers first. Designers empowered by AI might feel those pesky nay-saying, opinionated engineers aren’t needed anymore. Engineers empowered with AI might feel like AI creates designs that are good enough for most situations. Backend engineers feel like frontend engineering is a solved problem. Frontend engineers know scaffolding a CRUD app or an entire backend API is simple fodder for the agent. Meanwhile, management cackles in their leather chairs saying “Let them fight…”
I think it’s a dangerous place to be when we start to consider people as friction.
That’s because we know Gell-Mann is real. We know there’s an optimism bias the size of the sun blinding us to the actual quality of what the machine is producing. We need knowledgeable people to share what they know to improve the quality of our work, generated or otherwise. We even need ignorant people to make sure we can break ideas down into their simplest form that everyone, agents or human, understand. People can have bad attitudes, be shitty, and have wrong opinions… but people are not friction. An LLM may be able to autocorrect its way into a plausible human response, but it’s not people. It doesn’t care if it’s right or wrong. The money and hype surrounding it acts as a shield to its reputation. LLMs make up answers if it doesn’t have enough context and they fall over if it has too much context. It amplifies good patterns the same as bad patterns. And it glazes you with flattering language the entire time so that chart go up.
People, the context-bearers, have experience and capabilities that machines might never understand encoded in our muscles and memory. I’m on record saying I despise nuance –and I do– but it’s more important than ever to be able to connect to our fellow humans over this nuance so our world is not paved over by contextless opinions from ill-informed robots. Empower and believe people over machines.
From: Rachel Andrew
Look into the future of the web platform
Last week I spoke at the very lovely Web Day Out in Brighton. My talk was about browser support, based on the work I’ve done over the past almost five years on Baseline. I ran through the various things you need to consider when deciding whether to use features that don’t meet your Baseline target. […]
From: Codepen
Chris’ Corner: Processing
The other week when I was talking about Web Components in the Corner, I mentioned zero-md, a nice little Web Component for doing exactly that. I had to bite my tongue a little bit though, as the 2.0 public beta hadn’t quite made it out of the door yet. See, the new compiler, among its many […]
From: Zeldman
Too Many Notes
Lately, in work conversations, I find myself fighting a lifelong tendency to provide way more context than is absolutely required. If you ask me to okay your work, for example, I may respond with an essay on what delighted me about it. The teaching gene, plus the exuberance of writing and thinking clearly, compel me […]
Cover art for the 1971 prog-rock LP “Fearless,” by British band Family features a distinctive, die-cut cover design depicting the five band members gradually morphing into a single entity combining features of them all. Tom Brigham, a high school student and friend of mine the year the LP was released, had not yet invented morphing […]
Generative UI: useful, or just chaos with better branding?
It can personalize and reduce friction. It can also wreck consistency and muscle memory. Here is my take on the latest buzzword.
From: Codepen
420: What are Blocks?
With CodePen 2.0, we’ve got a new word we’re using: Blocks. A way to think about Blocks is anything that processes code. They are added as steps to the CodePen Compiler as needed. For example, TypeScript is a block, because it processes files in the TypeScript syntax into JavaScript files. But something like Lodash is […]
From: Codepen
Chris’ Corner: Anchors
As of January, with Firefox 147’s release, Anchor Positioning is supported across all major browsers. I’m happy about that, of course. I think Anchor Positioning is really powerful and a layout mechanism we probably should have had a long time ago. My enthusiasm was tempered when I found out how finicky it can, simply not […]