Teaching a company to value something it doesn’t care about is considerably the hardest sort of work you can do, and it often fails, so you should do as little of it as you can, but no less.
A visual language for music and time
I’ve remarked before on my gratefulness for CSS as the ubiquitous and expressive visual language of our times, a sort of design Esperanto (that is actually widely spoken).
One would struggle to find a more perfect example of this than Scribe, by Stephen Band. Scribe is a custom element (<scribe-music>
) which renders responsive music notation in HTML and CSS grid.
Here’s an example, rendered inline via Scribe:
To really understand the magic happening here, you must read Stephen’s excellent blog post about how it all works.
It’s remarkable that this is possible using CSS, and even more remarkable that the language itself morphs to become a syntax not for describing elements on a web page, but to describe pitch over time. CSS as interface for the natural world.
Under the hood, Scribe uses markup like this to represent music in time:
<div class="stave bar">
<svg class="clef" data-pitch="B4">…</svg>
<svg class="flat" data-beat="1" data-pitch="Bb4">…</svg>
<svg class="head" data-beat="1" data-pitch="Bb4">…</svg>
<svg class="head" data-beat="2" data-pitch="D4">…</svg>
<svg class="head" data-beat="3" data-pitch="G5">…</svg>
<svg class="rest" data-beat="4" data-pitch="B4">…</svg>
</div>
Elegant, useful, and thanks to the hard-won stability of the web platform: durable for generations to come.
One might wonder, what other natural or mathematical systems might we be able to represent in CSS? Another example that crossed my feeds recently is time-based CSS animations by Yuan Chuan.
Yuan creates a variable in CSS representing time, and uses keyframe animations to increment the value of the variable by 1 every millisecond. Suddenly CSS has a timer, something powerful for generative art and animation where time itself is used as an input variable.
Need to adjust the frame rate? Easy:
/* 8 fps */
animation-timing-function: step(calc(86400000 / (1000 / 8)));
Yuan has some great examples of how this can be combined with functions in CSS like min()
, round()
, and newly added trigonometric functioned like sin()
, cos()
, etc. to create all sorts of useful effects. My favorite example is using all of this to create a clock with a perfectly ticking second hand.
In terms of representing natural systems in CSS, this reminds me of how often I’ve wanted to be able to generate and use random numbers in CSS at runtime. To my delight, it looks like that’s in the works.
I am someone that preaches expressiveness to a fault, but the truth is that I make decisions to scale all the time. I don’t necessarily see this as a compromise of values. There is beauty in trying to express something specific; there is beauty too in finding compromises to create something epic and collective.
New magic for animations in CSS
There are two new features coming to CSS that will make it much easier to further avoid JavaScript when implementing animations:
- Animating to and from
display: none;
for the sake of enter/exit animations. - Animating to and from the intrinsic size of an element (such as
height: auto;
).
Traditionally, animating something into or out of the screen (as opposed to just hiding it visually) required JavaScript to remove the element from the page after waiting for the animation or transition to complete. No longer!
When these new features land in browsers, you’ll be able to animate to display: none
like any other property using a keyframe animation:
.item {
animation: fade-out 0.5s forwards;
}
@keyframes fade-out {
100% {
opacity: 0;
display: none;
}
}
Neat!
You can also do the same thing with a CSS transition, but you’ll need to set the new transition-behavior
property to allow-discrete
for that to work. I can see something like * {transition-behavior: allow-discrete}
becoming a part of my CSS reset in the future to enable this behavior by default.
But what about the opposite case? You have an element that’s currently not displayed and you want to animate it as it appears. Again, we typically use JavaScript for this today to ensure the initial styles are set properly and our element doesn’t display visually on the page before it has animated.
Now, we can specify the starting style like this:
.item {
@starting-style {
opacity: 0;
}
opacity: 1;
transition: opacity 0.5s;
}
Elegant and useful. If you want to learn more about these new powers, I recommend checking out this post on the Chrome for Developers blog.
The second new feature coming to CSS is the ability to animate to and from an element’s intrinsic size. The most common use case for this is collapsible areas: we want them to be height: 0px
when closed, and when opened their height should be automatic based on the contents.
Because CSS has historically not allowed for animating to height: auto;
, we’ve had to use JavaScript to measure the height of the contents and animate to that pixel value.
When this feature lands in browsers, we’ll instead be able achieve this like so:
.item {
height: 0;
}
.item.open {
height: calc-size(auto);
}
The magic comes from the calc-size
function, which is a curious API choice—why not just use the existing calc()
function? Here’s a comment on the CSS working group’s draft for this feature that explains why.
These features are just a few of the many ways that CSS is growing and becoming more powerful and expressive. To learn about all of the other great new things coming, check out this excellent video by Una Kravets from Google I/O.
Una says that we’re in the golden era for web UI, and I couldn’t agree more.
This state of affairs goes beyond compassion fatigue. Our around-the-clock overexposure to global human suffering, our daily feed of what we once considered catastrophic events — political, ecological, cultural — when combined with diminished attention spans, smaller and smaller chunks of content, and baked-in cross-platform imperatives to remain emotionally removed from any given person, place, or event, adds up to a kind of merciless sterility and an impatience with meatspace that we’ve never known before.
That’s the promise: you will live more curiously if you write. You will become a scientist, if not of the natural world than of whatever world you care about. More of that world will pop alive. You will see more when you look at it.
The interdisciplinarian is essentially an exile. Someone who respects no borders enjoys no citizenship.
I really appreciated this write up from Jeremy Keith about his personal approach and best practices for HTML web components.
Judging by the discourse, web components seem to be gaining in popularity lately, and I’m very here for it.
Trying to build on the web using a component model was what led me (and others I’m sure) into the arms of React many years ago. While I’m grateful for that journey, and still believe React is the right choice for many projects, it gives me a lot of comfort to know there’s a native tool I can reach for.
The tricky thing with web components, like the web platform in general, is the flexibility. What makes it so powerful can also make it hard to learn, and even harder to know if what you’re learning is the right or recommended path. It takes time for best practices to form and percolate.
The moon trees of Mississippi
Many of my online acquaintances know that I live in Chicago, but I suspect they might not know that I’m from a small university town in Mississippi called Starkville.
Starkville is home to Mississippi State University, where I attended college and studied Computer Science. In 2017 I graduated and moved to Chicago to start my career.
At the time I was excited to escape the place where I spent so many of my formative years, a place which was the symbol of mundanity for me and my youthful ambitions.
Seven years later and I’m having coffee and catching up on my inbox when I happened to find the latest issue of Claire Evans’ newsletter: a delightful story about moon trees—that is, trees grown from seeds that traveled to space and around the moon 34 times during the Apollo 14 mission.
Claire traces the history of the seeds, which were germinated into seedlings and given out to foresters across the country before being largely forgotten about and then eventually rediscovered and catalogued by NASA.
(By the way, don’t miss out on the wonderful website created to track the trees by a NASA archivist.)
Today less than 100 moon trees remain, but as Claire goes on to describe, there is a second generation of moon trees (so called “half-moons”) grown from the seeds of original trees that remain today.
The location of one of these mother-trees, though, is what caught my attention: it’s on the campus of Mississippi State University, my campus. All the times I walked past this humble tree I had no idea it had been to space.
It’s such a pleasant surprise to have this story appear in my inbox and show me something new about a place where I spent so much time.
While I lived there, I often felt suffocated by the mundanity of my home town. This has reminded me that there are things to appreciate and interesting stories (of perhaps cosmic proportion!) to discover in even the most mundane of places. We just have to keep our eyes open and remember not to take anything for granted.
If you’d like, you can buy a seedling Sycamore moon tree online descended from the one on the MSU campus.
The Cascade
Hearty congrats to Robin Rendle who has turned his wonderful CSS-focused newsletter into a good, old fashioned blog. The Cascade is beautiful, and is already full of great content for CSS nerds like me.
The site is, generously, free to read, but member supported for $10/year. Subscribing, for me, was an absolute no brainer.
I liked this bit from an issue of Robin’s personal newsletter that he sent after the launch:
There’s not enough words in the English language to describe how cool it is to build a little publishing machine. That rare, lightning-in-a-bottle feeling of throwing a few services together and building something greater than the sum of its parts.
It’s never been easier to create a website (a publishing machine!) for yourself or your interests. The feeling of ownership you’ll have compared to publishing on someone else’s platform is a powerful force in and of itself.
Many designers and design teams now find themselves in a place between strategy and implementation, yet they are not fully empowered to influence either. As soon as a digital product takes its initial step towards becoming real, designers are relegated to the role of advisors without the necessary tools to challenge assumptions at the C-suite level.
However, driven by a desire from businesses to turn design into a process-heavy, measurable function, we’re filling our time with checklists instead of focusing on the very thing that makes designers relevant: our ability to propose new points of view and delight users with meaningful experiences. These core competences that were inherited from graphic design have been replaced with a poor man’s version of an anthropology major where the act of design is mostly based on averaging user opinions.
Software is a creative industry with more in common with media production industries than housebuilding.
As such, a baseline intrinsically-motivated curiosity about the form is one of the most powerful assets you can have when doing your job. It helps you solve problems and come up with new ideas.
Similarly, in making websites, the only source of truth is the website people access and use. Everything else — from design system components to Figma mocks to Miro boards to research data et. al. — is merely a tool in service of the final form.
Algorithms are informational gatekeepers. AI search tools, in an effort to show us the most relevant content in the most efficient format, may actually make obsolete our ability to have an Internet that feels uniquely our own. “Surfing the web” very well may be a thing of the past. Already, my sources of information and trust online have splintered. I read about current events on Twitter. I listen to music on Spotify. I shop on Amazon. The browser is a navigation engine to reach these places, but the search experience itself is fragmented across these highly specialized platforms.
Boku no Natsuyasumi
Several months ago, in an issue of Spencer Chang’s newsletter, I discovered the 6 hour video review of a game called Boku no Natsuyasumi by Tim Rogers (known as Action Button).
To call this a review is surely stretching the limits of the word’s meaning as we know it.
Boku no Natsuyasumi, henceforth shortened as Bokunatsu, is a game for the original PlayStation released 24 years ago in Japan. And only in Japan. It centers on a young boy, Boku, spending a month of his summer vacation with his aunt, uncle, and their family in the countryside of Japan in August of 1975.
Players can explore the countryside as Boku, collect bugs, fish, fly kites, and other low-stakes activities you might expect from a child on summer break.
Slowly, you learn about the people around you and their stories.
Sounds simple, but watch Tim’s review and you’ll see that the game is a subtle masterclass in storytelling, menu design, cinematography, typography, skeuomorphism, Japanese culture, sound design, memory, and even mortality.
I became determined to experience the game myself, which is easier said than done given that it was never released outside of Japan. I managed to find an English patch, translated by a fan, for the game’s sequel Boku no Natsuyasumi 2: Umi no Bouken-hen (My Summer Vacation 2: Sea Adventure Chapter). The sequel, released two years after the original, also follows a boy named Boku vacationing in the countryside in August of 1975.
Armed with the patch file, I needed 3 more items to complete my quest: a PS2 emulator, a PS2 BIOS (the software pre-installed on the console’s chipset), and a copy of Boku no Natsuyasumi 2.
Luckily, the emulator is easy to come by. I downloaded the excellent PCSX2, which is an open source PS2 emulator that works quite well on my MacBook Air.
Unfortunately, for Legal Reasons™ I cannot provide a link to the PS2 BIOS or the the game itself, but a cursory Google search should turn up the files you need without too much trouble.
With these 4 talismans in hand I was able to perform the necessary ritual of resurrection: apply the English patch to the game, boot up the PS2 emulator, load the game.
After a few clicks… paydirt.
An experienced gamer might find this process mundane, but to me it feels like the internet equivalent of breaking open an ancient, hidden tomb. At this point I could only imagine what treasures may lie within.
What I discovered is undoubtedly a work of art, made clear by my time playing this iteration and from Tim’s review of the original. The games also happen to be an example of the billions of bytes of lost media that are just waiting to be rediscovered by someone who will appreciate them.
Here is a game, published 22 years ago, that has managed to evoke feelings of nostalgia and wistfulness in me today, in 2024. This must be the closest thing to time travel I’ll ever experience.
I knew lots about the game before playing due to Tim’s review (which, again, is a 6 hour masterpiece), but there are two aspects I couldn’t fully appreciate until playing: the game’s backgrounds and soundscapes.
First, the backgrounds. Bokunatsu makes use of a fixed perspective, where the camera only changes angles when the character moves to another scene. Each area that the user can move through is set upon a gorgeous hand-painted background. If you’ve ever seen a Miyazaki film you have a sense for the feelings that these backdrops create. A 3D modeled scene would never have evoked such a strong sense of place, time, and character, and the creative decision to use hand drawn backgrounds makes all the difference.
There’s a narrative purpose to the backgrounds as well, signaling the time of day as they change throughout between different paintings for day, afternoon, and night.
The backgrounds were done by artists at an animation studio called Kusanagi. Here are the backgrounds they made for Bokunatsu 2, but I heartily encourage you to browse through all of the art on their site.
Kazuo Oga is a famous background painter and the person responsible for many of the backgrounds in your favorite Miyazaki films. Animation Obsessive had this to say about him:
That’s really the heart of it. Oga notices things — little things. He gets a feel for them. When he sits down to work, he brings with him all the unimportant details that matter the most. Then, with his paint, he creates an artwork that centers those details, elevates them. It’s more a way of seeing and feeling than it is a technique.
All the unimportant details that matter the most—paying attention to these details are precisely what make Bokunatsu, from its backgrounds to the narrative itself, so plainly striking.
The backgrounds are complimented by the soundscapes. These are, in my opinion, the best part of the game.
Of all the characteristics of summer, it may be the sounds which I most associate with the season. I grew up in the rural south, and Bokunatsu manages to capture the droning sounds of summer in a way I’ve never experienced before in media.
At times, I’ve let the game run in the background just to listen to the soundscapes.
According to an interview with the creator and director Bokunatsu, Kaz Ayabe, Sony sent a team into the mountains to capture sounds for the game.
Dear reader, I’m here to tell you that the effort paid off.
The game’s environment is alive with the sounds of insects chirping, the wind blowing through a nearby chime, the trickling of a nearby stream. As Boku explores the countryside time advances and, like the background art, the sounds change to evoke the feeling of morning, afternoon, and night.
Animal Crossing, which debuted the year after the original Boku no Natsuyasumi game, is held up as the shining example of cozy, relaxing video games. I am a true fan of the Animal Crossing franchise, but with its gameplay literally focused on grinding in order to pay your landlord they stand in stark comparison to a game like Bokunatsu. Animal Crossing rewards completionism, and in doing so makes the game about grinding instead of actually relaxing.
In comparison, the only thing you’ll get for collecting all of the bugs or catching all of the fish in Boku is a diary entry written by the boy at night before bed. And, like in real life, maybe that’s enough?
Discovering and playing Bokunatsu (and watching Tim’s 6 hour magnum opus of a review) has given me a deep appreciation for the timelessness of art and media.
A game from 24 years ago, deeply steeped in a culture that isn’t my own, has managed to create in me a sense of warm nostalgia. Its soundscapes remind me of home, but also make me long for a place I’ve never been.
It’s also worth appreciating the meta aspect of the journey I went on to discover and experience this game, all because of a link in a newsletter. This is why the web is so special, and it’s what an AI will never do: unearth a lost gem.
When writing in his diary at the end of each in-game day, Boku reflects on “the most wonderful day in which nothing happened.” Let this be a reminder that there is magic waiting to be found in the mundane.
When you look out around you, all you see are rocks. Rocks have no agency; they cannot change themselves. They need the effort of others to make them into something beautiful. A living thing has its own agency: a kind of internal magic. It is something that grows under its own power. When I look around me, I see that some of those ‘pebbles’ have the potential to be alive. Some of those ‘pebbles’ are acorns.
IP isn’t just short for intellectual property. It’s a euphemism for “a law that lets me reach beyond the walls of my company and control the conduct of my critics, competitors and customers”. And “app” is just a euphemism for “a web page wrapped in enough IP to make it a felony to mod it, to protect the labour, consumer and privacy rights of its user”.
Here’s something unexpected: Keanu Reeves and China Miéville (one of my favorite science fiction authors) are writing a book together that’s dropping in July. The Book of Elsewhere is described as a “genre-bending epic of ancient powers, modern war, and an outcast who cannot die.” Sign me up.
Speaking of books being released this year, Robin Sloan’s new novel Moonbound will land in June. Preorder a copy and let Robin know to receive a limited edition zine.
Summer beckons!
A small programming note—I’ve updated my homepage to include highlights from articles and books I’ve read in addition to blog posts. The highlights are synced from my Readwise account.
If you haven’t used Readwise Reader, I highly recommend it. It’s my modern replacement for Instapaper, and has a wonderful browser extension which allows for in-place highlighting of passages (including comments!) I am a very happy subscriber in part because of their excellent API.
The Readwise API combined with Eleventy’s fetch API made it a breeze to implement this new feature ✨
You can’t think your way to right action; you can only act your way to right thinking.
The trouble with parental advice is that it’s extremely difficult to select the good parts while discarding the bad parts. Sometimes when you really sit and analyze what your parents taught you, you discover that there aren’t that many bad parts. The things they said to you weren’t even the problem. It was their conflicted feelings, their shame, their anger at themselves, their habit of blaming external forces for their failures, their inability to show up and be present for your weird personality, that stood in the way of your bond with them, your self-acceptance, your well-being, and your ability to embrace your path forward in life.
Aside from the creative outlet it gave me, cooking, being active in the kitchen, gave me an obvious place to channel my anxiety. It calmed my nervous system. Cooking, being active in the kitchen, also meant I was useful. And if I could be useful, I could be loved.
Makeware is a term I’m using to refer to products that let people build software, workflows, or creative works
This works great with the kinds of transactional processes (marketplaces, social media, search engines, etc) most product literature centers around, but can fall apart when designing creative tools (developer tools, no-code tools, design tools, languages, APIs etc.), as there are fundamental differences[1] between the two:
• In transactional processes, users have clearly defined goals, and the task is highly specialized (e.g. “Go to work”, “Order takeout”, “Find accommodation for my upcoming trip”) and can often be modeled as a linear process.
• In creator tools, use cases vary wildly, goals are neither linear, nor clearly defined, and may even change throughout the session.
I eventually came to realize that the appeal [of generative art] was rooted in my love of the web, where we create content elements and visual styles and scripted behavior, and then we send our work into a medium that definitely has constraints, but something very much like the random component of generative art: viewport size, device capabilities, browser, and personal preference settings can combine in essentially infinite ways. The user is the seed in the RNG of our work’s output.
It’s very common that your first design idea will be overfit. It’s useful to interrogate a concept and ask — is there a deeper, more fundamental need? Could we reduce this concept until that is the only part that remains? What other possibilities unlock with a simpler, more general tool?
Use cases should be applied after design is done — to check if the tools available can accomplish the job. As a starting point, they put you in a mindset to overfit. This is especially dangerous because users will often tell you they love it in concept testing. “Ah yes, here is my process, represented in pictures!” But it’s only when you actually try to use the tool — hold the thing in your hands — that there’s a hundred things you need it to do that it doesn’t. It’s not flexible — it’s a series of menus and disappointed feature requirements.
I believe it’s best to think of a use case as a test case to see if your basic tools are working. What’s missing from the toolbox? What are the limits of what’s available? What 4 use cases would open up with the addition of one more tool?
I believe that designing great creative software tools is not about designing cabinet assembly machines. It’s about giving users a high quality toolbox of screwdrivers, hammers, and wrenches. It’s about seeing the shared needs across many use cases and designing the simplest possible set of devices that allow the user to accomplish their objectives.
Such research consists of a repetitive recording of the same facts until one has a large enough sample to deduce patterns, derive conclusions, and even make predictions.
Poets of the mundane
Paul has always been my favorite Beatle.
I was in junior high school when I got hooked—during that time there’s a good chance that if you found me listening to music on my iPod nano, it was The Beatles.
Perhaps it was Paul’s youthfulness and humor that made him approachable to me at that age in a way that John wasn’t. Paul was someone you might have known in real life, but John and George seemed otherworldly.
That otherworldliness is a part of why John in particular is regarded as the driving creative genius of the group.
But this has never sat right with my love for Paul, so I was delighted to discover Ian Leslie’s 64 Reasons To Celebrate Paul McCartney which makes a very strong case for the boyish Beatle.
It’s a long list full of excellent reasons to rethink your choice of favorite Beatle. There was one aspect in particular that stood out to me.
For McCartney, the domestic isn’t opposed to the world of the imagination; it is a portal to it. He is a poet of the mundane; a writer who will start off writing about his dog, or fixing a hole, and see where it takes him.
I think this is the one that sums up the whole thing, and is what a large part of makes Paul appealing. His work offers me reassurance that inspiration can and does come from the most unassuming of places.
The need to find or manufacture deeper meaning in our work by tracing its inspirations can be paralyzing—Paul is a good reminder for me to not ignore ideas sparked from humble circumstances.
It’s clear that being a “poet of the mundane” extends beyond creative work and into the way we choose to live our lives:
His unashamed “normality” was an act of inverted rebellion, as transgressive, in its way, as Lennon and Yoko posing naked. But neither fans nor critics saw it that way, and to this day it is Lennon who best fits our Romantic idea of a great man; tortured, difficult and deep. Long before it became commonplace for male public figures to hymn the joys of parenting, Paul McCartney was showing us a different way to be a man, and we have never quite forgiven him for it.
This echoes the timeless advice from Stephen King: “Life isn’t a support-system for art. It’s the other way around.”
Apps and the Age of AI
For how much software has evolved and matured I find it strange how many tasks remain unaddressed by niche, purpose-built software. I’m always excited to see how novel ideas can come about from focusing in on a narrow domain.
Ink and Switch’s latest research prototype Embark focuses on one specific task: making travel plans.
Embark uses a humble text-based document as its interface, which it then enriches with additional data and views as needed. There is something thrilling to me in the notion that, of all the options explored, plain text won (and often wins) the day.
As a designer I find it both deeply distressing and blissfully serene that improvements upon plain text as way of viewing, creating, and manipulating data are so rare.
Perhaps more importantly than the medium, Embark brings the features of multiple apps into a single workspace:
Although apps give us access to all kinds of information, they provide only limited mechanisms for bringing it together in useful ways. Whenever a complex task requires multiple apps, we are forced to juggle information across apps, resulting in tedious and error-prone coordination work.
Embark: Dynamic documents for making plans
Ink and Switch’s research identified 3 core problems with the typical model where tasks are completed using a series of individual apps:
- Context is not shared across apps
- Views are siloed
- Apps produce ephemeral output
One of the most exciting aspects of AI for me is its potential to address these challenges. AI actors operating on our behalf, paired with the right platform primitives and protocols, have the potential to form a new model of computing which reduced the coordination cost of managing many apps and interfaces.
I feel optimistic about a future with technology shaped by catalysts like LLMs, federated social protocols, and now Embark. Each offer new avenues for addressing the challenges with a computing model centered around siloed apps.
If the past decade of human computer interaction has been centered around apps, perhaps the next decade will knock those walls down and put users back in control of their data and the ways it is manipulated.
Of course, an X is an X, in some respects. But when you, as a human, read text, you receive a dose of extra information — always! The monospaced grid of code tells you something (along with the syntax highlighting, of course). The “nothing to see here” of a neo-grotesque font tells you something. The wash of a web page’s muted background color tells you something.
The internet has groomed me to expect that all of culture is indexable and classifiable. In the absence of metadata, I feel a deeper loss and disconnect.
Instead the media talked about the internet in broad generalities is the internet good, or is the internet bad? Is the internet making us smart, or is it making us stupid? The supposed answer to any user's problem was less internet rather than a better internet. Or, as the techno-optimists would have it, the answer was more internet, rather than purposeful use of the internet.
I see an overemphasis on artefacts and deliverables: things you can point at, at the expense of what they really are: large scale organisational change programmes.
Why is it so difficult to plan a trip using our digital devices? When making a plan of any kind, we need to pull together information from different sources, and then synthesize the information to make decisions. Although apps give us access to all kinds of information, they provide only limited mechanisms for bringing it together in useful ways. Whenever a complex task requires multiple apps, we are forced to juggle information across apps, resulting in tedious and error-prone coordination work.
Reality is that which, when you stop believing in it, doesn’t go away.
For a technology to be effective, he said, it should provide easy ways for novices to get started (low floor) but also ways for them to work on increasingly sophisticated projects over time (high ceiling). With his Logo programming language, for example, kids could start by drawing simple squares and triangles, but gradually create more complex geometric patterns over time.
But the most important lesson that I learned from Seymour isn’t captured in the low-floor/high-ceiling metaphor. We need to add an extra dimension: wide walls. It’s not enough to provide a single path from low floor to high ceiling; we need to provide wide walls so that kids can explore multiple pathways from floor to ceiling.