<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/atom.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>philwilson.org</title>
    <link rel="self" type="application/atom+xml" href="https://philwilson.org/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://philwilson.org/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2025-10-22T20:15:34+00:00</updated>
    <id>https://philwilson.org/atom.xml</id>
    <entry xml:lang="en">
        <title>Planning is a superpower</title>
        <published>2025-10-22T20:15:34+00:00</published>
        <updated>2025-10-22T20:15:34+00:00</updated>
        
        <author>
          <name>Phil Wilson</name>
        </author>
        <link rel="alternate" type="text/html" href="https://philwilson.org/blog/2025/10/planning-is-a-superpower/"/>
        <id>https://philwilson.org/blog/2025/10/planning-is-a-superpower/</id>
        <category scheme="https://philwilson.org/blog" term="management" />
          <category scheme="https://philwilson.org/blog" term="planning" />
          <category scheme="https://philwilson.org/blog" term="roadmaps" />
          <content type="html" xml:base="https://philwilson.org/blog/2025/10/planning-is-a-superpower/">&lt;p&gt;It has taken me many years to recognise that one of the main differences between me and many others in the software development world, and part of what makes me good at software engineering management, is that I don&#x27;t just look at the piece of work in front of me, but also the one behind that (and beyond that, too).&lt;&#x2F;p&gt;
&lt;p&gt;I have previously heard several people in software engineering (and adjacent) roles say that roadmaps are only for product managers.&lt;&#x2F;p&gt;
&lt;p&gt;I think the opposite is true. An engineering manager can&#x27;t treat the roadmap of work as someone else&#x27;s problem. This is a hard thing to grasp for a freshly promoted developer who has been used to having this kind of thing dealt with for them.&lt;&#x2F;p&gt;
&lt;p&gt;At the team-scale, developers are used to:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Talking with the product team about what their priorities are&lt;&#x2F;li&gt;
&lt;li&gt;Building and prioritising the backlog accordingly&lt;&#x2F;li&gt;
&lt;li&gt;Estimating the work&lt;&#x2F;li&gt;
&lt;li&gt;Taking that work through to completion&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;What they don&#x27;t typically do is have a wider view on what that estimate means for the broader product timeline. A Product or Delivery manager will take care of that for them, and the only time an estimate might come up again is in a sprint retro that reviews velocity predictions (although I&#x27;ve seen very few of these).&lt;&#x2F;p&gt;
&lt;p&gt;But as a manager it&#x27;s important to be realistic about what is achievable in what kind of timeframe, what your margin of error is, and what the impact of that error might be.&lt;&#x2F;p&gt;
&lt;p&gt;If a task has been broken down to be deliverable inside of a week then you might accrue a day&#x27;s delay (and who knows, it might even be on time or early!) and that&#x27;s an off-by-one error which doesn&#x27;t seem too bad - but it&#x27;s also easy to see that the equivalent 20% error margin on a piece of much longer work (or a greater number of pieces) is a real problem.&lt;&#x2F;p&gt;
&lt;p&gt;This is part of why developers are generally so bad at planning for high-level, unrefined, quarterly deliveries. Ok, we&#x27;ve made a prediction for what we can do in this 12-week period, but if we overrun that by 20% when something is well-understood then we&#x27;re suddenly at over 14 weeks of work and whilst this might not be a problem inside of a delivery team (&quot;just an extra sprint to wrap things up&quot;), it certainly is once you realise that not only does your next quarter now only contains 10 weeks&#x27; worth of developer time, but this compounds over the rest of the year and you&#x27;ve also lost your aligned planning between different streams of work.&lt;&#x2F;p&gt;
&lt;p&gt;So, rather than focus on why an estimate might be out by a fifth in the first place, it seems that the more valuable skill for a manager is being able to understand why that matters - to look beyond that one team&#x27;s needs and understand why the impact of that delay might be important to the bigger picture, and to be able to come up with ways of either communicating about it proactively, mitigating it or choosing to not start the work in the first place.&lt;&#x2F;p&gt;
&lt;p&gt;I am happy for a product manager to have a list of features they want, ideally in some prioritised order, but it should be the engineering teams owning and driving the roadmap for delivery of those features. And most importantly they should also be accountable for it.&lt;&#x2F;p&gt;
&lt;p&gt;In many places I&#x27;ve worked the engineering leads have been quite happy for delivery or product managers to take accountability for overall delivery - after all, when things are going well it means they get the credit! - but as a result of ongoing misalignment over the roadmap the relationships sour over time, trust between the different professions dissolves and there needs to be a periodic clearing of the figurative board whilst everything is reset.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s only by being accountable and deeply involved in the roadmap that engineering leads get better at planning, improve their communication and management skills and are able to build up high levels of trust in the other management professions around them.&lt;&#x2F;p&gt;
&lt;p&gt;The sooner managers treat planning with the same rigour they give to code and architecture, the stronger and more trusted their teams will become.&lt;&#x2F;p&gt;
&lt;p&gt;Planning isn’t bureaucracy - it’s the engineering of time.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>72 seasons on the TRMNL</title>
        <published>2025-06-24T17:58:58+00:00</published>
        <updated>2025-06-24T17:58:58+00:00</updated>
        
        <author>
          <name>Phil Wilson</name>
        </author>
        <link rel="alternate" type="text/html" href="https://philwilson.org/blog/2025/06/72-seasons-on-the-trmnl/"/>
        <id>https://philwilson.org/blog/2025/06/72-seasons-on-the-trmnl/</id>
        <category scheme="https://philwilson.org/blog" term="trmnl" />
          <category scheme="https://philwilson.org/blog" term="eink" />
          <category scheme="https://philwilson.org/blog" term="japan" />
          <category scheme="https://philwilson.org/blog" term="72seasons" />
          <content type="html" xml:base="https://philwilson.org/blog/2025/06/72-seasons-on-the-trmnl/">&lt;p&gt;The traditional Japanese Calendar has&lt;a href=&quot;https:&#x2F;&#x2F;www.kanpai-japan.com&#x2F;travel-guide&#x2F;koyomi-72-seasons&quot;&gt; 72 seasons in a year, each made up of a handful of days&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I have always found these to be a very calming way of reminding myself to look around and observe the changes in nature as the year progresses.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve written a plug-in for &lt;a href=&quot;https:&#x2F;&#x2F;usetrmnl.com&quot;&gt;the TRMNL device&lt;&#x2F;a&gt; that shows you which of these seasons it currently is.&lt;&#x2F;p&gt;
&lt;p&gt;It looks like this:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;..&#x2F;trmnl-72-seasons.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;TRMNL plugins can connect to a server to fetch data, but there&#x27;s no server involved here - this is just some static data and a rendering template. This was super easy to build, I did it in an hour or so after working out what the templating language allowed me to do. I converted &lt;a href=&quot;https:&#x2F;&#x2F;www.kanpai-japan.com&#x2F;travel-guide&#x2F;koyomi-72-seasons&quot;&gt;this existing web page which lists the 72 seasons&lt;&#x2F;a&gt; into &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pipwilson&#x2F;trmnl-72-seasons&#x2F;blob&#x2F;main&#x2F;src&#x2F;microseasons.json&quot;&gt;this JSON file using ChatGPT&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;You can &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pipwilson&#x2F;trmnl-72-seasons&quot;&gt;access the source code here&lt;&#x2F;a&gt;, and if you have a TRMNL device you should soon be able to find it on &lt;a href=&quot;https:&#x2F;&#x2F;usetrmnl.com&#x2F;recipes&quot;&gt;the list of Recipes on their website&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I used the &lt;a href=&quot;https:&#x2F;&#x2F;help.usetrmnl.com&#x2F;en&#x2F;articles&#x2F;10031211-stock-price&quot;&gt;sample stock ticker layout&lt;&#x2F;a&gt; as the base for my template, which meant I then only needed to sort out my date comparison and the whole thing was done.&lt;&#x2F;p&gt;
&lt;p&gt;This was very easy to do and is both pleasing and relaxing when it cycles around on my TRMNL.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;ins datetime=&quot;2025-07-08&quot;&gt;Turns out &lt;a href=&quot;https:&#x2F;&#x2F;usetrmnl.com&#x2F;recipes&#x2F;18876&quot;&gt;someone else had the same idea for their TRMNL&lt;&#x2F;a&gt;:  - this is just one manifestation of their much larger effort at &lt;a href=&quot;https:&#x2F;&#x2F;smallseasons.guide&#x2F;&quot;&gt;https:&#x2F;&#x2F;smallseasons.guide&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;ins&gt;&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Pairing bluetooth headphones with your Mecool Android TV</title>
        <published>2025-06-17T10:19:59+00:00</published>
        <updated>2025-06-17T10:19:59+00:00</updated>
        
        <author>
          <name>Phil Wilson</name>
        </author>
        <link rel="alternate" type="text/html" href="https://philwilson.org/blog/2025/06/pairing-bluetooth-headphones-with-your-mecool-android-tv/"/>
        <id>https://philwilson.org/blog/2025/06/pairing-bluetooth-headphones-with-your-mecool-android-tv/</id>
        <category scheme="https://philwilson.org/blog" term="android" />
          <category scheme="https://philwilson.org/blog" term="bluetooth" />
          <content type="html" xml:base="https://philwilson.org/blog/2025/06/pairing-bluetooth-headphones-with-your-mecool-android-tv/">&lt;p&gt;I have a &lt;a href=&quot;https:&#x2F;&#x2F;www.mecool.com&#x2F;products&#x2F;tv-box-mecool-km2-plus&quot;&gt;Mecool KM2 Plus Android TV&lt;&#x2F;a&gt; which I have in my garage so I can watch Netflix or whatever whilst &lt;a href=&quot;https:&#x2F;&#x2F;philwilson.org&#x2F;blog&#x2F;2023&#x2F;02&#x2F;riding-my-bike-online&#x2F;&quot;&gt;riding my bike online&lt;&#x2F;a&gt;. Generally speaking I really like this box.&lt;&#x2F;p&gt;
&lt;p&gt;I also have some &lt;a href=&quot;https:&#x2F;&#x2F;en.m.wikipedia.org&#x2F;wiki&#x2F;Samsung_Galaxy_Buds_series&quot;&gt;Samsung Galaxy Buds FE earbuds&lt;&#x2F;a&gt; but if you try and pair them to the Mecool box (via the &quot;Accessories&quot; menu) it doesn&#x27;t work.&lt;&#x2F;p&gt;
&lt;p&gt;This is because of the xcpe settings. If you disable this then the pairing will work smoothly. You can do this by opening Settings -&amp;gt; Device Preferences -&amp;gt; Accessibility and then selecting XCPE at the bottom of the list.&lt;&#x2F;p&gt;
&lt;p&gt;The real benefit of doing this right now as it hits 30C in the UK is that I can leave my garage door open whilst on my bike and not be blasting the whole neighbourhood with the latest episode of &lt;a href=&quot;https:&#x2F;&#x2F;en.m.wikipedia.org&#x2F;wiki&#x2F;My_Hero_Academia&quot;&gt;My Hero Academia&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Export a list of all the people you follow on Medium as OPML</title>
        <published>2025-06-06T19:21:37+00:00</published>
        <updated>2025-06-06T19:21:37+00:00</updated>
        
        <author>
          <name>Phil Wilson</name>
        </author>
        <link rel="alternate" type="text/html" href="https://philwilson.org/blog/2025/06/export-a-list-of-all-the-people-you-follow-on-medium-as-opml/"/>
        <id>https://philwilson.org/blog/2025/06/export-a-list-of-all-the-people-you-follow-on-medium-as-opml/</id>
        <category scheme="https://philwilson.org/blog" term="rss" />
          <category scheme="https://philwilson.org/blog" term="opml" />
          <category scheme="https://philwilson.org/blog" term="medium" />
          <content type="html" xml:base="https://philwilson.org/blog/2025/06/export-a-list-of-all-the-people-you-follow-on-medium-as-opml/">&lt;p&gt;For my sins, I follow lots of people on Medium.&lt;&#x2F;p&gt;
&lt;p&gt;For their sins, I never check Medium to see what they&#x27;re writing.&lt;&#x2F;p&gt;
&lt;p&gt;The link below is a bookmarklet which will export the list of people you are following on Medium as an OPML file so that you can import it into your feed reader.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;&lt;a href=&quot;javascript:(function()%7Bjavascript%3A(function()%20%7B%0A%20%20function%20getFeedUrls()%20%7B%0A%20%20%20%20const%20anchors%20%3D%20document.querySelectorAll(&#x27;main%20div.m%20a%5Bhref%5D&#x27;)%3B%0A%20%20%20%20const%20urls%20%3D%20new%20Set()%3B%0A%20%20%20%20anchors.forEach(function(a)%20%7B%0A%20%20%20%20%20%20const%20href%20%3D%20a.getAttribute(&#x27;href&#x27;)%3B%0A%20%20%20%20%20%20if%20(href.startsWith(&#x27;%2F%40&#x27;))%20%7B%0A%20%20%20%20%20%20%20%20const%20cleanHref%20%3D%20href.split(&#x27;%3F&#x27;)%5B0%5D%20%2B%20&#x27;%2Ffeed&#x27;%3B%0A%20%20%20%20%20%20%20%20urls.add(cleanHref)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D)%3B%0A%20%20%20%20return%20Array.from(urls)%3B%0A%20%20%7D%0A%0A%20%20function%20generateOPML(feeds)%20%7B%0A%20%20%20%20const%20header%20%3D%20%5B%0A%20%20%20%20%20%20&#x27;%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E&#x27;%2C%0A%20%20%20%20%20%20&#x27;%3Copml%20version%3D%222.0%22%3E&#x27;%2C%0A%20%20%20%20%20%20&#x27;%20%20%3Chead%3E&#x27;%2C%0A%20%20%20%20%20%20&#x27;%20%20%20%20%3Ctitle%3EMedium%20Following%20Feeds%3C%2Ftitle%3E&#x27;%2C%0A%20%20%20%20%20%20&#x27;%20%20%3C%2Fhead%3E&#x27;%2C%0A%20%20%20%20%20%20&#x27;%20%20%3Cbody%3E&#x27;%2C%0A%20%20%20%20%20%20&#x27;%20%20%20%20%3Coutline%20text%3D%22Medium%20Feeds%22%20title%3D%22Medium%20Feeds%22%3E&#x27;%0A%20%20%20%20%5D.join(&#x27;%5Cn&#x27;)%3B%0A%0A%20%20%20%20const%20footer%20%3D%20%5B%0A%20%20%20%20%20%20&#x27;%20%20%20%20%3C%2Foutline%3E&#x27;%2C%0A%20%20%20%20%20%20&#x27;%20%20%3C%2Fbody%3E&#x27;%2C%0A%20%20%20%20%20%20&#x27;%3C%2Fopml%3E&#x27;%0A%20%20%20%20%5D.join(&#x27;%5Cn&#x27;)%3B%0A%0A%20%20%20%20const%20items%20%3D%20feeds.map(function(url)%20%7B%0A%20%20%20%20%20%20const%20match%20%3D%20url.match(%2F%40(%5B%5E%5C%2F%5D%2B)%2F)%3B%0A%20%20%20%20%20%20const%20title%20%3D%20match%20%3F%20match%5B1%5D%20%3A%20&#x27;Medium%20User&#x27;%3B%0A%20%20%20%20%20%20return%20&#x27;%20%20%20%20%20%20%3Coutline%20type%3D%22rss%22%20text%3D%22&#x27;%20%2B%20title%20%2B%20&#x27;%22%20title%3D%22&#x27;%20%2B%20title%20%2B%20&#x27;%22%20xmlUrl%3D%22https%3A%2F%2Fmedium.com&#x27;%20%2B%20url%20%2B%20&#x27;%22%20%2F%3E&#x27;%3B%0A%20%20%20%20%7D).join(&#x27;%5Cn&#x27;)%3B%0A%0A%20%20%20%20return%20header%20%2B%20&#x27;%5Cn&#x27;%20%2B%20items%20%2B%20&#x27;%5Cn&#x27;%20%2B%20footer%3B%0A%20%20%7D%0A%0A%20%20function%20download(content%2C%20filename)%20%7B%0A%20%20%20%20const%20blob%20%3D%20new%20Blob(%5Bcontent%5D%2C%20%7Btype%3A%20&#x27;text%2Fxml&#x27;%7D)%3B%0A%20%20%20%20const%20a%20%3D%20document.createElement(&#x27;a&#x27;)%3B%0A%20%20%20%20a.href%20%3D%20URL.createObjectURL(blob)%3B%0A%20%20%20%20a.download%20%3D%20filename%3B%0A%20%20%20%20a.click()%3B%0A%20%20%7D%0A%0A%20%20const%20feeds%20%3D%20getFeedUrls()%3B%0A%20%20if%20(feeds.length%20%3D%3D%3D%200)%20%7B%0A%20%20%20%20alert(&#x27;No%20Medium%20user%20links%20found%20on%20this%20page.&#x27;)%3B%0A%20%20%20%20return%3B%0A%20%20%7D%0A%20%20const%20opml%20%3D%20generateOPML(feeds)%3B%0A%20%20download(opml%2C%20&#x27;medium-following.opml&#x27;)%3B%0A%7D)()%3B%7D)()%3B&quot;&gt;Export Medium Following&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Just click and drag it to your browser bookmark toolbar, visit your &quot;Following&quot; page from your profile, &lt;strong&gt;scroll to the bottom so that the whole list loads&lt;&#x2F;strong&gt; and then click &quot;Export Medium Following&quot;. This will download a file to your computer. Import it to your feed reader and you should have a new folder called &quot;Medium Following Feeds&quot; with the people you&#x27;re following listed inside.&lt;&#x2F;p&gt;
&lt;p&gt;Tada!&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Converting wayback machine pages into blog posts</title>
        <published>2025-06-04T18:23:45+00:00</published>
        <updated>2025-06-04T18:23:45+00:00</updated>
        
        <author>
          <name>Phil Wilson</name>
        </author>
        <link rel="alternate" type="text/html" href="https://philwilson.org/blog/2025/06/converting-wayback-machine-pages-into-blog-posts/"/>
        <id>https://philwilson.org/blog/2025/06/converting-wayback-machine-pages-into-blog-posts/</id>
        <category scheme="https://philwilson.org/blog" term="blogging" />
          <category scheme="https://philwilson.org/blog" term="waybackmachine" />
          <category scheme="https://philwilson.org/blog" term="rss" />
          <category scheme="https://philwilson.org/blog" term="python" />
          <category scheme="https://philwilson.org/blog" term="ai" />
          <category scheme="https://philwilson.org/blog" term="vibecoding" />
          <content type="html" xml:base="https://philwilson.org/blog/2025/06/converting-wayback-machine-pages-into-blog-posts/">&lt;p&gt;Summary: I extracted a load of old blog content from the feeds archived on the Wayback Machine and converted it into markdown files suitable for posting on my blog, and got AI to write all the code for me. The generated code &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pipwilson&#x2F;waybackmachine-to-markdown&quot;&gt;is all here in github&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;&lt;h2 id=&quot;what-i-wanted-to-do&quot;&gt;What I wanted to do&lt;&#x2F;h2&gt;
&lt;p&gt;Years ago I used to work for the University of Bath in the UK. We used to &lt;a href=&quot;https:&#x2F;&#x2F;public.digital&#x2F;pd-insights&#x2F;blog&#x2F;2022&#x2F;01&#x2F;what-does-working-in-the-open-mean&quot;&gt;blog in the open about the work we were doing&lt;&#x2F;a&gt; and contribute back to the rest of the UK&#x27;s Higher Education sector&#x27;s tech teams with lessons learned, practical tooling they could use, process improvements and so on. The team still there &lt;a href=&quot;https:&#x2F;&#x2F;blogs.bath.ac.uk&#x2F;digital-content-and-development&#x2F;&quot;&gt;continue to blog&lt;&#x2F;a&gt;, but with a slightly tighter focus.&lt;&#x2F;p&gt;
&lt;p&gt;That original blog and my dozens of posts have since been deleted, but live on the Wayback Machine.&lt;&#x2F;p&gt;
&lt;p&gt;So let&#x27;s get the posts out of there, and republish them back on my blog - they make up part of the tapestry of things I found interesting and activities I was doing at the time and so it would be nice to bring them back into the mix rather than let them disappear forever.&lt;&#x2F;p&gt;
&lt;p&gt;Having only used the Wayback Machine as a regular user I had no idea how to reach my goal, but figured I would need to try a few different approaches.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;trying-and-failing-to-use-an-existing-tool&quot;&gt;Trying and failing to use an existing tool&lt;&#x2F;h2&gt;
&lt;p&gt;Firstly I tried an off-the-shelf approach with &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;StrawberryMaster&#x2F;wayback-machine-downloader&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;StrawberryMaster&#x2F;wayback-machine-downloader&lt;&#x2F;a&gt; but couldn&#x27;t get it working properly after 30 minutes, so abandoned it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vibe-coding-our-way-to-the-goal&quot;&gt;Vibe-coding our way to the goal&lt;&#x2F;h2&gt;
&lt;p&gt;I realised I&#x27;d probably have to write some scripts to do this and because I wasn&#x27;t worried about the quality of what I was doing and I&#x27;d probably need to try a few approaches I decided to go full-on &lt;a href=&quot;https:&#x2F;&#x2F;simonwillison.net&#x2F;2025&#x2F;Mar&#x2F;19&#x2F;vibe-coding&#x2F;&quot;&gt;vibe-coding&lt;&#x2F;a&gt;. I&#x27;ve done this on a few other small, one-shot, throwaway projects pretty successfully and the hit rate keeps going up!&lt;&#x2F;p&gt;
&lt;p&gt;Browsing the web UI you can see all the pages which the Wayback Machine holds about a site e.g. &lt;a href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;*&#x2F;https:&#x2F;&#x2F;blogs.bath.ac.uk&#x2F;webservices&#x2F;*&quot;&gt;this listing for https:&#x2F;&#x2F;blogs.bath.ac.uk&#x2F;webservices&lt;&#x2F;a&gt; but that&#x27;s 30 pages of links! ChatGPT told me that I could use &lt;a href=&quot;https:&#x2F;&#x2F;archive.org&#x2F;developers&#x2F;wayback-cdx-server.html&quot;&gt;the CDX API&lt;&#x2F;a&gt; to get the full list in one hit:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;curl &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;http:&#x2F;&#x2F;web.archive.org&#x2F;cdx&#x2F;search&#x2F;cdx?url=blogs.bath.ac.uk&#x2F;webservices&#x2F;*&amp;amp;output=txt&amp;amp;fl=timestamp,original&amp;amp;collapse=digest&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; &amp;gt; urls_raw.txt
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The output &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pipwilson&#x2F;waybackmachine-to-markdown&#x2F;blob&#x2F;production&#x2F;urls_raw.txt&quot;&gt;looks like this&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;When I asked about how to get just the list of URLs it also gave me this line to strip the timestamp of the snapshot from each line of the file:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;awk &lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;{print &amp;quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;&amp;quot; $1 &amp;quot;&#x2F;&amp;quot; $2}&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39; urls_raw.txt &amp;gt; urls.txt
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Great! We now have a full list of working URLs that the Wayback Machine has of the site I&#x27;m interested in!&lt;&#x2F;p&gt;
&lt;p&gt;I spent some time here getting ChatGPT to give me a script to de-duplicate the list to only have one record per-URL (only using the latest snapshotted version), and then trying to download and parse those files to extract only the content. But this was just too much work to do - the parsers couldn&#x27;t always reliably extract the content of the page (using &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;buriy&#x2F;python-readability&quot;&gt;readability&lt;&#x2F;a&gt;), and the markdown wasn&#x27;t always what I wanted (using &lt;a href=&quot;https:&#x2F;&#x2F;pandoc.org&#x2F;&quot;&gt;pandoc&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;So I needed a new idea.&lt;&#x2F;p&gt;
&lt;p&gt;Well, I love RSS, and this blog was WordPress, so it definitely had a feed, and I made sure at the time that we always published full-content in the feeds, so let&#x27;s grab that!&lt;&#x2F;p&gt;
&lt;p&gt;I manually selected all the URLs from the long list which listed the main feed for the blog and put them in their own file. &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pipwilson&#x2F;waybackmachine-to-markdown&#x2F;blob&#x2F;production&#x2F;feed_urls.txt&quot;&gt;This gave me 33 lines&lt;&#x2F;a&gt;, and I knew there would be a ton of duplication of items between snapshots, so I couldn&#x27;t just do a naive merge. At this point I moved to &lt;a href=&quot;https:&#x2F;&#x2F;code.visualstudio.com&#x2F;docs&#x2F;copilot&#x2F;chat&#x2F;chat-agent-mode&quot;&gt;VS Code using Agent mode&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Very quickly it built me &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pipwilson&#x2F;waybackmachine-to-markdown&#x2F;blob&#x2F;production&#x2F;download_feeds.sh&quot;&gt;a bash script to download the files and name them after their snapshot timestamp&lt;&#x2F;a&gt;, and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pipwilson&#x2F;waybackmachine-to-markdown&#x2F;blob&#x2F;production&#x2F;merge_feeds.py&quot;&gt;a Python script to loop over those locale files&lt;&#x2F;a&gt;, and each time it found a new GUID value, add the item to a new RSS file. Voila, I now have a local, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pipwilson&#x2F;waybackmachine-to-markdown&#x2F;blob&#x2F;production&#x2F;webservices.xml&quot;&gt;single RSS file containing all the content and metadata of the content posted to that blog&lt;&#x2F;a&gt; that was deleted years ago!&lt;&#x2F;p&gt;
&lt;p&gt;I manage this blog &lt;a href=&quot;https:&#x2F;&#x2F;philwilson.org&#x2F;blog&#x2F;tags&#x2F;zola&quot;&gt;with Zola&lt;&#x2F;a&gt; so it was then an iterative job to get the agent to &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pipwilson&#x2F;waybackmachine-to-markdown&#x2F;blob&#x2F;production&#x2F;extract_phil_wilson_posts.py&quot;&gt;write a script to loop over the RSS file and extract the items I&#x27;d written into a new markdown file in the directory I wanted, with the frontmatter I wanted&lt;&#x2F;a&gt;. I did some manual blog template work so that I could highlight that the each of those posts originated elsewhere, and add a new taxonomy so that I could also list them out separately and I was done!&lt;&#x2F;p&gt;
&lt;p&gt;I can&#x27;t emphasise enough that other than keeping a very loose eye on the generated Python scripts in case there were mistakes, I didn&#x27;t write any of the code. I had to manually intervene at exactly one point when the generated YAML frontmatter was not indented as Zola required (which I hadn&#x27;t known about either), but otherwise it was just a matter of looping over a process of asking it to make the next step, hitting &#x27;Accept&#x27; and running the script. If I&#x27;d had a clearer idea in advance of the exact outcome I wanted I could have used the agent more autonomously, but at the start I didn&#x27;t really know exactly where I was going to end up or what my detailed requirements were. Given that, it all turned out really well!&lt;&#x2F;p&gt;
&lt;p&gt;You can now &lt;a href=&quot;https:&#x2F;&#x2F;philwilson.org&#x2F;collections&#x2F;university-of-bath&#x2F;&quot;&gt;view those posts made between 2008 and 2014&lt;&#x2F;a&gt;, including this &lt;a href=&quot;https:&#x2F;&#x2F;philwilson.org&#x2F;blog&#x2F;2011&#x2F;06&#x2F;going-html5&#x2F;&quot;&gt;interesting look in 2011 at which browsers were using our website&lt;&#x2F;a&gt; and a consideration of whether HTML5 was worth using yet!&lt;&#x2F;p&gt;
&lt;p&gt;Of course all the links on those posts are broken, so in a pleasingly circular manner I&#x27;ll be adding &lt;a href=&quot;https:&#x2F;&#x2F;remysharp.com&#x2F;2023&#x2F;09&#x2F;26&#x2F;no-more-404&quot;&gt;Remy Sharp&#x27;s approach&lt;&#x2F;a&gt; to linking to the Wayback Machine for all those 404s - another job for AI to do for me perhaps?&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Dark Wikipedia</title>
        <published>2025-05-01T10:26:53+00:00</published>
        <updated>2025-05-01T10:26:53+00:00</updated>
        
        <author>
          <name>Phil Wilson</name>
        </author>
        <link rel="alternate" type="text/html" href="https://philwilson.org/blog/2025/05/dark-wikipedia/"/>
        <id>https://philwilson.org/blog/2025/05/dark-wikipedia/</id>
        <category scheme="https://philwilson.org/blog" term="wikipedia" />
          <category scheme="https://philwilson.org/blog" term="usability" />
          <category scheme="https://philwilson.org/blog" term="accessibility" />
          <category scheme="https://philwilson.org/blog" term="darkmode" />
          <content type="html" xml:base="https://philwilson.org/blog/2025/05/dark-wikipedia/">&lt;p&gt;I use a browser extension which always redirect wikipedia articles to their mobile equivalent (&lt;a href=&quot;https:&#x2F;&#x2F;chromewebstore.google.com&#x2F;detail&#x2F;redirect-to-mobile-site-f&#x2F;pbphdieomeafocdjodmhjnkjjoloiebj&quot;&gt;chrome&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;addons.mozilla.org&#x2F;en-US&#x2F;firefox&#x2F;addon&#x2F;wikipedia-mobile-version&#x2F;&quot;&gt;firefox&lt;&#x2F;a&gt;). I find this much less cluttered and much more legible but it hides the settings screen behind a burger menu, so I hadn&#x27;t thought to look for a dark mode until I finally cracked late at night after being blinded one too many times.&lt;&#x2F;p&gt;
&lt;p&gt;It turns out that there has in fact been &lt;a href=&quot;https:&#x2F;&#x2F;en.m.wikipedia.org&#x2F;wiki&#x2F;Wikipedia:Dark_mode#Options_for_unregistered_users&quot;&gt;a dark mode available since July 2024&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;So when on the mobile site, click the top left burger menu, click &quot;settings&quot; and then choose either &quot;Dark&quot; or &quot;Automatic&quot; modes and suddenly reading Wikipedia at night has become a whole lot more peaceful.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;..&#x2F;wikipedia-colour-settings.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Physicality</title>
        <published>2025-04-10T17:19:58+00:00</published>
        <updated>2025-04-10T17:19:58+00:00</updated>
        
        <author>
          <name>Phil Wilson</name>
        </author>
        <link rel="alternate" type="text/html" href="https://philwilson.org/blog/2025/04/physicality/"/>
        <id>https://philwilson.org/blog/2025/04/physicality/</id>
        <category scheme="https://philwilson.org/blog" term="design" />
          <category scheme="https://philwilson.org/blog" term="hardware" />
          <category scheme="https://philwilson.org/blog" term="physical-objects" />
          <content type="html" xml:base="https://philwilson.org/blog/2025/04/physicality/">&lt;p&gt;I said to someone at work today that there&#x27;s been an entire generation who has only known media consumption and creation through digital means.&lt;&#x2F;p&gt;
&lt;p&gt;This isn&#x27;t a new observation and also it&#x27;s not quite true.&lt;&#x2F;p&gt;
&lt;p&gt;Colouring books, sellotape, straws. Cutting shapes out of paper. Everyone born in the UK will have done these things as a kid.&lt;&#x2F;p&gt;
&lt;p&gt;But in 2025, creating and using music, photography and art from the age of probably 10 to adult is predominantly digital and predominantly performed on the same buttonless black-backed square of glass.&lt;&#x2F;p&gt;
&lt;p&gt;The price of secondhand film-based cameras is going up. A camera bought on eBay a year ago for £50 is now £150. Opening the back of the camera and exposing the film and then paying to have it developed anyway &lt;em&gt;just in case&lt;&#x2F;em&gt; is about to become an experience for a whole new group of people.&lt;&#x2F;p&gt;
&lt;p&gt;And we all know about the rise of vinyl over the last decade.&lt;&#x2F;p&gt;
&lt;p&gt;More horrifying is the rise of the &lt;a href=&quot;https:&#x2F;&#x2F;bandcamp.com&#x2F;discover&#x2F;all&#x2F;cassette&quot;&gt;cassette tape on places like Bandcamp&lt;&#x2F;a&gt; where they&#x27;re sold both as collector&#x27;s editions and regular &quot;this is how you listen to our music&quot; releases.&lt;&#x2F;p&gt;
&lt;p&gt;While looking at other dedicated film cameras today, I got linked to a &quot;modern&quot; camera, the &lt;a href=&quot;https:&#x2F;&#x2F;www.sigma-global.com&#x2F;en&#x2F;cameras&#x2F;bf&#x2F;&quot;&gt;Sigma BF&lt;&#x2F;a&gt;. It&#x27;s probably one of the ugliest things I&#x27;ve ever seen, hearkening back to &lt;a href=&quot;https:&#x2F;&#x2F;en.m.wikipedia.org&#x2F;wiki&#x2F;Zune_80,_120&quot;&gt;Zune-levels of aesthetic design&lt;&#x2F;a&gt; that fundamentally misunderstand the role objects play in our lives. A design only fit for a dystopian near-future.&lt;&#x2F;p&gt;
&lt;p&gt;Turns out not all dedicated physical objects for creativity are good.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Books of January 2025</title>
        <published>2025-03-18T21:45:42+00:00</published>
        <updated>2025-03-18T21:45:42+00:00</updated>
        
        <author>
          <name>Phil Wilson</name>
        </author>
        <link rel="alternate" type="text/html" href="https://philwilson.org/blog/2025/03/books-of-january-2025/"/>
        <id>https://philwilson.org/blog/2025/03/books-of-january-2025/</id>
        <category scheme="https://philwilson.org/blog" term="books" />
          <category scheme="https://philwilson.org/blog" term="sci-fi" />
          <category scheme="https://philwilson.org/blog" term="space-opera" />
          <content type="html" xml:base="https://philwilson.org/blog/2025/03/books-of-january-2025/">&lt;p&gt;Yikes it&#x27;s March and I&#x27;m only posting January&#x27;s books now! Gotta go fast!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;uk.bookshop.org&#x2F;p&#x2F;books&#x2F;a-fire-upon-the-deep-vernor-vinge&#x2F;2881717&quot;&gt;A Fire Upon The Deep&lt;&#x2F;a&gt; - This was great! A 600 page space opera spanning billions of years and thousands of light years which had been on my wishlist for a few years but which got bought for me at Christmas by complete chance. This book contains about 5 ideas each of which could have spawned its own book but brought together forms a coherent and yet extremely distant universe. Having a storyline which included both the transcendentally evolved species and those at an approximately medieval level of development worked surprisingly well, and was probably one of the factors which helped keep the story interesting for the length of the book.&lt;&#x2F;p&gt;
&lt;p&gt;It jointly won the Hugo award in 1993 with &lt;a href=&quot;https:&#x2F;&#x2F;uk.bookshop.org&#x2F;p&#x2F;books&#x2F;doomsday-book-a-time-travel-novel-that-will-stay-with-you-long-after-you-finish-reading-connie-willis&#x2F;142123?ean=9780575131095&quot;&gt;Doomsday Book&lt;&#x2F;a&gt; by Connie Willis, which I read a few years ago and was excellent - even now I still think about it occasionally. It&#x27;s a sci-fi story set during the Black Death in England. I don&#x27;t think A Fire... is &lt;em&gt;quite&lt;&#x2F;em&gt; as good, but they are both well worth your time.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;uk.bookshop.org&#x2F;p&#x2F;books&#x2F;i-who-have-never-known-men-jacqueline-harpman&#x2F;1339967?ean=9781784879037&quot;&gt;I Who Have Never Known Men&lt;&#x2F;a&gt; is quite a different prospect. A &quot;heartbreaking post-apocalyptic tale of female friendship and intimacy set in a deserted world&quot; indeed. I really loved this.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;uk.bookshop.org&#x2F;p&#x2F;books&#x2F;shards-of-earth-first-in-an-extraordinary-new-trilogy-from-the-winner-of-the-arthur-c-clarke-award-adrian-tchaikovsky&#x2F;4974330?ean=9781529051902&quot;&gt;Shards of Earth&lt;&#x2F;a&gt; by Adrian Tchaikovsky is the first book I&#x27;ve read by him which is boring, and I&#x27;ve read about a dozen of his books.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s a space opera about giant moon-sized aliens eliminating planets by peeling back the layers and turning them into art. The overarching plot has been done a hundred times before and every single character is straight off a page on &lt;a href=&quot;https:&#x2F;&#x2F;tvtropes.org&#x2F;&quot;&gt;TVTropes&lt;&#x2F;a&gt;. Some of the detail is good, and the different alien species are fun but that is not enough to sustain its 565 pages and the final quarter is the only decent part of the book, by the end of which (after &lt;a href=&quot;https:&#x2F;&#x2F;en.m.wikipedia.org&#x2F;wiki&#x2F;The_Final_Architecture&quot;&gt;checking with wikipedia&lt;&#x2F;a&gt; since I knew I wasn&#x27;t going to read the 2nd and 3rd books in this series) I&#x27;d guessed the underlying motivations and direction the story was going to take, including its conclusion.&lt;&#x2F;p&gt;
&lt;p&gt;My copy of this book also had several typos. I came in with quite high expectations so overall this was very disappointing.&lt;&#x2F;p&gt;
&lt;p&gt;Slow Time Between the Stars by John Scalzi (this book doesn&#x27;t seem to have an ISBN so I can&#x27;t link to it on anywhere but amazon!). This is part of &lt;a href=&quot;https:&#x2F;&#x2F;www.amazon.com&#x2F;dp&#x2F;B0C4TJRRRV?binding=kindle_edition&amp;amp;ref=dbs_dp_sirpi&quot;&gt;Amazon&#x27;s The Far Reaches collection&lt;&#x2F;a&gt; of short stories by famous authors. The blurb says &quot;An artificial intelligence on a star-spanning mission explores the farthest horizons of human potential—and its own purpose—in a mind-bending short story&quot; and it was exactly what it says on the tin, pretty predictable from the first page but nicely written and took about half an hour to read. It was more interesting to read about &lt;a href=&quot;https:&#x2F;&#x2F;whatever.scalzi.com&#x2F;2025&#x2F;03&#x2F;13&#x2F;the-church-faq&#x2F;&quot;&gt;why he bought a church&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Making a bigger back button in Firefox</title>
        <published>2025-03-09T10:56:30+00:00</published>
        <updated>2025-03-09T10:56:30+00:00</updated>
        
        <author>
          <name>Phil Wilson</name>
        </author>
        <link rel="alternate" type="text/html" href="https://philwilson.org/blog/2025/03/making-a-bigger-back-button-in-firefox/"/>
        <id>https://philwilson.org/blog/2025/03/making-a-bigger-back-button-in-firefox/</id>
        <category scheme="https://philwilson.org/blog" term="firefox" />
          <category scheme="https://philwilson.org/blog" term="css" />
          <category scheme="https://philwilson.org/blog" term="usability" />
          <category scheme="https://philwilson.org/blog" term="customization" />
          <category scheme="https://philwilson.org/blog" term="gui" />
          <content type="html" xml:base="https://philwilson.org/blog/2025/03/making-a-bigger-back-button-in-firefox/">&lt;p&gt;I&#x27;ve been &lt;a href=&quot;https:&#x2F;&#x2F;www.philwilson.org&#x2F;blog&#x2F;2004&#x2F;11&#x2F;enhancing-firefox-gui-usability&#x2F;&quot;&gt;hacking Firefox CSS to make the &quot;Back&quot; button bigger since 2004&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s the latest version, so that you can have small toolbar buttons &lt;em&gt;except&lt;&#x2F;em&gt; for the Back button, which &lt;a href=&quot;https:&#x2F;&#x2F;en.m.wikipedia.org&#x2F;wiki&#x2F;Fitts%27s_law&quot;&gt;for obvious Fitt&#x27;s law reasons&lt;&#x2F;a&gt;, you want to be bigger by default.&lt;&#x2F;p&gt;
&lt;p&gt;This is what it will look like:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;..&#x2F;back-unhighlighted.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;And when you&#x27;re hovering:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;..&#x2F;back-highlighted.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Enable userChrome.css
&lt;ol&gt;
&lt;li&gt;Go to &lt;code&gt;about:config&lt;&#x2F;code&gt; in your address bar&lt;&#x2F;li&gt;
&lt;li&gt;Search for &lt;code&gt;toolkit.legacyUserProfileCustomizations.stylesheets&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Set it to &lt;code&gt;true&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Find your Firefox profile folder
&lt;ol&gt;
&lt;li&gt;Go to &lt;code&gt;about:support&lt;&#x2F;code&gt; and find &quot;Profile Folder&quot;&lt;&#x2F;li&gt;
&lt;li&gt;Click Open Folder&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;In the &lt;code&gt;chrome&lt;&#x2F;code&gt; directory (create it if it doesn&#x27;t exist), create a file called &lt;code&gt;userChrome.css&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;In that file add this CSS:&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre data-lang=&quot;css&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-css &quot;&gt;&lt;code class=&quot;language-css&quot; data-lang=&quot;css&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;toolbar&lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;icons&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;] #back-button .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;toolbarbutton-icon &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;	border-radius: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;!important&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;toolbar&lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;mode&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;icons&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;] #back-button .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;toolbarbutton-text &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;	display: block;
&lt;&#x2F;span&gt;&lt;span&gt;	border-radius: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;!important&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Restart Firefox - done!&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;I found out what the relevant styles to apply were by using &lt;a href=&quot;https:&#x2F;&#x2F;firefox-source-docs.mozilla.org&#x2F;devtools-user&#x2F;browser_toolbox&#x2F;index.html&quot;&gt;Firefox&#x27;s Browser Toolbox&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;You can also do something similar by applying one of the CSS files (to your userChrome.css as above) &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;MrOtherGuy&#x2F;firefox-csshacks&#x2F;blob&#x2F;master&#x2F;chrome&#x2F;toolbarbuttons_icon%2Blabel.css&quot;&gt;from MrOtherGuy&#x27;s firefox-csshacks repository&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Escaping content is hard, let&#x27;s go scrolling!</title>
        <published>2025-02-28T15:47:57+00:00</published>
        <updated>2025-02-28T15:47:57+00:00</updated>
        
        <author>
          <name>Phil Wilson</name>
        </author>
        <link rel="alternate" type="text/html" href="https://philwilson.org/blog/2025/02/escaping-content-is-hard/"/>
        <id>https://philwilson.org/blog/2025/02/escaping-content-is-hard/</id>
        <category scheme="https://philwilson.org/blog" term="html" />
          <category scheme="https://philwilson.org/blog" term="blogging" />
          <category scheme="https://philwilson.org/blog" term="rss" />
          <category scheme="https://philwilson.org/blog" term="yarr" />
          <category scheme="https://philwilson.org/blog" term="content-escaping-is-hard" />
          <content type="html" xml:base="https://philwilson.org/blog/2025/02/escaping-content-is-hard/">&lt;p&gt;This is from the web-based RSS reader I use, which apparently does not always escape content &lt;em&gt;quite&lt;&#x2F;em&gt; right.&lt;&#x2F;p&gt;
&lt;p&gt;Gotta love that &lt;code&gt;&amp;lt;marquee&amp;gt;&lt;&#x2F;code&gt; tag!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;..&#x2F;escaping-content-is-hard.gif&quot; alt=&quot;An animation of the contents of a blog post scrolling across the screen when it should be static&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;With thanks to &lt;a href=&quot;https:&#x2F;&#x2F;localghost.dev&#x2F;blog&#x2F;this-page-is-under-construction&#x2F;&quot;&gt;Sophie over at localghost for the actual blog post I was reading&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
    </entry>
    </feed>
