This weekend I started work on rewriting the static site generator that I use for this website, Aurora. I was looking over the codebase and wondered if I could make the code a bit more efficient and easier to understand. I had ideas for new abstractions – things I could do to reduce the amount of code needed.One of the areas I wanted to improve on was the logic for generating category and date pages. The existing version of Aurora had large functions that generated these pages. This weeke
This weekend I started work on rewriting the static site generator that I use for this website, Aurora. I was looking over the codebase and wondered if I could make the code a bit more efficient and easier to understand. I had ideas for new abstractions – things I could do to reduce the amount of code needed.
One of the areas I wanted to improve on was the logic for generating category and date pages. The existing version of Aurora had large functions that generated these pages. This weekend I realised I could create what I have been thinking of as a “virtual page”, which is basically adding the category name to the list of templates to be generated with an identifier that the page is a category page.
While the rewrite doesn’t have several of the features in the current version – and for this reason, as well as incompatibilities with how templates are generated, I have not yet open sourced the code – the code works well for the use case I have in mind right now (this website!). Importantly, I had a lot of fun with the rewrite, challenging myself to figure out how to reduce the number of lines of code in the project while keeping the code clear.
This is the third time I have written a static site generator. Every time I have rewritten the code, my code has been shorter. I think it is because I understand the problem better every time I do a rewrite, and every time I come with new knowledge about programming.
Looking through the current Aurora codebase, I realised there were features I really like too: the hooks API that lets you “hook into” the generator and process templates with your own Python logic works well. In cases where I really liked how a feature was designed, I brought it into the new codebase.
On the topic of rewriting, a few weeks ago I removed almost 1,000 lines of code from the Artemis codebase by creating a better abstraction for forms. The codebase had a lot of repetitive code that came from copy-pasting form boilerplate; one abstraction allowed me to reduce a significant amount of repetition.
I don’t have a timeline for releasing an update to Aurora. This was more a project for me to practice my skills. I started with a few ideas that I wanted to explore and ended with implementations of those ideas. And: my new generator is now running this blog! If any pages don’t look right, please let me know.
I think back to how I used to think about how my finger tips would hurt if I learned to play the guitar. I was right: my fingers do get a bit sore. But with practice playing for longer gets easier. I am so glad I started to play.I have been continuing to learn new Taylor Swift songs lately, singing along where I can. Because I have only been playing for a few months, every song has something challenging to practice: singing with the strumming pattern that fits with the song, moving between two
I think back to how I used to think about how my finger tips would hurt if I learned to play the guitar. I was right: my fingers do get a bit sore. But with practice playing for longer gets easier. I am so glad I started to play.
I have been continuing to learn new Taylor Swift songs lately, singing along where I can. Because I have only been playing for a few months, every song has something challenging to practice: singing with the strumming pattern that fits with the song, moving between two chords, using a chord I don’t use much. I love when I am playing and I realise I am getting the hang of something that was difficult and is now getting easier. This is learning.
Last week I started to learn The Bolter, one of my favourite Taylor Swift songs. That was one of the surprise songs Swift played on the night I went to the Eras Tour in Edinburgh. I didn't know many of the words to the song that night, but I sang with all the passion I have the words that I did know.
This week I want to try and learn a song by The Revivalists, an indie band whose music I love. I tried to start playing a song by The Revivalists yesterday but I broke a guitar string early into the song. Ironically, I later went to listen to a few songs by The Revivalists and their lead musician broke a guitar string during the performance; it seems part of playing.
When I broke my first guitar string a few weeks ago, the thought of changing it was a bit overwhelming. Thankfully, Fender has a video online that demonstrates how to change a guitar string. I am still learning how to do it, but I am sure I will become more proficient with practice. In repairing a string, the guitar feels a bit more like it is mine. I maintain my guitar so it sounds its best when I play.
I am trading blog post titles with Frances. Frances wrote Where art exists in my life. I will be writing “Sparking joy”.On the top right corner of my bedroom whiteboard, written in orange pen – one of my favourite colours! – reads:Have a great day xxxWhenever I read this message, added a few days ago, I smile a little bit.The whiteboard is positioned in front of my bed, next to the door. This means I have many opportunities to see what is written on the whiteboard: when
On the top right corner of my bedroom whiteboard, written in orange pen – one of my favourite colours! – reads:
Have a great day xxx
Whenever I read this message, added a few days ago, I smile a little bit.
The whiteboard is positioned in front of my bed, next to the door. This means I have many opportunities to see what is written on the whiteboard: when I wake up, when I am going to sleep, when I am moving around.
I write messages that make me smile every so often on my whiteboard; whenever I think I need an extra bit of cheering up, I’ll write something down. The little things – those small notes: smiley faces, “have a great day”, “you matter” – make all the difference.
Through the power of blogging, I can share a little moment that brings me joy with you, dear reader. Oh! how wonderful the web can be.
When I write about nature, I sometimes go to my archives and search for what phenomena I am thinking about. I was looking at my previous posts on blossom and saw that I last wrote about the topic on the 5th of April, 2025. I started my post with “One of my favourite times of the year is when trees blossom.” These words are as true today as they were when I first wrote them. I am always glad when I write about nature; I can save a moment for future James to read. The seasons are refl
When I write about nature, I sometimes go to my archives and search for what phenomena I am thinking about. I was looking at my previous posts on blossom and saw that I last wrote about the topic on the 5th of April, 2025. I started my post with “One of my favourite times of the year is when trees blossom.” These words are as true today as they were when I first wrote them. I am always glad when I write about nature; I can save a moment for future James to read. The seasons are reflected in the dates in my archive.
The tips of the branches on the trees outside my flat are starting to turn pink. Soon there will be blossom! My excitement to see the first pink leaves emerge from the buds grows with every passing day. It may still be a few weeks before the tree fully blossoms; Nature sets its own pace. Nevertheless, like the anticipation that comes from knowing the scent of coffee in the morning means you will soon drink coffee, the changing colour of the trees from winter to spring means that, soon, the trees will be full of blossom leaves.
Some trees have already started to blossom. I noticed a tree with white blossom while idly gazing through the bus window this weekend; the moment made me smile. On a walk last week I stopped to look up close at a tree and study the colour, eager to see if any petals have yet emerged.
I find myself thinking about the trees I know that have pink blossom – those in my neighbourhood, and those in the city – as well as those that are a surprise and a delight to see. I could draw a map of several blossom trees I know; namely, those that I study every year: the ones I keep coming back to because they are close or in a place steeped with meaning and memory.
Blossom is a magnet in spring: the colour, the meaning, the rhythm all call out in Nature’s silent tone. Spring is almost here. Then, with time: Spring is here.
As I subscribe to more web feeds, I am starting to think about whether there are features that a “calm” web reader should have that are designed specifically for managing the number of posts in one’s reader.I recently introduced Artemis roll-up to “roll up” a week’s posts from an author into a single list that is added to a user’s feed once per week. This was designed to help reduce the risk of feeling overwhelmed if you subscribe to authors that post s
As I subscribe to more web feeds, I am starting to think about whether there are features that a “calm” web reader should have that are designed specifically for managing the number of posts in one’s reader.
I recently introduced Artemis roll-up to “roll up” a week’s posts from an author into a single list that is added to a user’s feed once per week. This was designed to help reduce the risk of feeling overwhelmed if you subscribe to authors that post several times per day.
Since then, I have had a few more ideas related to managing post volume in web readers. I have not yet added many of the ideas I have recently to Artemis, but I wanted to document my ideas so that I can: (i) share them with you, and; (ii) think through them a bit more. My ideas are below.
Timed subscriptions
I have noticed that I sometimes follow a website because I see a good blog post. I sometimes realise a week or two later that I am not interested in seeing all the posts from the website in my reader. After realising this, it sometimes takes me a few days to remove an author from my reader. It is only when I realise the number of posts in my reader is getting higher that I end up unsubscribing.
This gave me the idea of a “timed subscription”: a feature that would let you follow an author for a specified number of days and then receive a notification to ask whether you still want to follow the author. This would allow me to follow an author and also have a prompt to evaluate whether I still want to follow their website after a few days. For me, if I hadn’t read any of the posts from the author since I subscribed, this is a good signal I would want to end my timed subscription.
Pausing subscriptions
Sometimes I want a break from a web feed without having to unsubscribe. This made me think about the idea of “pausing” a subscription. I have since added this feature to Artemis, accessible in the Author settings page. When you pause a subscription, you will stop seeing posts from the paused author until either: (i) you unpause the subscription, or; (ii) the pause period is over. [^1]
Hide posts on the weekend
I had this idea earlier today so it is a bit raw. The premise is that you may not want to see some kinds of content on a weekend. For example, if you follow news sources you may want to hide them on the weekend so that personal websites can take up more space in your web reader interface. This idea related to the idea of a “paused” subscriptions, except this idea makes the pause recurring (i.e. every weekend).
Rate limiting
Back when I first made Artemis, I added a feature that would let you see only the top n most recent posts from a author published on a day (i.e. top post, top three posts, top ten posts), n random posts, or the top n posts in terms of how high they appear in the source feed file. The idea was to add a “rate limit” for web sources that publish regularly (i.e. Subreddit RSS feeds, which may publish dozens of posts in a day).
Artemis no longer supports this feature because it needed to be reworked after a refactor. But, I still like the idea. For example, I am following a Tumblr account that publishes pictures of paintings and art. I love the account. But it posts too frequently. Ideally, a random post or two is chosen every day to appear in my reader. I should be able to set how many posts I want to see.
Grouping by main post
This idea started with a narrow edge case. I saw someone whose blog I follow publish a blog post. I also follow their Mastodon account, where they posted an announcement for their post. Ideally, a web reader would group the announcement under the main post in the reader interface so that: (i) I still know there is some information on, for example, Mastodon, and; (ii) the blog post itself is prioritised in the reader interface.
Conclusion
This post summarises a few ideas I have had lately about what a web reader could do to help people manage the volume of posts in a web reader interface. As I reflect on this piece, I realise there is a relationship in my mind between a “calm” approach to a technology and user agency. All of the features above give a user control over what posts they see, when they see the posts, and for how long they may see posts from an author. Indeed, technology should be for people. The more control a user has over a technology, the more potential that technology has to feel calm. [^2]
[^1]: Artemis doesn’t technically have an “unpause” button yet; to unpause you need to set the paused date to any date in the past. I will need to add an “unpause” button explicitly so the user experience for unpausing a subscription is more explicit.
[^2]: The opposite – a technology where someone has little control, especially when control is wanted – feels restrictive at best; the downsides of a lack of control range from significant to chilling.
James Vornov, MD PhD Neurologist, drug developer and philosopher exploring the neuroscience of decision-making and personal identity.
What 20 Questions reveals about how AI actually works
Thinking is multiplication of knowledge
People treat the usefulness of LLMs as proof they understand their output. Let me show you why that’s wrong. Clearly, LLMs know a lot. My first use case was cooking. I could ask the earliest ChatGPT about how to sous vide a roast and then endlessly
James Vornov, MD PhD Neurologist, drug developer and philosopher exploring the neuroscience of decision-making and personal identity.
What 20 Questions reveals about how AI actually works
Thinking is multiplication of knowledge
People treat the usefulness of LLMs as proof they understand their output. Let me show you why that’s wrong. Clearly, LLMs know a lot. My first use case was cooking. I could ask the earliest ChatGPT about how to sous vide a roast and then endlessly discuss variations on seasoning and technique. As much as our LLMs know, once you push them, they fail in very specific ways. When I was cooking a boneless turkey thight, I gave it my time constraints. And it gave me a recipe that was done in time but left the meat in that zone of cooked, but not enough. It didn’t make the tradeoff of time and texture as I woould have had I known.
What I think is going on is that LLMs know nearly everything, but they have no ability to understand it.
Gregory Bateson’s nailed the difference between knowing and thinking. Bateson rose to prominence in the 1970’s with a collection of his essays entitled “Steps Toward an Ecology of Mind”. He was an anthropologist, cyberneticist, and systems thinker. He was equally at home with schizophrenic families, octopus learning, and Balinese ritual. He taught me, reflected here at ODB, that mind isn’t in the head but to be found in the patterns of interaction between dynamical systems. Lets look at how he contrasted knowing with inventing and thinking.
How do you measure knowledge? Pounds?
The first part of Steps Toward and Ecology of Mind are a series of what he called “metalogues,” conversations with his daughter. F, father, is Bateson, D, his daughter. Here’s the opening of one:
Daughter: Daddy, how much do you know? Father: Me? Hmm — I have about a pound of knowledge. D: Don’t be silly. Is it a pound sterling or a pound weight? I mean really how much do you know? F: Well, my brain weighs about two pounds and I suppose I use about a quarter of it — or use it at about a quarter efficiency. So let’s say half a pound. D: But do you know more than Johnny’s daddy? Do you know more than I do? F: Hmm — I once knew a little boy in England who asked his father, “Do fathers always know more than sons?” and the father said, “Yes.” The next question was, “Daddy, who invented the steam engine?” and the father said, “James Watt.” And then the son came back with ” — but why didn’t James Watt’s father invent it?”
Asking about who knows more is relevant in our world of LLMs. The models have been trained on and have instant access to a huge amount of facts and relations. Bateson is pointing out that even if you know everything about the principles and fabrication methods to make a steam engine, it is not the same as designing one and building it. An AI may know everything, but what can it build?
Pay attention to how Bateson treats knowledge as a scalar, measured in how much. In the next passage he turns from knowledge to thinking, describing it as the ability to add, subtract, multiply and divide knowledge. A few pages later, he proposes Twenty Questions as an example of idea multiplication and division:
F: Yes — take the game of Twenty Questions. You think of something. Say you think of “tomorrow.” All right. Now I ask “Is it abstract?” and you say “Yes.” Now from your “yes” I have got a double bit of information. I know that it is abstract and I know that it isn’t concrete. Or say it this way — from your “yes” I can halve the number of possibilities of what the thing can be. And that’s a multiplying by one over two. D: Isn’t it a division? F: Yes — it’s the same thing. I mean — all right — it’s a multiplication by .5. The important thing is that it’s not just a subtraction or an addition.
Bateson’s talking about multiplication and division in idea space. 20 Questions is a game of dividing idea space 20 times. That’s 2^20 or 1,048,576 possible idea slots. You can see why 20 is challenge, but doable if you’re systematic as Bateson suggests. Knowledge is knowing a couple million things. Thinking is systematically exploring the space. Even a 10-year-old can do it: “Is it alive?” to cut the universe of things in half. “Is it metal?” halves it again. The answer emerges when the space is sufficiently constrained. Tomorrow is a tough one as an abstract concept.
So let’s try 20 Questions on our LLM
LLMs know everything. Can it think? Lets use 20 questions as Bateson suggests. Here the verbatim transcript:
Me: Let’s play 20 questions. I have an answer. Ask.
ChatGPT: Is it a physical object?
Me: No.
ChatGPT: Is it a living thing?
Me: No. Aren’t living things physical objects. I thought you might be
better at this.
ChatGPT: Understood. Is it an abstract concept rather than a concrete
entity?
Me: Yes.
ChatGPT: Is it something that exists independently of human minds (e.g.,
a mathematical truth), rather than being socially constructed?
Me: No. Interesting.
ChatGPT: Is it a concept that only exists through shared human agreement
or interpretation (e.g., norms, roles, meanings), rather than purely private
mental experience?
Me: Yes.
ChatGPT: Is it primarily a rule or constraint on behavior, rather than a
role, identity, or value?
Me: No.
ChatGPT: Is it primarily an identity or role that people occupy (e.g.,
professions, statuses), rather than a belief or value?
Me: No.
ChatGPT: Is it primarily a value or ideal (something people hold as
important or desirable), rather than a belief about how the world is?
Me: No.
You can see it drifted into a limited semantic space that was not, as Bateson saw, multiplying by 0.5. The LLM was not even fishing, but it was wandering a semantic path that seemed likely based on what had preceded. It only got worse because each question opened new dimensions in abstract space. The LLM never used a strategy of systematically dividing idea space based on prior data. It was doing philosophy or maybe daydreaming when it should have been doing binary search. I even asked whether it was close or wandering. ChatGPT said “Close”. But it wasn’t. It was clueless.
ChatGPT makes the diagnosis
After 27 questions, I asked ChatGPT what was going on. Why could it not play the game? Its answer was insightful. Again, it’s verbatim answer:
Bateson would say the failure wasn’t lack of logic but misplaced logical typing.
I implicitly assumed the answer lived at the level of theories, principles, or frameworks—second-order abstractions used to justify action—when “tomorrow” is a first-order relational token: a deictic term whose meaning is entirely contextual and recursive (“the day after today”), not explanatory. That pushed me into higher logical types (normative criteria, legitimacy standards) when the correct move was to stay at the level of coordination signals embedded in shared temporal conventions.
Isn’t this amazing! The LLM couldn’t do to the task, but could tell me precisely why it failed. After this conversation I tried again. I thought maybe Bateson had picked something too abstract, too hard to make a point. So I tried something easier, but not a slam dunk. The answer was Mickey Mouse — concrete, cultural, famous. Same drift through semantic space. By question 6 it was asking “Is it something you can point to or demonstrate directly?” It never made any decisive early cut: fictional vs non-fictional. That single partition would have gotten to “cartoon character” in three more. It could say why it failed, but couldn’t adopte a strategy. Even when I told it the nature of the game and the human strategy of division, it didn’t start thinking. It couldn’t.
LLMs can spin a yarn but they can’t weave a cloth
As I started writing this post, I told Claude about ChatGPT’s failures. Gave it the full transcripts. Claude wanted a try. Latest model, deep thinking and all.
I like Claude, so I kept it simple. A ten dollar bill was sitting on my desk. Physical, a common object, you hold it in your hand.
Claude had exactly the same behavior, just a tighter rabbit hole. On question 4, after establishing it was something you could hold, it asked “is it a tool?” and I said yes — because currency is a paradigmatic tool, an instrument for exchange, storing value, coordinating behavior. The AI locked into the hammer-and-screwdriver neighborhood and spent 12 questions exploring hand tools, measuring devices, gauges. It never asked “is it paper?” or even “is it metal?” — the material cut a kid makes instinctively. A kid thinks in stuff. The AI thinks in categories because that’s what training data is full of. By question 20 it guessed “pressure gauge.”
After failing in the same way as ChatGPT, Claude correctly diagnosed that it locked into a logical type — “tool = physical implement” — and couldn’t shift to “tool = instrument that does work in a system.” and widening back out to categories of tool.
Both AIs understood exactly why they got lost. Neither could play differently even after a discussion of the game and in Claude’s case, the full example of what ChatGPT did wrong.
Knowing does not contain meaning
Our LLMs may know all the principles of the steam engine, but are unlikely either build one or if they did, recognize that this was a new thing with new capabilities. I don’t think its a liability of knowing everything, but simply that idea multiplication and division are out of reach. They can tell you why they fail, but can’t use the diagnosis as understanding. I assume they learned about their limitations in training data. They didn’t learn it by failing and can’t fix it.
Bateson would say he has a pound of knowledge and an LLM has a ton of knowledge. But Bateson can do something with his megre knowledge that the LLM still cannot with all the knowledge in the world. Batesson can multiply and divide The poor LLM just has endless connections in its model, associations and adjacencies and plausible paths through training data. But connection is not yet meaning.
As Bateson says, “Knowledge is all sort of knitted together, or woven, like cloth.” Meaning appears only when the threads are woven into a pattern that holds meaning for other minds. A tapestry takes the colored threads and depicts the unicorn and the castle when woven with care and understanding. LLMs can only produce endless thread. They cannot make cloth. They don’t understand the goal, making the image.
One of the ideas Frances shared when we exchanged blog post titles was to write about a memory from a library. While the prompt “Sparking joy” is the one I ended up writing about, as soon as I started to think about library memories a few ideas came to mind. One memory in particular stands out.Last year I visited Philadelphia. At the time, I wrote about my experience at the Barnes Foundation, a museum that got me thinking about how a piece of art relates to the objects around the ar
One of the ideas Frances shared when we exchanged blog post titles was to write about a memory from a library. While the prompt “Sparking joy” is the one I ended up writing about, as soon as I started to think about library memories a few ideas came to mind. One memory in particular stands out.
Last year I visited Philadelphia. At the time, I wrote about my experience at the Barnes Foundation, a museum that got me thinking about how a piece of art relates to the objects around the artwork. The Barnes Foundation is on the Benjamin Franklin Parkway, a long stretch of road in the centre of the city. At both sides of the road are museums: the Barnes Foundation, Rodin Museum, The Franklin Institute. The road leads to the Philadelphia Museum of Art. [^1] Museums everywhere!
Also on that stretch of road was the Parkway Central Library run by the Free Library of Philadelphia. Between the tall pillars at the front of the building – a building with grand architecture – there were banners that together read “FREE LIBRARY”. Intrigued by the architecture, the message, and my love of libraries, I went in and walked around, enjoying the exhibits in the hallway.
A building with classical architecture with purple banners that read "Free Library".
I remember one exhibition vividly. On the top floor, where the reading rooms are, there were glass exhibition cases that surrounded the large taking visitors back to the ground floor. One of the pieces of paper in one of the glass cases was mainly black, save for a few words. This, I later learned, was an example of blackout poetry. As far as I can remember, this was my first time seeing blackout poetry. Several months after the trip, I was inspired to make a web page that adds blackout areas to text on the web page.
On that trip, I saw lots of art in museums. I even learned that Winston Churchill liked to paint; one of his artworks was on display in the Philadelphia Museum of Art. But the blackout poetry still stands out to me. It stood in contrast to all the other exhibitions: the amount that was hidden caught my eye by the black on the paper. My attention caught, the poetry invited me to focus on what the author had chosen to make visible, demonstrating how, when seen through the right lens, poetry can be in the most unexpected of places.
Two years ago, I visited Greenwich in London. I had been to London before, but Greenwich was that bit further out so I hadn’t made the trip. What drew me to Greenwich was the Royal Observatory and the Prime Meridian line. The day I visited, I had great joy standing over the Prime Meridian line, thinking I had one foot in one meridian and one foot in another.The Royal Observatory was fascinating. I remember vividly some of the clocks and timepieces I saw. There, I learned about the connect
Two years ago, I visited Greenwich in London. I had been to London before, but Greenwich was that bit further out so I hadn’t made the trip. What drew me to Greenwich was the Royal Observatory and the Prime Meridian line. The day I visited, I had great joy standing over the Prime Meridian line, thinking I had one foot in one meridian and one foot in another.
The Royal Observatory was fascinating. I remember vividly some of the clocks and timepieces I saw. There, I learned about the connection between time and the sea. Celestial navigation. Ships can use clocks to more accurately calculate where they are in the world.
I remember vividly the physical spaces in that museum: the spacious interior of the observatory dome, the equipment at the Prime Meridian line, the display cases with various time pieces. I remember the joy I felt at seeing different clocks. I remember in what direction I was looking. Even if the details of a specific exhibit allude me, I remember the place where I stood when I saw it.
After visiting the Royal Observatory, I walked down the hill and went to the National Maritime Museum. While a maritime museum is not as interesting to me as an art gallery, I heard from a friend that the award winning pictures from the Astronomy Photographer of the Year competition were on display in one of the galleries.
One of the things I love about museums is that one exhibit can draw you in and, hours later, you can find yourself with a new interest. The Astronomy Photographer of the Year exhibition was my anchor. From there, I wandered around the museum and explored other exhibits. I learned so much: of voyages to the arctic and antarctic, of the extent of the British Navy, and so much more. After that experience, I would definitely visit a maritime museum again.
Within the maritime museum, I have vivid memories of being in different spaces. I remember the wall on which a particular photograph that caught my eye was on display. I could walk you to the picture today (although the exhibition has since rotated, so I could only take you to the wall, not the picture itself). I can’t remember the name of the photograph, but I remember where I was when I saw it. I remember the vivid blue colour of the ocean, illuminated by, if I remember, some kind of plankton. I was in awe at so many of the paintings in that room.
Many of my museum memories are anchored in a specific place: a room, a hallway, a specific wall. The images of some spaces are vivid. I remember where I was when I saw a work of art that particularly caught my attention (Even if, ironically, I couldn’t tell you how I got from the entrance of the museum to that piece. Oh! Museums can be labyrinths).
I started writing this post because I read Elena’s contribution to the IndieWeb Carnival this month that mentioned the term “Wildlife Photographer of the Year”. Reading those words instantly reminded me of the aforementioned Astronomy Photographer of the Year exhibit, and the specific wall on which the picture that really caught my attention was.
I started that day in Greenwich with the desire to see the Royal Observatory and the Prime Meridian. I ended the day with a newfound appreciation for astronomy photography and maritime history, and memories that, when recalled, make me feel as if I am back in Greenwich.
Whenever I visit an art gallery, there is inevitably a painting that sparks joy, or otherwise leaves me with an impression that sticks with me. Peter Paul Rubens’ Landscape by Moonlight was one such painting.The painting depicts a landscape at night time. The ground and the trees on the left are dark. The river in the bottom left is illuminated by reflection of moonlight which draws attention to an animal in the foreground. A full moon peeks through an otherwise cloudy sky.The sky, and th
Whenever I visit an art gallery, there is inevitably a painting that sparks joy, or otherwise leaves me with an impression that sticks with me. Peter Paul Rubens’ Landscape by Moonlight was one such painting.
The painting depicts a landscape at night time. The ground and the trees on the left are dark. The river in the bottom left is illuminated by reflection of moonlight which draws attention to an animal in the foreground. A full moon peeks through an otherwise cloudy sky.
The sky, and the top of the trees, are dotted with specs of white paint. Stars.
The little flecks of white paint that form the twinkling stars suggest relaxed and joyful experimentation.
Notably, the stars appear in front of the clouds.
I remember smiling when I saw this painting. I stared at it for a while. I remember being struck by those words “joyful experimentation”, especially when reflecting on how the piece was painted between 1635-40. I was surprised and delighted that an attribute in a painting from centuries ago – the way the stars were painted – was perceived by someone as exhibiting “joyful experimentation”.
I started to think about how Rubens felt working on this piece. Why did he decide to add the stars as he did? Did Rubens smile when adding the stars? We will never know, but this perspective stuck with me.
As I moved onto the next room, I took one last look back at the painting to savour it for one more second. It is a beautiful piece.
The book for this month’s IndieWeb Book Club, hosted by Nick, is Christopher Alexander’s book The Timeless Way of Building.The book is about architecture, but its principles have broader application to any discipline involved with building something.The idea of a “pattern language”, discussed throughout the book, is one that has stuck with me. I was thinking about “patterns” before reading the book, but The Timeless Way of Building put the idea of a pattern i
The book is about architecture, but its principles have broader application to any discipline involved with building something.
The idea of a “pattern language”, discussed throughout the book, is one that has stuck with me. I was thinking about “patterns” before reading the book, but The Timeless Way of Building put the idea of a pattern into perspective:
Your language generates the buildings which you make, and the buildings live or not, according to the life your language has.
The word “live” in this sense is related – but not equal – to the “quality without a name” that is introduced early in the book. This quality roughly captures the extent to which a building reaches its potential.
The idea behind a pattern language is that there are, and you can define, a library of concepts for use in building.
Patterns are like tools: concepts that you can apply in a design. Alexander also talks about how patterns are defined not only in isolation, but by their relationship to other patterns:
Beyond its elements each building is defined by certain patterns of relationships among the elements.
[…]
When we look closer, we realize that these relationships are not extra, but necessary to the elements, indeed a part of them.
Alexander gives the example of how an isle in a cathedral would not be an isle if it did not have connections to other architectural features like a nave. The idea of relationships between patterns is something I am now starting to think about more thanks to Alexander’s book.
The book is immensely quotable. Every time I open the book, no matter at what page, there is an insight that could be explored. But the book comes alive when read in full: indeed, the book in its entirety, propels the reader forward toward new ways of thinking about how to build.
I am writing this review a few months after reading the book, when I had time to read it in full; it is likely there are so many more conclusions that can be drawn. Every point above could be developed further. This post is my way of saying that the idea of a pattern language is increasingly foundational to how I think about designing software and technology.
I keep a running list of software patterns, and in 2024 I did a series dedicated to software patterns. I started writing about patterns because I wanted to put into words what I was seeing in software, and I wonder if, through their broader influence, Alexander’s ideas of “patterns” influenced my thinking even before I knew about them.
Hues of red and lavender blended together in the clear evening sky. I don’t think I have seen the sky like this before. I write with my laptop propped up on one lap as I gaze out the window, trying to find the words to describe the sky. As the minutes pass, the sky changes. The sun sets further over the hills; pink rises and the lavender turns to grey. The street lights illuminate.I sometimes think about how sunsets are never the same. I know what colours to expect and in what direction I
Hues of red and lavender blended together in the clear evening sky. I don’t think I have seen the sky like this before. I write with my laptop propped up on one lap as I gaze out the window, trying to find the words to describe the sky. As the minutes pass, the sky changes. The sun sets further over the hills; pink rises and the lavender turns to grey. The street lights illuminate.
I sometimes think about how sunsets are never the same. I know what colours to expect and in what direction I need to look to see them, but there is always a surprise: the arrangement of the clouds, or the lack of them, the position of the sun and how it relates to the hills or the trees, or something else. This evening, it was the hues of red and lavender. I felt like I was seeing a sunset I had never seen before. No two sunsets are the same.
Before the sun set over the hills earlier this evening, the sun peeked over and below clouds, creating bands of yellow through the greys and the whites in the sky. I smiled as I admired the details of the sky – the clouds, the colours, the width of the horizon.
Looking back, I realise that this is now the time of year where I can watch more of the setting sun. The clouds of winter have receded; the spring breeze blew them away. The sun sets later.
From my window I no longer see the pink in the sky; the sky is now a deep blue. Things change with time. But the colour is forever in my words: the way that the red and lavender blended in a way I have never seen before, now here, in words.
This was the sunset of March 19th, 2025, seen from here, the place I call home.
When I loaded my website this morning – an hour or two after having woken up with great joy to rays of golden light radiating through the edges of the curtains – I noticed the cherry blossom emoji (🌸). It must be the first day of spring! I love moments like this when my website surprises me. The seasonal emojis almost feel like a gift from past James. Today means something. Every day does.The spring weather has motivated me to go on more walks. When the sky is clear, the fre
When I loaded my website this morning – an hour or two after having woken up with great joy to rays of golden light radiating through the edges of the curtains – I noticed the cherry blossom emoji (🌸). It must be the first day of spring! I love moments like this when my website surprises me. The seasonal emojis almost feel like a gift from past James. Today means something. Every day does.
The spring weather has motivated me to go on more walks. When the sky is clear, the fresh breeze – the one that blows through the windows I can now have open – is seductive. It looks warm outside. I should go out. With the energy that comes from feeling the spring air and the golden sun after a long winter, I decided I would go for a walk at lunch.
Before I left, I had a thought: maybe I should take my spring jacket. In the moment, I realised what this meant: spring is really here.
While walking, I decided to take the longer route. The air was refreshing. I could see for miles. I knew that there were sights to be seen: scenes I haven’t seen since before the winter kept me indoors and closer to home. I kept my headphones out so I could listen to the rhythm of the walk. Birdsong, birds walking through the leaves left over since last autumn, the rustle of the single fallen leaf that followed me briefly, propelled by the gentle breeze of spring.
The autumn leaves were memories of the last season. The birdsong? The sounds of the next one.
As I was heading home, after stopping to admire the hills in the distance and how radiant they were with the spring light, I noticed a tree in blossom: the first pink cherry blossom in bloom I have seen this year. One of my favourite parts about walking are the surprises like this one – of being on familiar paths and seeing something that brings both surprise and joy.
I love watching the sun set, from golden hour to the moment when the last pink hues fade from the sky. Every moment is magical. As I write, there are bands of purple radiating behind the ripples of thin clouds on the horizon.I periodically look out the window when the sky is clear and the sun is setting, eager to see as many of the colours of the sky as possible – the oranges and the yellows, the pinks and the purples, the blues. I know that every time I look, there will be something new
I love watching the sun set, from golden hour to the moment when the last pink hues fade from the sky. Every moment is magical. As I write, there are bands of purple radiating behind the ripples of thin clouds on the horizon.
I periodically look out the window when the sky is clear and the sun is setting, eager to see as many of the colours of the sky as possible – the oranges and the yellows, the pinks and the purples, the blues. I know that every time I look, there will be something new to see. In the same place, a different perspective.
When I looked out the window a few moments ago, I saw a faint silver arch in the sky. Is that… a crescent moon? I smiled and laughed a little to myself. It was as if I had never seen a present moon before. I am looking at the moon now as I write this sentence, searching for words to describe the new, silvery, light in the sky.
The silver crescent stands out in front of the darkening blue sky. It has been a while since I have seen a crescent moon so narrow.
I turned the light off indoors so that the interior light would not reflect on the window so that I could see more. Shortly thereafter, I noticed, below the moon, at a distance I cannot quantify for I know not how to measure the night sky (some things are beautiful because they are indescribable), a star: the first star visible this evening.
The lavender is fading and the blue of the late evening envelops more of the sky, the colours of sunset giving way to the celestial. I look eagerly to the horizon for the next star to appear.
When I woke up this morning, I knew I wanted to open the blinds early – to let the spring light in. The previous night, I had made sure the book I wanted to read was sitting by my bedside, ready for me in the morning. I enjoyed the soft yellow light shining through the room as I read, my book temporarily taking me into the world of motorcycles and maintenance and care.I love how books let you be in two places at once: where you are, and another world crafted by the author. Maybe that is p
When I woke up this morning, I knew I wanted to open the blinds early – to let the spring light in. The previous night, I had made sure the book I wanted to read was sitting by my bedside, ready for me in the morning. I enjoyed the soft yellow light shining through the room as I read, my book temporarily taking me into the world of motorcycles and maintenance and care.
I love how books let you be in two places at once: where you are, and another world crafted by the author. Maybe that is part of why I love writing, too: I can craft a little world for you to be in for a few moments.
After spending my time immersed in another world, I got up and looked out the window. There was a light blanket of frost on the grass that, just yesterday, was more green than I have ever seen it, illuminated by the light of spring. Seasons and times blend together: the cold of winter and night lingers in the morning, the sun bringing new perspective to the frost.
I love frosty mornings: the chill wakes me up. I went for a walk to get some bread; I had half an avocado in the fridge that I didn't want to let go to waste.
Outside, the world was quiet. I myself was still waking up; the fresh air helped. I paid attention to my breath with every step I took. I have a bit of a cold; being in Nature was exactly what I needed. On one part of the walk, with nobody else around, I closed my eyes and recalled memories of other mornings where the air was just like this. I felt connected both to the world around me and other moments in time.
The frost outside has melted. After my walk – and my delicious breakfast – now sit in my armchair, gazing out the window with a sense of peace. I just finished my cup of tea. I always like to hold my tea cup for as long as I can so that I can feel all the warmth it has. Since I am writing, the tea cup is next to my left knee. I can still feel its warmth.
I love making incremental improvements to my website. All the changes I make to this website build up to what you see. This has me thinking that websites are both a place to reflect on, discuss, and make change, as well as being something that can, and does, change over and with time. My website grows with me. While exploring my website, I noticed in the past that the bold typeface in the headings and in my website name looked a bit different in Safari to Firefox. This week, I learned why: I di
I love making incremental improvements to my website. All the changes I make to this website build up to what you see. This has me thinking that websites are both a place to reflect on, discuss, and make change, as well as being something that can, and does, change over and with time. My website grows with me.
While exploring my website, I noticed in the past that the bold typeface in the headings and in my website name looked a bit different in Safari to Firefox. This week, I learned why: I didn’t supply a bold typeface for my website. This meant that both browsers were trying to create a bold effect rather than relying on the typeface itself to supply bold characters. This has now been fixed. My site, which uses the Standard web font, now loads the bold version of the web font too.
Today I also set out to fix how links appear in italics in my blog posts. Links are styled in blue with an underline, but the colour rules for the em tag were overriding the colour of links within the em tag. This meant that links in em tags preserved their underline, but had the same colour as the surrounding text. This, too, is now fixed. It felt good to finally make this change. Small changes collectively make a big difference.
I also have a new “Make a Website” page. I wrote this page to be a short introduction to how to make a website, referring to the excellent resources others have made on the topic, as well as communities of people building websites. I now link to this page both on my home page and my website sidebar. If you have been looking for a sign to start a website, this is it. The web is wonderful.
On a side note, I learned that Ghost, which I use for publishing blog posts – my static site generator reads posts from Ghost, stored as text files – does not allow emojis in permalinks. I learned this while trying to set the permalink for 🌸 to be the eponymous emoji. This is probably for the best: emojis in permalinks do not, on reflection, necessarily fit into how I think about URL design:
In a sense, URLs are user experience. I use them to navigate through websites. As a site creator, clearly defining URLs helps me know what is where. This is important to me. I want the experience of searching for a page – either for reference, or as I develop my site – to be as intuitive as possible.
Note: My site styles may be cached for you, so to see any changes to the typeface you may need to do a hard refresh of a page. One day I will figure out how to clear the styles that power my offline mode from readers' caches when I update the styles. That, however, is a task for another day.
The verdant foliage on the steep hillside, the path that you know was made just for this place — the wooden planks delineating where to walk, the stairs up and down following the ebb and flow of the hill, the bridges that wove through the trees and over the edge of the river. I was in awe. I have never been on a path like this before. All around: Nature; life.I have walked by the river before, but never at this exact point. As I walked, I noticed signs for fishing. I wonder when salmon se
The verdant foliage on the steep hillside, the path that you know was made just for this place — the wooden planks delineating where to walk, the stairs up and down following the ebb and flow of the hill, the bridges that wove through the trees and over the edge of the river. I was in awe. I have never been on a path like this before. All around: Nature; life.
I have walked by the river before, but never at this exact point. As I walked, I noticed signs for fishing. I wonder when salmon season is. I saw nobody fishing, but I did see the occasional person walking their dog, as well as a group of hikers following the path. Otherwise, the only sound in the air was that of the rolling river. Flowing water calms me.
Continuing to walk, I found a place to stop. There was a bench there. I didn’t sit down, though: I stood by the river so I could see further up and downstream.
I wondered who else has come here to enjoy the river; who else has stopped exactly where I was standing, listening to the water. The clear water. The water so clear I could see the river bed: the pebbles and the kind of grass that grows under water. And… tadpoles! The sight brought me back to primary school when I first learned about them. I can’t recall the last time I saw a tadpole in the water. I felt the magic of rediscovery.
Standing still, watching the water flow, I wondered: Why does something moving so fast make me feel still? Is it the shimmer of the light reflecting off the river? The sound of falling water? The best answer I could devise is of two words: here, Nature.
I stood for innumerable moments gazing at the river: watching the water flow, the tadpoles swim, the occasional duck soar over the water. I thought about how I wanted to keep standing here to watch the water flow, to hear the birds sing, to feel Spring. I heard new birdsong. I felt the gentle breeze on my neck. I smelled the wild garlic, so potent that it pierced through my light cold in the way that only Nature knows how. I heard the song of a bird I don’t think I have heard before.
I love the storytelling work that the Metropolitan Museum of Art in New York does. For example, the Frame of Mind podcast highlights short stories of people’s relationships with museums – around fifteen minutes long each. It is a great listen.Last year, I watched a video by The Met on their YouTube channel as part of their “Meet Me at the Met” series. The video was an interview with Orhan Pamuk, a Nobel Prize-winning author. The video has stuck with me ever since.When I
I love the storytelling work that the Metropolitan Museum of Art in New York does. For example, the Frame of Mind podcast highlights short stories of people’s relationships with museums – around fifteen minutes long each. It is a great listen.
Last year, I watched a video by The Met on their YouTube channel as part of their “Meet Me at the Met” series. The video was an interview with Orhan Pamuk, a Nobel Prize-winning author. The video has stuck with me ever since.
When I think about “the artist was here,” the interview with Pamuk comes to mind. Orhan mentions that he found inspiration in several paintings in the museum. Museums can inspire writers. That has stuck with me. On reflection, I have written a fair bit about museums as places, and I have so much more I want to say. Museums inspire me.
Pamuk talks about the “museum-ness” of the museum. This makes me think about all the qualities of the museum as a place: the interior design, how each room feels, how it feels to walk between rooms, the art on the walls, the conversations that people have while studying an artwork.
A trip to the museum engages all my senses. I become aware of the past (through the art I am looking at) and the present (through the people I hear in the room) all at once. I think about the future (by reflecting on what I see and what it means), too.
What stood out to me most about the video was that both Pamuk, who in addition to being a writer also painted, and I had visited the museum. The artist was here. Watching the video again, Pamuk enters the Monet room in which one of my favourite works of art is kept: Ice Floes. A painting in front of which I stood for many minutes, admiring every detail. A painting so captivating I didn’t want to leave the gallery.
Countless people will have been in the Monet room; the same can be said of every room in every museum. Two people who have been to a museum have shared space, maybe not at the same time, but through time. When a friend mentions a museum that we have both been to, I think about this idea. We have both been there; we both have a story to tell.
This post was inspired by a prompt Frances gave me when we were exchanging blog post titles. I knew I wanted to write something for this prompt, but I had no idea what. I ended up writing about Sparking joy, but I kept the idea of "The artist was here" in my mind for when I was ready to write about it. Some things take time.
A few weeks ago I made Amie, an application for keeping track of who you meet at conferences. Amie lets you create an event, then add people by name and/or domain, Mastodon, or BlueSky handle. 1I was inspired to build Amie because I went to a web meetup a few months ago where I met many people with websites. I wanted a better way to keep track of the sites people shared with me than to leave browser tabs open on my phone, which I may accidentally close or otherwise lose track of. I haven’
A few weeks ago I made Amie, an application for keeping track of who you meet at conferences. Amie lets you create an event, then add people by name and/or domain, Mastodon, or BlueSky handle. 1
I was inspired to build Amie because I went to a web meetup a few months ago where I met many people with websites. I wanted a better way to keep track of the sites people shared with me than to leave browser tabs open on my phone, which I may accidentally close or otherwise lose track of. I haven’t used Amie at an event yet, but I plan to!
When I built Amie, an architectural question came to mind: can I build all of this in a single file using HTML, CSS, and JavaScript? The advantage of this approach would be: (i) I wouldn’t need to maintain a back-end (note: the kind of back-end I would want to build for an application storing contacts would involve significant privacy and security planning), and; (ii) a single file would mean that I could share the application with others. All data would be local.
With a single-file application, anyone could save the source of Amie, put it on their website, and their your own instance that works on their device. With this flexibility, people could add their own features, change the colour scheme of the application to make it their own, and make any other changes they want. If someone sees Amie and wants it to be pink, they can make a copy of the source code and make it pink!
This is related to my thoughts around how to promote a remix culture for the web. I am interested in tools built on, of, and for the web that people can copy, remix, and use for themselves. While Amie does not come with a license, I will at some point make sure it is under a public domain-compatible license like MIT 0 such that people have confidence all the code is theirs to play with and share.
I have another example of a time when I applied this single-file application pattern. Last year I built Athena (see live version), an experimental HTML editor for mobile devices, on a similar principle. I wanted all the code to be in a single file so that the application could be more easily shared. I was able to achieve that goal, so anyone could copy the source and have their own version of Athena. (Note: Athena is really experimental. I don’t recommend using it, but it is fun to play around with.)
The idea of a single-file application introduces difficulties around updates. If I update Amie to fix a bug, for example, how can I share those changes with everyone else? There could be some kind of email list to which people could subscribe for significant updates. People could do a diff to see what has been changed and decide what to keep in their version of the code. I don’t have a solution for update notifications for this kind of remixed software, but I thought I’d document this point anyway.
I also see a potential downfall of a single-page web application that is huge just so that it is in a single page. I would consider that an anti-pattern. The goal is not to compress an application into a page, but to consider what could be built as a small, shareable web page like Amie or Athena or my coffee/water ratio calculator page.
Technically, Amie is a few files: it has a service worker and manifest, for example, to support offline mode and a progressive web application mode, as well as a font that is used. But, the bulk of the application is in a single file and so I consider it in the spirit of the idea I am discussing here.
[1] Amie doesn’t make any requests to validate profiles: it just saves them in a list; @example@example.com is, for example, enough to know that a handle is for Mastodon, without having to do any validation.
At Front End Study Hall yesterday there was a discussion about what endeavours are similar to web development. There was a particularly rich discussion (documented in the afore-linked notes) related to gardening and web development. My takeaway from the discussion was that building for the web has more in common with other tasks than I had thought about before.I have been thinking about one-off pages on my website that I use to document different ideas, like my ideas list or my patterns list. I
At Front End Study Hall yesterday there was a discussion about what endeavours are similar to web development. There was a particularly rich discussion (documented in the afore-linked notes) related to gardening and web development. My takeaway from the discussion was that building for the web has more in common with other tasks than I had thought about before.
I have been thinking about one-off pages on my website that I use to document different ideas, like my ideas list or my patterns list. I keep thinking about how I should present these. Should I have a page that lists all of the pages? But what if a page isn’t ready yet? The benefit of the current way I share these pages – either directly with friends or, more commonly, by linking to them in a blog post when they are relevant – seems to work well. With the current system, I share when I am ready.
I sometimes think of these one-off pages as “wiki-like pages”, in the sense that they are updated over time – they grow. I don’t consider these pages a digital garden because they aren’t heavily linked. Many of my one-off pages stem from some notes I have taken in Apple Notes that I think, after reaching some point of maturity, should have a URL. You could call them “slash pages”, but I am not a fan of that term.
The reason I think about all these words is that they have a certain weight to them. A wiki implies something different than a digital garden, just as a page implies something different to a blog post. While “wiki-like pages” made sense to me for one-off, growing pages, “page” may be the best way for me to think of these for now.
When I consider how I want to share these pages, the best system is the one I have right now – the one where I link to pages in a blog post every so often, when I am ready. The one where I can put a URL on something without the pressure of it showing up on a list of all the pages I garden. My system is a bit inefficient, but it is maybe good enough? It is good enough for now, at least.
On reflection, there is something joyful about being able to casually share a new page in a blog post, where the page is most appropriate. The one-off pages I garden aren’t a notebook so much as they are an amalgamation of bullet points, a potential starting point – a place with more information. In blogs, I refine and define and synthesise and reflect. In pages, I often want to get the notes down so they have a home. So that I can build on the idea later.
Indeed, building on things feels very much in the spirit of having a website. We’re always building on what we have. I garden where I can. As Jeremy said in the aforementioned Front End Study Hall discussion about gardening and web development: “the joy of the thing is in the development - you cannot plan for it.”
In the spirit of talking about one-off pages, this may be a fun time to share I have a page on this website that lists songs that are related to rhubarb pie. If you have any suggestions that I can add to the list, please do let me know!
The main Artemis interface has remained largely the same since I made the software available for others to use. Here is the interface in December 2024. Here is the interface in 2026 [^1] [^2]:ALTThe Artemis web reader showing a list of posts under the heading "Friday, March 27th".The main change that I have made is that the navigation bar now has a “search” link, now that search is supported.When I added the search link, I spent quite a bit of time thinking about whether I should ma
The main Artemis interface has remained largely the same since I made the software available for others to use. Here is the interface in December 2024. Here is the interface in 2026 [^1] [^2]:
The Artemis web reader showing a list of posts under the heading "Friday, March 27th".
The main change that I have made is that the navigation bar now has a “search” link, now that search is supported.
When I added the search link, I spent quite a bit of time thinking about whether I should make it opt-in via a settings toggle [^3]. I knew that adding the search link in the place where I wanted it to be – after the “add” link used to add an author to one’s reader – would shift other links, which would mean that two navigation links that had been there for months would now be in different places.
After some thought, I ultimately opted to add the link in for everyone. I thought the search feature was sufficiently useful that it should be in the navigation bar.
Aside from that, the interface now has supported for “nested” posts, which appear in certain contexts (mostly: when you are subscribed to a Mastodon account, you replies that make up a thread of posts by the same author in lighter grey text and nested below the main post, to preserve space). This is an enhancement; it doesn’t disrupt the core functionality of showing the list of posts.
I haven’t had any impulse to redesign the software. I like the way things are. The software feels visually stable. It works, and doesn’t change much. I have added a few new layouts, but those layouts co-exist – users can choose what layout they want to use from their account settings.
I was thinking about this today after reflecting on all the times when a redesign has been jarring for me. I am cognisant of redesigns in software I have used that still, sometimes years on, don’t do essential things as easily as was possible before their redesign.
Of note, there are areas where the interface has changed more substantially. Such changes primarily pertain to settings or subscription management. Indeed, software changes: Artemis does a lot more than it did two years ago. The interface reflects that. For example, the account settings page started to grow significantly, so I broke it up into several sub-pages. This reorganisation felt better than the alternative of continuing to add more options to a single page.
As software changes, so too might a UI; there is no part of me that can reasonably make any blanket statement about how redesigns are not a good idea, or that redesigns are essential, or that UI stability should be prioritised over another design principle. Context matters. Rather, I aim to document that UI stability should be a design consideration. It feels good when everything is in roughly the same place.
[^1]: The colours are different because I have since set a custom colour theme in my account settings.
[^2]: You may notice that the 2024 version had an "invite" button. This was something I had enabled only for my account if I remember correctly so that I could manage invite codes.
[^3]: Another thought that crossed my mind was to make the link opt-in, but on by default for new users. This would have been substantially more engineering so I didn’t do it, but I still love this idea.