I visited a coffee shop I have not been to in at least two years today. On the wall, above the coffee equipment rested on wooden countertops, there was a quotation written on a sign. It read: I’ve learned that people will forget what you said, people will forget what you did, but people will never forget how you made them feel. - Maya Angelou...
One of the programming patterns I have seen used in several contexts over the last year is lazy loading. On the web, you can use lazy loading to tell the browser that an iframe or image should only be loaded when the viewport is sufficiently close to the resource. Using lazy loading lets the browser skip downloading resources that are not used...
I have just finished the first week of Couch to 5k! It has has been a challenging week, but incredibly rewarding. I have gone from having not run in years to doing three runs in a week. I’m very happy! This week I have felt myself being pushed to my physical limits. I have become more aware of my body and its movements. I start thinking more...
I had a conversation last week with Ben about tools for the next decade of the web. I think we are at an inflection point in the history of the web, one where the tools we made over the last decade or two may not be fit for us in the coming decade. Last year, I wrote in “The next decade of the web“: My vision for the web over the next ten years...
Over the last few months, I have been learning more about web design. I have been experimenting with layout, learning about colours, figuring out what types of fonts are available and using them in different contexts. Thus far, there have been three facets to my learning: noting, making, and understanding. Last year, a friend who is a web...
I have been thinking a lot creativity. What does creativity mean to me? What factors make me feel more creative? How can I be more consistent in refining my skills in my creative pursuits? The Blog Questions Challenge, in which bloggers are challenged to write about their blogging practice, got me thinking more about my creative questions. Thus,...
The clouds in the sky are painted with a light pink hue. The full moon peeks over one of the clouds. It is morning. I appreciate the morning and evening skies because there are so many different ways the sky can be. On the horizon, the sky can be pink or a pink-ish purple, the sky can be yellow or orange. There can be a gradient of two or three...
Last year, I spent a lot of time iterating on Publish, the publishing interface for my website. This interface is a static HTML page that generates a markdown file. This markdown file can then be published to my website. The Publish page is public, but you cannot publish a blog post unless you have access to my Git repository. This paradigm works...
I went out for my second run this morning. The schedule was the same as my first run: a warm up period, followed by eight periods of running for 60 seconds and walking briskly for 90 seconds. After my last run, I started to get some aches in my legs. I asked a friend who runs about this and it’s a common phenomenon. My legs were sore yesterday,...
I have always enjoyed a brisk walk. My best friend growing up walked really fast. I enjoyed staying at the same pace with him. For the last few months I have been thinking about taking up running as a hobby. I enjoy the challenge of walking fast and wanted to see if I could start running. I had no experience but, I thought, maybe I could give...
The snow and frost on the hills in the distance are painted with a faint pink hue. The sun is about to set. While the sky is still blue with pink on the horizon, the moon is out. The moon has been in the sky for hours. I see it above a tree. I crane my neck up to look at the moon and think about all the joy that seeing the moon in the daytime...
A few years ago, I had a morning routine I followed every day. I later thought to myself that I was being too rigid, so I relaxed the routine. Life happened and my mornings started to get less consistent. The main parts of morning – breakfast, coffee, getting dressed – were there, but the order was different each day. Some days I have to be up...
Over the last week, I have made several improvements to the way images are loaded on my website. I now have WebP and AVIF versions of the images used in my blog posts. I use the picture element to tell the browser that there are multiple formats available; browsers can then choose to load a format that is compatible. I have also been updating how...
It is a cool winter morning. Snow lies peacefully on the grass and the hills. The pavements here on lower ground are mostly clear. I am surrounded by a snowy landscape. As I gaze out the window, I see a blue and white horizon where the white, morning winter sky blends in with the snow-covered hills. It is cold outside, but I feel warm inside. I...
For the last few months, I have been working on Artemis, my calm web reader. Artemis lets you keep up to date with web feeds. The reader updates once per day, intended to discourage me from periodically checking for new articles. As I have been working on the tool, I find myself often noting details about my experience that I think could be...
I am in awe of the knowledge available on the web. Stories of wonder, tutorials of great quality, and words of excitement, passion, and interest are all around us. Earlier today, I was thinking about the significance of sharing things others have written. By sharing what I have enjoyed on the web, I can help others find those resources. Through...
Happy New Year! In 2024, I spent a lot of time reflecting on the personal significance of writing. Writing makes me feel alive. When I write, I feel excited and challenged. “What do I want to say?” is then followed by “How do I say it?”: two seemingly simple questions from which art can flow. I enjoy thinking about the stories I want to share on...
I ask myself the question What should I make next? often. When I don’t have a new idea to work on, I think about what’s next. Figuring out what to build is hard, but I know deep down that ideas always come – whether after a conversation, after reading an article on a topic I find interesting, or after reflecting on something that I have noticed....
I have recently been thinking about two creative modes that I find myself in: one where I am inspired and have lots to work on and see many areas for growth, and another where I’m not quite sure what to say and get stuck in my shell. One of my favourite things to do is to make something new: to write down and share a story that brought me joy, to...
I have made several updates to Artemis, the calm web reader I am developing. Here is what has been added since the last release: You can now authenticate with passkeys. You can set up a passkey in your account settings. noreferrer attributes are added to all external links to ensure no Referer header is sent when you click a link in your feed....
Advent of Patterns was motivated by my interest in learning more about design. I was inspired by the advice of a friend who said that to become a better designer I should first start by noting what I like – and don’t like – about other designs. I expanded upon this to start asking myself “what patterns do I see consistently?” I have occasionally...
Sometimes, website authors change the URL of a feed without adding a redirect. This causes a problem for people subscribed to the feed: without the redirect, the software used to subscribe to the feed will have an out of date URL. After seeing Artemis, the calm web reader that I run, try to retrieve several dozen feeds that now return 404s, I...
This article is the twenty-fourth and final edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series.. When I am working on content management tasks, I often make reference to the list of all...
Artemis, the calm web reader I am developing, is out of beta. You can sign up with the invite code “coffee”. Since launching Artemis, I have added several features. The highlights are as follows: You can use the Artemis feed recovery wizard to find updated feeds if a feed URL is broken. This appears as a red “Fix” button in your Authors page...
This article is the twenty-third edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. When I was designing Artemis, a calm web reader, I started to reflect on the importance of user...
This article is the twenty-second edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. Knowing the status – or “state” – of a system or task is an essential part of interaction design....
Artemis, the calm web reader I am building, updates once a day with the most recent posts from the authors you are following. I have designed Artemis to update on this cadence so that I don’t feel compelled to check my reader several times each day for new updates. Months after starting to use the software, I have found I check Artemis...
This article is the twenty-first edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. Some parts of websites continue to stay on screen as you scroll to different parts of a page. For...
This article is the twentieth edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series.. A shareable link is a link to a web resource that you can share with others. All public links are...
Many of my Advent of Patterns blog posts contain visuals that accompany the text. This is different from much of my previous writing which was text-focused; technical guides, poetry, musings. When looking through my posts, I noticed that some of the details of the images were hard to grasp because they were too small. I was trying to fit the...
This article is the nineteenth edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. Tables of contents provide an overview of the contents of a document. Tables of contents can help a reader...
This article is the eighteenth edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. Timelines let you scroll through the history of a document or piece of digital material. Timelines allow...
This article is the seventeenth edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. A “diff” shows the difference between two states of a document. You can use a diff to understand what has...
This article is the sixteenth edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. I was recently working with a web page developed in Webflow. The page was on a “branch”, which means it was...
I was recently writing the landing page text for Artemis, the calm feed reader I am developing. In the first three sentences on the page, I wanted to communicate what Artemis is, for what you can use the reader, and the fact that the reader only updates once per day. Here is what I came up with: Artemis is a calm web reader. You can use Artemis...
This article is the fourteenth edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. When I am working on written documents – from blog posts to documentation – I like to see a preview of...
Offline mode is a version of an application that usually depends on internet but can work without an internet connection. Offline mode ensures that software can be useful even if a user does not have access to the internet at a given time. There are two main types of offline mode: read-only, and read-and-write. In a read-only offline mode, you...
This article is the thirteenth edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. Text fragments are links that point to a specific part of a web document. A common use case for text...
This article is the twelfth edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. When I want to create a Google Document, I usually type docs.new into the address bar of Firefox. This...
For the last few months, I have been working on Artemis, a calm web reader. I use Artemis to follow my favourite blogs and websites. In designing Artemis, I had a few goals in mind: I want Artemis to be part of a web exploration journey, so every web link takes you to the author’s websites. I want the interface to make me feel calm, not...
This article is the eleventh edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. An inline function tray is an interface pattern that lists functions that you can apply to information in a...
This article is the tenth edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. When I am working on a web page design, I think a lot about the reading experience. How readable is the text?...
This article is the eighth edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. Software used for creating or publishing documents or files commonly implement version histories. Version...
This article is the eighth edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. Applications that aggregate or have lists of information commonly show previews of information in an overall...
This article is the sixth edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. In Pattern: Link contexts I discussed ways in which additional information can be added to or around a link as...
I have designed my own web reader. With the web reader, I can subscribe to blogs and websites I like. The reader updates once a day to show all the web pages published in the previous day. I can also see pages published in the last seven days. Yesterday, I found an edge case: the title for article that used curly quotes was not properly...
This year, I have been trying to design more web pages so I can learn more about web design and practice my skills. I started with a re-design of this website which I have been refining little-by-little as time passes and I learn more. Recently, I have been experimenting with designing a new type of layout: a documentation website. I had a...
This article is the sixth edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. When you type a phrase into the Firefox address bar, the browser will suggest pages you have been to before. If...
I continue to learn a lot about content design and web development from the GOV.UK design system. Inspired by the idea of having all styles and patterns and components in one place, I started to think: how can design systems apply to personal websites? My first thought is to think about this in terms of a “website style gallery” – a place where I...
This article is the fifth edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. Pre-rendering refers to rendering something before it is explicitly needed. Pre-rendering can improved the...
My Spotify wrapped, showing the list of artists and songs to which I have listened most. The lists in this image appear in text later in this article. Before my first sip of coffee today, I saw a colleague share their Spotify Wrapped. It’s that time of year again! Excited to see the collection of songs I had listened to most this year, I picked...
One of my joys in the morning is to open my web reader and to look through all the new things to read. I may read some posts in the morning, or bookmark others for later. Sometimes, I add links to my personal notes, a sort of bookmark for my future self. The links in my web reader inevitably take me not only to a specific piece of writing by a...
This article is the fourth edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read more about this series. This year, I commissioned a holiday-themed mascot for my website. I wanted the holiday mascot to appear on all...
This article is the third edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read the introduction to the series to learn more about the series. Static site generators commonly have an interactive “incremental” mode....
This article is the second edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read the introduction to the series to learn more about the series. When you are designing a search engine, it is important to filter...
The more people talk about CSS features, the more likely it is that developers will hear about them. I learned about oklch in a talk about CSS colours. I learned why rem and em are significant after conversations with friends and reading about the topics online. I love the spectrum of resources available: from documentation like MDN that...
There are a few categories of navigation features on my personal website: My website homepage. The sidebar, which appears on most pages. It is the main, global navigation for my website. Category and date links that appear on articles. My search feature. All of these features serve different roles. My website homepage both introduces me, the...
This article is the first edition of the Advent of Patterns series. In this series, running from December 1st to December 24th 2024, I will document one design or programming pattern I have noticed recently. Read the introduction to the series to learn more about the series. The Guardian adds a “This article is more than” box in yellow to the top...
My equivalent of the “morning paper” is reading personal websites. I sometimes get so excited to check what new blog posts are out that I write down on my TODO list that I should check my reader in the morning to see what’s new. [1] I designed my web reader – the interface I use to follow blogs – after reflecting on how I want to read the web. I...
My inspiration ebbs and flows: some days, I have many ideas; others, I think hard but no ideas come. I have found that speaking with friends helps me to think of new things to make and write about. Spending more time out and about helps too. I haven’t been walking around a lot recently: the colder weather, and the winter blues, had me out less...
In 2021 and 2023, I challenged myself to publish a blog post on a specific theme every day from December 1st to December 24th. The 2021 theme was Advent of Bloggers, in which I discussed a blog I liked in each post. In 2023, I wrote my Advent of Technical Writing series, in which I published a post a day about technical writing. I generally...
External links on my website now show a small icon commonly associated with an external link. The icon, which is part of each link and implemented using the CSS ::after pseudo-element, is a visual indicator that the linked material is on another website. This provides important context to the user that differentiates internal from external links...
In my recent blog post “Forgiving interfaces,” I reflected on the ways in which software can be designed to be “forgiving.” I was thinking about forgiveness in design through Tantek’s original definition of “able to undo or otherwise correct your mistake.” This evening, I started to think about another framing: that a forgiving interface should...
Back when I used to attend coffee festivals – something I should plan to do next year! – I would revel in the prospects of trying coffees that vary by varietals, roasting method, region, and more. For each coffee I tasted, I could learn something new; I learned some flavour profiles are more typical of certain regions, that the fruity and floral...
Tantek introduced me to the idea of forgiveness as a property of a trustworthy tool, defined as “Forgiving — if you make a mistake, you should be able to undo or otherwise correct your mistake.” I was thinking about this when reflecting on a notes archiving tool I made. The tool is forgiving in a few senses. First, if you try to archive a...
A year or two ago, I made a tool that saves notes from IndieWeb meetups to MediaWiki. I made the tool because it was tedious to copy-paste the notes from our note-taking software, Etherpad, to the wiki. Archiving also involved adding a few tags so that the page would have various components useful for readers of the archived notes. The tool,...
Last month, the Guardian published an article on how “young people are shunning AI algorithms and online retailers to experience the joy of visiting bookshops.” The article makes me feel excited, and matches my experience going to a bookshop. I go to bookshops to explore, to wander, to learn. I enjoy walking in the front door and seeing what new...
One of my goals for this year has been to learn more about the tools of the web platform: HTML, CSS, and a bit of JavaScript. I am excited to learn about the possibilities of these tools and what I can do with them. I have particularly enjoyed learning about CSS. This year, I have learned about so many new features in CSS, for example: conic...
Last night, before bed, I was thinking about ideas for what to blog about in December. I am interested in doing another writing series, although I was unsure on what topic to write. I still am, but now I have a few more ideas. As inspiration struck – one idea, then another – I started to write notes on my bedroom whiteboard. This is one of two...
I am hosting a Web Writer’s Workshop event on December 3rd, 2024. The event, scheduled to last 90 minutes, is a place to chat about all things writing: what to write about, writing tips, staying motivated, how to collaborate on written projects, and whatever else comes up on the topic of writing. Whether you publish fiction or non-fiction,...
When I redesigned my website earlier this year, I removed the dark mode theme from my website. I wanted to focus on getting the website working first – a functional design was the goal. Now that I have been using my new theme for a few months and, in the process, refined several of the styles, I was ready this weekend to revisit dark mode. Dark...
I want to learn about design, I thought to myself, excitedly. I was interested in why some things feel better to use than others – why do some tools feel like a delight, while others feel rough around the edges? What makes an effective tool? What makes a tool a delight to use? How do I make a tool that feels like a delight? I asked a designer I...
Recommended by a friend, I first listened to Cat Burns’ live more & love more on an early morning train. The songs I listen to often were flowing through my headphones; the usual playlist going. The music soothed the transition from tiredness to feeling ready for the day. Then, I remembered that I had a new song to which I wanted to listen. I put...
When I woke up this morning and opened the window, it was snowing. This was the first time this year I have seen more than a small flutter of snow fall from the sky. The ground and hills were coated with snow; the imprint of footprints followed the pavements. It was cold. And it was magical. There were low clouds. Looking up, I could see only...
The web is empowering. Through the web, we can find information, read and share stories, find inspiration for the next thing we want to do, and communicate with others. We can make art: poems, essays, fiction, websites. We can share what makes us human. I was thinking earlier today what I want for the web. Where do I want the web to be in the...
I have several lists on my website that have two columns. For example, my archive pages have a column for the date on which a post was published and a column for the post title. My link garden has a column for the link title and another for a tag related to the content. Here is an example showing a side-by-side layout in my link garden: The...
As I continue to build my blog search engine, I have been asking myself “given my search engine is for my website, what features can I build that would be most helpful to me?” I have been thinking a lot about search filters since I wrote my blog post on how helpful I find Slack’s search filters. I now think of search filters as an integral part...
Toward the top of my notepad, I wrote I miss personal writing. I realised this in a conversation earlier this week where I felt that something was missing from the more technical writing I have been doing lately on this website. As I was singing and dancing while waiting for the kettle to boil, listening to Taylor Swift’s reputation, I thought...
My website search engine now supports direct answers. Any query starting with what is or what are is processed with logic that aims to find a direct answer to the question. For example, consider the query “what is a trie”. When this query is run, the search engine returns a “direct answer” result at the top of the page, followed by the “10 blue...
One of the joys of making something is that you never know the extent to which it can inspire someone. I was just thinking about all the things I have on my bookshelf. The authors will never know that their books touched me in a particular way. Thus is the nature of creativity: when you put something out there, people can find meaning in what you...
Sometimes, I have an idea for something to create – an essay, a blog series, a program, a tool – that I realise I am not ready to make yet. I felt this way when I wanted to write about technical writing. I knew I had something to say, but I wasn’t sure what yet. I feel this way with many of my essays: I have an idea, but I’m not sure how I want...
I have so many links I can share, I said to a friend with excitement. I often feel this way. I have websites and web pages in my head that I often refer to when I’m talking with friends. Perhaps one of the reasons I love search so much is that I don’t necessarily keep all my favourite links in one place. Some are in my bookmarks, others I...
My website search engine uses text search to identify documents relevant to a given term. Up until recently, the search engine treated every word in a term independently. For example, consider the query “all too well”. Documents would be found that contain any of the words in the query. Then, the results would be ordered according to their...
My blog search engine used to treat every word independently in evaluating a query. For example, results for “homebrew website club” were calculated by finding documents that contained all those words. The words did not necessarily have to be in sequence. For many queries, documents that were relevant bubbled up to the top of search results using...
In Let’s replace “user experience” with human experience, I posit that we should use “human experience” instead of “user experience,” the former expressing more directly the fact that we design software for people. When I make this website, I like to follow my curiosities. With that said, I care deeply about the accessibility of the content on...
I recently asked two friends to give feedback on part of the experience on my website. I invited both to calls, separately, and gave the requisite context about the feature I wanted them to try. I then watched as they navigated around the website in pursuit of a goal. I was tempted to refer to this as “user testing,” but then a hesitancy I have...
I love being the person who can make sound from a piano where there was silence. I hope that I can also be the person who inspires more people to find their own sound.
It was with the sounds of the cicadas, that Sestuna walked through the streets, looking for the rumored cafe with the ability to travel in time. She could hear the sounds of the first fireworks in the background, the children running around the streets. She passed the Obon festival, before she reached the right block. The sounds of children...
I have spent a lot of time thinking about how to organise content on my website. I want you, my readers, to be able to learn about the different types of content to write – from poetry to technical blog posts to stories – and find the posts that may be most interesting to you. There are several ways in which I organise my content: My homepage...
The hills on the horizon are becoming clearer, I think to myself. I reflect on the faint haze that remains after the heavy fog that painted the landscape white earlier in the morning. The low sun is shining, illuminating the few remaining colourful leaves on the trees in front of me. I think back to all the changes in the leaves — from the pink...
Music from Bon Iver plays in the background of a cosy cafe in the heart of Mitte, Berlin. The cafe is elevated from street level, which gave me a different perspective of the street. After a few days of cold mornings, the city had started to warm up a little bit. People will still wearing hats and gloves on the street, but the temperature was no...
I have been thinking about how musical concepts apply to blogging recently. For example, could you make “playlists” of your content that are curated by theme or the mood of the posts? For example, could I have a list of “Monday morning pick-me-ups” with heartwarming stories I have written, or a list of “Web Wednesday” posts that are all about...
A few weeks ago, I wrote a blog post with a friend in real time using Google Docs. We started with a blank page and conversed in the document to develop an idea. Then, we started writing, together. The result was a delightful story. We only spoke in Google Docs; our communication was limited to text. We decided to write a fiction story. I am less...
A supermarket in Berlin with a sign that reads ‘freshly made smiles’. Freshly made smiles at a supermarket in Berlin.
Nestled within the annals of my notes is “The long view of blogs,” followed by my wondering whether a blog could be a magnum opus. I later coalesced these ideas into the “long view” of a blog. I imagine this as thinking about the blog not as any single post, but rather as the collection of all works over time; the contents and presentation When I...
Showing feedback is an essential part of user experience design. When a user takes an action, it should be clear to the user that the action has been recognised by the system and that, as a result, something is happening. If an action is instant, feedback may mean showing the results of the task or an indicator to say the task is complete. If an...
Earlier this year, a friend told me that an essential part of learning design is to take note of what you like and don’t like. Once you notice that you like and don’t like, you can ask yourself why. From there begins the potential to analyze and build an eye that you can use to make your own designs. —- The IndieWeb has a philosophy of...
Slack uses keyword search. I can type in a keyword, like “optimization”, and find words that match the keyword. I can also add filters that refine my query. For example, I can say “optimization from:@James” to say that I only want to see messages that contain “optimization” and were authored by the user @James. Search filters are one of my...
ClickHouse is a database that aims to provide “lightning fast analytics for everyone.” They have published several resources online about how they strive toward making ClickHouse as fast as possible, including Why is ClickHouse so fast? In one post, Testing the Performance of ClickHouse, they outline a “ClickHouse comparison tool” that lets...
In “Regular Expression Matching with a Trigram Index or How Google Code Search Worked”, Russ Cox describes a system that allows for code search with regular expressions. It has taken me several reads of the article to understand roughly what is going on, and I still don’t have a full understanding. With that said, there is one pattern that stands...
The theme for this month’s IndieWeb Carnival is impact. In the announcement, Xandra, who is hosting the event this month, noted “has someone made a profound impact on you?” as a potential question to explore. While saying to a friend “I’m not sure where to start with such a big topic,” followed by a smiling face emoji to take the tension away...
Before you optimize your code, you should run a profiler to understand how your code performs. In Python, you can use cProfile to profile your code. cProfile is part of the Python standard library. With cProfile, you can find out: How long functions take to run in your code, both per call and cumulatively; How many times functions are called;...
I have noticed a pattern across my work in search and on static site generators: in both cases, the key to offering good performance for users is to precompute as much information as you can. Text search engines rely on “reverse indices,” which map words to the documents they are in. Reverse indices are structured in such a way that allows...
Search engines help us find information. Over the years, web search engines such as Google have experimented extensively with how that value proposition translates into a user experience. At first, search engines helped you find web pages that addressed queries. Google famously showed “10 blue links.” Then, search engines started to render more...
The Firefox address bar lets you search for URLs given a series of characters. You can then select a URL with your arrow keys and press enter to navigate to that URL. One use of this for me is finding files on GitHub. For example, I can type gith jam def to find the default.html file in the private jamesg.blog GitHub repository. I usually write...
The IndieWeb wiki, like Wikipedia, uses concise, descriptive URL slugs. A “slug” is the part of the URL after the domain name. For example, the following page takes you to the wiki page on coffee. https://indieweb.org/coffee I have recently been thinking about two benefits of concise URLs such as the one above: You can remember the URL so you...
When you copy images directly from a Google Document into Ghost, and potentially other rich text editors, URL references to the images in the Document are copied instead of the underlying image. This means that if the document is deleted, the images will be broken. Thus, before you use images in a Google Doc, you should export them. Google Docs...
Firefox has a feature that lets you map a character or sequence of characters typed in the Firefox address bar to a custom search engine. For example, you can map w to Wikipedia, so the query w coffee would take you to the Wikipedia search page for coffee (which auto-redirects to the Wikipedia page for coffee). I have just set up two shortcuts...
Your eyes open to see rays of the autumn sun peeking through your dark curtains. A soft alarm rings in the background. It’s time to start your day. While it’s a Sunday, you set an alarm to make sure you don’t spend your whole day in bed. Or, if you do, at least you have an alarm to prompt you to make a cup of coffee that you can drink while you...
How does one encapsulate this feeling of awe? I’m looking up at the stars and it’s beautiful. It’s beautiful. All the glimmers, from the intense to the twinkling. The moon, with a tint of red, is to my left. As I look West, I don’t see the comet for which I was looking. But it almost doesn’t matter. Because I see… wonder, and a reminder of how...
Read this article on James' Coffee Blog
At Homebrew Writing Club yesterday, someone asked “What is the writing equivalent of a duet?” I explore this concept with reference to collaborative writing, then extend the idea further of applying musical metaphors to writing. This led to thinking about the literary equivalent of playlists, remixing, and more. My thoughts are in the voice note...
html from links, adventure James' Coffee Blog mascot from links, adventure: № 1 october 9th, 2024 by James' Coffee Blog. 1. Designing for Users with Anxiety by the United Kingdom Government 2. Garfield: September 18th, 2024 by Jim Davis 3. A quote on words by Ursula K. Le Guin 4. Contronym on Wikipedia 5. Color Hunt A colour palette directory
When I am designing technology, I like to think about how fast I can make the experience. This involves making conscious engineering decisions at the beginning of a project to lay the foundation for building a fast application (i.e. choosing the right data structures). Then, as I develop, I ask questions like “is this as fast as it should be,...
This evening, I started to think about what the experience should be on audio notes. Could I offer transcriptions? What would that look like? What design elements should I have on the page? What features could I add to afford greater utility to the transcript, like search? I explore these questions in the below audio note, with additional...
I have recently been reflecting on how technical writing goes out of date, and what that means as a technical writer. In the voice note below, I explore how technical documents have relevance far beyond their immediate utility as a reference material. Your browser does not support the audio tag.
At Homebrew Writing Club this evening, we spoke about modalities of content: of writing, audio, video, and more. We also spoke about the best way to make something is to get started, and to make it as easy as possible to get started. For example, instead of worrying about how to classify content, you can write or make it, then classify it later....
The melody of The Sound by Carly Rae Jepsen plays in the background as I write the opening sentence for this blog post. When I hear a song in a playlist that I love, I often take a screenshot of the song name to remind me to listen to the song later. I often forget to go back and look at the songs. This weekend, however, I decided to look through...
Running monthly, the IndieWeb Movie Club is an invitation to watch a movie chosen by a selection of rotating hosts and, optionally, write your thoughts about the movie on your personal website. Mark started the blogging challenge with The Matrix, then Benji hosted September’s event with When Harry Met Sally. I am excited to be hosting this...
I love bookshops. I enjoy perusing the shelves in search for a new book to read, and the excitement that comes when I find a title that looks like exactly the kind of thing I might enjoy. I love seeing the new releases, searching for if there are new editions out of book series I have been following. I am inspired by how many stories are sitting...
The views from the Millenium Bridge in London are incredible. Opened in 2000s by Queen Elizabeth II, the bridge connects St. Paul’s Cathedral with the Tate Modern gallery. Standing there a few days ago while on holiday, I found myself gazing at the Tower Bridge. I had arrived in the early morning, as the sun was rising. I stood in a spot where...
Never give up, said the person sitting next to me in the theatre as we chatted in the interval of Hamilton. When I arrived at the theatre in London’s West End, I took my seat and looked around at the room. This was my first time going to see a musical. I was entranced by the building: the architecture, the grandeur. I was early to arrive, and sat...
It has been a busy day, characterised by delightful adventure. You have spent the day doing many of your favourite things, and trying new things, too. Night has fallen on the busy city and you find yourself in the heart of town: the place where you can find any cuisine that you seek. Your feet and legs are tired from the day. You walk one street...
Sweet Caroline, ba ba ba. Good times never been so good., sang, passionately, a group of friends who had just disembarked a London Underground train. I was at the foot of the escalator to go back to street level. As I went up, I saw people glancing, with joy, at the people singing who were down at the bottom of the escalator – the busker, with...
Every day, I look out for little things that make me smile. I sometimes take notes, knowing that those notes may bring back memories of the thing that brought me joy and the moment surrounding it. My Moments of joy series, in which I document things that made me smile, has helped me refine my storytelling skills. Since I was a child, I have loved...
I remember vividly when I first saw Picasso’s “Fernande with a Black Mantilla” painting. I was visiting the Guggenheim museum in New York. The spiral dome was under maintenance in preparation for a new exhibit (although that did not stop me from peeking through the curtain to see the vastness of it as I walked up the spiral platform through the...
“I’m just trying to think of a way to start this,” thought Cassie, as she embarked on her first blog post: an interview with two of her friends on what the web means to them. An assignment to pass her journalism class. Cassie: “Hello, everyone. Thank you for joining me today for this interview. I’m so excited! I must admit that I’m a bit nervous....
Suppose you are looking for my Aeropress recipe. To find this information, you could turn to my blog search engine. This search engine indexes all of my blog posts. The search engine is powered by JameSQL, a NoSQL document database. Turning text queries into JSON queries Let’s start with a query: aeropress recipe When you type this query into my...
The search engine on this website is powered by JameSQL, an open source, NoSQL database. The engine accepts a query and evaluates it according to any conditions specified. I strive to keep query times below 10ms, to help ensure the search experience feels and is as fast as possible. When I first released the search engine, relevance was...
On my way back from a trip to Vienna, I got breakfast at the airport. My flight was early, so I was especially looking forward to having a coffee with my meal. At the breakfast eatery I visited, there was a quiet room. The room was detached from the rest of the cafe with a glass wall, enough to significantly dull the sounds from outside. Whereas...
I was speaking with a friend yesterday about finding the time to write blog posts. I offered a tip that has worked for me recently: write before dinner. A few months ago, I had a work project and I decided to set myself a 20 minute deadline. I put my dinner in the oven, then started writing. In the time when I otherwise would be doing dishes or...
This blog post describes my thought process in implementing a transaction log for my database. My implementation may not follow best practices, as I am still learning. If this blog post sparks ideas on what I could do better, please let me know! JameSQL, my NoSQL database, was designed to be an in-memory data store. I use the tool for my blog...
The web has changed all of our lives: we are more connected than ever, knowledge is easier to access than ever. But sometimes it feels that we are subjected to that change, rather than being able to proactively participate in making the future; in crafting a web that speaks to what we want. Sometimes change feels impossible. I sometimes feel this...
Google, among other search engines, supports advanced operators for writing refined search queries. For example, you can use the site: search operator to constrain your search to a website, like: site:reddit.com aeropress coffee recipe In my How to build a query language in Python blog post, I walked through how to create the foundations of a...
I was having a conversation yesterday with a reader about clustering news headlines according to similarity. This had me reflecting on some of my past experiments with clustering and sorting, where I have used word embeddings to find similar documents. Word embeddings encode semantic similarity between documents, which allow for more nuanced...
Spreadsheets are a fascinating tool. With a spreadsheet, you can both store and structure data, and include formulas that run computations on the contents of a sheet. Every so often, I ask myself how a spreadsheet works. How do spreadsheets turn data and a list of formulas into a complete table of data? This week, I set out to build a spreadsheet...
This post is not an authority on how to make a NoSQL database, rather how I made mine. I am still actively learning this topic, but I wanted to write my thoughts to help me process what I am learning. I have used NoSQL databases for search projects in the past. A NoSQL database like Elasticsearch stores documents in (usually) a single table....
When you are working with dictionaries in Python, you may be familiar with the following process: You initialize a dictionary. You iterate over data. You check if a key is in a dictionary. If it isn’t, you add a default value. You add to the value associated with the key (i.e. to increment a counter, or add an item to a list or set). With the...
When you are building applications, you may want to add a cache to parts of your application. For example, consider a web directory that lists recipes. The directory has thousands of recipes available. You may want to add caching to database queries so that you don’t have to look up the database every time a user makes a request to the web...
Consensus algorithms allow computer scientists and data analysts to answer a question based on information from several data sources. These data sources may be independent, or data taken from the same source but at different time frames. Consider a scenario where you are building a tool that retrieves tags from Wikipedia album pages to build a...
One flat white, please. I sometimes order food, too; a warm croissant or fruit. I sit down at a table and take out my book from my backpack, the book I packed the previous day. Sometimes, I have two, if I am on the cusp of finishing one of them. I recline back in the chair in which I am sitting, open to the last page I was reading. This page is...
Websites that use well-defined URL structures are easier for me to navigate. When I use a site enough, I can remember specific paths, infer the structure of a site so I can find the page to which I want to go, and more. Some affordances of clean URL design, such as ease of navigation, can be implemented directly on the page – for example,...
In the “How to build a search index in Python” tutorial, we walked through how to build a search index in Python. This index, when queried, gives equal weights to all words that you use in your query. Thus, you can retrieve documents that contain words, but the documents are not ordered in any way. Once you have a search index, the next step is...
In this guide, I walk through how to build a query language in Python. No required knowledge of query languages is required to follow this guide. You will find this article easier to understand if you have some knowledge of trees. This guide should get you set up with all the information you need to make your own query language. With that said,...
I have been writing a test suite for Knowledge Graph Language (KGL), a concise syntax for querying knowledge graphs. My test suite ensures that, given a specific input, the language execution engine returns the correct response. Specific functionalities are tested, too, such as data imports and class methods that allow someone to manipulate a...
When I was re-designing my website, I put a lot of thought into the content section. I wanted to ensure my content was as readable as possible for as many people as possible. This meant that I wanted to design a default experience that adheres to design best practices. The design also had to be accessible, which would ensure that those using...
In response to my Ask the Website Maker blog post, a reader asked about my Moments of Joy series, curious about what moments I include, whether any moments are unpublished, and how I write the notes. That question inspired this blog post. In Februrary 2023, I blogged one of, if not the first, of my “Moments of Joy” blog posts. I ended the blog...
’Cause we never go out of style, we never go out of style… Wait… that’s a Taylor Swift lyric. This blog post is about a different kind of style: CSS styles. (Long-time readers, please disregard that this is the second blog post in which the topic is style and I referenced a Taylor Swift song.) fLaMEd fury asked a thought-provoking question on...
Would you like your scone warmed up? asked the barista as I placed my order in the bookstore cafe. I was touched by the question. I am used to cafes asking questions about the preferences of an order – “would you like that with oat milk?”, “what size of coffee would you like?” – but this time felt different. I was then asked what jam I would...
While sitting at my desk, I gazed up at the window and saw red, orange, yellow, green, blue, indigo, and violet. A rainbow. This is the second one I have seen over the last few days. Today’s rainbow looked like the bottom was close to my house. With a spontaneity that I didn’t realise I have, I walked briskly to get my shoes and keys. I was...
I am sincerely grateful for all of the knowledge people share about personal websites on the internet. From other blogs, I have found inspiration of things I can do on my website. I have learned how to do things I was previously unable to do. I have been inspired to create new things. In kind, I like to share what I am learning about personal...
Final boarding call for flight to Dublin, said the voice through the loudspeaker. I stood up and walked toward the end of the boarding line. It was one of those long, winding lines. There was a bit of awkwardness to figure out where to stand at the end of the line. As I maneuvered my way into a position in line, I smiled at someone who was, too,...
What is essential for this interface? is a question I have been thinking about in designing new digital interfaces and tools. Another way of framing this is “what do I really need?” When I went to re-design this website, those two questions were at the forefront of my mind. As I looked at the old version of my website, I realised that I could...
One of my favourite parts of San Francisco is the sun setting over the Golden Gate Bridge. I love the view from Fort Mason all the way to the marina and toward the bridge. I enjoy the array of colours and how they illuminate the horizon: the pinks, purples, reds, oranges. On my trip last week, I set out to see the sun set as much as possible. One...
It makes such a difference to someone’s day when you have a smile on your face., I said. The driver responded by saying “Exactly!”, in a tone of equal parts excitement and sincerity. I was in a taxi heading for work. I had my first coffee for the day, an iced mint mojito. A San Francisco classic made with milk, black coffee, and mint. Energised...
While walking down a street you have not yet explored, you notice a shop with tall, glass windows. On one window reads “Athena’s Coffee Shop” in traditional lettering. The kind of lettering you may associate with an old-timey store. But the interior is everything but dated. Through the clear glass, you see the vibrant, beaming sun illuminating...
I had been walking for half an hour along the Embarcadero in San Francisco, among my favourite places to walk in the morning. I can walk for miles and see beautiful sights along the way: bridges, palm trees, and people, like me, who have decided to start their morning with a walk. The time flew past. I was feeling a bit anxious – being away from...
How can search engines be so fast? While there are many parts of a search system, one of the key concepts to know is the inverted index. Suppose we have the following strings, all Taylor Swift lyrics: I made you my temple, my mural, my sky And I still talk to you when I’m screaming at the sky Started with a kiss We could manually search through...
I have been thinking about the question what makes a “good tool”? What are the characteristics that make me comfortable depending on a tool? What makes me delighted to use a tool? Expectations play a crucial role in my experience with a tool. Does this tool do what I expect? Are the controls easy to navigate? Are navigation elements grouped...
It is a warm, summer day. The sky is clear. The clouds has receded after days of rain. Over your morning coffee, you take a breath and realise the stillness of the moment. The wisps of steam coming from the side of your favourite coffee cup; the one that feels just right in your hands. While gazing out the window, a question comes to mind: What...
My favourite movie is The Map of Tiny Perfect Things, in which two characters discover they are stuck in a time loop. They use the time to make a map of all the wonderful things that happen in a small town. Toward the end of the movie, the song Frame of Reference by the Drug Store Romeos plays. Last time I heard the song, I wrote down the name,...
Lying in bed, you look through the window as the sun sets. It has been a rainy day. The sky was a blanket of clouds. As evening progressed, a soft pink hue emerged from the horizon. On a clear day, more of the sky would be pink. Today, the stokes of pink visible on the horizon are what you have. You smile as you notice that there is a break in...
After days of rain, I have been looking forward to seeing the sunset. I often note to myself that I should savour the sunset, watching as the sun recedes over the hills and changes the colour of the sky. Today, I am looking out another window through which I can see another part of the sky. Through the window, I can see candy floss clouds. I know...
I love to take notes of words. I write down words I hear that I think I could use in poetry and words that catch my eye. I sometimes take a note of a word after trying to think of how to express something and guessing what the right word may be. For example, I recently wondered if there was a word that meant arranged according to a taxonomy. I...
I am glad summer is here, I said to a friend earlier today. The sun was shining through the window after a dull, rainy spell of weather. It started to get dull throughout the day, but the sentiment with which I started my day – the joy of summer’s presence – was rooted in my mind. After dinner, I found myself going from tab to tab on the computer...