Shellsharks Blogroll - BlogFlock2026-08-23T23:27:19.094ZBlogFlockAdepts of 0xCC, destructured, Trail of Bits Blog, Aaron Parecki, fLaMEd, Westenberg, gynvael.coldwind//vx.log (pl), James' Coffee Blog, joelchrono, Evan Boehs, cool-as-heck, Kev Quirk, Posts feed, Sophie Koonin, cmdr-nova@internet:~$, <span>Songs</span> on the Security of Networks, Werd I/O, Johnny.Decimal, Robb Knight, Molly White, Hey, it's Jason!, Terence Eden’s BlogDungeon Crawler Carl - Kev Quirkhttps://kevquirk.com/dungeon-crawler-carl2026-08-23T12:03:00.000Z<div class="book card"><h2>Dungeon Crawler Carl</h2><p><b>Author:</b> Matt Dinniman<br><b>Genre:</b> Fantast, Sci-fi<br><b>Released:</b> 2020<br><b>Rating:</b> <span class="star-rating"><span class="star-rating" aria-label="5/5 ★★★★★">★★★★★</span></span></p><p>You know what’s worse than breaking up with your girlfriend? Being stuck with her prize-winning show cat. And you know what’s worse than that? An alien invasion, the destruction of all man-made structures on Earth, and the systematic exploitation of all the survivors for a sadistic intergalactic game show. That’s what.</p>
<p>Join Coast Guard vet Carl and his ex-girlfriend’s cat, Princess Donut, as they try to survive the end of the world—or just get to the next level—in a video game–like, trap-filled fantasy dungeon. A dungeon that’s actually the set of a reality television show with countless viewers across the galaxy. Exploding goblins. Magical potions. Deadly, drug-dealing llamas. This ain’t your ordinary game show.</p>
<p>Welcome, Crawler. Welcome to the Dungeon. Survival is optional. Keeping the viewers entertained is not.</p><p><a class="button" target="_blank" href="https://www.goodreads.com/book/show/211721806-dungeon-crawler-carl">Learn more on Goodreads ➡</a></p></div>
<hr>
<p>Started reading this book after a couple of friends in work recommended it to me. Couldn't put it down and read it in a couple days. I've gone straight onto the next book in the series, and I'm really looking forward to seeing where it goes.</p>
<p>The book has <em>Hitchhiker's Guide To The Galaxy</em> vibes in that it doesn't take itself too seriously, and is a lot of fun to read. Highly recommended.</p> <div class="email-hidden">
<hr />
<p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p>
<p>You can <a href="mailto:19gy@qrk.one?subject=Dungeon%20Crawler%20Carl">reply to this post by email</a>, or <a href="https://kevquirk.com/dungeon-crawler-carl#comments">leave a comment</a>.</p>
</div>Death to px, long live ch! - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=638472026-08-23T11:34:52.000Z<p>Pixels are a lie. Even if you think you're drawing something with "<a href="https://shkspr.mobi/blog/2018/11/the-myth-of-the-pixel-perfect-grid/">pixel perfect</a>" accuracy, your monitor is lying to you. There is no grid of platonically perfect squares.</p>
<p>In CSS, <a href="https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Styling_basics/Values_and_units#lengths">pixels are a double lie</a>:</p>
<blockquote><p>Note that <code>1px</code> doesn't necessarily equal one physical device pixel. On HD displays, it may span multiple physical pixels. Similarly, <code>1cm</code> in CSS often doesn't correspond to one hundredth of SI meter. On a large TV screen, it typically is longer than that. The lengths are perceptual: <code>16px</code> looks roughly the same on a phone, laptop, or TV screen at typical viewing distance.</p></blockquote>
<p>This blog is primarily text based. I want the <a href="https://journals.uc.edu/index.php/vl/article/view/5765/4629">width of the text to be readable</a> for the average human. So, rather than setting the main width to be a percentage of the screen, I set it based on character width using the <code>ch</code> unit - which <a href="https://meyerweb.com/eric/thoughts/2018/06/28/what-is-the-css-ch-unit/">isn't exactly a character</a> but good enough for my purposes:</p>
<pre><code class="language-css">--width-content: min(75ch, 100%);
main {
max-width: var(--width-content);
}
</code></pre>
<p>When it comes to padding and margins, the same is true. If I want a gap around an element, I want that gap to be in proportion to the text inside it.</p>
<p>For widths, it makes sense to re-use the <code>ch</code> unit. I want the gap to be in proportion to the text.</p>
<p>But for <em>height</em>, perhaps it doesn't make sense to express vertical distance on character width? In which case <a href="https://www.w3.org/Style/Examples/007/units.en.html">the <code>ex</code> unit can be used</a>. It is the size of a typical lower-case letter.</p>
<p>Just like my idea to <a href="https://shkspr.mobi/blog/2025/09/class-warfare-can-i-eliminate-css-classes-from-my-html/">eliminate CSS classes from my HTML</a>, it's possible to go too far with this. I haven't changed <em>every</em> reference from em to ch, I'm just experimenting to see if it works.</p>
<p>There's nothing wrong, immoral, or evil about using px - or any other measure unit. Using ch and ex fit with my particular proclivities.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=63847&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">Automated organisation is here - Johnny.Decimalhttps://johnnydecimal.com/blog/0242-automated-organisation-is-here/2026-08-23T04:12:30.000Z<blockquote>
<p>Originally sent to the <a href="https://johnnydecimal.com/support/contact-community/mailing-list-rss-social">mailing list</a>.</p>
</blockquote>
<p>The last of the week's big updates is that you can now connect your AI to Johnny.Decimal. Now Claude or ChatGPT or whatever else you use has access to:</p>
<ul>
<li>The site documentation, blog posts, and 5+ years of my forum posts.
<ul>
<li>So it can give you advice on the system and how it should be used.</li>
</ul>
</li>
<li>The Life Admin and Small Business Systems – all 50,000+ words of explanatory text, exceptions, examples.
<ul>
<li>So it can tell you where to file stuff.</li>
</ul>
</li>
<li>The Workbook process
<ul>
<li>So you can build your own system.</li>
</ul>
</li>
<li>Transcripts of all of our videos.
<ul>
<li>So it can point you to a specific video that answers your question.</li>
</ul>
</li>
</ul>
<p>Your existing Pro account just got an upgrade: all of this just works for you, today. To read the SBS, you need a Business account. Free and Personal accounts can read the documentation including the Workbook. (Get a free account on <a href="https://johnnydecimal.com/">the home page</a>. Upgrade your account at <a href="https://johnnydecimal.com/products">Products</a>.)</p>
<p>I can ask it a question about planning a new range of banana-coloured clothing and it can map it out in the Small Business System.</p>
<figure class="figure jdimage jdimage--auto-dark"> <picture> <img class="figure__inner" alt="Screenshot of Claude's response to my banana clothing question. It shows me which parts of the SBS I need to use, and recommends starting with a Work Package." height="447" loading="lazy" src="https://johnnydecimal.com/blog/0242A_Claude_response_to_banana-1334x894@2x.png" width="667"> </picture> </figure>
<p>Using your tool's 'cowork' feature you can connect it to your local filesystem and JDex. Now you can ask it questions about your own data. Here, it correctly notes that I've deviated from our published advice on filing receipts! I'll update that guidance in the Small Business System…</p>
<figure class="figure jdimage jdimage--auto-dark"> <picture> <img class="figure__inner" alt="Screenshot of Claude's response to my receipt question. It's read my local disk and tells me that I am up-to-date with my receipt filing." height="450" loading="lazy" src="https://johnnydecimal.com/blog/0242B_Claude_response_to_receipt_query-1316x900@2x.png" width="658"> </picture> </figure>
<h2 id="automated-organisation-is-here">Automated organisation is here</h2>
<p>This is the beginning of truly automated organisation. Point Claude at your downloads folder and it'll tell you what needs filing, and where it should go.</p>
<p>I find myself not doing that, if I'm honest. I like knowing where my stuff goes: and Johnny.Decimal makes it easy anyway. I'm still faster than Claude at filing my receipts.</p>
<p>I <em>have</em> found that working with Claude in a very structured environment is a revelation. The other day I had it write a script to monitor my Obsidian vault for conflicts. Now when me and Lucy edit a file at the same time it sends me a Telegram alert. Magic.</p>
<p>This is the future: we'll all write our own custom utilities to help us stay on top of stuff. But that script … where is it? <em>It still has to be somewhere</em>. Having Claude connected to my JDex means I can tell it to "document the script at <strong>23.12</strong>" (my ID for Obsidian, as a tool in my business) and it does that, wiki-linking to <strong>14.11+ Curium</strong> (the server the script runs on).</p>
<p>Having these short, consistent, unambiguous numbers that I can use to refer to anything in my life or business is proving to be a superpower. I can't imagine working without them.</p>
<h2 id="how-to-connect">How to connect</h2>
<p>This is documented at the <a href="https://johnnydecimal.com/jdhq/mcp-server">MCP server</a> page. Updates will be published there, and on the blog.</p>
<p><a href="https://johnnydecimal.com/video/1220522887">Here's a 10-minute video</a> showing you how to connect your agent to the server. This is still young technology, so it's a bit of a fussy setup. If you need a hand, use the <a href="https://forum.johnnydecimal.com/t/mcp-server-support-post/2955">MCP server support post on the forum</a> or in the <a href="https://discord.com/channels/822215537589354566/1490248270813986986">#AI channel on Discord</a>.</p>
<h2 id="also-see-the-skills-and-config">Also see the skills and config</h2>
<p>The server works great with my <a href="https://johnnydecimal.com/jdhq/agent-skills">agent skills</a>, and they in turn work well with the <a href="https://johnnydecimal.com/jdhq/configuration">new configuration file</a>.</p>
<h2 id="lots-more-coming">Lots more coming</h2>
<p>We think we're going to record a 'Learn with Lucy – AI' series. She has no idea how this works, and she'd like to. We'd like to show you how you can use these tools safely and effectively to manage your life and business. No hype, just useful advice. Let us know what you need.</p>
<p>This will all appear on your Pro account as it's released. <a href="https://johnnydecimal.com/products">Buy it once</a>, and we'll keep making it more valuable.</p>
<h2 id="privacy">Privacy</h2>
<p>I say it on that page, and in the video, and I want to reinforce it here. When you connect to an MCP server – any MCP server – <strong>your agent necessarily has to send that server some of your data</strong> so that the server knows what to send back. And of course the server knows who you are, because you're authenticated to it.</p>
<p><strong>I do not and will never log any of this data</strong>. It hits my server, a function responds, and nothing personal is ever saved, logged, or viewed by me. Not your user ID, name, email, IP address, or any of the text that your agent sent.</p>
<p>I log exactly two things: the name of the agent (e.g. <em>claude-code/2.1.240</em>) and the name of my tool that was called (e.g. <em>list_documentation</em>). This helps me troubleshoot connectivity issues.</p>
<p>When you connect to an MCP server the dialog says "ensure that you trust the owner of this server". That is absolutely the case: you need to trust me. If you don't, don't use the server.</p>
<h2 id="">🇯🇵🚅🐄</h2>
<p>Big week! We're going on a trip to Hokkaido, Japan tomorrow. We get to go on the Hayabusa Shinkansen, then I plan on eating my own weight in dairy products. :-)</p>
<p>j.</p>Organising physical artefacts - James' Coffee Bloghttps://jamesg.blog/2026/08/23/organising-physical-artefacts2026-08-23T00:00:00.000Z
<p>I love admiring spaces and thinking about how they work but, when it comes to the physical spaces I use most or every day – my bedroom, my desk, my bookshelves – I haven’t spent as much time thinking about decoration. When an environment functions, I don’t often think about how I can make it beautiful. Indeed, I have never been particularly adept at decorating. </p><p>This evening I had a discussion about organising mementos from trips: museum maps and guidebooks, and all the other little things I have picked up that I don’t already keep in my scrapbook. I have a paper bag from the British Museum in which I keep my museum maps and other paraphernalia, but it isn’t particularly organised; indeed, despite being red, I seldom look through the bag.</p><p>This has me thinking about how I can keep some of my physical collectibles – zines, museum maps, clippings, and everything in between – more organised. I made a few immediate choices: to get a letter rack for my zines, to get a new scrapbook because my current one is full. But I would like to do more.</p><p>As I said to my friends, somewhat inelegantly but spoken from the heart: “I don’t want to keep all these memories in a bag.” One suggestion was to get a pinboard, which I love. I may also look through my museum maps and order them, so that at least I can remember what I have so I can decide what to do next. I would love for the maps not to be sitting in a paper bag, but to be part of something else. Maybe I could have a space on my bookshelf dedicated to museum maps? (I really need another bookshelf too!)</p><p>One thing I love about bookshelves is that all the titles are visible. I can look to my bookshelf and be proud that I have read Moby Dick even though it took a long time, and look at my anime and think about for how many hours and days a particular series has kept me entertained, or to look at my art books and know I can pick one up at any time and look at pictures that will undoubtably make me think. I can recall the memories associated with each book or series. I would like this for physical paraphernalia too. Having shelf space might be just what I need, and a corkboard too.</p><p>I love that I can curate bookshelves: by subject, by theme, by space. The more I write the more I realise this is what I want to do with physical paraphernalia too. I also want to move the zines I have made from where they are stored, on a shelf I don’t often look at, onto my main bookshelf, to elevate them in my space because I am proud of making them.</p><p>How do you organise physical artefacts you have collected? I would love inspiration! If you have any ideas, please feel free to <a href="https://jamesg.blog/email">email me</a>.</p><script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a2fd23346d09321a',t:'MTc4NzUxOTc3Nw=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
<a class="tag" href="https://jamesg.blog/email">email me</a>
Finished reading The Last Devil to Die - Molly White's activity feed6a8b2d9491f30f1ebee9c3ea2026-08-22T04:29:11.000Z<article class="entry h-entry hentry"><header><div class="description">Finished reading: </div></header><div class="content e-content"><div class="book h-entry hentry"><a class="book-cover-link" href="https://www.mollywhite.net/reading/books?search=The%20Last%20Devil%20to%20Die"><img class="u-photo book-cover" src="https://m.media-amazon.com/images/S/compressed.photo.goodreads.com/books/1680740298i/62226126.jpg" alt="Cover image of The Last Devil to Die" style="max-width: 300px;"/></a><div class="book-details"><div class="top"><div class="series-info"><i>Thursday Murder Club</i> series, book <span class="series-number">4</span>. </div><div class="title-and-byline"><div class="title"><i class="p-name">The Last Devil to Die</i> </div><div class="byline">by <span class="p-author h-card">Richard Osman</span>. </div></div><div class="book-info">Published <time class="dt-published published" datetime="2023">2023</time>. 421 pages. </div></div><div class="bottom"><div class="reading-info"><div class="reading-dates"> Started <time class="dt-accessed accessed" datetime="2026-08-19">August 19, 2026</time>; completed August 21, 2026. </div></div></div></div></div><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp">Posted: <time class="dt-published" datetime="2026-08-22T04:29:11+00:00" title="August 22, 2026 at 4:29 AM UTC">August 22, 2026 at 4:29 AM UTC</time>. </div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/reading/books?tags=crime" title="See all books tagged "crime"" rel="category tag">crime</a>, <a class="tag p-category" href="https://www.mollywhite.net/reading/books?tags=humor" title="See all books tagged "humor"" rel="category tag">humor</a>, <a class="tag p-category" href="https://www.mollywhite.net/reading/books?tags=mystery" title="See all books tagged "mystery"" rel="category tag">mystery</a>. </div></div></footer></article>Saturday morning - James' Coffee Bloghttps://jamesg.blog/2026/08/22/saturday-morning2026-08-22T00:00:00.000Z
<p><em>Before I leave this morning, I have to pack some things to read.</em> I picked up a zine and a book on colour and set out to a coffee shop to ease my way into the weekend. I purchased the zine and the book following my reflection on <a href="https://jamesg.blog/2026/08/17/miniatures-reference-works-and-writing">reference works</a> earlier this week, which had me thinking that I wanted to vary the kinds of books on my shelf.</p><p>This year I haven’t read many fiction books. Most of my reading has been devoted to textbooks and what I read online: blogs and the news and articles and everything in between. I would love to read more fiction, but I often find it hard to stay focused on longer works, especially when my mind is busy. I used to read often on Saturday mornings, finding comfort in the tradition of some quiet reading times while the world was waking up, but I haven’t followed that tradition in a while. That is, until this morning, where I found myself sitting in a coffee shop, reading my zine and studying my book on colour.</p><p>The zine I was reading was called “<a href="https://shop.serraglia.com/product/books-as-art-practice" rel="noreferrer">Books as Art Practice</a>”, a reflection on what it means to create printed works. This zine comes at an apt time for me as I reflect more on what we gain and lose from different mediums and, in turn, come to appreciate each medium in more depth. I love the focus that I feel when I am with a book, but I also love the abundance of snippets from the world that I find on the web. When I think of mediums, I think less about their merits and drawbacks so much as their affordances – what does the web allow that other mediums don’t? What does the web make more difficult that are inherent in other mediums?</p><p>When it comes to the web, I have been thinking about time, especially in the context of blogs. Blog posts have published dates. But what if those dates were hidden? Available, but hidden. My thought was that words are already steeped in time, being written in and of a moment. I experimented with a “timeless” mode on my website that hides all the publication dates of works, and I admit I am intrigued. Scrolling through my archives without seeing publication dates, my <a href="https://jamesg.blog/2026/07/11/websites-as-anthologies-of-self" rel="noreferrer">anthology of self</a> speaks not in years but in moments, in seasons. Presented in this way, my writing is still a blog in that entries are printed in reverse chronological order, but each entry is without a specific date.</p><figure><picture><img alt='My archive page for the Nature category, listing blog posts without dates. The top five posts, in reverse chronological order, without dates, are "Change; anchors", "Autumn", "Afterflow", "Sunset", and "Eclipse".' loading="lazy" src="https://editor.jamesg.blog/content/images/2026/08/archive.png" style=" max-width: 130%;"/></picture><div class="alt"><label><input aria-label="Toggle image alt text on screen" type="checkbox"/>ALT</label><div class="content">My archive page for the Nature category, listing blog posts without dates. The top five posts, in reverse chronological order, without dates, are "Change; anchors", "Autumn", "Afterflow", "Sunset", and "Eclipse".</div></div></figure><p style="text-align: center;">⁂ ⁂ ⁂ </p><p>The book on colour that I was reading, published by the <a href="https://shop.nationalgallery.org.uk/colour-art-book-1057166.html" rel="noreferrer">National Gallery in London</a>, featured works of art through the centuries grouped by colour. This book was different from most I have read: it was predominantly visual. While engaged with the book, I was moving between reading and visually analysing, between understanding concepts through words and appreciating details communicated through colour and depth and shadow and tint.</p><p>I started at the end of the book, on the chapter on monochrome. Works with few colours appeal to me. I love seeing how much detail you can add to a work with few colours. One of my favourite works is mostly monochrome, except for a blue flower in the centre of the painting. And yet despite my love of monochrome works, I also love the Impressionists, among whose defining characteristics is their use of colour.</p><p>While I was aware I couldn’t see as many details as I might be able to see if I were studying a painting in a museum, I did enjoy how much I could study each work from its printed version. I appreciated that the book magnified particular aspects of images so I could study features in more depth, like the boats in Peter Balke’s <em>The Tempest</em> that I didn’t discern until seeing them up close.</p><p>Closing the book after being immersed in art for some time, I started to think about technology; this is a relationship that pops up every so often in my mind, even when I am not necessarily studying the intersection of the two.</p><p>We live in time with a rich visual culture, enabled in large part by technology. The book I was reading was enabled by technology: high-resolution photography, the ability to print with such detail. Indeed, art and technology are not separate; today, many aspects of our visual culture are intertwined with the technologies we have.</p><p style="text-align: center;">⁂ ⁂ ⁂ </p><p>After my reading, I ran a few errands and went for a long walk, listening to a podcast about reading and enjoying looking at the leaves and the trees and the fields and the distance. Then, I did as I do: sat down, with a beverage – in this case, a glass of water, having been sufficiently fuelled from the cup of coffee I had consumed earlier – and looked through my notes of the day, with wonder and curiosity and reflection, ready to start writing.</p><script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a2f1383739c56c55',t:'MTc4NzM5NDgwOQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
<a class="tag" href="https://jamesg.blog/2026/07/11/websites-as-anthologies-of-self">anthology of self</a>
<a class="tag" href="https://jamesg.blog/2026/08/17/miniatures-reference-works-and-writing">reference works</a>
<a class="tag" href="https://shop.nationalgallery.org.uk/colour-art-book-1057166.html">National Gallery in London</a>
<a class="tag" href="https://shop.serraglia.com/product/books-as-art-practice">Books as Art Practice</a>
Streak of procrastination - Joel's Log Fileshttps://joelchrono.xyz/blog/streak-of-procrastination2026-08-21T20:50:00.000Z<p>Sometimes you have such a great idea, a post that you need to write and share with everybody and you just keep meaning to get to it.</p>
<p>Then reality hits and it doesn’t quite let you make that post in a way that feels right for the subject.</p>
<p>In the end, you end up writing nothing at all, or with a draft that is quite big and extensive but still not completed.</p>
<p>And welp, you have many smaller ideas for posts you could do in the meantime, but you don’t want to because you gotta dedicate all of that time to that great post idea.</p>
<p>Except you don’t, work shows up, distraction shows up, life shows up, and you end up procrastinating both the main post and doing anything else.</p>
<p>At this point, I would rather have something out, something complete and ready to be posted on this evil blogpost of mine.</p>
<p>Worst of all is that this is also in the middle of Blaugust (pretty much ending in just ten days now) and now I’ll have to play catch up! If this wasn’t the case I could simply let it happen, I literally post at least twice per week anyway, not that that means something.</p>
<p>The only good thing is that there’s a couple drafts that should be done very soon. I rarely publish thouse but the desperation on my side is on that level already.</p>
<p>In any case, I just want to get some post out there to break the procrastination streak and call it day.</p>
<p>That’s a good title, I’ll use it, hope you enjoy it. The original title was actually <em>“When a blogpost stun-locks you”</em>, but perhaps that is too much of a gaming reference for some.</p>
<p>I really want to write a little less about games too, but also not, because I love to talk about games, confusing stuff!</p>
<p>Perhaps I am just playing way too much <em>Outer Wilds</em> this week and my brain can’t process everything properly right now. Too many mind-bending moments.</p>
<p>The blogpost in question is my retelling of my session of <em>Land of Eem</em> with friends by the way. Though my review of <em>Gris</em> is also pending…</p>
<p>This is day 21 of <a href="https://100DaysToOffload.com">#100DaysToOffload</a> and day 16 of <a href="https://nerdgirlthoughts.game.blog/2026/07/15/blaugust-2026-is-coming">#Blaugust2026</a></p>
<p>
<a href="mailto:me@joelchrono.xyz?subject=Streak of procrastination">Reply to this post via email</a> |
<a href="https://fosstodon.org/@joel/idcomments">Reply on Fediverse</a>
</p>Book Review: An Immense World - How Animal Senses Reveal the Hidden Realms Around Us by Ed Yong ★★★☆☆ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=729032026-08-21T11:34:36.000Z<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/07/9781473572737-jacket-large.webp" alt="Book cover featuring various animals." width="200" class="alignleft size-full wp-image-72904">
<p>This is a detailed examination of the various senses possessed by animals. Some will be intimately familiar to you - like sight and sound - whereas some will seem strange and uncanny - like magnetic detection and electro-sensing. Some straddle an almost understandable space like echolocation or tetra-chromatic vision.</p>
<p>This isn't a game of Top Trumps where all the animals are ranked by power. Instead there's a gentle and passionate exploration of what these senses <em>might</em> mean to their owners. It is refreshingly candid about what we don't know, while always trying to convey a sense of wonder about the inherent <a href="https://en.wikipedia.org/wiki/Umwelt"><i lang="de">Umwelt</i></a> experienced by the animal.</p>
<p>But goodness me is it long. It seems that every time the editor told the author to cut out a paragraph, he stuck it in a footnote instead. The text is well referenced, but so are the footnotes, which means occasionally encountering sentences formatted like this:</p>
<blockquote><p>Despite several frustrating false leads, nobody’s ever found them.<sup>fn11,36,37,38,39</sup></p></blockquote>
<p>Speaking of which, the general formatting of the eBook is poor. The CSS contains all sorts of weird stuff which I needed to turn off, and is full of comments which probably should have been stripped before the book was distributed.</p>
<p>Science publishers still haven't grasped that eBooks don't need to relegate glossy images to the back of the book - they can go inline with the text!</p>
<p>This is a funny, heartfelt, and (perhaps overly) thorough book. It will gleefully send you down rabbit holes - even if you're ill-equipped to see in the dark and sense the bugs around you.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=72903&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">'Project' section of 'Task & Project Management' course re-recorded - Johnny.Decimalhttps://johnnydecimal.com/blog/0241-taskpm-update/2026-08-21T06:35:47.000Z<p>Our <a href="https://johnnydecimal.com/jdu/taskpm">Task & Project Management course</a> is, perhaps unsurprisingly, split into two sections: tasks, and project management. (Perhaps to our marketing detriment, I have a tendency to name things literally.)</p>
<p>We just re-recorded the entire project management section. If you watched the previous version, you should watch these new videos. Start from <a href="https://johnnydecimal.com/jdu/taskpm/350-feedback-from-the-future">feedback from the future</a>.</p>
<h2 id="updated-based-on-real-world-use">Updated based on real-world use</h2>
<p>Everything we produce is a result of real-world experience. I can't teach you how do to a thing if it's not something I do myself.</p>
<p>The previous projects section was the best that I knew at the time. But since releasing it late last year, I continued to refine the method. The re-recorded episodes reflect 6 months of further work, and are exactly how we run our own business.</p>
<p>It's a great update. I'm really happy with it.</p>
<h2 id="also-see-work-packages">Also see: Work packages</h2>
<p>See the previous blog post, <a href="https://johnnydecimal.com/blog/0240">'50-59 Portfolio of creative outputs' becomes 'W0000-9999 Work packages'</a>.</p>'50-59 Portfolio of creative outputs' becomes 'W0000-9999 Work packages' - Johnny.Decimalhttps://johnnydecimal.com/blog/0240-50-59-becomes-work-packages/2026-08-21T06:35:43.000Z<p>With the release of the <a href="https://johnnydecimal.com/sbs">Small Business System</a> last year we introduced a new pattern. Area <code>50-59 Portfolio of creative outputs</code> was an <a href="https://johnnydecimal.com/documentation/expand-an-area-overview">expanded area</a> with numbers ranging from <code>50000</code> through <code>59999</code>.</p>
<p>The extended numbering is required because you're expected to have more than 100 'creative outputs', so the usual restrictions don't work. This numbering was always a bit weird, not least because <code>50-59</code> as a parent folder name didn't accurately describe its contents.</p>
<h2 id="expanding-the-concept">Expanding the concept</h2>
<p>This concept was originally for 'creative outputs', as its name says. For our type of business that's blog posts and video course lessons. For a restaurant it might be the photo shoot for their latest Instagram campaign.</p>
<p>But the more we used it, the more we realised that it was a useful pattern for <em>all work</em>. If you have a broad Johnny.Decimal ID like <code>21.34 Small Business System</code>, it gets crowded if you try to do work in there.</p>
<figure class="figure jdimage jdimage--auto-dark"> <picture> <img class="figure__inner" alt="A diagram showing ID 21.34 SBS with lots of 'work' floating around it. It's very busy." height="392" loading="lazy" src="https://johnnydecimal.com/blog/0240A-21.34_SBS_busy-862x784@2x.png" width="431"> </picture> </figure>
<p>One solution would be to promote that thing to its own category: <code>61 Small Business System</code>, say. You could do that, but now we've pulled this specific product out of the list of products into its own place. And we still have the limit of 100 things to consider.</p>
<figure class="figure jdimage jdimage--auto-dark"> <picture> <img class="figure__inner" alt="A diagram showing the SBS as a new category '61' containing a bunch of IDs." height="523" loading="lazy" src="https://johnnydecimal.com/blog/0240B-61_SBS_category-1336x1046@2x.png" width="668"> </picture> </figure>
<p>This 'place to do work' turned out to be a really nice alternative. With this pattern, you leave the core thing where it is: <code>21.34 Small Business System</code> never changes. Each piece of work you do gets a new number in this 'work world', and we link it back to <code>21.34</code>.</p>
<figure class="figure jdimage jdimage--auto-dark"> <picture> <img class="figure__inner" alt="The diagram now shows the SBS as 21.34 again, but _connected to it_ – not inside it, crowding it – are a bunch of work packages." height="518" loading="lazy" src="https://johnnydecimal.com/blog/0240C-21.34_SBS_with_WPs-1010x1036@2x.png" width="505"> </picture> </figure>
<h2 id="introducing-work-packages">Introducing 'work packages'</h2>
<p>At this point I realised I'd brought the established concept of <a href="https://en.wikipedia.org/wiki/Work_breakdown_structure#Work_package">work packages</a> into Johnny.Decimal. And that's a good sign: well-established patterns are probably correct. Let's not invent something new for the sake of it.</p>
<p>So that's what the 'creative pattern' has grown into: each of these jobs is now a work package, and they're no longer limited to creative-like things. They're useful for <em>any work</em>.</p>
<p>For example, you might need to conduct a large audit as part of a compliance exercise. That audit could be a work package, linked to the SBS ID <code>11.13 Compliance</code>.</p>
<h2 id="fixing-the-numbers">Fixing the numbers</h2>
<p>A design principle of Johnny.Decimal is that you must always be able to give a stranger – a new starter at your business, say – a number, and they must be able to find it easily. So the parent folder name needs to accurately explain what's in it.</p>
<p>The existing area pattern <code>A0-A9</code> doesn't work here. Work packages are so different, we've given them a completely new scheme. They start at <code>W0000</code> and continue to <code>W9999</code>.<sup><a href="#user-content-fn-w0011" id="user-content-fnref-w0011" data-footnote-ref="true" aria-describedby="footnote-label" class="footnote">1</a></sup> So we call the folder that contains them <code>W0000-9999 Work packages</code>. This sorts them below all of your regularly-numbered Johnny.Decimal areas.</p>
<h2 id="they-must-link-to-an-id">They must link to an ID</h2>
<p>Crucially, work packages may not exist in isolation. <strong>They must belong to an ID</strong>. We indicate this in the title like: <code>W0011~11.13 Compliance audit</code>. Here, we've linked <code>W0011</code> to ID <code>11.13</code>.</p>
<p><strong>This link-to-parent-ID-in-title is required</strong>. You can and should cross-reference these entries using links in your JDex, but trust me: you'll forget to do that. If you always link every work package to its parent using this simple notation, you can never lose anything.</p>
<p>This is how our Small Business example now looks.</p>
<figure class="figure jdimage jdimage--auto-dark"> <picture> <img class="figure__inner" alt="The work packages connected to the SBS are now numbered, e.g. W0011~21.34." height="492" loading="lazy" src="https://johnnydecimal.com/blog/0240D-21.34_SBS_with_numbered_WPs-1314x984@2x.png" width="657"> </picture> </figure>
<h2 id="how-do-i-migrate-from-50-59">How do I migrate from <code>50-59</code>?</h2>
<p>If you've been using area <code>50-59</code>, I recommend switching to this new scheme. Start the numbers where you left off: if your last creative job was <code>50106</code>, your first work package is <code>W0107</code>.</p>
<p>You could renumber your old entries. We didn't: the nature of these things is that, once done, they're rarely referenced again.</p>
<h3 id="weve-also-retitled-40-49">We've also retitled <code>40-49</code></h3>
<p>While we're at it, we've tweaked the title of the Small Business System's area <code>40-49</code>. What was your <strong>Library of creative inputs</strong>, previously mirrored by the now-defunct <strong>Portfolio of creative outputs</strong>, has been renamed to <code>40-49 Creative assets</code>. Same thing, simpler name.</p>
<h2 id="see-more-at-the-updated-task--project-management">See more at the updated Task & Project Management</h2>
<p>We just re-recorded the entire second half of the course. You'll find a full explanation of this concept starting at <a href="https://johnnydecimal.com/jdu/taskpm/490-work-packages-intro">this episode</a>. See <a href="https://johnnydecimal.com/blog/0241">the blog post that follows this one</a> for more information.</p>
<div data-footnotes="true" class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-w0011">
<p>Just like every other part of the system, you should leave the first 10 for <a href="https://johnnydecimal.com/documentation/the-standard-zeros">standard zero-like</a> IDs. Start your own WPs at <code>W0011</code>. <a href="#user-content-fnref-w0011" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref footnoteBackLink">↩</a></p>
</li>
</ol>
</div>Small Business System – '50-59 Portfolio of creative outputs' becomes 'W0000-9999 Work packages' - Johnny.Decimalhttps://johnnydecimal.com/support/updates/2026-08-21-50-59-to-wps/2026-08-21T06:23:04.000Z<p>This is the changelog entry for this update. See <a href="https://johnnydecimal.com/blog/0240">blog post 0240</a> for full details.</p>Note published on August 21, 2026 at 12:29 AM UTC - Molly White's activity feed6a879beb52b01ca28c3ff0c12026-08-21T00:29:31.000Z<article><div class="entry h-entry hentry"><header></header><div class="content e-content"><p>delighted to discover that a) Jimothy has a Wikipedia picture and b) it's this</p><div class="media-wrapper"><a href="https://storage.mollywhite.net/micro/6373206f0ebf8cc6fc84_Screenshot-2026-08-20-at-8.27.15---PM.png" data-fslightbox=0f9c8d4fddbddd019e23><img src="https://storage.mollywhite.net/micro/6373206f0ebf8cc6fc84_Screenshot-2026-08-20-at-8.27.15---PM.png" alt="A Wikipedia infobox for Jimothy, featuring an MS Paint-style illustration of Jimothy the raccoon walking through grass with flowers in front of buildings and a sunny sky. Cartoonish illustration of Jimothy made by the USGS Species Common raccoon Sex Unknown Born c. 2025 Known for Abnormal body shape, internet memes" /></a></div></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp-block"><div class="timestamp">Posted: <a class="u-url" href="https://www.mollywhite.net/micro/entry/202608202027"><time class="dt-published" datetime="2026-08-21T00:29:31+00:00" title="August 21, 2026 at 12:29 AM UTC">August 21, 2026 at 12:29 AM UTC</time>. </a></div></div><div class="social-links"> <span> Also posted to: </span><a class="social-link u-syndication mastodon" href="https://hachyderm.io/@molly0xfff/117130669740897586" title="Mastodon" rel="syndication">Mastodon, </a><a class="social-link u-syndication bluesky" href="https://bsky.app/profile/molly.wiki/post/3mtkixpzopo2h" title="Bluesky" rel="syndication">Bluesky</a></div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/micro/tag/wikipedia" title="See all micro posts tagged "Wikipedia"" rel="category tag">Wikipedia</a>. </div></div></footer></div></article>HTML element letter count distribution - James' Coffee Bloghttps://jamesg.blog/2026/08/21/html-element-letter-counts2026-08-21T00:00:00.000Z
<style>
table {
width: 20rem;
border-collapse: collapse;
}
tr td:nth-child(2) {
background-color: light-dark(orange, royalblue);
display: block;
}
th {
text-align: left;
}
</style>
<style media="(prefers-color-scheme: dark)">pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #49483e }
.highlight { background: #272822; color: #F8F8F2 }
.highlight .c { color: #959077 } /* Comment */
.highlight .err { color: #ED007E; background-color: #1E0010 } /* Error */
.highlight .esc { color: #F8F8F2 } /* Escape */
.highlight .g { color: #F8F8F2 } /* Generic */
.highlight .k { color: #66D9EF } /* Keyword */
.highlight .l { color: #AE81FF } /* Literal */
.highlight .n { color: #F8F8F2 } /* Name */
.highlight .o { color: #FF4689 } /* Operator */
.highlight .x { color: #F8F8F2 } /* Other */
.highlight .p { color: #F8F8F2 } /* Punctuation */
.highlight .ch { color: #959077 } /* Comment.Hashbang */
.highlight .cm { color: #959077 } /* Comment.Multiline */
.highlight .cp { color: #959077 } /* Comment.Preproc */
.highlight .cpf { color: #959077 } /* Comment.PreprocFile */
.highlight .c1 { color: #959077 } /* Comment.Single */
.highlight .cs { color: #959077 } /* Comment.Special */
.highlight .gd { color: #FF4689 } /* Generic.Deleted */
.highlight .ge { color: #F8F8F2; font-style: italic } /* Generic.Emph */
.highlight .ges { color: #F8F8F2; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #F8F8F2 } /* Generic.Error */
.highlight .gh { color: #F8F8F2 } /* Generic.Heading */
.highlight .gi { color: #A6E22E } /* Generic.Inserted */
.highlight .go { color: #66D9EF } /* Generic.Output */
.highlight .gp { color: #FF4689; font-weight: bold } /* Generic.Prompt */
.highlight .gs { color: #F8F8F2; font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #959077 } /* Generic.Subheading */
.highlight .gt { color: #F8F8F2 } /* Generic.Traceback */
.highlight .kc { color: #66D9EF } /* Keyword.Constant */
.highlight .kd { color: #66D9EF } /* Keyword.Declaration */
.highlight .kn { color: #FF4689 } /* Keyword.Namespace */
.highlight .kp { color: #66D9EF } /* Keyword.Pseudo */
.highlight .kr { color: #66D9EF } /* Keyword.Reserved */
.highlight .kt { color: #66D9EF } /* Keyword.Type */
.highlight .ld { color: #E6DB74 } /* Literal.Date */
.highlight .m { color: #AE81FF } /* Literal.Number */
.highlight .s { color: #E6DB74 } /* Literal.String */
.highlight .na { color: #A6E22E } /* Name.Attribute */
.highlight .nb { color: #F8F8F2 } /* Name.Builtin */
.highlight .nc { color: #A6E22E } /* Name.Class */
.highlight .no { color: #66D9EF } /* Name.Constant */
.highlight .nd { color: #A6E22E } /* Name.Decorator */
.highlight .ni { color: #F8F8F2 } /* Name.Entity */
.highlight .ne { color: #A6E22E } /* Name.Exception */
.highlight .nf { color: #A6E22E } /* Name.Function */
.highlight .nl { color: #F8F8F2 } /* Name.Label */
.highlight .nn { color: #F8F8F2 } /* Name.Namespace */
.highlight .nx { color: #A6E22E } /* Name.Other */
.highlight .py { color: #F8F8F2 } /* Name.Property */
.highlight .nt { color: #FF4689 } /* Name.Tag */
.highlight .nv { color: #F8F8F2 } /* Name.Variable */
.highlight .ow { color: #FF4689 } /* Operator.Word */
.highlight .pm { color: #F8F8F2 } /* Punctuation.Marker */
.highlight .w { color: #F8F8F2 } /* Text.Whitespace */
.highlight .mb { color: #AE81FF } /* Literal.Number.Bin */
.highlight .mf { color: #AE81FF } /* Literal.Number.Float */
.highlight .mh { color: #AE81FF } /* Literal.Number.Hex */
.highlight .mi { color: #AE81FF } /* Literal.Number.Integer */
.highlight .mo { color: #AE81FF } /* Literal.Number.Oct */
.highlight .sa { color: #E6DB74 } /* Literal.String.Affix */
.highlight .sb { color: #E6DB74 } /* Literal.String.Backtick */
.highlight .sc { color: #E6DB74 } /* Literal.String.Char */
.highlight .dl { color: #E6DB74 } /* Literal.String.Delimiter */
.highlight .sd { color: #E6DB74 } /* Literal.String.Doc */
.highlight .s2 { color: #E6DB74 } /* Literal.String.Double */
.highlight .se { color: #AE81FF } /* Literal.String.Escape */
.highlight .sh { color: #E6DB74 } /* Literal.String.Heredoc */
.highlight .si { color: #E6DB74 } /* Literal.String.Interpol */
.highlight .sx { color: #E6DB74 } /* Literal.String.Other */
.highlight .sr { color: #E6DB74 } /* Literal.String.Regex */
.highlight .s1 { color: #E6DB74 } /* Literal.String.Single */
.highlight .ss { color: #E6DB74 } /* Literal.String.Symbol */
.highlight .bp { color: #F8F8F2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #A6E22E } /* Name.Function.Magic */
.highlight .vc { color: #F8F8F2 } /* Name.Variable.Class */
.highlight .vg { color: #F8F8F2 } /* Name.Variable.Global */
.highlight .vi { color: #F8F8F2 } /* Name.Variable.Instance */
.highlight .vm { color: #F8F8F2 } /* Name.Variable.Magic */
.highlight .il { color: #AE81FF } /* Literal.Number.Integer.Long */ .highlight .nn, .highlight .n{color: light-dark(black, var(--dark-foreground-color)) }</style><style media="(prefers-color-scheme: light)">pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #F00 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666 } /* Operator */
.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #9C6500 } /* Comment.Preproc */
.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #E40000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #008400 } /* Generic.Inserted */
.highlight .go { color: #717171 } /* Generic.Output */
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #04D } /* Generic.Traceback */
.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008000 } /* Keyword.Pseudo */
.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #B00040 } /* Keyword.Type */
.highlight .m { color: #666 } /* Literal.Number */
.highlight .s { color: #BA2121 } /* Literal.String */
.highlight .na { color: #687822 } /* Name.Attribute */
.highlight .nb { color: #008000 } /* Name.Builtin */
.highlight .nc { color: #00F; font-weight: bold } /* Name.Class */
.highlight .no { color: #800 } /* Name.Constant */
.highlight .nd { color: #A2F } /* Name.Decorator */
.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #00F } /* Name.Function */
.highlight .nl { color: #767600 } /* Name.Label */
.highlight .nn { color: #00F; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #19177C } /* Name.Variable */
.highlight .ow { color: #A2F; font-weight: bold } /* Operator.Word */
.highlight .w { color: #BBB } /* Text.Whitespace */
.highlight .mb { color: #666 } /* Literal.Number.Bin */
.highlight .mf { color: #666 } /* Literal.Number.Float */
.highlight .mh { color: #666 } /* Literal.Number.Hex */
.highlight .mi { color: #666 } /* Literal.Number.Integer */
.highlight .mo { color: #666 } /* Literal.Number.Oct */
.highlight .sa { color: #BA2121 } /* Literal.String.Affix */
.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
.highlight .sc { color: #BA2121 } /* Literal.String.Char */
.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
.highlight .sx { color: #008000 } /* Literal.String.Other */
.highlight .sr { color: #A45A77 } /* Literal.String.Regex */
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
.highlight .ss { color: #19177C } /* Literal.String.Symbol */
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #00F } /* Name.Function.Magic */
.highlight .vc { color: #19177C } /* Name.Variable.Class */
.highlight .vg { color: #19177C } /* Name.Variable.Global */
.highlight .vi { color: #19177C } /* Name.Variable.Instance */
.highlight .vm { color: #19177C } /* Name.Variable.Magic */
.highlight .il { color: #666 } /* Literal.Number.Integer.Long */</style>
<style>
@font-face {
font-family: 'MonaspaceArgon';
src: url('/assets/fonts/MonaspaceArgon-Regular.woff2') format('woff2');
font-weight: 400;
font-style: normal;
}
pre, code {
font-family: 'MonaspaceArgon', ui-monospace, monospace;
}
</style>
<p><em>How many HTML elements are exactly five letters long?</em> This question came to mind in the context of a discussion I had yesterday about what an indie web version of Wordle would look like. We all started to name elements. <code>table</code>, <code>tbody</code>, <code>input</code>, among others, all have five letters.</p>
<p>After the discussion, I wrote a Python script to compute the string lengths of each HTML element. I used the list of HTML elements on the MDN website as my dataset. The MDN list includes some elements (like <code>selectedcontent</code>) that are not Baseline supported yet, but I included them anyway. I excluded deprecated elements.</p>
<p>From my analysis, I found there are fifteen elements that are exactly five letters long. These are:</p>
<ul>
<li>aside</li>
<li>audio</li>
<li>embed</li>
<li>input</li>
<li>label</li>
<li>meter</li>
<li>small</li>
<li>style</li>
<li>table</li>
<li>tfoot</li>
<li>thead</li>
<li>title</li>
<li>track</li>
<li>video</li>
</ul>
<p>This means that there are fifteen possibilities for a HTML Wordle. We’d definitely need more words.</p>
<p>Here is a histogram showing the letter count distribution for all HTML elements:</p>
<table>
<thead>
<tr>
<th>Element Length</th>
<th>Number of Elements</th>
</tr>
</thead>
<tbody>
<tr>
<td>
1 chr.
</td>
<td style="width: 6%;">
7
</td>
</tr>
<tr>
<td>
2 chrs.
</td>
<td style="width: 17.1%;">
20
</td>
</tr>
<tr>
<td>
3 chrs.
</td>
<td style="width: 14.5%;">
17
</td>
</tr>
<tr>
<td>
4 chrs.
</td>
<td style="width: 17.9%;">
21
</td>
</tr>
<tr>
<td>
5 chrs.
</td>
<td style="width: 12.8%;">
15
</td>
</tr>
<tr>
<td>
6 chrs.
</td>
<td style="width: 14.5%;">
17
</td>
</tr>
<tr>
<td>
7 chrs.
</td>
<td style="width: 6.0%;">
7
</td>
</tr>
<tr>
<td>
8 chrs.
</td>
<td style="width: 6.8%;">
8
</td>
</tr>
<tr>
<td>
9 chrs.
</td>
<td style="width: 0; background-color: transparent;">
0
</td>
</tr>
<tr>
<td>
10 chrs.
</td>
<td style="width: 1.7%;">
2
</td>
</tr>
<tr>
<td>
11 chrs.
</td>
<td style="width: 1.7%;">
2
</td>
</tr>
<tr>
<td>
12 chrs.
</td>
<td style="width: 0; background-color: transparent;">
0
</td>
</tr>
<tr>
<td>
13 chrs.
</td>
<td style="width: 0; background-color: transparent;">
0
</td>
</tr>
<tr>
<td>
14 chrs.
</td>
<td style="width: 0; background-color: transparent;">
0
</td>
</tr>
<tr>
<td>
15 chrs.
</td>
<td style="width: 0.9%;">
1
</td>
</tr>
</tbody>
</table>
<p>The design of this table was inspired by <a href="https://www.norvig.com/mayzner.html">Norvig's English letter frequency counts analysis</a>.</p>
<details>
<summary>View raw data, with a list of elements that match each count</summary>
<pre>Element count: 117
String Length | # of Matching Elements | % of Element Count | Elements
-----------
1 7 6.0% ['a', 'b', 'i', 'p', 'q', 's', 'u']
2 20 17.1% ['br', 'dd', 'dl', 'dt', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'li', 'ol', 'rp', 'rt', 'td', 'th', 'tr', 'ul']
3 17 14.5% ['bdi', 'bdo', 'col', 'del', 'dfn', 'div', 'img', 'ins', 'kbd', 'map', 'nav', 'pre', 'sub', 'sup', 'svg', 'var', 'wbr']
4 21 17.9% ['abbr', 'area', 'base', 'body', 'cite', 'code', 'data', 'form', 'head', 'html', 'link', 'main', 'mark', 'math', 'menu', 'meta', 'ruby', 'samp', 'slot', 'span', 'time']
5 15 12.8% ['aside', 'audio', 'embed', 'input', 'label', 'meter', 'small', 'style', 'table', 'tbody', 'tfoot', 'thead', 'title', 'track', 'video']
6 17 14.5% ['button', 'canvas', 'dialog', 'figure', 'footer', 'header', 'hgroup', 'iframe', 'legend', 'object', 'option', 'output', 'script', 'search', 'select', 'source', 'strong']
7 7 6.0% ['address', 'article', 'caption', 'details', 'picture', 'section', 'summary']
8 8 6.8% ['colgroup', 'datalist', 'fieldset', 'noscript', 'optgroup', 'progress', 'template', 'textarea']
10 2 1.7% ['blockquote', 'figcaption']
11 2 1.7% ['fencedframe', 'geolocation']
15 1 0.9% ['selectedcontent']</pre>
<small>Percentages may not add up to exactly one hundred percent, due to rounding.</small>
</details>
<p>If you are interested, here is the code I used to produce the analysis:</p>
<div class="highlight"><pre><span></span><span class="c1"># data source https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">collections</span><span class="w"> </span><span class="kn">import</span> <span class="n">defaultdict</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"elements.txt"</span><span class="p">,</span> <span class="s2">"r"</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
<span class="n">elements</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">file</span><span class="o">.</span><span class="n">readlines</span><span class="p">()]</span>
<span class="n">letters2counts</span> <span class="o">=</span> <span class="p">{</span><span class="n">el</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">el</span><span class="p">)</span> <span class="k">for</span> <span class="n">el</span> <span class="ow">in</span> <span class="n">elements</span><span class="p">}</span>
<span class="n">counts2letters</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
<span class="k">for</span> <span class="n">el</span><span class="p">,</span> <span class="n">count</span> <span class="ow">in</span> <span class="n">letters2counts</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">counts2letters</span><span class="p">[</span><span class="n">count</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">el</span><span class="p">)</span>
<span class="n">num_of_elements_with_each_letter_count</span> <span class="o">=</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">counts2letters</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Element count:"</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">elements</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"String Length | # of Matching Elements | </span><span class="si">% o</span><span class="s2">f Element Count | Elements"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"-----------"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">length</span><span class="p">,</span> <span class="n">count</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">num_of_elements_with_each_letter_count</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="nb">round</span><span class="p">((</span><span class="n">count</span> <span class="o">/</span> <span class="nb">len</span><span class="p">(</span><span class="n">elements</span><span class="p">))</span> <span class="o">*</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="s2">"%"</span><span class="p">,</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">counts2letters</span><span class="p">[</span><span class="n">length</span><span class="p">]))</span>
<span class="c1"># NB, there are no 9, 12, 13, 14</span>
</pre></div>
<p>And here is my list of HTML elements I wrote (by hand) from the MDN list:</p>
<details>
<summary>View HTML element list.</summary>
<pre>html
base
head
link
meta
style
title
body
address
article
aside
footer
header
h1
h2
h3
h4
h5
h6
hgroup
main
nav
section
search
blockquote
dd
div
dl
dt
figcaption
figure
hr
li
menu
ol
p
pre
ul
a
abbr
b
bdi
bdo
br
cite
code
data
dfn
em
i
kbd
mark
q
rp
rt
ruby
s
samp
small
span
strong
sub
sup
time
u
var
wbr
area
audio
img
map
track
video
embed
fencedframe
iframe
object
picture
source
svg
math
canvas
noscript
script
del
ins
caption
col
colgroup
table
tbody
td
tfoot
th
thead
tr
button
datalist
fieldset
form
input
label
legend
meter
optgroup
option
output
progress
select
selectedcontent
textarea
details
dialog
geolocation
summary
slot
template</pre>
</details><script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a2e8ad999b4c3efe',t:'MTc4NzMwNTI0NQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
<a class="tag" href="https://www.norvig.com/mayzner.html">Norvig's English letter frequency counts analysis</a>
Change; anchors - James' Coffee Bloghttps://jamesg.blog/2026/08/20/change-anchors2026-08-20T00:00:00.000Z
<p>I look out the window. Every time I look I notice change: the ambering of leaves that are still green in my memory, the movement of clouds as they go from one end of the sky to the other, the movement of leaves as they sway to-and-fro with the light morning breeze; some mornings I see birds in the trees; yesterday I had the pleasure of seeing a small bird take flight, soaring to another tree.</p><p>I look at the trees outside and see the leaves that have been changing colour for a while, and those in the early stages of change. I think back to a realisation I had a while ago about how everything changes at its own pace. The warmth from my cooling cup of morning tea radiates as I think about the morning, and change.</p><p>My university textbooks for next year arrived yesterday. I am looking forward to skimming through them – to building the first stages of a mental map. I looked through the reference notes yesterday and saw a mention of an artist whose work I was reading about earlier this week, in what felt like a dialogue between my everyday and my studies. I am looking forward to next year – to all that I will learn. I am on the precipice of change: from one academic year to the next.</p><p style="text-align: center;">⁂ ⁂ ⁂</p><p>My website has been changing, too: my home page is a now poem, and I continue to sit with the question “how can I make my website more poetic?” I am fascinated by bridges between mediums: the intersection of poetry and hypertext, of essays and the web, of imagery and text. I see more connections between mediums that I once thought of more on their own. I feel the opportunity to make new connections – to wonder how the vocabularies of different disciplines and mediums fit together and differ. Can a web page have a rhythm, like a poem? My thoughts are nascent; it feels both jarring and exciting to be at the early stage of new thoughts. <sup class="footnote-reference" id="f-1"><a href="https://jamesg.blog/longform-feed#1">1</a></sup></p><p>Connecting between mediums relates to a <a href="https://museupicassobcn.cat/en/whats-on/exhibition/picasso-poet">quote from Picasso</a> that I read this week:</p><blockquote><em>When it comes down to it, all arts are one. You can write a painting with words, just as you can paint feelings in a poem.</em></blockquote><p>Researching this idea further earlier in the week, I found an article in the Guardian titled “<a href="https://www.theguardian.com/artanddesign/2004/sep/20/art.poetry">If a painting could talk…</a>”, from 2004, in which the author, Grace, noted the affordances of poetry relative to paintings:</p><blockquote>The visual impact of a painting can be immediate. We have it all before us: images, colour, forms, a stimulating eye-feast. […]<br/><br/>A poem, though, communicates in a more subliminal way, unfolding through the senses as you go along. Not until the end of the poem - sometimes even later - do we feel its resonance or have its meaning dawn on us.</blockquote><p>Related to this, I have been thinking about form: about what writing on a blog means, and how I could use my blog for more long-form writing. How do I build a practice around longer-form writing? What affordances does the blog form have or not have that enables or makes this kind of writing more difficult relative to writing shorter pieces? How do I start to connect the dots between longer time horizons?</p><p>In pondering the latter question, I have realised how much I enjoy writing that is of a moment: a reflection of the streams of thought as they were in a given time. This writing, for example, is anchored in Nature – in what I saw when I looked out the window – and all of the ideas that followed from my original observation, including those I have had in my mind for several days or weeks but had not yet written down.</p><p>I have the phrase “artworks as anchors” written down on my whiteboard: a textual embodiment of the feeling that I have when I revisit an artwork that I know well; the feeling of familiarity combined with the feeling there is more to see, more to learn. Writing in a stream of thought allows me to put ideas side by side in the moment of writing, to reflect connections as they are made; to create new combinations, flowing from the sentences that precede into words that follow. <em>What does it mean for a piece to be anchored, or to be an anchor? How do anchors help us when we change?</em> I will need to keep thinking about these questions.</p>
<div class="footnote-definition" id="1"><sup class="footnote-definition-label" id="f-2">1</sup>
<p>One of the themes in my university studies this year has been “crossing boundaries” as it applies to the humanities – physical, cultural, across time, and more. Leading on from this, I wonder: how do we and can we cross boundaries on the web?</p>
<a href="https://jamesg.blog/longform-feed#f-1">[↩]</a></div>
<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a2dfc7f14cd3463d',t:'MTc4NzIxMTk1Mg=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
<a class="tag" href="https://jamesg.blog/longform-feed#1">1</a>
<a class="tag" href="https://jamesg.blog/longform-feed#f-1">[↩]</a>
<a class="tag" href="https://museupicassobcn.cat/en/whats-on/exhibition/picasso-poet">quote from Picasso</a>
<a class="tag" href="https://www.theguardian.com/artanddesign/2004/sep/20/art.poetry">If a painting could talk…</a>
Gamifying Snacking with Snacker Tracker - Kev Quirkhttps://kevquirk.com/gamifying-snacking-with-snacker-tracker2026-08-19T14:39:00.000Z<p>So one of the things I've been trying to do as part of <a href="https://kevquirk.com/tag/fatboy">my journey to lose weight and get fit</a> is sort my diet out. As the saying goes, <em>"you can't out-train a poor diet"</em>. And the worst part of my diet is definitely snacking in the evening.</p>
<p>The routing generally goes:</p>
<ol>
<li>Have dinner.</li>
<li>Put the kids to bed and settle down with my wife on the couch.</li>
<li>Crave snacks out of habit.</li>
<li>Get snacks and eat them!</li>
</ol>
<p>I'm the type of person who finds an arbitrary thing to aim for very motivating. It's not enough to just <em>want</em> to stop snacking in the evening, nope. That shit will fail pretty quickly. But if I have a streak I <em>have</em> to maintain - now we're talking!</p>
<p>So I decided to build a simple little tool that I called <em>Snacker Tracker</em>. It's just a tap of a button every evening to say whether I've snacked or not, and it maintains a streak. Here's what it looks like on my phone:</p>
<p><img loading="lazy" src="https://kevquirk.com/content/images/gamifying-snacking-with-snacker-tracker/snacker-01.webp" alt="snacker-01" /></p>
<h2>Free pass & design</h2>
<p>I decided to implement a free pass into the site as well. So I'm allowed to have 1 evening per calendar week where I <em>can</em> snack and it won't affect my streak - after all, I want to be able to have some fun!</p>
<p>I thought about bundling <a href="https://simplecss.org" rel="noopener noreferrer">Simple.css</a> in to make it look pretty, but I decided to have some fun with the CSS and went with a neo-brutalist aesthetic, which I think looks great. So much so that I'm thinking about re-designing this site in a similar way, but I've managed to hold off on that...for now.</p>
<h2>Retrospective log</h2>
<p><em>Snacker Tracker</em> also has a way of adding days retrospectively, so if I forget to log a day, I can easily go back and do it:</p>
<p><img loading="lazy" src="https://kevquirk.com/content/images/gamifying-snacking-with-snacker-tracker/snacker-02.webp" alt="snacker-02" /></p>
<p>I've only been using <em>Snacker Tracker</em> for a few days, but it's making me pause when that inevitable pang happens in the evening. I'm finding that instead of instinctively raiding the cupboard for some crisps or a chocolate bar, I'm thinking <em>"don't screw up your streak"</em> and not doing it.</p>
<p>I know I'm not hungry during the evening, it's just a habit. My hope is that with time I'll re-train my brain to not expect sugar in the evening, and the pangs will go away. Until then, I'm gonna continue tracking my snacks with this fun little site in the hope that it makes me form better habits.</p>
<blockquote>
<p>But Kev, why don't you be a proper grown-up and just use your willpower?</p>
<p><cite>-- All the internet people</cite></p>
</blockquote>
<p>Because, Internet Person, it's a habit that I don't even think about, and this forces my to think about it. Yes, I know it's arbitrary and rather childish, but it's working, so what's the harm?</p>
<blockquote>
<p>Will you be releasing <em>Snacker Tracker</em> so we can try it?</p>
<p><cite>-- Another internet person</cite></p>
</blockquote>
<p><em>Maybe.</em> I threw it together pretty quickly and the code is rough. A lot of my spare time is focussed on <a href="https://pureblog.org" rel="noopener noreferrer">Pure Blog</a> and <a href="https://purecomments.org" rel="noopener noreferrer">Pure Comments</a> at the moment, so I don't think I'll have the time to clean the code up to the point where I'm happy to release it any time soon I'm afraid.</p> <div class="email-hidden">
<hr />
<p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p>
<p>You can <a href="mailto:19gy@qrk.one?subject=Gamifying%20Snacking%20with%20Snacker%20Tracker">reply to this post by email</a>, or <a href="https://kevquirk.com/gamifying-snacking-with-snacker-tracker#comments">leave a comment</a>.</p>
</div>Asymmetric Agents - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=735942026-08-19T11:34:52.000Z<p>One of the promises of the AI-filled future is that we'll all have highly capable autonomous <del>servants</del> "agents" to work for us.</p>
<p>Even <a href="https://shkspr.mobi/blog/2026/02/how-close-are-we-to-a-vision-for-2010/">back in the 1990s</a>, it was a common trope in future-gazing to insist that a person's personal <del>slave</del> agent would negotiate on their behalf. Ask your <del>meek digital pal</del> agent to find you a restuarant in town, tonight, for a hot date, catering to your dietary preferences, and within your budget. The little <del>butler</del> agent scurries off and, without your intervention, finds the <em>perfect</em> place, negotiates with the restaurant's <del>house boy</del> agent and books you a slap up meal.</p>
<p>Marvellous! You can tell your <del>manservant</del> agent to buy you clothes, reserve a flight, do the grocery shopping, or buy your wife flowers without having to lift a finger.</p>
<p>But, of course, there's a fly in the ointment. Not all <del>valets</del> agents are created equally. You're sending your Rasperry Pi powered <del>peon</del> agent against the full might of Amazon's bazillion datacentres.</p>
<p>Can a low-complexity <del>serf</del> agent be bullied, outwitted, and manipulated by a more capable <del>henchman</del> agent? It seems obvious to me that the answer is yes. Humans have a set of cognitive biases which render us susceptible to advertising tricks. AI may have <a href="https://cacm.acm.org/research/rolling-in-the-deep-of-cognitive-and-ai-biases/"><em>different</em> biases</a> but will still be vulnerable to <a href="https://shkspr.mobi/blog/2017/03/how-to-hypnotise-an-artificial-intelligence/">hypnosis</a> and hacking.</p>
<p>Perhaps having my <del>secretary</del> agent negotiate with your <del>PA</del> agent to find a suitable meeting time for our Q2 KPI Deep Dive doesn't carry this sort of risk. But I'm sure that <del>scumbags</del> advertisers everywhere will be salivating at the thought of waylaying my innocent <del>footman</del> agent on its way to market.</p>
<p>A future where we delegate responsibility to <del>stochastic imbeciles</del> agents is one where we accept that we have no control over their susceptibility to more powerful and malevolent <del>thugs</del> agents.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=73594&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">Site and product updates - Johnny.Decimalhttps://johnnydecimal.com/blog/0239-site-product-updates/2026-08-19T09:44:52.000Z<blockquote>
<p>Originally sent to the <a href="https://johnnydecimal.com/support/contact-community/mailing-list-rss-social">mailing list</a> on Wednesday 2026-08-19.</p>
</blockquote>
<p>Hey all. It's been a while; we've been busy. Rather than overload this update, I'll send a couple of short(er than usual) updates over the next few days.</p>
<h3 id="site-changes">Site changes</h3>
<p>I've been tweaking the site homepage <em>again</em>.</p>
<p>The previous home and product pages had that 'sales page' thing going on. Large text, not a lot of it, kinda shouty. It was a new approach – for most of the site's ten-year life it's had a predominantly-text homepage: <a href="https://web.archive.org/web/20150801154932/http://johnnydecimal.com/">2015</a>, <a href="https://web.archive.org/web/20180329164235/https://johnnydecimal.com/">2018</a>, <a href="https://web.archive.org/web/20200728174422/https://johnnydecimal.com/">2020</a>, <a href="https://web.archive.org/web/20240113225823/https://johnnydecimal.com/">2024</a>, <a href="https://web.archive.org/web/20260513043249/https://johnnydecimal.com/">2026</a>. I'm glad I tried 'the shouty thing', once. Because now I know that I hate it and don't have to do it again.</p>
<p>Design is hard. I have no design training. I opted out of every art class at school in favour of science. I like to think that I have <em>taste</em> – I know nice when I see it. But knowing it and making it are two different things.</p>
<p>Thankfully, inspiration hit me in the form of <a href="https://www.are.na">Are.na's wonderful new homepage</a>. Charles <a href="https://www.are.na/editorial/how-do-you-describe-are-na-at-a-party">wrote about it here</a>. I'm a big fan of their ethos and of his writing – I quote his <a href="https://www.are.na/editorial/personal-business">Personal Business</a> piece often.</p>
<p>Seeing their page it hit me, instantly: that this shouty page that I'd designed just <em>wasn't me</em>; wasn't us, Johnny and Lucy, this 'personal business'. The old page was my attempt at being a Big Company – something I don't want to be!</p>
<p>It's gone; blessed relief. In its place is <a href="https://johnnydecimal.com">a page</a> that I hope helps you find the place you're looking for. I hope it's useful to the newcomers, who don't know what this thing is, and the long-timers, who know just what they're looking for.</p>
<p>I particularly like the new user flow. The page subtly changes when you go from signed out, to signed in with a free account, to signed in with access to products. Same place, same feel, slightly different story.</p>
<p>I'm proud of it. It feels like me. Let me know what you think.</p>
<h3 id="product-name-updates">Product name updates</h3>
<p>We've updated the names of our products. So if you look in your new <a href="https://johnnydecimal.com/account">account page</a> you might see unfamiliar words. Nothing has actually changed other than a name.</p>
<p>What was 'Life Admin System' (and then, very briefly, …(pack only)) is now a <strong>Personal</strong> membership.</p>
<p>What was 'Johnny.Decimal University' (then, briefly, 'The Life Admin System') is now a <strong>Pro</strong> membership. This better reflects what we're doing with it – there's a fledgling API you can use, and most of the AI tools (see below) will require a Pro account. I want to keep adding useful stuff – if you're Pro, you'll get it all.</p>
<p>And what was 'Small Business System' is now a <strong>Business</strong> membership. It includes everything in Pro.</p>
<p>What hasn't changed is that 'membership' doesn't mean 'subscription'. Pay once, access and updates forever. Nor have any of the prices changed.</p>
<h3 id="lifetime-is-back">Lifetime is back</h3>
<p>For a while we sold a <strong>Lifetime</strong> membership option. Then I couldn't figure out where it should sit, so I removed it.</p>
<p>Enough people ask how they can support us, so I've put it back. You'll find it there on your <a href="https://johnnydecimal.com/account">account page</a>. As with all of our products, it'll discount anything you've already paid.</p>
<p>For this extra money you get … not much, honestly! You get our eternal gratitude and love. You get everything we make in the future, but I can't promise what that'll be, if anything.</p>
<p>Our Lifetime members make a huge difference. When I say love, I mean it. Thank you all.</p>
<h3 id="ai-content-coming">AI content coming</h3>
<p>The next update will be about exciting stuff I'm doing with AI. I think it's really cool – but I know some of you aren't into it. There's a new button on the <a href="https://johnnydecimal.com/#settings">homepage</a>. If you don't want to hear about AI, turn it on. I'll do my best to filter it out of the site (still some work to do, bear with me).</p>
<p>Do that in the next ~36 hours and I should be able to filter you out of AI-specific email. I haven't coded that up yet so no promises but I don't see why not. I should also be able to create an AI-free version of the RSS feed. I'll drop a post in the feed when I've done that.</p>
<p>Until next time,<br>
j.</p>AI-free features now available - Johnny.Decimalhttps://johnnydecimal.com/blog/0238-rss-no-ai/2026-08-19T09:39:21.000Z<p>For those of you not into AI, there are a handful of new features. There's a setting on <a href="https://johnnydecimal.com/#settings">your new homepage</a> that, when checked, will hide most AI content on the site.</p>
<p>I'm not promising that you'll never see the letters 'AI'. But posts and pages that are predominantly about AI will be hidden. These posts are also hidden from your search results.</p>
<h2 id="ai-free-rss-feed">AI-free RSS feed</h2>
<p>That setting doesn't carry across to the public RSS feed, so if you want the AI-free feed, resubscribe to <a href="https://johnnydecimal.com/rss-no-ai.xml">https://johnnydecimal.com/rss-no-ai.xml</a>.</p>Organising my blog categories - James' Coffee Bloghttps://jamesg.blog/2026/08/19/organising-my-blog-categories2026-08-19T00:00:00.000Z
<p>My <a href="https://jamesg.blog/categories">blog categories</a> page has, until today, been designed with a functional mindset: the purpose of the page was to list all of the categories I use on my website. But, this week, I started thinking about how I could improve the page, to make it more of a hub to explore different parts of my site, and to elevate the different kinds of writing I do most.</p><p>One of my main design goals was for the page to be organised into groups, each group representing a different topic about which I write. As I started to work on this goal, however, I realised there were many more mini tasks waiting for me: some category pages were being overwritten by static pages I had made, I had a few pairs of categories that were identical (or almost identical) in purpose, some categories had not been used in years and their contents could be moved elsewhere. This led me to start reorganising posts in my categories. These tasks were broken down into:</p><ul><li>Creating new categories that I have wanted for a while (i.e. <a href="https://jamesg.blog/nature" rel="noreferrer">Nature</a> for my nature posts, <a href="https://jamesg.blog/monostich" rel="noreferrer">Monostich</a> for my monostich poems, <a href="https://jamesg.blog/ssgs" rel="noreferrer">SSGs</a> for my static site generator posts, <a href="https://jamesg.blog/quizzes" rel="noreferrer">Quizzes</a> for my quiz posts).</li><li>Consolidating categories (i.e. all the posts in the Programming category have now been moved into <a href="https://jamesg.blog/coding" rel="noreferrer">Coding</a>, Designs and Design, which had been created with subtly different intents but were never used that way, have been consolidated into <a href="https://jamesg.blog/design" rel="noreferrer">Design</a>).</li><li>Removing categories that had been unused for a long time and could fit into a bigger category, and assigning new categories to posts under the category that had been removed. I only removed a handful of categories.</li><li>Adding new categories to posts that already had a category where the post content may be represented well by two or more categories (i.e. my HTML Day posts now have the <a href="https://jamesg.blog/events" rel="noreferrer">Events</a> category).</li><li>Changing categories that had been used by accident on a post.</li><li>Moving pages that were not really posts into different parts of my site (i.e. I had entries that I used for <a href="https://jamesg.blog/2022/02/03/breakfast-and-coffee" rel="noreferrer">Breakfast and Coffee</a>, a Webmention-powered wiki I made a few years ago, in my post list, even though they were written as wiki pages; these have been moved to be individual pages, rather than posts. I preserved the publication dates of the pages and made sure the old URL redirects to the new one).</li><li>Miscellaneous website changes that were required as a result of stumbling on old web pages (especially interactive ones) that were not working as expected. <sup class="footnote-reference" id="f-1"><a href="https://jamesg.blog/longform-feed#1">1</a></sup></li></ul><p>All of this work was manual, but it was worth it. I can’t go as far as to say I have organised my website, but my blog categories feel a bit more navigable than they were before. I still have a lot of work to do on backfilling posts into the Nature category, but at the very least I am glad that I have it ready for when I need it.</p><p>When I removed categories, I added a redirect to the category into which most or all of the posts had been moved. This ensures that any links to the old category do not break.</p><p>As I made these changes, I also worked on my aforementioned main design goal: to organise my category page into groups. I came up with a few super-categories that could serve as section headings under which related categories could be listed. These are:</p><ul><li>Life, Art, and Writing, which includes categories like Life, Moments of Joy, Stories, and Poetry.</li><li>Web, which includes categories like IndieWeb, Web, and Advent of Bloggers.</li><li>Technology and Design, which includes categories like Coding, Ideas, and Technical Writing.</li><li>Coffee, which includes categories like Coffee, Coffee Interviews, and Steampunk Coffee.</li><li>Miscellaneous, which includes categories like Music, Book Review, Fun with Words.</li></ul><p>Items in this list appear in order of the type of writing I do most at the moment and have the most fun writing. Categories within each super-category are ordered by the number of posts in the category. Importantly, more than one category can be assigned to a post, although I don’t do this often. This means that the page doesn’t represent a count of all posts on my site; a post may be tagged Life and Nature, and so appear in both of the respective category counts.</p><p>Here is a screenshot of the page as it is today:</p><figure><picture><img alt='The top part of my categories page, showing the supercategories "Life, Art, and Writing" and "Web" with the accompanying child categories below each heading.' loading="lazy" src="https://editor.jamesg.blog/content/images/2026/08/categories-1.png" style=" max-width: 130%;"/></picture><div class="alt"><label><input aria-label="Toggle image alt text on screen" type="checkbox"/>ALT</label><div class="content">The top part of my categories page, showing the supercategories "Life, Art, and Writing" and "Web" with the accompanying child categories below each heading.</div></div></figure><p>As part of making this page, I did an experiment where I was going to show an asterisk next to the post count for categories to which a post had not been added for at least a year. I ended up removing this because it felt like the kind of design pattern that might make me feel bad for not writing in a specific category.</p><p>Separately, I also added an <a href="https://jamesg.blog/uncategorised">Uncategorised</a> category (and a redirect from /uncategorized with a “z” to /uncategorised with an “s”, given that, even during development, I got them both mixed up, and will likely in the future). This lists posts without a category. Adding this category helped me find several posts throughout the history of my site that were never given a category. I have now added categories to those posts.</p><p>Right now, all the posts in the Uncategorised category are my announcements for episodes in my Wonders of Web Weaving podcast. I hadn’t assigned a category to those posts because I wanted the main list of episodes to be on the <a href="https://web-weaving.jamesg.blog/">podcast website</a>. I may make a category though since these I am unsure the extent to which having a separate category page would be a problem since all the posts related to the podcast already link to the main podcast website.</p><p>As I mentioned earlier, there is more work to do, but my category page feels like it is in a much better place than it has been before. As a result of the new design, I have added a link to my categories page with the anchor text “Explore” in the left sidebar of my website. If you have any feedback, do let me know by <a href="https://jamesg.blog/email">sending me an email</a>.</p>
<div class="footnote-definition" id="1"><sup class="footnote-definition-label" id="f-2">1</sup>
<p>One of the bigger changes I made was replacing all instances of my email address in a blog post with a link to my /email page, which lists my email address. I made my /email page a while ago to be the canonical page with information on how to contact me, but I hadn’t updated my old blog posts to use it until today.</p>
<a href="https://jamesg.blog/longform-feed#f-1">[↩]</a></div>
<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a2da3857bd0214e1',t:'MTc4NzE1MzY0Mg=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
<a class="tag" href="https://jamesg.blog/2022/02/03/breakfast-and-coffee">Breakfast and Coffee</a>
<a class="tag" href="https://jamesg.blog/categories">blog categories</a>
<a class="tag" href="https://jamesg.blog/coding">Coding</a>
<a class="tag" href="https://jamesg.blog/design">Design</a>
<a class="tag" href="https://jamesg.blog/email">sending me an email</a>
<a class="tag" href="https://jamesg.blog/events">Events</a>
<a class="tag" href="https://jamesg.blog/longform-feed#1">1</a>
<a class="tag" href="https://jamesg.blog/longform-feed#f-1">[↩]</a>
<a class="tag" href="https://jamesg.blog/monostich">Monostich</a>
<a class="tag" href="https://jamesg.blog/nature">Nature</a>
<a class="tag" href="https://jamesg.blog/quizzes">Quizzes</a>
<a class="tag" href="https://jamesg.blog/ssgs">SSGs</a>
<a class="tag" href="https://jamesg.blog/uncategorised">Uncategorised</a>
<a class="tag" href="https://web-weaving.jamesg.blog/">podcast website</a>
Now (August 2026) - Robb Knight • Posts • Atom Feedhttps://rknight.me/blog/now-august-2026/2026-08-18T18:46:21.000Z<p>This update has been way too long - <a href="http://localhost:8083/blog/now-january-2026/">January was the last one</a>. I kind of let <a href="https://rknight.me/blog/tags/weeknotes/">weeknotes</a> take over but they don't include the <em>now</em> part of a now page so I'm going to make an effort to update the now page every month while continuing with weeknotes in the sporadic fashion that I have been.</p>
<h3>Doing...</h3>
<ul>
<li>We went to <a href="https://4-kingdoms.co.uk/">4 Kingdoms</a> which feels a bit more run down that some <a href="https://www.fishersfarmpark.co.uk/">other places</a> we've been but the Knightlings had a great time.</li>
<li>Baby Knight the second is starting at a new nursery next week which means both the Knightlings will be at the same place — this will make lunchtime pickups <em>much</em> easier.</li>
<li>I ordered a physical copy of <a href="https://www.blackwellwriter.com/products/umbra-a-game-of-final-frontiers">Umbra</a> because I want to try out a solo RPG and the idea of drawing a map as part of that really appeals to me. Had to order a <a href="https://www.etsy.com/uk/listing/4402528493/original-mystery-dice-set-of-7-ttrpg">mystery set of dice</a> too, of course.</li>
<li>I want to do more (and get better at) drawing and incorporate that into my online things. Practice is the thing I hear that works. Sounds like a propaganda to sell more practice.</li>
<li>Prepping for the <a href="http://stjude.omg.lol/">Relay and St Jude fundraiser</a> with Adam. Sticker designs are coming along nicely, here's a peek at mine.</li>
</ul>
<figure><img src="https://cdn.rknight.me/site/2026/st-jude-sticker-tease.jpg" alt="A red cartoon character with big white eyes. The background has some yellow and red splashes" /></figure>
<h3>Making...</h3>
<ul>
<li>A new website design. This is taking a lot longer than I'd like because I just can't nail down the colour scheme.</li>
<li>A handful of small, single use tools similar to <a href="https://doodlescan.rknight.me">Doodle Scan</a> and <a href="https://favicons.rknight.me">Favicons to Go</a>.</li>
</ul>
<h3>Listening...</h3>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Connor_Price">Connor Price</a> and <a href="https://www.youtube.com/channel/UCifdpJnv6JymGahUuPDPV6g">Nic D</a>.</li>
<li><a href="https://en.wikipedia.org/wiki/Lauren_Sanderson">Lauren Sanderson's</a> latest album, Lauren.</li>
<li><a href="https://music.apple.com/gb/album/o-ep/6795664692">Zebrahead - O EP</a></li>
</ul>
<h3>Watching...</h3>
<ul>
<li><a href="https://www.imdb.com/title/tt4477976/?ref_=fn_t_1">Superstore</a> for the second time.</li>
<li>We just finished <a href="https://www.imdb.com/title/tt27444205/">Paradise</a>.</li>
<li>Up next on the list: Grey's season 22, Daredevil, Reacher season 4, and the new Futurama season.</li>
</ul>
<h3>Writing with...</h3>
<ul>
<li><a href="https://cultpens.com/products/twsbi-eco-fountain-pen-pink-lemonade-with-bronze">Pink Lemonade TWSBI Eco 1.1</a> inked with <a href="https://www.diamineinks.co.uk/products/diamine-80ml-fountain-pen-ink-lady-grey">Diamine Lady Grey</a></li>
<li><a href="https://cultpens.com/collections/pilot-prera">Pilot Prera stub nib</a> inked with <a href="https://www.penaddict.com/shop/fireonfire">TPA Fire on Fire</a></li>
<li><a href="https://cultpens.com/products/pilot-parallel-pen">Pilot Parallels</a></li>
</ul>