Shellsharks Blogroll - BlogFlock2025-09-15T14:34:21.222ZBlogFlockAdepts of 0xCC, cool-as-heck, Evan Boehs, destructured, Hey, it's Jason!, <span>Songs</span> on the Security of Networks, Werd I/O, cmdr-nova@internet:~$, Sophie Koonin, Westenberg, fLaMEd, gynvael.coldwind//vx.log (pl), Aaron Parecki, Trail of Bits Blog, Molly White, Johnny.Decimal, James' Coffee Blog, Terence Eden’s Blog, joelchrono, Robb Knight, Posts feed, Kev QuirkHow big a solar battery do I need to store *all* my home's electricity? - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=629592025-09-15T11:34:42.000Z<p>I have a <a href="https://shkspr.mobi/blog/solar-faq/">modest set of solar panels</a> on an entirely ordinary house in suburban London.</p>
<p>On average they generate about 3,800kWh per year. We also use about 3,800kWh of electricity each year. Obviously, we can't use all the power produced over summer and we need to buy power in winter. So here's my question:</p>
<p>How big a battery would we need in order to be <em>completely</em> self-sufficient?</p>
<h2 id="background"><a href="https://shkspr.mobi/blog/2025/09/how-big-a-solar-battery-do-i-need-to-store-all-my-homes-electricity/#background" class="heading-link">Background</a></h2>
<p>Let's take a look at a typical summer's day. The graph is a little complex, so I'll explain it.</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/09/Power-Flow.webp" alt="Graph of power flow." width="1788" height="988" class="aligncenter size-full wp-image-62974"/>
<p>The yellow line shows solar production. It starts shortly after sunrise, peaks at midday, and gradually drops until sunset.</p>
<p>The red line shows how much electricity our home is using. As you can see, there's a large peak about 19:00 when we cook dinner.</p>
<p>The blue line shows how much electricity we draw or export from the grid. From midnight until sunrise we import because the sun isn't shining. Once the sun has risen we're able to power our house <em>and</em> export to our neighbours. When we cook, we draw from the grid <em>and</em> our battery - which is why the evening grid peak is lower than the household use dip.</p>
<p>The CSV of the data looks something like this:</p>
<table>
<thead>
<tr>
<th align="right">Local_time</th>
<th align="right">Household_(W)</th>
<th align="right">Solar_(W)</th>
</tr>
</thead>
<tbody>
<tr>
<td align="right">2025-08-25T08:25:00.000+01:00</td>
<td align="right">-187.76</td>
<td align="right">1166.77</td>
</tr>
<tr>
<td align="right">2025-08-25T08:30:00.000+01:00</td>
<td align="right">-227.04</td>
<td align="right">1193.25</td>
</tr>
<tr>
<td align="right">2025-08-25T08:35:00.000+01:00</td>
<td align="right">-253.06</td>
<td align="right">1222.84</td>
</tr>
<tr>
<td align="right">2025-08-25T08:40:00.000+01:00</td>
<td align="right">-266.87</td>
<td align="right">1245.18</td>
</tr>
<tr>
<td align="right">2025-08-25T08:45:00.000+01:00</td>
<td align="right">-450.8</td>
<td align="right">1268.66</td>
</tr>
<tr>
<td align="right">2025-08-25T08:50:00.000+01:00</td>
<td align="right">-251.84</td>
<td align="right">1281.79</td>
</tr>
<tr>
<td align="right">2025-08-25T08:55:00.000+01:00</td>
<td align="right">-1426.26</td>
<td align="right">1306.93</td>
</tr>
<tr>
<td align="right">2025-08-25T09:00:00.000+01:00</td>
<td align="right">-206.78</td>
<td align="right">1341.37</td>
</tr>
<tr>
<td align="right">2025-08-25T09:05:00.000+01:00</td>
<td align="right">-215.52</td>
<td align="right">1390.9</td>
</tr>
<tr>
<td align="right">2025-08-25T09:10:00.000+01:00</td>
<td align="right">-242.6</td>
<td align="right">1426.19</td>
</tr>
<tr>
<td align="right">2025-08-25T09:15:00.000+01:00</td>
<td align="right">-246.84</td>
<td align="right">1473</td>
</tr>
</tbody>
</table>
<p>It's fairly trivial to sum both columns and subtract one from the other. That shows either the excess or deficit in solar power for the household.</p>
<p>On that day, the house used 9.7kWh and generated 19.6kWh. I'd need a 9.9kWh battery to store the excess right? Wrong!</p>
<p>Because my usage doesn't track the sun, I'd actually need a 13kWh battery. That's the peak amount of excess electricity I've generated in that one day.</p>
<p>What I want to do is find out what the <em>maximum</em> size battery I would need in order to store all of summer's electricity for use in winter.</p>
<p>Luckily, I have several years of real data to go off! Let's get started!</p>
<h2 id="disclaimer"><a href="https://shkspr.mobi/blog/2025/09/how-big-a-solar-battery-do-i-need-to-store-all-my-homes-electricity/#disclaimer" class="heading-link">Disclaimer</a></h2>
<p>This is based on data generated by my home battery. It has probes to measure solar output and grid flow. It is not 100% clock-accurate compared to my solar-panels' internal reporting nor what my smart-meter reports. I estimate a 1-2% deviation, which is good enough for these purposes.</p>
<p>My energy usage isn't representative of anything other than my usage. Your household is probably different. I already have a 4.8kWh battery which changes how and when I use energy.</p>
<p>This doesn't account for gas heating or hot water. We have some electric heaters and taps which increases our electricity usage.</p>
<p>My maths is <em>probably</em> right - but the code is open source, so feel free to check for yourself.</p>
<p>Remember, this is just a bit of fun. There's no practical way to build domestic batteries with this capacity using the technology of 2025.</p>
<h2 id="code"><a href="https://shkspr.mobi/blog/2025/09/how-big-a-solar-battery-do-i-need-to-store-all-my-homes-electricity/#code" class="heading-link">Code</a></h2>
<p>We tend to start generating more electricity than we use starting in Spring. So I've picked the end of March 2024 to the end of March 2025.</p>
<p>Let's see how big a battery we'd need to store our summer excess for winter. This finds the cumulative difference between each day's energy production and usage:</p>
<pre><code class="language-python">import os
import pandas as pd
# Load all the CSVs
filepaths = [f for f in os.listdir(".") if f.endswith('.csv')]
df = pd.concat(map(pd.read_csv, filepaths))
# Make sure they're in order
df = df.sort_values("Timestamp")
df = df.reset_index(drop=True)
# Resolution is every 5 minutes, so divide by 12 to get hourly
df["Cumulative_Difference"] = ( (df["Household_(W)"] + df["Solar_(W)"] ).cumsum() ) / 12
# kWh of battery needed
int(df["Cumulative_Difference"].max() / 1000)
## Draw a pretty graph
df.plot(kind="line", x="Local_time", y="Cumulative_Difference", xlabel="Date", ylabel="MWh", xticks=["2024-04-01", "2024-05-01", "2024-05-01", "2024-06-01", "2024-07-01", "2024-08-01", "2024-09-01", "2024-10-01", "2024-11-01", "2024-12-01", "2025-01-01", "2025-02-01", "2025-03-01", "2025-04-01"], legend=False, grid=True, fontsize=15)
plt.show()
</code></pre>
<p>The total is <strong>1,068KWh</strong> - basically, a MegaWatt-hour of storage.</p>
<p>Here's a quick graph to show how the storage would be used over the year.</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/09/Cumulative-Graph.webp" alt="Graph showing a steady climb to 1 MegaWatt-hour and then down again." width="1300" height="700" class="aligncenter size-full wp-image-62980"/>
<p>As you can see, even in this scenario there are a few days where we'd need to import energy from the grid.</p>
<h2 id="is-this-sensible"><a href="https://shkspr.mobi/blog/2025/09/how-big-a-solar-battery-do-i-need-to-store-all-my-homes-electricity/#is-this-sensible" class="heading-link">Is this sensible?</a></h2>
<p>Probably not, no. It doesn't account for increased energy use from having an electric car or moving away from gas heating / cooking. As <a href="https://www.nrel.gov/pv/interactive-cell-efficiency">solar panels increase in efficiency</a>, it might be more sensible to replace the panels on my roof, or add some onto a shed.</p>
<p>The environmental impact of creating and storing such huge batteries could also be factored in.</p>
<p>A battery which is only 100% full for a few days probably isn't an efficient design. Using wind, hydro, and other green sources from the grid might be preferable.</p>
<p>But, remember, this is an exercise in wishful thinking.</p>
<h2 id="is-this-possible"><a href="https://shkspr.mobi/blog/2025/09/how-big-a-solar-battery-do-i-need-to-store-all-my-homes-electricity/#is-this-possible" class="heading-link">Is this possible?</a></h2>
<p><a href="https://mathstodon.xyz/@johncarlosbaez/115190527741497635">Grid-scale batteries exist</a> and they work brilliantly.</p>
<p>But if I wanted my own MegaWatt-hour of battery storage, it would probably cost me between <a href="https://www.fogstar.co.uk/collections/solar-battery-storage/products/fogstar-energy-32kwh-battery?variant=55157091205497">£100k</a> and <a href="https://modoenergy.com/research/battery-energy-storage-capex-containerised-bess-development-costs-oem-balance-plant-bop-grid-connections-survey-2024">half-a-million quid</a>.</p>
<p>That doesn't include maintenance, the land, planning permission, and a hundred other things.</p>
<p>But battery prices are falling fast. In the last decade <a href="https://www.energy.gov/eere/vehicles/articles/fotw-1354-august-5-2024-electric-vehicle-battery-pack-costs-light-duty">lithium ion battery prices have fallen 90%</a>. With new <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC11913365/">sodium ion batteries</a> promising an even bigger drop - down to <a href="https://www.geeky-gadgets.com/catl-sodium-ion-battery-packs/">US$10/kWh</a>.</p>
<p>If - and it is a <strong>big</strong> if - those numbers came to pass, it would probably cost around £8,000 for a domestic battery. Basically the same cost as adding solar panels in the first place.</p>
<p>Domestic solar <em>works</em> - yes, even in the rainy UK! It is relatively cheap, moves energy production as close as possible to energy consumption, reduces bill-shock, and means we don't have endless planning arguments about whether fields should be turned into solar farms.</p>
<p>It is possible that, not too long in the future, every home could also have a 1 MegaWatt-hour battery. They would be able to capture all the excess solar power generated in a year.</p>
<p>There's a bright and sunny future where every home can be solar-self-sufficient.</p>
📝 15 September 2025 at 06:26 - The more …... - Kev Quirknotes/20250915-06262025-09-15T06:25:00.000Z
<p>The more I play with <a href="https://kevquirk.com/hashtags/obsidian">#Obsidian</a>, the more I realise why people love it so much. They've thought of everything.</p>
<div class="email-hidden">
<hr>
<p>Thanks for reading this post via RSS. RSS is great, and you're great for using it. ❤️</p>
<p>
<a href="mailto:72ja@qrk.one?subject=15 September 2025 at 06:26">Reply to this post by email</a> ●
<a href="https://kevquirk.com/guestbook">Sign my guestbook</a>
</p>
</div>
Second person birds - James' Coffee Bloghttps://jamesg.blog/2025/09/14/second-person-birds/2025-09-14T21:37:36.000Z
<p>I remember the feeling of the light shining around and through the curtains. Then there was music: melodies in chirp. I wanted to close my eyes and go back to sleep for just a while longer, enjoying the warmth of my bed, but I didn’t want to forget the light and the music – there was a moment so wonderful just behind the curtain.</p><p>Bird song plays the role that so many people do and have done in my life: the bird song is the music that starts my day.</p><p>I wonder if the birds know how far their songs carry, how we notice the patterns and changes in their tone, how we find both wonder and joy in figuring out from where the song calls, how their song starts and adds life to the day.</p><p><em>This is my entry for the </em><a href="https://toground.link/second-person-birds/" rel="noreferrer"><em>September 2025 IndieWeb Carnival, hosted by Sophia at toground.link</em></a><em>. The topic is "</em>second person birds<em>".</em></p>
Rain - James' Coffee Bloghttps://jamesg.blog/2025/09/14/rain/2025-09-14T18:44:03.000Z
<p><em>I don’t think it’s going to rain that much</em> I thought to myself before going out yesterday. I took my summer jacket: a light blue denim coat that brings me a lot of joy. My jacket keeps me warm.</p><p><em>However, my jacket doesn’t have a hood.</em></p><p>Later in the day, when I got to my destination, the rain started to fall. But after so little rain this year, I felt less bothered by the rain. I wanted to be outside and take in the scent that the trees and Nature make only during and after rain.</p><p>The scent has a word that has stuck in my mind from the moment I first heard it: <em>petrichor</em>. The way the letters sit by each other in the word is poetic. So, too, is the feeling that there is a word that exists to describe the scent in the air. <em>There is a word for the refreshing scent in the air after rain!</em> So many other people have experienced this scent that we – the world – gave it a word.</p><p>I took shelter under a tree in the park, holding a warm, decaf flat white coffee that I had bought earlier. I bought the coffee because I wanted something warm to cusp around my hands; the drink would keep me warm inside, too. With my hands warm and feeling good from the coffee, I watched the rain fall past the leaves on the tree. I stood under a spot where less rain fell, but the occasional drop did fall on my hand and my coffee cup. The raindrops made me feel alive.</p><p>In the distance, I saw the sun that would set in an hour or two was beaming gold onto some clouds. <em>I think the rain will let up soon.</em> A few minutes later, I took the first step out from under the tree. The rain was progressively turning from a shower to a pitter-patter. The park path was damp but there was no longer as much rain falling as there was. More people who were taking shelter started to come out.</p><p>I went to get dinner – a sandwich, among my favourite dinners on the go – and got caught in the rain once again. This time, the rain was much heavier, but I also had a plan! I could take shelter under the columns of a nearby museum. With a to-go sandwich in one hand, I walked at a brisk pace toward the museum.</p><p>There, standing in the cold outdoors – but somewhere the rain could not fall on us – I found many people who were, like me, waiting for the rain to pass by. I listened to the active conversations of people making plans about where to go next; people young and old, couples and families, tourists and people for whom this place was home. All together in one place, waiting for the rain to let up.</p><p>In this moment, a moment in which my hair was dripping wet and my hands, holding a sandwich, were cold, I smiled to myself. <em>We’re all in the same spot. We’re all here. We’re all making up this evening’s story of the city. We’re all living, while also waiting.</em> I listened and enjoyed the sounds of conversation. I moved so that a few more people could fit in and stay out of the rain. I ate my sandwich and watched the world go by.</p>
Thinking About Simplification - Kev Quirkblog/thinking-about-simplification2025-09-14T10:35:00.000Z
<p style="font-size: 1.2em;"><p>This site’s a fun playground, but it’s evolved into a cluttered maze. Lately I’ve been wondering if it’s time to strip it down so I can focus on writing.</p></p><p>Since <a href="https://kevquirk.com/blog/migrating-this-blog-to-kirby">moving this blog over to Kirby</a> a couple years ago, I've added <em>a lot</em> of features. Prior to the move, it was a simple site that had a blog, an RSS feed, and a handful of pages. But since then, I've been learning a bit of PHP and this site has morphed into a playground for my online antics. As a result, I've added:</p>
<ul>
<li>A notes system.</li>
<li>A guestbook.</li>
<li>A blogroll with an automatically generated OPML file that you can download.</li>
<li>Custom post types that include blog, links, books, watches, and goodness knows what else.</li>
<li>Stats for both my blog posts and my notes.</li>
<li>A log of which watches I wear, along with stats.</li>
</ul>
<p>Under the hood I've built a number of custom plugins, routes, hooks, configs etc. It's a lot, and I struggle to keep up with all the things I've done at this point.</p>
<p>By some people's measure, this isn't that complicated. But for a hobbyist like me, this is really bloody complex and as a result things are starting to creak. For example, I'm now having to reboot my server once a month or so, because <em>something</em> (I don't know what) is causing it to shit the bed.</p>
<p>It also means that I'm spending more time fiddling and less time writing, which is shame because it's what I love to do. If you look at the stats for this site, you will see a big drop off in 2025, which coincides with me starting to learn PHP and fiddling more.</p>
<figure class=""><img alt="Screenshot of number of posts per year, taken from my stats page." loading="lazy" src="https://kevquirk.com/media/pages/blog/thinking-about-simplification/a6adaf09c1-1757844621/posts-graph.webp"></figure>
<h2>What shall I do?</h2>
<p>My first thought was to burn it all down, simplify the whole thing and re-write it in something like <a href="https://11ty.dev">11ty</a>. No PHP, no complexity, just a simple blog, RSS feed and a few pages again.</p>
<p>But I <em>love</em> Kirby and honestly, I think I'd miss the CMS too much if I got rid of it. But then, on the other side of the coin, Kirby is what's causing me to fiddle so much.</p>
<ul>
<li>Do I go to an SSG like 11ty?</li>
<li>Do I keep the CMS and go with something like Ghost?</li>
<li>Do I just strip a load of the functionality out of this existing site?</li>
</ul>
<p>I've been thinking about this <a href="https://kevquirk.com/blog/doing-a-jack-baty">for months</a>, and I can't make up my mind. I know I want to get back to writing, but every time I login to this site, I end up getting side-tracked on something I want to fix, change, or improve. It's a slippery slope.</p>
<p>I’ve been using <a href="https://obsidian.md/">Obsidian</a> for notes for a while now, and I love it. I could turn it into a slick SSG publishing machine…but I’m not sure if I want to open that can of worms, either.</p>
<p>Gah, I dunno. I think I'm going to spin up a simple 11ty site and see if I can build a decent workflow around Obsidian, then go from there...</p>
<div class="email-hidden">
<hr>
<p>Thanks for reading this post via RSS. RSS is great, and you're great for using it. ❤️</p>
<p>
<a href="mailto:72ja@qrk.one?subject=Thinking About Simplification">Reply to this post by email</a> ●
<a href="https://kevquirk.com/guestbook">Sign my guestbook</a>
</p>
</div>
Walking - James' Coffee Bloghttps://jamesg.blog/2025/09/13/walking/2025-09-13T14:27:49.000Z
<p><em>When did I stop walking as much?</em> I realised this week after having found the motivation to go out for a few walks. I knew that I didn’t want to spend the whole day inside. <em>I want to see the world.</em> With each passing day, I felt more confidence in going out. My usual walk seemed more difficult than it used to be, but I got to the end. I even felt the spark of energy that I felt when I started running earlier this year (a routine I stopped after pushing myself too much too early).</p><p>I haven’t been out for a walk today; the sky is grey. I started to search for what to write about, then I thought back to the last week. My walks, and the realisation of a routine that fell by the wayside. Walking is not the only routine that I lost: my sleep schedule, too, could be better. Finding the right sleep schedule when you find ideas at midnight like I do is tricky, I have told myself, but those moments are really few and far between. Maybe I have been staying up late with the hope that I find more inspiration.</p><p>There is so much I don’t know right now; my world is changing. I do know one thing: I want to go out for more walks; to see and be among the changes of autumn, knowing that change is natural; to put one foot in front of the other and remember that moving forward is natural; to remember the way walking clears my mind, leaving room for ideas to sit and grow. Perhaps with walks I will find that inspiration I have been seeking in midnight: the spark that begins with <em>I have an idea</em> and is followed by <em>I want to bring this to life.</em></p>
Raindrop - James' Coffee Bloghttps://jamesg.blog/2025/09/13/raindrop/2025-09-13T14:07:11.000Z
<p>The autumn rains are here. I have been looking forward to a bit of rain. There is something delightfully cosy about sitting inside reading or writing or watching television while the rain falls outside. And, rain means the opportunity for rainbows. This week, I have seen at least two rainbows, much needed after a relatively difficult week. After seeing the first rainbow, I started to keep my eye out for more. I just went to look out the window and there is <em>another</em> rainbow! Fainter than the others, but nonetheless breathtaking.</p><p>About ten minutes ago, there was a soft rain outside. The sun and the clouds exist together in the sky. From my chair I can see both blue and grey. As the rain stopped, I noticed a droplet on a railing outside from which several colours were radiating, flickering between blue, green, and others. I have never seen a raindrop so colourful, almost as if it were a prism through which the sun was shining (was this the phenomenon that made rainbows possible?).</p><p>The raindrop was about to fall, but all that mattered in the moment was that I was there to see it.</p>
Book Review: All That We See or Seem by Ken Liu ★★★★★ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=632992025-09-13T11:34:34.000Z<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/09/9781035915934_l.webp" alt="Book cover with a fractured city in the background." width="200" height="310" class="alignleft size-full wp-image-63301"/>
<p>This book is <em>ridiculously</em> zeitgeisty. It's all brain-rotting AI, social-media meltdowns, mixed with some cracking technobabble.</p>
<blockquote><p>She thinks about erasing more: all the practice session recordings; her own encrypted cephaloscripts; the dream-guide neuromesh of her personal AI; the interviews, fan messages, reviews—food for her vanity, training data for her egolets.</p></blockquote>
<p>Fab! But, for all that, it's pretty realistic. Sure, it's set five-minutes into the future, but all the tech is plausible and all the hacks somewhere in the ballpark of reality. It is <em>much</em> better than <a href="https://shkspr.mobi/blog/2021/09/book-review-the-ministry-for-the-future-by-kim-stanley-robinson/">The Ministry for the Future</a> simply because all the technowizardry passes the smell test.</p>
<p>The plot is, charitably, basic. A woman has been kidnapped and her husband (who is a suspect) enlists a <del>Private Eye</del> hacker to solve the mystery. But you're not reading to discover whodunnit; you're there to revel in the pitch-perfect future-gazing and cower before the (hopefully not too accurate) predictions around how technology will be subverted to protect the powerful while leaving everyone else helpless.</p>
<p>The neologisms are off the chart - "Darcybots" to help you date, a "Fiscjinn" to interrogate your finances, and an "Oneirofex" to… well, I'll let you discover that! You'll need to have a good grasp of what's going on with modern technology in order to get more than half the references. I've no idea if the book will be intelligible half-a-decade from now. Perhaps we'll have our self-hosted AIs translate it for us?</p>
<p>At times, it feels less like a book and more like a series of parables woven into one story. The ending feels a little rushed - but it fits in with the fast-paced nature of the plot. A great slab of sci-fi to chew on.</p>
<p>The book is released in October 2025 - and will probably remain relevant for at least half-a-dozen weeks.</p>
22.00.0133 Extend-the-end: a deep-dive - Johnny.Decimalhttps://johnnydecimal.com/22.00.0133/2025-09-13T04:38:48.000Z<h1 id="extend-the-end-a-deep-dive">Extend-the-end: a deep-dive</h1>
<p><a href="https://johnnydecimal.com/13.31/">Extend-the-end</a> (EtE) is a new pattern that is still finding its feet in the real world. Here's a deep-dive and discussion of the use cases that I see on the <a href="https://johnnydecimal.com/23/">forum & Discord</a>.</p>
<h2 id="pattern-1-lifting-up-a-header">Pattern 1: 'lifting up' a header</h2>
<p>You have some ID, and in that ID you can hold a whole bunch of information. Let's say you keep one long JDex entry with neat headers.</p>
<p>The simplest way to think about EtE is to imagine 'lifting up' each of those headers into its own document. Because eventually that single note is going to get really long.</p>
<p>So this:</p>
<pre><code># 11.11 Some note
## Header about thing A
Yada yada blah blah for 10,000 words…
## Header about thing B
Blah blah yada yada for 15,000 words…
</code></pre>
<p>– is going to become 3 notes. We keep the parent</p>
<ul>
<li><code>11.11 Some note</code>, and introduce</li>
<li><code>11.11+ Header about thing A</code> and</li>
<li><code>11.11+ Header about thing B</code>.</li>
</ul>
<h3 id="format-acidtitle-of-the-thing">Format: AC.ID+▁Title of the thing</h3>
<p>Note the specific format here, which is in contrast to pattern 2. The EtE'd note's title is:</p>
<ul>
<li>The ID of its parent <code>11.11</code>, then</li>
<li>The <code>+</code>, then</li>
<li>A space <code> </code>, then</li>
<li>The note's title.</li>
</ul>
<h3 id="this-recognises-the-general-broadening-of-ids">This recognises the general broadening of IDs</h3>
<p>A broad pattern (see <a href="https://youtu.be/7vrIEl8mEl0">YouTube 'What is an ID?'</a>) is that IDs are getting broader, and holding more.</p>
<p>I'm not really sure why this is, to be honest. I can't tell you the last time I got anywhere near filling up a category with IDs (our pre-built systems excepted; they were <em>designed</em> to be full).</p>
<p>So exercise caution: if you do think about 'lifting up' a header like this, ask yourself, should I instead just be creating a new ID?</p>
<h3 id="concerns">Concerns</h3>
<p>It can be easy to forget that you've created these 'sub-notes'. Think carefully before creating one: prefer to 'fold' the header in the existing note.<sup><a href="#user-content-fn-fold" id="user-content-fnref-fold" data-footnote-ref="" aria-describedby="footnote-label">1</a></sup></p>
<p>Leave yourself a breadcrumb in the parent note. I always do this at the top.</p>
<pre><code># 11.11 Some ID
- Sub-notes:
- 11.11+ Header about thing A
- 11.11+ Header about thing B
---
Main note contents here.
</code></pre>
<blockquote>
<p>If your notes app supports it, make these clickable <code>[[wiki-links]]</code>.</p>
</blockquote>
<h2 id="pattern-2-use-it-as-a-short-code">Pattern 2: use it as a short code</h2>
<p>I use <a href="https://johnnydecimal.com/15.03/">Life Admin</a> (LAS) as my personal system. So it already has all of the IDs that I need, day-to-day.</p>
<p>I manage my own data storage & backups at <code>14.14 Data storage & backups</code>. But I also manage this for my bestie <a href="https://www.michellegracehunder.com">Michelle</a>, a photographer. She has her own setup and I don't want that mixed in with my own.</p>
<p>In a 'normal' system, i.e. not the pre-built LAS, I'd probably just create her own ID:</p>
<p><code>14.83 Michelle's data storage & backups</code></p>
<p>– but I <em>am</em> in LAS, and I already have a place, and the system is pretty full. <em>Also</em>, this isn't the only piece of data I'm storing for her: I also manage her domains, and who knows what else in the future.</p>
<p>So here's what I've created:</p>
<ul>
<li><code>14.14+MGH Data storage & backups</code></li>
<li><code>14.25+MGH Domains & hosting</code></li>
</ul>
<h3 id="mgh--a-reusable-short-code"><code>+MGH</code> = a reusable short code</h3>
<p>Being her initials, in this case. And note the subtly different naming pattern here: <strong>no space after the <code>+</code></strong>. Because this enables searching your JDex for this specific string, revealing all of the stuff that is exclusively related to Mishy.</p>
<p>More importantly it conveys to you the fact that this <em>is</em> a reusable short code.</p>
<h3 id="using-this-to-manage-the-family">Using this to manage the family</h3>
<p>A very common question in the context of LAS is <em>how do I use the system to manage my family?</em></p>
<p>The simplest pattern is to use EtE as just described. Assign your husband and each of the kids a short code. Obviously this code has to be the same everywhere. Initials are great, but use whatever works for you. I'd probably keep it to <5 characters, but really that's arbitrary. There's nothing fundamentally wrong with <code>+BARTHOLOMAEUS</code> but I think you'll get sick of typing it.</p>
<p>(Actually there is a sound logic to shorter codes: they're harder to get wrong. It'd be easy enough to type <code>+BARTHOLOMEAUS</code> one time and now you're at risk of losing that note.)</p>
<h3 id="think-of-this-like-a-shadow-system">Think of this like a 'shadow system'</h3>
<p>In this situation, you have one primary system. All IDs are created in this primary system.</p>
<p>But <em>underneath</em> that, you have any number of 'shadow systems'. They're the same system; same structure, so you don't have to remember a whole bunch of other IDs. And you reveal it by searching for your short code.</p>
<picture class="JDImage6 astro-3zw7efbj"> <source media="(prefers-color-scheme: light) and (min-width: 600px)" class="astro-3zw7efbj"> <source media="(prefers-color-scheme: dark) and (min-width: 600px)" class="astro-3zw7efbj"> <source media="(prefers-color-scheme: light) and (max-width: 599px)" class="astro-3zw7efbj"> <source media="(prefers-color-scheme: dark) and (max-width: 599px)" class="astro-3zw7efbj"> <img alt="An animated GIF showing the first few IDs from LAS. Then a 'card' from behind shows the same, but with the + pattern as described above." class=" no-caption astro-3zw7efbj" loading="lazy" src="https://johnnydecimal.com/img/v6/22.00.0133A-Shadow_systems--0_original-786x568.gif" width="393" height="284"> </picture>
<h3 id="alternative-not-ete">Alternative (not EtE)</h3>
<p>For the record, the other way you might do this is by completely duplicating the LAS structure for each of the kids, or whomever.</p>
<pre><code>10-19 Life admin ← your stuff
…
20-29 Michelle's life admin
24 Her online life
24.14 Data storage & backups
…
30-39 Bartholomaeus' life admin
…
</code></pre>
<p>This feels like you'll have a lot of empty space. Personally I prefer the EtE pattern.</p>
<h2 id="retraction-the-blog-pattern-was-wrong">Retraction: the 'blog pattern' was wrong</h2>
<p>The <a href="https://johnnydecimal.com/13.31/">EtE</a> page lists as an example this blog. E.g. the page you're reading would be <code>22.00+0133</code>.</p>
<p>I'm going to remove this example and instead number blog posts using the 5-digit <a href="https://johnnydecimal.com/15.01/">creative pattern</a>. That's a future post.</p>
<hr>
<p><em>100% human. 0% AI. Always.</em></p>
<section data-footnotes="" class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-fold">
<p>Any good notes app will let you 'fold' or 'collapse' a header. Typically hovering over the header will show a reveal/collapse triangle ▶ ▼. <a href="#user-content-fnref-fold" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>Published on Citation Needed: "Issue 92 – The scam of all scams" - Molly White's activity feed68c44815af8e0043c4ac1f0d2025-09-12T16:19:33.000Z<article class="entry h-entry hentry"><header><div class="description">Published an issue of <a href="https://www.citationneeded.news/"><i>Citation Needed</i></a>: </div><h2 class="p-name"><a class="u-syndication" href="https://www.citationneeded.news/issue-92" rel="syndication">Issue 92 – The scam of all scams </a></h2></header><div class="content e-content"><div class="media-wrapper"><a href="https://www.citationneeded.news/issue-92"><img src="https://www.citationneeded.news/content/images/size/w2000/format/webp/2025/09/scamofallscams.png" alt="Tweet by Bruno Skvorc: I just got a reply from @worldlibertyfi . TLDR is, they stole my money, and because it's the @POTUS family, I can't do anything about it..."/></a></div><div class="p-summary"><p>The Trumps “debank” major customers from their “anti-debanking” cryptocurrency venture, and a CFTC nominee says the Winklevosses are blackballing him</p></div></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp">Posted: <a href="https://www.citationneeded.news/issue-92"><time class="dt-published" datetime="2025-09-12T16:19:33+00:00" title="September 12, 2025 at 4:19 PM UTC">September 12, 2025 at 4:19 PM UTC</time>. </a></div><div class="social-links"> <span>Also posted to:</span><a class="social-link u-syndication twitter" href="https://twitter.com/molly0xFFF/status/1966530169918616061" title="Twitter" rel="syndication">Twitter</a><a class="social-link u-syndication mastodon" href="https://hachyderm.io/@molly0xfff/115192124739226119" title="Mastodon" rel="syndication">Mastodon</a><a class="social-link u-syndication bluesky" href="https://bsky.app/profile/molly.wiki/post/3lynmedzy522h" title="Bluesky" rel="syndication">Bluesky</a><a class="social-link u-syndication youtube" href="https://www.youtube.com/watch?v=27OMxCS91uM" title="Youtube" rel="syndication">Youtube</a></div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/crypto" title="See all feed posts tagged "crypto"" rel="category tag">crypto</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/crypto_lobby" title="See all feed posts tagged "crypto lobby"" rel="category tag">crypto lobby</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/donald_trump" title="See all feed posts tagged "Donald Trump"" rel="category tag">Donald Trump</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/regulation" title="See all feed posts tagged "regulation"" rel="category tag">regulation</a>.</div></div></footer></article>📝 12 September 2025 at 15:25 - I know …... - Kev Quirknotes/20250912-15252025-09-12T15:30:00.000Z
<p>I know lots of people don't like services like ChatGPT, but I get <em>so much</em> use out of it. It use it to tweak language here and there when needed (among other things). It's great for things like <em>"hey Geeps, I don't like this paragraph, but I can't think of a better way to write it..."</em>.</p>
<div class="email-hidden">
<hr>
<p>Thanks for reading this post via RSS. RSS is great, and you're great for using it. ❤️</p>
<p>
<a href="mailto:72ja@qrk.one?subject=12 September 2025 at 15:25">Reply to this post by email</a> ●
<a href="https://kevquirk.com/guestbook">Sign my guestbook</a>
</p>
</div>
Creating a searchable archive page - James' Coffee Bloghttps://jamesg.blog/2025/09/12/creating-a-searchable-archive-page/2025-09-12T14:54:16.000Z
<p>One of the pages I use most on my website is the <a href="https://editor.jamesg.blog/post">page that lists the titles of all of my blog posts</a>. I made this page for two reasons: (i) for quick reference to all of my recent posts beyond those on my home page, and (ii) so that I can search the page by post title. I often do this if I already know the title of a post or a keyword that will help me find it.</p><p>Whether I am trying to find a blog post I wrote recently or a while ago, my archive page lets me find it.</p><p>I have wanted to write a blog post about this for the longest time because despite having a full-text search engine on my site I still find a lot of utility in searching posts by title with my blog post list page. That is to say: if you are looking for a way to search your site, a good way to start may be to have a page that lists yoru post titles! It's amazing how effective a single list of titles can be as a way to search through your words.</p><p>As a reader of a website, I also love skimming through archive pages to find more blog posts to read. Out in the wild, I have seen archive pages with titles is a common pattern on Bear Blog (maybe this is part of the default template?), which makes navigating many of the sites that use Bear Blog a delight.</p>
Artemis Changelog #7 - James' Coffee Bloghttps://jamesg.blog/2025/09/11/artemis-changelog-7/2025-09-11T22:35:55.000Z
<p><a href="https://artemis.jamesg.blog">Artemis</a>, the calm web reader I maintain, has a few new features. Below is a summary of the features now available to all users.</p><p>Also, I have started a <a href="https://discord.gg/h5zANTaw2V">Discord server for the project</a> in which I can both answer questions and will potentially share some stories of the behind-the-scenes design and engineering that goes in the project. All are welcome.</p><ul><li>You can now set keyword filters that must apply in order for a post to show up in your reader. This is useful if you want to use Artemis to curate information around a particular topic. For example, if you want to follow academic papers that match a specific set of keywords, you can set up an exclusive filter to only see posts that contain one or more keywords of interest. To use this feature, go to your Account Settings, click “Keyword Filters” in the sidebar. If you want to only show posts that contain a keyword, check the new “Do posts need to include this keyword to show up in your reader?” box.</li><li>When you paste an <a href="https://arxiv.org/">Arxiv URL</a> into the Add page, the URL will be transformed into the Arxiv RSS feed URL so you can follow the feed in Artemis.</li><li>Several back-end changes have been made to make the Artemis feed polling process more robust.</li><li>The <a href="https://artemis.jamesg.blog/demo">Artemis demo video</a> now has a transcript.</li><li>Many pages on the Artemis website now have a site footer that links to several important resources, including the <a href="https://artemis.jamesg.blog/privacy">Artemis privacy policy</a>, information on <a href="https://artemis.jamesg.blog/bot">how the Artemis feed fetcher bot works</a>, and <a href="https://artemis.jamesg.blog/acknowledgements">acknowledgements of software and design resources that the project uses</a>.</li><li>A bug that caused password reset emails to not be sent has been fixed.</li></ul><p>If you have any feedback on Artemis, please do let me know! You can email me at readers [at] jamesg [dot] blog. If you would like to try the software, you can sign up with the invite code “coffee”.</p>
This post was written in a notebook - Joel's Log Fileshttps://joelchrono.xyz/blog/this-post-was-written-in-a-notebook2025-09-11T15:30:00.000Z<p>I am not much of a hand-writing guy. I prefer to just type on my computer and call it a day. However, I’ve been taking some notes by hand for other things, and I thought it would be interesting to write a fully analog blogpost on pen and paper.</p>
<p>One of the issues I have with most paper is how big the line-spacing is. I feel like I could write so much more on each page, and it annoys me a little bit. I also have no indication of how many words I have written, I would have to do this more often to get and idea, and I will know once I paste this—I mean, transcribe it—to my typed article (I will upload this as an image as well, just for posterity).</p>
<p>Thinking about it, most of my hand-writing in the past few years has consisted of transcribing spoken words, or from some online article about whatever topic I had homework for.</p>
<p>There were some essays as well, and even a couple book summaries, but nothing I can say were just “written thoughts” has been a thing, that I can remember at least.</p>
<p>I’ve been writing with some no-name pen up until now, and I just asked a friend for another one, and I got a gel pen. So far so good, and it’s much easier to write on.</p>
<p>My hand already hurts at this point, amd I going too fast? is it normal? is my grip hurting me in some way? The reason I am trying this at all, besides the fun of it, is that I really want to get into fountain pens, which many of my friends are fans of.</p>
<p>Still, the slight pain is annoying, and I don’t know if I’m just not used to it anymore since my high-school days (or school in general). Another thing is that I can’t really correct myself without ruining the paper. I am <del>comi</del> (I was gonna say “committing to every word” but then I simply struck through that so maybe I’m not).</p>
<p>But well, I am, once I have written enough words, it is difficult and ugly to just get rid of it all, at least I wouldn’t do it.</p>
<p>Hey, I have written around three pages at this point, my hand hurts but I think it did back in school too, so I just have to get used to it again? or maybe my finger placement is actually wrong (my pingy is bearing a lot of pressure right about now).</p>
<p>Anyways, this has been fun, now I will take a third of the time transcribing it verbatim (maybe I’ll include the typos, or not) and then publishing it!</p>
<p>Let me know what you think about my hand-writing, was it legible? BYE!!!</p>
<p><img src="https://joelchrono.xyz/assets/img/blogs/2025-09-11-handwriting1.jpg" alt="Page 1"/></p>
<p><img src="https://joelchrono.xyz/assets/img/blogs/2025-09-11-handwriting2.jpg" alt="Page 2"/></p>
<p><img src="https://joelchrono.xyz/assets/img/blogs/2025-09-11-handwriting3.jpg" alt="Page 3"/></p>
<h2 id="afterword">Afterword</h2>
<p>I decided to correct any actual typos, but left some clear grammar issues such as “on pen and paper” instead of “with”, in any case, I’m pretty happy with this experiment. The pain is an issue, really, and yes, I was used to it since my school days, but I can’t help but wonder if that is just normal and I should just get over it.</p>
<p>Looking it up, I write with a quadrupod grip, which is unusual as most people use three fingers instead. I don’t think it’s wrong, and I don’t know if I can get used to a new grip at this point, but well, who knows, I’ll just keep trying!</p>
<p>Also, the reason I brought up the “I can’t correct words* thing is because I did quite a bit of hand-writing at university too, but I wasn’t going to just start over after saying “high school” instead. I guess I could have done so but it didn’t feel right, so I’m just clarifying it here.</p>
<p>By the way, I wrote (complained) about <a href="https://joelchrono.xyz/blog/handwritten-homework/">handwritten homework</a> back in the day and wow, it’s one of those cases where I can feel how I’ve changed as a person, but well, times were difficult I guess.</p>
<p>All in all, an interesting experiment, maybe I’ll get a fountain pen, or maybe I’ll just get good regular ballpoint pens, I am not into gel pens just yet, I feel like the don’t last as much, could be just me though. So, what kind of pens do you prefer? Do you write often by hand? Or are you sticking to digital text now?</p>
<p>
<a href="mailto:me@joelchrono.xyz?subject=This post was written in a notebook">Reply to this post via email</a> |
<a href="https://fosstodon.org/@joel/commmentsid">Reply on Fediverse</a>
</p>Designing a new button to visually show and hide alt text - James' Coffee Bloghttps://jamesg.blog/2025/09/11/alt-text-button-design/2025-09-11T13:28:05.000Z
<p>In <a href="https://jamesg.blog/2025/08/17/alt-text-button">Developing an alt text button for images on my website</a>, I wrote about how I made a button for visibly showing and hiding alt text on my website. I enjoy reading alt text. <a href="https://tech.lgbt/@dotjayne/115001457009393204">Alt text is great.</a></p><p>My implementation method used a combination of a HTML checkbox and the CSS <code>:has</code> selector. A <code>div</code> containing the alt text for an image would appear or disappear depending on whether the corresponding checkbox was checked.</p><p>My code had a few limitations. I had to think a lot about how to visually hide the checkbox. Focus styles required a lot of thought and tripped me up a few times as I wrote my code. I also wondered whether a checkbox was the right semantic. In addition, if the CSS didn't load on the page for some reason, the interactivity would be lost. Since writing the blog post, I have wondered: what can I improve?</p><p>I went back to the drawing board with the intent to use the HTML <code>details</code> and <code>summary</code> elements. These elements allow you to show and hide content on a web page natively. With a bit of tinkering, I have a new version of the project, which is <a href="https://github.com/capjamesg/alt-text-button">now in its own open source (MIT-0 licensed) GitHub repository</a>. I have also published the code on a <a href="https://capjamesg.github.io/alt-text-button/">demo web page</a> so you can try the interaction for yourself.</p><p>Here is a demo video showing the new button:</p><video autoplay="" controls="True" loop="" muted="" playsinline="" poster="https://img.spacergif.org/v1/1146x1300/0a/spacer.png" preload="metadata" src="https://editor.jamesg.blog/content/media/2025/09/487687623-670a5b19-0a72-4f80-96db-7870ec32a8c8.mp4" style="background: transparent url('https://editor.jamesg.blog/content/media/2025/09/487687623-670a5b19-0a72-4f80-96db-7870ec32a8c8_thumb.jpg') / cover no-repeat;max-height: 30rem; max-width: 100%;" width="1146"></video><p><em>The button is not yet live on my website, although I hope to move to my new button code soon!</em></p><h2 id="how-the-button-works"><strong>How the button works</strong></h2><p>Below I am going to talk about a few of the styles that make this alt text button work. For all the CSS, refer to the GitHub repository.</p><p>Before styling, I needed a good foundation of semantic HTML. This is the structure upon which my code depends:</p><div class="highlight"><pre><span></span><span class="p"><</span><span class="nt">figure</span><span class="p">></span>
<span class="p"><</span><span class="nt">picture</span><span class="p">></span>
<span class="p"><</span><span class="nt">img</span> <span class="na">alt</span><span class="o">=</span><span class="s">"A supermarket in Berlin with a sign that reads 'freshly made smiles'."</span> <span class="na">loading</span><span class="o">=</span><span class="s">"lazy"</span> <span class="na">src</span><span class="o">=</span><span class="s">"https://jamesg.blog/assets/smiles.avif"</span><span class="p">></span>
<span class="p"></</span><span class="nt">picture</span><span class="p">></span>
<span class="p"><</span><span class="nt">details</span> <span class="na">class</span><span class="o">=</span><span class="s">"alt"</span> <span class="na">aria-label</span><span class="o">=</span><span class="s">"Show or hide the alt text for the image"</span><span class="p">></span>
<span class="p"><</span><span class="nt">summary</span><span class="p">></span>ALT<span class="p"></</span><span class="nt">summary</span><span class="p">></span>
<span class="p"><</span><span class="nt">p</span><span class="p">></span>A supermarket in Berlin with a sign that reads "freshly made smiles".<span class="p"></</span><span class="nt">p</span><span class="p">></span>
<span class="p"></</span><span class="nt">details</span><span class="p">></span>
<span class="p"></</span><span class="nt">figure</span><span class="p">></span>
</pre></div>
<p>By default, the <code>details</code> element is closed. In this state, the <code>ALT</code> button appears in the top left of the image. This is implemented using <code>absolute</code> positioning. The parent <code>figure</code> has a <code>position:relative</code> rule.</p><p>When the details element is opened, the enclosed <code>p</code> tag is displayed. By default, the <code>summary</code> element (which contains the "ALT" label) expands in width when the details element is opened. To get around this, I set the width of the <code>summary</code> to <code>max-content</code>, which ensures that the summary tag stays the same size:</p><div class="highlight"><pre><span></span><span class="nt">figure</span><span class="w"> </span><span class="nt">details</span><span class="o">[</span><span class="nt">open</span><span class="o">]</span><span class="w"> </span><span class="nt">summary</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">width</span><span class="p">:</span><span class="w"> </span><span class="n">max-content</span><span class="p">;</span>
<span class="w"> </span><span class="k">margin-bottom</span><span class="p">:</span><span class="w"> </span><span class="mf">0.25</span><span class="kt">rem</span><span class="p">;</span>
<span class="w"> </span><span class="k">list-style</span><span class="p">:</span><span class="w"> </span><span class="kc">none</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
<p>The CSS makes use of the <code>details[open]</code> selector. This lets me apply styles exclusively to a <code>details</code> element that has been opened by the user. I originally used <code>details:open</code>, but that selector doesn't work in Safari at the time of writing this blog post.</p><p>When the details element is opened, its background is set to <code>transparent</code> and its border is removed:</p><div class="highlight"><pre><span></span><span class="nt">figure</span><span class="w"> </span><span class="nt">details</span><span class="o">[</span><span class="nt">open</span><span class="o">]</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">border</span><span class="p">:</span><span class="w"> </span><span class="kc">none</span><span class="p">;</span>
<span class="w"> </span><span class="k">background-color</span><span class="p">:</span><span class="w"> </span><span class="kc">transparent</span><span class="w"> </span><span class="cp">!important</span><span class="p">;</span>
<span class="w"> </span><span class="k">padding</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>Without setting the background colour to be transparent, the whole space that takes up the <code>details</code> element -- which includes the <code>summary</code> -- would have a white background, whereas I want the button and <code>p</code> to be in their own boxes.</p><p>I style the <code>summary</code> and <code>p</code> tags as their own boxes with this code:</p><div class="highlight"><pre><span></span><span class="nt">figure</span><span class="w"> </span><span class="nt">details</span><span class="o">[</span><span class="nt">open</span><span class="o">]</span><span class="w"> </span><span class="nt">p</span><span class="o">,</span><span class="w"> </span><span class="nt">figure</span><span class="w"> </span><span class="nt">details</span><span class="o">[</span><span class="nt">open</span><span class="o">]</span><span class="w"> </span><span class="nt">summary</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">border-radius</span><span class="p">:</span><span class="w"> </span><span class="nf">var</span><span class="p">(</span><span class="nv">--border-radius</span><span class="p">);</span>
<span class="w"> </span><span class="k">border</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="kt">px</span><span class="w"> </span><span class="kc">solid</span><span class="w"> </span><span class="mh">#ccc</span><span class="p">;</span>
<span class="w"> </span><span class="k">padding</span><span class="p">:</span><span class="w"> </span><span class="mf">0.25</span><span class="kt">rem</span><span class="w"> </span><span class="mf">0.5</span><span class="kt">rem</span><span class="p">;</span>
<span class="w"> </span><span class="k">color</span><span class="p">:</span><span class="w"> </span><span class="kc">black</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>In designing this system, I wanted to make sure it was accessible. A big part of this was ensuring the system works well with a keyboard. The <code>details</code> element is already accessible (yay for semantic HTML!) but I wanted to add my own more visible focus styles. I like having a black background and yellow text: a colour combination that contrasts well and also stands out.</p><p>When a <code>summary</code> is focused, its parent <code>details</code> is assigned a black background and the summary text is set to yellow. This makes the keyboard focus clear as a user navigates through the page.</p><h2 id="conclusion,-and-what's-next"><strong>Conclusion, and what's next</strong></h2><p>With my new code, I am using the details and summary element, which I think is more semantically appropriate. I have also moved the code into an open source repository.</p><p>If you have ideas on how my code can be improved or made more concise, please file a contribution on GitHub, or email me at readers [at] jamesg [dot] blog.</p><p>The code is licensed under an MIT-0 license, which gives you the right to use, copy, modify, publish, and distribute the software as you want. I chose this license because I want this project to be as easy for other people to include in their websites as possible.</p><p>If you end up using the alt text button, let me know!</p>
Reasonably accurate, privacy conscious, cookieless, visitor tracking for WordPress - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=631582025-09-11T11:34:39.000Z<p>I am vain. I like to know which of my blog posts have "done numbers". I get a little thrill knowing that an old post I wrote has been read by someone in a land I've never visited. I'm curious and want to know if a newsletter has linked to me.</p>
<p>At the same time, I don't want to know <em>too</em> much about people. I don't want to stalk them around the web. I refuse to care how long they spend with me. I can't be bothered setting up a foolproof system that captures 100% accurate information.</p>
<p>After trying several analytics plugins for WordPress, I've decided to have a go at writing my own<sup id="fnref:learn"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#fn:learn" class="footnote-ref" title="I enjoy learning. If you're about to say "Why not just install…" then you've missed the point. I like understanding how things work, I get joy from discovering some new function, my brain feels happy…" role="doc-noteref">0</a></sup>.</p>
<p>Before embarking on this, please do read "<a href="https://blog.yossarian.net/2023/12/24/You-dont-need-analytics-on-your-blog">You Don't Need Analytics on Your Blog</a>" and the slightly more provocative "<a href="https://www.thisdaysportion.com/posts/contra-analytics/">You do not need “analytics” for your blog because you are neither a military surveillance unit nor a commodity trading company</a>". Both give excellent examples of why this is at best foolish and at worse injurious. Proceed with caution in your heart.</p>
<h2 id="background"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#background" class="heading-link">Background</a></h2>
<p>As a consequence of the way the web works, every time you click on a link the website's owner gets the following pieces of information.</p>
<ul>
<li>The time you clicked,</li>
<li>The page you visited,</li>
<li>The name of the web browser you use,</li>
<li>The URl of the page which you clicked to get here,</li>
<li>The IP address your computer has.</li>
</ul>
<p>There are a few other things sent along but they're not interesting to me.</p>
<p>Using that information, I can construct a reasonably accurate view of how many times a post has been viewed and how many people viewed it.</p>
<h2 id="defining-a-page-view"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#defining-a-page-view" class="heading-link">Defining a page view</a></h2>
<p>If a web page is loaded, that counts as a view. I'm not going to track whether the user stayed for more than 30 seconds or closed their browser in disgust after reading the headline. If the page is loaded, that's a view.</p>
<p>But what if one person repeatedly hits refresh on the same post? To deal with that, I'll need a concept of a visitor.</p>
<h2 id="defining-a-visitor"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#defining-a-visitor" class="heading-link">Defining a visitor</a></h2>
<p>The "normal" way of doing things is to stick a cookie in the user's browser and track them that way. I can't be bothered with that. And, besides, it doesn't account for a person reading on their laptop and then moving to their phone.</p>
<p>So I'm going to use a proxy by creating a cryptographic hash of the visitor's IP address and the browser's User Agent string.</p>
<p>Of course, a household might have one IP address and multiple people with the same phone. But, equally, one person might rove over several WiFi networks in the course of one browsing session, getting a different IP each time.</p>
<p>The aim is to be <em>reasonably</em> accurate.</p>
<p>Hashing the contents means I don't need to store the user's IP address. Once hashed, the information becomes a string like <code>db050e7b853e5856</code> which is functionally impossible to de-hash back to an IP address & UA string<sup id="fnref:orisit"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#fn:orisit" class="footnote-ref" title="Or is it? There are 4 billion IPv4 addresses - although slightly fewer in actual use. Creating a rainbow table with 4 billion rows is possible. But there are an almost infinite variety of User Agent…" role="doc-noteref">1</a></sup>.</p>
<p>This also means that I can redefine the concept of a page view. If the same visitor refreshed the page multiple times, it will only count as a single visit.</p>
<p>I'll reset the counter at midnight in my local timezone. If someone visits just before midnight and then just after, it'll count as two visits. Oh well.</p>
<h2 id="where-did-they-come-from"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#where-did-they-come-from" class="heading-link">Where did they come from?</a></h2>
<p>Generally speaking, there are two ways that visitors share their referrer. One is the "referer" header (yes, it is misspelled). It contains a URl of the referring site or application. For example, if someone clicked from a search result it might say <code>https://yahoo.com</code>.</p>
<p>The other way is using "Urchin Tracking Module" query strings. At the end of the URl they visit, they might append something like <code>?utm_source=alices-newsletter</code>.</p>
<p>Some sites, like Reddit, might use multiple subdomains - <code>old.reddit.com</code> or <code>out.reddit.com</code> - so some deduplication may be necessary.</p>
<h2 id="where-in-the-world-are-they"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#where-in-the-world-are-they" class="heading-link">Where in the world are they?</a></h2>
<p>A user's IP address is <em>somewhat</em> accurate method of detecting their location. Yes, users could be proxying through a VPN or using a SIM card from a foreign country. But this isn't an exercise in precise tracking. Rough and ready is fine.</p>
<p>There are a variety of <a href="https://mailfud.org/geoip-legacy/">GeoIP Databases</a> which are updated semi-regularly. I'm only interested in the country of origin, I don't care about finer resolution than that.</p>
<p>Again, the aim isn't precise targetting. I'd just like to know that people in Sudan ever read my blog posts.</p>
<h2 id="what-else-could-we-use"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#what-else-could-we-use" class="heading-link">What else could we use?</a></h2>
<p>It <em>might</em> be nice to know if someone is using a small-screen or large device. But my CSS is responsive, so I don't care.</p>
<p>Similarly, their Internet connection speed might be available. But, again, I try to optimise things so that isn't necessary to know.</p>
<p>Do I need to know if someone speaks Hungarian? No. There's nothing useful I can do with that information.</p>
<p>Could I extract their operating system, device, and browser from their User-Agent? I guess. Would I use the information that X% of my readers use Firefox on Linux? Doubtful!</p>
<h2 id="collect-the-information"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#collect-the-information" class="heading-link">Collect the information</a></h2>
<p>There are two main methods of collecting these data.</p>
<p>First is a "no JavaScript" solution. This tells the browser to request an image which has a query string to send along the details of the page requested.</p>
<pre><code class="language-php"><noscript>
<img src="/tracking.php?ID=<?php echo $postID ?>" alt="" width=1 height=1 class=hidden>
</noscript>
</code></pre>
<p>The downside is that there's no way to capture referer information. If each page were dynamically generated, I could grab it from PHP's <code>$_SERVER</code> superglobal. But my website is heavily cached, so that isn't possible.</p>
<p>It <em>is</em> possible to use JavaScript to dynamically send the information for collection:</p>
<pre><code class="language-js">let formData = new FormData();
formData.append("HTTP_REFERER", document.referrer);
formData.append("ID", <?php echo $postID ?>);
fetch("/tracking.php", {
method: "POST",
body: formData,
});
</code></pre>
<p>This approach has three distinct advantages.</p>
<ol>
<li>It works whether the user has JS enabled or not.</li>
<li>Repeated requests for the same page will usually reload the image from cache, so won't double-count.</li>
<li>It doesn't count hits from bots. They typically don't execute JavaScript or don't request images.</li>
</ol>
<h2 id="bot-detection"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#bot-detection" class="heading-link">Bot Detection</a></h2>
<p>Not all traffic originates from humans. There are lots of bots which crawl the web. Some are useful - like search engines building up a map. Others are harmful - like AI agents aggressively scraping content to plagiarise.</p>
<p>There are <a href="https://www.humansecurity.com/learn/blog/crawlers-list-known-bots-guide/">lots of identifiable bots</a> out there - and more which obfuscate themselves. There are some, like <a href="https://github.com/GoogleChrome/lighthouse/pull/14384">Lighthouse</a> which cloak themselves.</p>
<p>I'm not trying to eliminate everything which <em>could</em> be a bot. I am trying for <em>reasonably</em> accurate. So I eliminate any User-Agent which contains:</p>
<p><code>"/bot|crawl|spider|seo|lighthouse|facebookexternalhit|preview|HeadlessChrome/i"</code></p>
<p>There are some <a href="https://github.com/fabiomb/is_bot">big lists of bots</a> you can use - but they don't seem to trigger my analytics because they aren't requesting the images or executing the JS.</p>
<h2 id="what-bits-of-the-site-to-measure"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#what-bits-of-the-site-to-measure" class="heading-link">What bits of the site to measure?</a></h2>
<p>I only care about how many visitors my posts and pages get. I don't need to know if someone visited a tag page, or scrolled back to page 100 of posts from 2019. Those sorts of deep pages are usually only accessed by bots anyway.</p>
<p>I also don't want to count visits from me, myself, and I.</p>
<p>So the tracking is only inserted on single pages which are viewed by non-admins:</p>
<pre><code class="language-php">if ( is_singular() && !current_user_can( "edit_posts" ) ) {
…
}
</code></pre>
<h2 id="oddities"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#oddities" class="heading-link">Oddities</a></h2>
<p>Sometimes, the URl requested will look something like: <code>https://shkspr-mobi.translate.goog</code> - that just means Google has translated it.</p>
<p>Sometimes, the referer will look something like: <code>android-app://com.google.android.gm/</code> - that just means they clicked from an Android app.</p>
<p>Sometimes, the URl requested will include a fragment or a query string - they can be ignored.</p>
<p>Sometimes, the <code>utm_</code> will contain all sorts of weird stuff. It isn't always possible to pull out exactly where it has come from.</p>
<p>Sometimes, the referer and <code>utm_</code> will disagree. Ah well, never mind.</p>
<p>Sometimes, RSS views are counted and sometimes not. Perhaps I should fix that?</p>
<p>Sometimes, users block trackers or use a text-only browser. That's fine, they can keep their secrets.</p>
<h2 id="saving-the-data"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#saving-the-data" class="heading-link">Saving the data</a></h2>
<p>I started this by just shoving what I collected into a CSV.</p>
<pre><code class="language-php">// Write the CSV.
$line = [date("c"), $ID, $UA, $referer, $domain, $country, $user];
// Date-based filename.
$filename = "log-" . date("Y-m-d") . ".csv";
// Append mode.
$handle = fopen( $filename, "a" );
fputcsv( $handle, $line );
fclose( $handle );
</code></pre>
<p>Nothing fancy. Something easily grepable with the ability to query it in more detail if I need. At the number of hits that my site gets, it is less than 1MB per day.</p>
<p>I've since moved it into a single MySQL table. That might not be sustainable with hundreds of thousands of rows. But that's tomorrow's problem.</p>
<h2 id="accuracy"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#accuracy" class="heading-link">Accuracy</a></h2>
<p>I've been running this for a couple of days - simultaneously with my other, more professional, stats plugin. It is within 5% accuracy. It appears to <em>slightly</em> exaggerate the number of visitors and undercount my page-views. That's good enough for my purposes and probably good for my ego!</p>
<h2 id="putting-it-all-together"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#putting-it-all-together" class="heading-link">Putting it all together</a></h2>
<p>You can take a look at all the code <a href="https://gitlab.com/edent/blog-theme/">on my GitLab repo</a>.</p>
<h2 id="what-does-it-look-like"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#what-does-it-look-like" class="heading-link">What does it look like?</a></h2>
<p>If you've made it this far, you can have a little pictorial treat! Aren't you lucky?</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/09/stats-view.webp" alt="Three tables. One showing referers with colourful favicons. Another countries with colourful emoji flags. One a list of pages and views." width="2450" height="1400" class="aligncenter size-full wp-image-63260"/>
<h2 id="whats-next"><a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#whats-next" class="heading-link">What's next?</a></h2>
<p>For now, a simple table structure is fine. I've shoved it in a basic database. Sure, I don't have any indexes or fancy stuff like that. But modern computers are pretty fast.</p>
<p>Eventually I'll need to create some new tables which will consolidate the data. Perhaps a table for individual posts, using date and country? Or maybe referer? I'll have to see.</p>
<p>I also need a way to get historic data into it. I've blog stats going back to 2009 which I am anxious not to lose.</p>
<p>And, yeah, I'll need a better front-end than manually running SQL queries.</p>
<p>Above all, I want to keep it simple enough that my puny mortal brain can understand it after several years of not touching anything. I want to build something which can run without constant maintenance.</p>
<p>Remember, this is only an exercise in self-learning, self-hosting, and self-respect.</p>
<div class="footnotes" role="doc-endnotes">
<hr/>
<ol start="0">
<li id="fn:learn" role="doc-endnote">
<p>I enjoy learning. If you're about to say "Why not just install…" then you've missed the point. I like understanding how things work, I get joy from discovering some new function, my brain feels happy when it is working on a problem. I don't want to just click install, hit next a few times, and fiddle with a few options. <a href="https://shkspr.mobi/blog/2020/12/build-dont-buy/">I've written more about my philosophy here</a>. <a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#fnref:learn" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:orisit" role="doc-endnote">
<p>Or is it? There are 4 billion IPv4 addresses - although slightly fewer in actual use. Creating a rainbow table with 4 billion rows is possible. But there are an almost infinite variety of User Agent strings. It is probably possible to create a rainbow table of, for example, the 10 most popular UAs, concatenate them with every possible IP address, and then see which hashes to <code>65fef01fef257963</code>. But even then, what would that get an attacker? Knowing that the most popular model of iPhone is on a mobile network's IP range isn't exactly private information. <a href="https://shkspr.mobi/blog/2025/09/reasonably-accurate-privacy-conscious-cookieless-visitor-tracking-for-wordpress/#fnref:orisit" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
Collaborative web weaving - James' Coffee Bloghttps://jamesg.blog/2025/09/11/collaborative-web-weaving-coding/2025-09-11T09:18:45.000Z
<p>At this week’s Homebrew Website Club, I was introduced to the <a href="https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare">Live Share</a> extension developed by Microsoft for Visual Studio Code. The extension lets you start a collaborative editing session to which you can invite others.</p><p>Excited to learn that this extension exists, and curious to see what collaborative features were available, I installed it and started a session from a folder I had open with a few HTML files. The extension gave me a link that people could use to join my live sharing session from their Visual Studio Code interfaces. I shared the link.</p><p>Five of us started collaborating in real-time on a web page.</p><p>Using a HTML file I had already started, we made our own changes. Without direction, everyone added whatever came to mind. One person added an animation that changed the font on the page every few seconds. From that experiment, we all learned that you can use CSS keyframes to create animations to change fonts. Another collaborator wrote a story. Someone put the whole page into a <code>marquee</code> tag. Someone made a strobing “rainbow” mode that changed the background of various elements.</p><p>Here is a screenshot from part of our web page:</p><img alt="" class="kg-image" loading="lazy" sizes="(min-width: 720px) 720px" src="https://editor.jamesg.blog/content/images/2025/09/live-1.png" srcset="https://editor.jamesg.blog/content/images/size/w600/2025/09/live-1.png 600w, https://editor.jamesg.blog/content/images/size/w1000/2025/09/live-1.png 1000w, https://editor.jamesg.blog/content/images/size/w1600/2025/09/live-1.png 1600w, https://editor.jamesg.blog/content/images/2025/09/live-1.png 2356w"/><p>The resulting page was a bit chaotic, but it was <em>so fun</em> to make. We had no prompt. We, like musicians, riffed. We played. As <a href="https://ragt.ag">Angelo</a>, who actively experiments with collaboration on his website, would say: <em>we’re doing it live.</em></p><p>In our HTML document, we wrote code and stories. We asked how each other’s code worked. We debugged code. We made something that wouldn’t have existed without the collaborative session.</p><p>Joe, one of the people in the session, published the code from our web page which includes attribution and a button to toggle the “rainbow” mode (which is off by default, and should only be toggled if you are not sensitive to strobing light effects). <a href="https://smorgasborg.artlung.com/hwc-2025-09-10-eu/" rel="noreferrer">You can view the page we made on Joe's website.</a> <a href="https://jamesg.blog/hwc-demo.html" rel="noreferrer">You can also view my archive on my website.</a></p><p>With the Live Share extension, the cursor position of every author in the document was visible to everyone else. This meant we could follow along as everyone wrote in the document. There was also a feature to follow someone as they code so your view changes as they navigate the code. I couldn’t figure out how to toggle this; it was on by default for me. This feature would be especially useful for instructional discussions where someone walks through a codebase before another collaborator contributes.</p><p>There was also a chat interface that showed when people joined or left the session, and in which we could chat. This was a useful auxiliary space to communicate (read: check if everything is working, then tell jokes) while we wrote code.</p><p>One limitation with the setup is that we think it required participants to have Visual Studio Code installed on their computer. The web version didn’t seem to support the collaborative extension (although maybe it does and we didn’t figure it out). I would love to see a web-native version of this technology where I could create a space to code, share a link, and invite others to contribute. Like Etherpad, but for code. It would be even better if I could self-host this and invite people with a password.</p><p>I would love to author more HTML documents in real-time! Making HTML documents with friends feels like it is truly of the spirit of the web: fun, playful, and with an output that you can share.</p>
22.00.0131 Your computer is your workshop - Johnny.Decimalhttps://johnnydecimal.com/22.00.0131/2025-09-11T04:17:13.000Z<h1 id="your-computer-is-your-workshop">Your computer is your workshop</h1>
<p>A century ago, you were an old-timer. You made stuff in your workshop.</p>
<p>It took a while to set up a new job. You had to figure out which tools you need. Maybe sharpen your plane, oil your strop. Clear the bench, sweep. Check that you have enough birch, go to the store, pick up some more two-by-four and a bag of nails. Lay it all out. Have a look at it. Is the plan good? Do we know what we're making?</p>
<p>And <em>now</em> you can start.</p>
<p>Later, the new table finished, this all needs to be tidied away. Ready for the next job. You look over your shoulder as you lock the workshop. Neat. Calm.</p>
<p>You can't wait to work again tomorrow.</p>
<h2 id="is-this-how-you-feel">Is this how you feel?</h2>
<p>Computers allow us to do any number of things 'at once'. Of course you can only ever do one thing at a time, but it's nice to pretend.</p>
<p>When was the last time you <em>prepared</em> the next piece of work? Closed all of your old windows. Opened up a new view on your files and found the place you needed to be. Opened the note you'll be using in a new, clean window. Focused your task manager on the task at hand.</p>
<p><strong>Your computer is your workshop</strong>. If you want to work well, you need to slow down. You need to think more, and do less.</p>
<p>What you do will be better, and you will enjoy it more.</p>
<h1 id="tip-use-your-task-manager">Tip: use your task manager</h1>
<p>Here's what I've started doing. I use <a href="https://culturedcode.com/">Things</a> but any task manager will work.</p>
<ol>
<li>Create a new window. In Things, <strong>File > New Things Window</strong> or <strong>Ctrl+Cmd+N</strong>. Move it up in to the corner, and make it small. Think of it like a tiny dashboard.</li>
<li>Highlight the single thing you're working on now. Here, I'm using a tag <code>🫵🏼 focus</code> on the task, then viewing that tag in this window by typing <strong>focus</strong>.</li>
<li>That's it. Remember to be doing what this window says. Don't do anything else until you've finished, and cleaned up, and prepared the next job. Simple.</li>
</ol>
<picture class="JDImage6 astro-3zw7efbj"> <source media="(prefers-color-scheme: light) and (min-width: 600px)" srcset="/img/v6/22.00.0131A-Things--0_original-light-cx-1528x1126.png" class="astro-3zw7efbj"> <source media="(prefers-color-scheme: dark) and (min-width: 600px)" srcset="/img/v6/22.00.0131A-Things--0_original-dark-cx-1528x1126.png" class="astro-3zw7efbj"> <source media="(prefers-color-scheme: light) and (max-width: 599px)" srcset="/img/v6/22.00.0131A-Things--0_original-light-cx-1528x1126.png" class="astro-3zw7efbj"> <source media="(prefers-color-scheme: dark) and (max-width: 599px)" srcset="/img/v6/22.00.0131A-Things--0_original-dark-cx-1528x1126.png" class="astro-3zw7efbj"> <img alt="Screenshot of this Things window up at the top-left of my screen. It shows my blog post checklist; the thing I'm working on." class=" no-caption astro-3zw7efbj" loading="lazy" src="https://johnnydecimal.com/img/v6/22.00.0131A-Things--0_original-light-cx-1528x1126.png" width="764" height="563"> </picture>
<h3 id="more-on-this-in-the-upcoming-jdu-course">More on this in the upcoming JDU course</h3>
<p>I'm figuring this out as part of the next <a href="https://johnnydecimal.com/14.02/">JDU</a> course: <strong>Task & Project Management using the Johnny.Decimal system</strong>. <a href="https://list.johnnydecimal.com/subscription/form">Sign up to the mailing list</a> for updates.</p>
<hr>
<p><em>100% human. 0% AI. Always.</em></p>Note published on September 11, 2025 at 4:07 AM UTC - Molly White's activity feed68c24ae9af8e0043c4ac1cb62025-09-11T04:07:05.000Z<article><div class="entry h-entry hentry"><header></header><div class="content e-content"><p>it's like when you miss a cool number on the odometer</p><div class="media-wrapper"><a href="https://storage.mollywhite.net/micro/1056dd58f5755f269d15_cool-edits.png" data-fslightbox=b6827126254d56d607d1><img src="https://storage.mollywhite.net/micro/1056dd58f5755f269d15_cool-edits.png" alt="Screenshot: User contributions for GorillaWarfare A user with 123,475 edits. Account created on 28 July 2007." /></a></div><p>1,111,092 more to go, i guess!</p></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp-block"><div class="timestamp">Posted: <a href="https://www.mollywhite.net/micro/entry/202509110004"><time class="dt-published" datetime="2025-09-11T04:07:05+00:00" title="September 11, 2025 at 4:07 AM UTC">September 11, 2025 at 4:07 AM UTC</time>. </a></div></div><div class="social-links"> <span> Also posted to: </span><a class="social-link u-syndication twitter" href="https://twitter.com/molly0xFFF/status/1965990464114302977" title="Twitter" rel="syndication">Twitter, </a><a class="social-link u-syndication mastodon" href="https://hachyderm.io/@molly0xfff/115183689993300361" title="Mastodon" rel="syndication">Mastodon, </a><a class="social-link u-syndication bluesky" href="https://bsky.app/profile/molly.wiki/post/3lyjupuosoe2t" 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>30 collaborative things you can do on the web - James' Coffee Bloghttps://jamesg.blog/2025/09/10/collaborative-web-activities/2025-09-10T21:33:45.000Z
<p>In <a href="https://jamesg.blog/2024/02/19/personal-website-ideas">100 things you can do on your personal website</a>, I shared ideas for what you can do with your website. Most of them were ideas that can be worked on yourself. With that said, I find myself increasingly delighted by the collaborative spirit of the web.</p><p>Indeed, one of the wonders of the web is that we can make something that we can share with others. We can author a blog post – whether a story, a poem, a tutorial – and publish it for people to read. The post may inspire someone to write. We can make websites together. We can build wikis. When we share a web page, someone might ask “how does that work?” and peek under the source code and learn a new skill.</p><p>This has me thinking: what can we do on a website that involves both our selves and someone else? With that question in mind, I have made a list of 30 activities you can do collaboratively on the web:</p><ol><li>Help a friend create their first website! There are many indie tools out there that are approachable. <a href="https://omg.lol">omg.lol</a> looks especially wonderful.</li><li>Write a blog post, a poem, a story, or something else with someone else in real-time that you can publish on the web if you want. You could create a Google Doc or an Etherpad or use another tool and write a blog post. You can use any writing prompt you like. One fun anchor for choosing a prompt is something open-ended. For example, I have written collaboratively about the topic of gardening. This is something we both knew we could find some angle to write about. If we got stuck, we could ask each other for help!</li><li>Write a blog post asynchronously with someone, with a writing prompt. For example, a friend and I each suggested paintings for each other to write about. We each wrote on our own time, then combined the results and published them on each other’s blogs.</li><li>Create a list of links that are relevant to something you and your collaborator know a lot about.</li><li>Start a blank HTML document and work on it with a friend in person.</li><li>Help a friend add a feature they want to add to their website.</li><li>Use real-time collaboration software like the <a href="https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare" rel="noreferrer">Live Share extension in Visual Studio Code</a> to collaborate with multiple people on the same HTML document. Make a web page in real time online!</li><li>Draw a design for a web page on paper with a friend. Discuss how you might build it.</li><li>Not in the same room as a friend? Use a virtual white boarding tool to scaffold a web page.</li><li>Create cut-out versions of HTML elements and assemble a page with a friend on a table or the floor.</li><li>Create a “mashup” post where you and your collaborator both take excerpts from things you have already written and combine them together.</li><li>Make a photo gallery web page that lists photos. Maybe you can take turns to each pick a photo.</li><li>Invite a friend to contribute a post to your blog. Maybe the post could be about a theme you have explored on your website in the past.</li><li>Make a web page just for you and your friend that you don’t intend to share with others. Let the knowledge that the web page is just for you encourage you to make whatever you want!</li><li>Create a fan site for an interest you have in common with your friend.</li><li>Contribute to a community wiki!</li><li>Create a website for a community you are in, with the community. For example, if you participate in a club like a zine library, you could ask if you could all design and make a website for the club together.</li><li>Start a collaborative blog where multiple friends can contribute to the blog. <em>See also: </em><a href="https://thehistoryoftheweb.com/do-blogs-need-to-be-so-lonely/"><em>Do blogs need to be so lonely?</em></a></li><li>Participate in a <a href="https://indieweb.org/blog_carnival">blog carnival</a>, like the <a href="https://indieweb.org/IndieWeb_Carnival">IndieWeb Carnival</a> or the IndieWeb Movie Club. (Or start one for a community that you are in! Swiftie blog carnival, anyone? CSS Carnival?)</li><li>Ask a friend to review a draft of a blog post that you think they would have insights on.</li><li>When a friend says something you’d love to read more about, ask if they would want to write a blog post on the topic!</li><li>Study HTML and CSS with a friend. <a href="https://indieweb.org/Front_End_Study_Hall">Front-End Study Hall</a> is a good place to learn and ask questions about something you want to build with HTML/CSS that you don’t know how to build or want to discuss.</li><li>Choose a lesser-known HTML element. Ask a friend to try to use it in their next web page.</li><li>Choose a CSS rule or technique. Ask a friend to try to use it in their next web page. Share a link that would be helpful for them as they get started.</li><li>When they happen, <a href="https://html.energy/html-day/2025/">participate in HTML day</a>. Spend time after the event looking at what others made!</li><li>Participate in a <a href="https://32bit.cafe/updates/">32-Bit Cafe Code Jam</a>, where a prompt is chosen around which people are invited to make a web page. At the end of the code jam, everyone’s pages are grouped onto a single web page.</li><li>Start an interview series! I used to interview <a href="https://jamesg.blog/coffee-interviews">Scottish coffee professionals</a> and <a href="https://jamesg.blog/technical-writing-interviews">technical writers</a> on this blog.</li><li>Join a web weaving meetup like the <a href="https://discourse.32bit.cafe/t/web-weaving-workshop-9-july/3075">32-Bit Cafe’s Webweaving Workshops</a> (join the Discord to stay up to date) or an <a href="https://events.indieweb.org">IndieWeb</a> meetup. In both meet-ups, you can listen to cool demos, share what you’re working on, and ask questions about the web!</li><li>Submit an entry to a magazine that publishes on the web, like the <a href="https://goodinternetmagazine.com">Good Internet Magazine</a>.</li><li>Make a web page that others can contribute to. For example, you could make a web page that lists URLs on a specific topic, and have a form that lets other people submit a link for consideration. <a href="https://url.town/">url.town</a> is a great example. I would love an “indie web sticker club” site to exist where people who make stickers related to the web can share them with others, with links to purchase stickers.</li><li>Ask a friend to prepare some questions for you to answer on your website.</li><li>Tell a friend that you’re happy to review one of their blog posts if they would like feedback or a proof read.</li><li>Say thank you to someone whose blog post you enjoyed or whose website you appreciate!</li></ol><p>Wait, that’s 31 ideas? Unlike in my first <a href="https://jamesg.blog/2024/02/19/personal-website-ideas">website ideas post</a>, I have <em>exceeded</em> the number of ideas! Well, almost. I started out wanting to write 100 ideas, but I think I need more time to get to that number. I don’t have 100 ideas that fit that category yet, and I don’t want to push myself. I want my list to include either things I have done or that excite me and that I may want to do soon. I need to play more with friends on the web. I need – and want – to experiment more.</p><p>Do you have an idea that involves making web pages with friends? I encourage you to bring the idea to fruition! Reach out to your friend or community or family and make something. It doesn’t have to be perfect. It doesn’t have to be polished. It doesn't have to be complete. The most important thing is that you made it with someone. Indeed, some of the most fun things I have made on the web have started with a friend and the question “does the <code>marquee</code> tag still work?”</p><p>There are so many things you can do on the web! I hope the list above encourages you to think about things you can make with others. If you make something, let me know via email at readers [at] jamesg [dot] blog! And if you have more ideas, share them on your website!</p>
<!--kg-card-begin: html-->
<a class="u-syndication" href="https://news.indieweb.org/en">Also posted on IndieNews.</a>
<!--kg-card-end: html-->