Shellsharks Blogroll - BlogFlockhttps://blogflock.com/list/xJ8yq2026-10-22T18:30:42.000ZBlogFlockshellsharksNews will be intermediated by AI. What's next? - Werd I/O6ada56526f97950001d0380b2026-10-22T18:30:42.000ZWerd I/O<p>Link: <a href="https://www.journalismfutures.org/three-layer-cake"><em>The Three-Layer Cake: Public-Interest Information in an AI-Intermediated Age, by Gina Chua and Adiel Kaplan at the Tow-Knight Center for Journalism Futures</em></a></p><p>Gina Chua and Adiel Kaplan at the Tow-Knight Center for Journalism Futures have put together a report summarizing a year of convenings and conversations about how journalism might react to its intermediation by AI. I was privileged to take part and to read a draft version of this report.</p><p>I love the framing here: the three-layer cake is digestible (so to speak), and I think the conclusions are sound. The worrisome thing for journalism is that most newsrooms live in the <em>creation</em> layer — the creators who supply the information which informs answers and summaries — which is also the part of the stack where participants have the least leverage.</p><p>So we need open, shared, common infrastructure. I think we also need strong portability standards. I’d argue that another word for the <em>consumption</em> layer as described here is <em>profiling</em>; tools at the consumption layer need to know a lot about their users so they can provide the most relevant information.</p><p>As the report says:</p><blockquote>“This is the layer that holds the relationship with the end user, where their data resides and the understanding of their information needs and desires accumulates and deepens over time. Owning that relationship will be one of the prizes of the AI age; not only will it unlock deep knowledge of individuals, it could lock them into particular providers.”</blockquote><p>And any solution needs to keep this in mind:</p><blockquote>“At the consumption layer, [points of leverage] involve working to ensure that the knowledge of people’s wants and needs is not the monopoly of organizations that may not have the public’s interest at heart.”</blockquote><p>Profile data is accumulated, private, and usually non-portable. The consumption layer also represents the greatest risk to creators from platform business decisions, both in terms of the business models of those platforms and which creators they choose to feature. Open portability standards and protocols — combined with full user control of their data — can scale, create useful competition, and empower users in the process.</p>Read "AI Is Changing Everything About Hacking. No One Knows What Happens Next" - Molly White's activity feed6ada2e8a914413745264549c2026-10-22T15:40:58.000ZMolly White<article class="entry h-entry hentry"><header><div class="description">Read: </div></header><div class="content e-content"><div class="article h-cite hcite"><div class="title"><a class="u-url u-repost-of" href="https://www.404media.co/php2shell-black-october-ai-is-changing-everything-about-hacking-no-one-knows-what-happens-next/" rel="bookmark">“<span class="p-name">AI Is Changing Everything About Hacking. No One Knows What Happens Next</span>”</a>. </div><div class="byline"><span class="p-author h-card">Jason Koebler</span> in <i class="p-publication">404 Media</i>. <span class="read-date"> Published <time class="dt-published published" datetime="2026-10-22">October 22, 2026</time>.</span></div><blockquote class="summary p-summary entry-summary">So much is happening, and so quickly, that it has been difficult for me — someone who has been reporting and editing stories on security and hacking for a decade — to fully understand what’s going on, to have a sense of what could happen next, or predict where this is going. And I think that that is largely where we are at the moment, as I am writing this.
But it has become clear that AI, broadly defined, has fundamentally changed both offensive hacking and defensive cybersecurity. This is not because AI has become sentient or because human beings have lost control of it or because of “swarms” of “rogue agents,” but because AI is proving something that we have always known: much of the software that runs the internet, our devices, our accounts, and our lives is vulnerable, or out of date, or has security flaws that human beings never noticed, or was installed by someone at a company who left the company six years ago and has been replaced four times and no one knows how to find them now or how to update it.</blockquote><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp">Posted: <time class="dt-published" datetime="2026-10-22T15:40:58+00:00" title="October 22, 2026 at 3:40 PM UTC">October 22, 2026 at 3:40 PM UTC</time>. </div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/artificial_intelligence" title="See all feed posts tagged "artificial intelligence"" rel="category tag">artificial intelligence</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/cybersecurity" title="See all feed posts tagged "cybersecurity"" rel="category tag">cybersecurity</a>. </div></div></footer></article>Note published on October 22, 2026 at 2:38 PM UTC - Molly White's activity feed6ada1fee0ebbcef1160d57132026-10-22T14:38:38.000ZMolly White<article><div class="entry h-entry hentry"><header></header><div class="content e-content"><p>a sight for sore eyes</p><div class="media-wrapper"><a href="https://storage.mollywhite.net/micro/62a9f648f9dd9754e25b_Screenshot-2026-10-22-at-10.33.42---AM.png" data-fslightbox=aa3e8a6610b66a7e452a><img src="https://storage.mollywhite.net/micro/62a9f648f9dd9754e25b_Screenshot-2026-10-22-at-10.33.42---AM.png" alt="molly@grayson:~$ php -v Command 'php' not found, but can be installed with:" /></a></div></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp-block"><div class="timestamp">Posted: <a class="u-url" href="https://www.mollywhite.net/micro/entry/202610221037"><time class="dt-published" datetime="2026-10-22T14:38:38+00:00" title="October 22, 2026 at 2:38 PM UTC">October 22, 2026 at 2:38 PM UTC</time>. </a></div></div><div class="social-links"> <span> Also posted to: </span><a class="social-link u-syndication mastodon" href="https://hachyderm.io/@molly0xfff/117485071325404559" title="Mastodon" rel="syndication">Mastodon, </a><a class="social-link u-syndication bluesky" href="https://bsky.app/profile/molly.wiki/post/3myhv2p4ccc23" 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/cybersecurity" title="See all micro posts tagged "cybersecurity"" rel="category tag">cybersecurity</a>. </div></div></footer></div></article>2026-10-22 14:13: So. Hooman. Are you ready for our meeting? - Kev Quirkhttps://kevquirk.com/2026-10-22-14132026-10-22T13:13:00.000ZKev Quirk<p>So. Hooman. Are you ready for our meeting?</p>
<p><img loading="lazy" src="https://kevquirk.com/content/images/2026-10-22-1413/1000012586.webp" alt="1000012586" /></p> <div class="email-hidden">
<hr />
<p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p>
<p>You can <a href="mailto:19gy@qrk.one?subject=2026-10-22%2014%3A13">reply to this post by email</a>, or <a href="https://kevquirk.com/2026-10-22-1413#comments">leave a comment</a>.</p>
</div>Gadget Review: Mokin 17 Port USB-C Tower ★★☆☆☆ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=761362026-10-22T11:34:36.000ZTerence Eden’s Blog<p>The good folks at Mokin have sent me their new USB-C hub and it is a <em>beast</em>.</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/09/product-shot.webp" alt="Photo of the front and back of the hub." width="1024" height="576" class="aligncenter">
<p>This is the <a href="https://mokinglobal.com/products/mokin-17-in-1-usb-c-docking-station-for-triple-monitors-with-smart-lcd">MODK2403</a> - the latest in their line of high-tech USB-C docks. It does close to everything you could want <em>and</em> has an LCD monitor for showing the weather.</p>
<p>Errr… What?</p>
<p>OK, a quick product shots, then on to the specs.</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/09/All-the-ports.webp" alt="All the ports." width="1024" height="771" class="aligncenter">
<p>On to the ports:</p>
<ul>
<li>Triple display
<ul>
<li>Either 3x HDMI or 1x HDMI and 2x DisplayPort</li>
</ul></li>
<li>4x USB-A
<ul>
<li>2x 2.0 480Mbps, 1x 3.0 5Gbps, 1x 3.1 10Gbps</li>
</ul></li>
<li>2x USB-C
<ul>
<li>1x 3.0 5Gbps, 1x 3.1 10Gbps</li>
</ul></li>
<li>USB-C PD input
<ul>
<li>100W</li>
</ul></li>
<li>USB-C to host computer
<ul>
<li>USB-C to C cable included</li>
</ul></li>
<li>Ethernet port
<ul>
<li>1Gbps</li>
</ul></li>
<li>SD and microSD</li>
<li>3.5m Audio Jack</li>
<li>Suction cup</li>
</ul>
<p>Yup! At the bottom of the tower is a silicone surround which allows it to firmly plant on any flat surface. It's strong enough to take any gentle nudges without toppling over, but easy enough to lift off if you need to move the unit.</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/09/suction.webp" alt="A square suction cup." width="1024" height="768" class="aligncenter">
<p>It is <em>slightly</em> cheeky to describe this as 17 ports. The two DisplayPorts are tied to the HDMI ports - so you can only have 3 screens active at a time, not five. But as each screen can do 4K @ 60Hz, I'll let it slide.</p>
<h2 id="screen"><a href="https://shkspr.mobi/blog/2026/10/gadget-review-mokin-17-port-usb-c-tower/#screen">Screen</a></h2>
<p>There's a black and white screen included which can show you a bunch of information. Tap the power-button on top to cycle between them.</p>
<p>Which ports are connected:</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/09/Whats-plugged-in.webp" alt="A list of ports. Some are illuminated." width="1024" height="768" class="aligncenter">
<p>Screen resolution of attached devices:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/09/Displayinfo.webp" alt="Screen resolution, size, and refresh rate." width="1024" height="768" class="aligncenter"></p>
<p>Total power draw:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/09/what-watts.webp" alt="A weird smiley face showing 49 Watts." width="1024" height="768" class="aligncenter"></p>
<p>WiFi set up:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/09/WiFi-Info.webp" alt="WiFi Info." width="1024" height="768" class="aligncenter"></p>
<p>Wait? What! If you connect to the hub's WiFi, you get this set-up screen.</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/09/WiFi-setup.webp" alt="A long settings screen to allow WiFi and set various options." width="504" height="1344" class="aligncenter">
<p>Once it is connected, it'll show you the weather in your area:</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/09/Weather-no-location.webp" alt="Weather and time." width="1024" height="768" class="aligncenter">
<p>I'm not <em>entirely</em> convinced about whether that's useful. Although you can change the units from ℉ to ℃, and show or hide your area, there's no other customisation available. No 24 hour clock, no date formatting, nothing. There's also no privacy policy or indication of which weather provider it is connecting to.</p>
<p>The screen switches off after a few minutes - so it isn't a constant distraction. Tapping the top button turns it on again.</p>
<p>Double-pressing the power-button switches the external monitors off. Which is useful for privacy I guess?</p>
<h2 id="linux-info"><a href="https://shkspr.mobi/blog/2026/10/gadget-review-mokin-17-port-usb-c-tower/#linux-info">Linux Info</a></h2>
<p>Worked perfectly with my Linux laptop. I drove two external screens via DisplayPort, a bunch of USB peripherals, Ethernet, etc.</p>
<p>A full read-out gives:</p>
<pre><code class="language-_">0bda:8153 Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter
0bda:0411 Realtek Semiconductor Corp. Hub
2109:0822 VIA Labs, Inc. USB3.1 Hub
2109:8822 VIA Labs, Inc. USB Billboard Device
0020:0b21 Generic AB13X USB Audio
0bda:1100 Realtek Semiconductor Corp. HID Device
0bda:5411 Realtek Semiconductor Corp. RTS5411 Hub
1a86:8095 QinHeng Electronics USB Hub
303a:1001 Espressif USB JTAG/serial debug unit
2109:2822 VIA Labs, Inc. USB2.0 Hub
</code></pre>
<h2 id="speed"><a href="https://shkspr.mobi/blog/2026/10/gadget-review-mokin-17-port-usb-c-tower/#speed">Speed</a></h2>
<p>I have 1Gbps broadband, and I was able to get 850Mbps through the Mokin's Ethernet port. That's pretty much what I'd expect.</p>
<p>Copying files via USB-C to a Pixel phone topped out at about 200MBps, which was a little underwhelming, but fast enough for my needs. I tried a variety of cables, including the bundled one.</p>
<h2 id="sound"><a href="https://shkspr.mobi/blog/2026/10/gadget-review-mokin-17-port-usb-c-tower/#sound">Sound</a></h2>
<p>The AB13X USB Audio presents as both analogue and S/PDIF. There was no meaningful difference between the two in terms of sound quality. There was minimal hum on output when nothing was being played.</p>
<h2 id="wifi-and-security"><a href="https://shkspr.mobi/blog/2026/10/gadget-review-mokin-17-port-usb-c-tower/#wifi-and-security">WiFi and Security</a></h2>
<p>I'm slightly uneasy about the built-in WiFi connection this hub offers. It is primarily used for showing the weather on screen, but it can also be used to upload new firmware.</p>
<p>Worryingly, it has a weak default password set - <code>mokin123</code>. I think that might be <a href="https://www.gov.uk/government/news/new-laws-to-protect-consumers-from-cyber-criminals-come-into-force-in-the-uk">against the law</a>. The password can be changed by the user - but I wonder how many people will bother?</p>
<p>When I mentioned this to Mokin, they replied:</p>
<blockquote><p>After the initial password is set, the user can change the password themselves rather than continuing to use a fixed default password.</p></blockquote>
<p>I don't think that's good enough to protect users.</p>
<p>Similarly, the SSID can be hidden and is randomised, but I wonder if that's suitable defence against a determined hacker?</p>
<p>I'm glad that the unit doesn't hijack the Ethernet connection - but who knows what a future firmware update might do.</p>
<p>There's also a <code>303a:1001 Espressif USB JTAG/serial debug unit</code> exposed on the hub. I tried connecting to it with <code>esptool</code> and the hub crashed! I had to pull out the power to get it to restart. I'm not smart enough to probe it further, but I can't help wondering why it is there.</p>
<p>Finally, there's a mysterious <code>0bda:1100 Realtek Semiconductor Corp. HID Device</code>. I thought that was used for blanking the external screens when the power-button is double-pressed, but that didn't register on <code>evtest</code>. So what is it for? I don't like the idea of a random Human Interface Device (usually a keyboard or mouse) being attached to my computer.</p>
<p>I spoke to Mokin about it and they said:</p>
<blockquote><p>our technical manager confirmed that these two entries are reserved for future firmware updates.</p></blockquote>
<p>Personally, I would expect these to be disabled if they aren't going to be used.</p>
<h2 id="privacy"><a href="https://shkspr.mobi/blog/2026/10/gadget-review-mokin-17-port-usb-c-tower/#privacy">Privacy</a></h2>
<p>With any device which connects to the Internet, you have to be concerned about what data it is collecting, storing, and transmitting. I asked Mokin if they had a privacy policy related to their weather service. They said:</p>
<blockquote><p>There is no need to worry about your personal or location information being uploaded or stored remotely. The relevant user information is stored locally on the device.</p>
<p>The weather/location information is provided through Google services, and no personal information is uploaded or stored by us. Therefore, there should be no privacy or data security concern from our side.</p></blockquote>
<p>I don't find that terribly convincing. At the very least they should tell users who their weather provider is and what their privacy says. I assume that the device is doing a GeoIP lookup before sending the request to Google - again, that should be explained to users.</p>
<p>I've no evidence that the hub is collecting data about what is attached and then sending it off somewhere - but without a privacy policy from Mokin, who can say?</p>
<h2 id="cracking-it-open"><a href="https://shkspr.mobi/blog/2026/10/gadget-review-mokin-17-port-usb-c-tower/#cracking-it-open">Cracking It Open</a></h2>
<p>The suction cup at the bottom is only lightly glued on and peeled off easily. Underneath are four screws.</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/10/Bottom-Screws.webp" alt="Four cross head screws." width="512" height="531" class="aligncenter">
<p>The base removes easily, exposing the three circuit boards.</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/10/Internal-guts.webp" alt="Two circuit boards with a middle board and some wires." width="2048" height="1824" class="aligncenter">
<p>Here's a close up:</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/10/guts.webp" alt="Close up of the circuits." width="2048" height="1798" class="aligncenter">
<p>I couldn't easily get them out, and the front plastic was held on securely. I'm sure it would be possible to snap off, but I didn't want to damage it.</p>
<h2 id="price-and-final-thoughts"><a href="https://shkspr.mobi/blog/2026/10/gadget-review-mokin-17-port-usb-c-tower/#price-and-final-thoughts">Price and Final Thoughts</a></h2>
<p>It's usually about <a href="https://mokinglobal.com/products/mokin-17-in-1-usb-c-docking-station-for-triple-monitors-with-smart-lcd">£90 from the manufacturer</a> or around <a href="https://link.amazon/B08w3yaiS">£70 from Amazon</a>.</p>
<p>You can get a basic hub for less than half that price - but what you're paying for here having <em>all the ports</em>. It's an attractive package, well designed, quiet, and unobtrusive.</p>
<p>The screen is moderately useful - being able to see which ports are in use was handy, as was seeing the total power draw. The screen debugging was also handy. I'm not that interested in the weather, but I can see how it would be helpful as a single-use screen.</p>
<p>I have significant concerns about the always-on WiFi, especially given its easy to guess password. I've contacted the manufacturer to see if anything can be done about that but they don't seem interested in fixing it. The lack of privacy policy is also worrying.</p>
<p>Similarly, the HID and JTAG are also something I wouldn't expect to see on a hub like this. Ideally they should be disabled if not in use.</p>
<p>In terms of ports and performance, this can't be beat. But I would be reluctant to connect it to my home WiFi network.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=76136&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">Converting YAML to Jekyll collection - Joel's Log Fileshttps://joelchrono.xyz/blog/converting-yaml-to-jekyll-collection2026-10-22T03:36:01.000Zjoelchrono<p>I was reading a blogpost by AetherAnne where she spent some time manually <a href="https://aetheranne.ca/tumblelog/2026/i-could-have-used-ai/">turning a YAML file into a Jekyll collection.</a> Doing things by hand is a wonderful thing, but well, sometimes a bash script works too!</p>
<p>I don’t know why I hadn’t done this myself already for <a href="/bookshelf/">my books</a>. Especially because I already had <a href="/blog/using-jekyll-collections-to-share-origami/">used Jekyll collections for my origami</a> before. Check that out in case anything here is unfamiliar to you. I am assuming a bunch of terms that only make sense if you use Jekyll or YAML or parsing and such.</p>
<p>In any case, my YAML file looked like this:</p>
<div class="language-yml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Dune</span><span class="nv"> </span><span class="s">Messiah"</span>
<span class="na">author</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Frank</span><span class="nv"> </span><span class="s">Herbert"</span>
<span class="na">cover</span><span class="pi">:</span> <span class="s2">"</span><span class="s">/assets/img/books/dune-messiah.jpg"</span>
<span class="na">start</span><span class="pi">:</span> <span class="s2">"</span><span class="s">2026-10-20"</span>
<span class="na">end</span><span class="pi">:</span> <span class="s2">"</span><span class="s">2026-10-20"</span>
<span class="na">progress</span><span class="pi">:</span> <span class="m">15</span>
<span class="na">summary</span><span class="pi">:</span> <span class="s2">"</span><span class="s">a</span><span class="nv"> </span><span class="s">summary"</span>
</code></pre></div></div>
<p>Like AetherAnne, I also considered using some LLM tool to do this, it would have taken a single prompt and would probably work just fine, and few people would have judged me too harshly for it. But again, why not actually try and do it myself, and maybe <a href="https://tracydurnell.com/2026/09/26/learning-scripting-by-scraping-my-own-website/">learn something?</a></p>
<p>First I had to figure out how to read a yaml file with bash. I could have done some stuff with the usual <code class="language-plaintext highlighter-rouge">echo</code> and <code class="language-plaintext highlighter-rouge">cut</code> or <code class="language-plaintext highlighter-rouge">awk</code>, but I looked it up and discovered that <code class="language-plaintext highlighter-rouge">yq</code> would do the trick rather cleanly. This only took some basic online research!</p>
<p><em>I probably could have done an equivalent function but again, not the point</em></p>
<p>Afterwards I needed to remember how to do a for loop in bash. Thankfully I found <a href="https://www.w3schools.com/bash/bash_loops.php">this tutorial from W3Schools</a></p>
<p>So I tried this little script to see if I got the logic right:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">title</span><span class="o">=</span><span class="si">$(</span>yq <span class="s1">'.[].title'</span> books.yml<span class="si">)</span>
<span class="k">for </span>i <span class="k">in</span> <span class="nv">$title</span><span class="p">;</span> <span class="k">do
</span><span class="nb">echo</span> <span class="nv">$i</span>
<span class="k">done</span>
</code></pre></div></div>
<p><em>…It didn’t work.</em></p>
<p>The output ended up looking like this:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"Dune
Messiah"
"The
Left
Hand
of
Darkness"
</code></pre></div></div>
<p>I guess it was taking the whole string of characters and… not doing what I wanted!</p>
<p>But hey, that’s how coding works, the computer is doing as it is told, I am the one who misunderstands here.</p>
<p>I figured I would do a bit of a cheat code after seeing the examples in the article I linked, and use a range for the loop to go through. I knew I had a total of 57 books logged, so I did the obvious from there.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for </span>i <span class="k">in</span> <span class="o">{</span>0..56<span class="o">}</span><span class="p">;</span> <span class="k">do
</span><span class="nv">title</span><span class="o">=</span><span class="si">$(</span>yq <span class="s1">'.['</span><span class="nv">$i</span><span class="s1">'].title'</span> books.yml<span class="si">)</span>
<span class="nb">echo</span> <span class="nv">$title</span>
<span class="k">done</span>
</code></pre></div></div>
<p>This worked as expected! Now the output was:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"Dune Messiah"
"The Left Hand of Darkness"
</code></pre></div></div>
<p>It was a bit slow but I didn’t mind one bit. Some smarter people would do a line count to see how many files there are and such, but hey, this works.</p>
<p>Since I got the main thing going, I revisited some of my older scripts where I do some similar stuff and applied it.</p>
<p>I needed to figure out how to make a filename. This wasn’t different from what I already do to generate my permalinks from the title of my posts. Excuse the ugly variable:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">filen</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="nv">$title</span> | <span class="nb">tr</span> <span class="s2">" ,.!"</span> <span class="s2">"-"</span>| <span class="nb">awk</span> <span class="s1">'{print tolower($0)}'</span><span class="si">)</span>
</code></pre></div></div>
<p>Check my article about <a href="/blog/rofi-automated-blog/">my rofi script to generate my posts</a> in case you are curious about that.</p>
<p>In any case, now everything is done. Here is the whole script:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for </span>i <span class="k">in</span> <span class="o">{</span>0..56<span class="o">}</span><span class="p">;</span> <span class="k">do
</span><span class="nv">title</span><span class="o">=</span><span class="si">$(</span>yq <span class="s1">'.['</span><span class="nv">$i</span><span class="s1">'].title'</span> books.yml<span class="si">)</span>
<span class="nv">filen</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="nv">$title</span> | <span class="nb">tr</span> <span class="s2">" ,.!"</span> <span class="s2">"-"</span>| <span class="nb">awk</span> <span class="s1">'{print tolower($0)}'</span><span class="si">)</span>
<span class="nv">author</span><span class="o">=</span><span class="si">$(</span>yq <span class="s1">'.['</span><span class="nv">$i</span><span class="s1">'].author'</span> books.yml<span class="si">)</span>
<span class="nv">cover</span><span class="o">=</span><span class="si">$(</span>yq <span class="s1">'.['</span><span class="nv">$i</span><span class="s1">'].cover'</span> books.yml<span class="si">)</span>
<span class="nv">start</span><span class="o">=</span><span class="si">$(</span>yq <span class="s1">'.['</span><span class="nv">$i</span><span class="s1">'].start'</span> books.yml<span class="si">)</span>
<span class="nv">ending</span><span class="o">=</span><span class="si">$(</span>yq <span class="s1">'.['</span><span class="nv">$i</span><span class="s1">'].end'</span> books.yml<span class="si">)</span>
<span class="nv">desc</span><span class="o">=</span><span class="si">$(</span>yq <span class="s1">'.['</span><span class="nv">$i</span><span class="s1">'].summary'</span> books.yml<span class="si">)</span>
<span class="nb">echo</span> <span class="nv">$filen</span>.md
<span class="nb">echo</span> <span class="nt">-e</span> <span class="s2">"---</span><span class="se">\n</span><span class="s2">layout: book</span><span class="se">\n</span><span class="s2">title: </span><span class="nv">$title</span><span class="se">\n</span><span class="s2">author: </span><span class="nv">$author</span><span class="se">\n</span><span class="s2">cover: </span><span class="nv">$cover</span><span class="se">\n</span><span class="s2">start: </span><span class="nv">$start</span><span class="se">\n</span><span class="s2">end: </span><span class="nv">$ending</span><span class="se">\n</span><span class="s2">description: </span><span class="nv">$desc</span><span class="se">\n</span><span class="s2">---"</span> <span class="o">>></span> ./test/<span class="nv">$filen</span>.md
<span class="k">done</span>
</code></pre></div></div>
<p>This is not a script that will work with any format or for any edgecases, in fact, it doesn’t even do things as I expected: all the filenames ended up as <code class="language-plaintext highlighter-rouge">"name-of-book".md</code></p>
<p>So those extra quote marks were rather ugly, but by this point I just used the built-in <a href="https://docs.xfce.org/xfce/thunar/bulk-renamer/start">Bulk Rename</a> tool in Thunar file manager and called it a day.</p>
<p>It is my script, it got me where I needed, and I worked from there. I created the <code class="language-plaintext highlighter-rouge">_books</code> folder in my website root directory, I did a super quick modification to the liquid syntax to generate my booklog, enabled the <code class="language-plaintext highlighter-rouge">"books"</code> collection on <code class="language-plaintext highlighter-rouge">_config.yml</code>, and called it a day.</p>
<p>Now I kind of have to do this with my videogames…</p>
<p>This is day 56 of <a href="https://100daystooffload.com">#100DaysToOffload</a></p>
<p>
<a href="mailto:me@joelchrono.xyz?subject=Converting YAML to Jekyll collection">Reply to this post via email</a> |
<a href="https://fosstodon.org/@joel/117482668130598307">Reply on Fediverse</a>
</p>Walking - James' Coffee Bloghttps://jamesg.blog/2026/10/22/walking2026-10-22T00:00:00.000ZJames' Coffee Blog
<p><em>I stopped in awe.</em></p>
<p>Looking up, I saw a tall tree whose base was yellow and top was red, with all of its leaves glistening in the golden sun that made its way through the clouds we have seen in recent days. An adjacent tree had a combination of green leaves and barren branches, prompting me to wonder why. <em>These are two different types of trees.</em> I know not their names, but all trees are beautiful.</p>
<p>The path was full of colour. I took a deep breath of the cold air. Was I also trying to breathe in the colour of the day, and the energy that brought the trees to life today? Filling my lungs and propelling my walk, the air blew away difficult thoughts and opened my mind to new ones: falling leaves danced through the sky, contributing to the bed of colour that I like to imagine keeps the grasses warm as they adjust to the cooler weather.</p>
<p>An idle thought occupies my mind for a moment. <em>The present is a theme and a focus of my work.</em> I like looking to the world each day and writing what I see; what I feel with the passing moments.</p>
<p><em>What if leaves were stars, flickering in the light of day?</em> From where I stand – from where I walk – the trees are high in the sky, their leaves twinkling as they move with the wind and catch the light of the day. I think about how the way I look at trees is similar to how I look at architecture. I look up, in awe. With time I have come to realise that everything I see in the world has many dimensions to appreciate.</p>
<p><em>If the leaves were stars, we would be walking perpetually among stars. Who would we be? The sun, radiating warm energy? The moon, casting a cool calm glow? Jupiter? I like to think I’d be myself.</em></p>
<p>Every season has its own sounds, and its own textures. I trawl through crispy leaves to hear the crunch, a sound that is made possible by Autumn. My attention turned to the ground, to all the colours. Then I looked up again and saw a hill that, yesterday I saw – and today, and every day, I see – in a new way.</p>
<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a4e85e877c94de7e',t:'MTc5MjY3MDcxNg=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
Your AI agent fixed the bug, but what else did it change? - Trail of Bits Bloghttps://blog.trailofbits.com/2026/10/21/your-ai-agent-fixed-the-bug-but-what-else-did-it-change/2026-10-21T15:00:00.000ZTrail of Bits Blog<p>Today we’re publishing <a href="https://github.com/trailofbits/skills/tree/main/plugins/patching-bugs">patching-bugs</a> and <a href="https://github.com/trailofbits/skills/tree/main/plugins/regression-hunt">regression-hunt</a>, two plugins that let engineers delegate patch development and regression checks to agents. Our patching-bugs plugin reproduces reported bugs, develops fixes, and tests them. The regression-hunt plugin checks whether any changes break previously working and supported behavior. Engineers can direct the work and review their results; maintainers can supply their own security assumptions and patching requirements, so the agents work within the project’s rules.</p>
<p>We built patching-bugs and regression-hunt through <a href="https://trailofbits.com/patch-the-planet/">Patch the Planet</a>, our joint initiative with OpenAI, where we’ve co-authored hundreds of security patches for widely used open-source projects. Motivated by our major successes on projects like <a href="https://github.com/trailofbits/publications/blob/master/presentations/Auditing%20Scapy%20With%20Agents/README.md">Scapy</a>, our plugins draw on our analysis of merged patches and thousands of our engineers’ Codex sessions.</p>
<p>The plugins provide maintainers with a structured workflow, evidence, independent checks, and best practices to improve their patching hygiene. In our preliminary evaluations, regression-hunt produces 25% fewer false-positive findings than a baseline Codex agent prompted to “review the PR for regressions.”</p>
<h2 id="standardizing-the-patching-process">Standardizing the patching process</h2>
<p>Our <a href="https://blog.trailofbits.com/2026/09/15/1passwords-ai-patching-benchmark-is-misleading/">September post</a> reported regressions introduced by some of our Patch the Planet patches. Since then, we’ve reviewed every patch that a Trail of Bits engineer authored and maintainers merged upstream. The review confirmed 21 regressions from over 130 PRs merged: 16 functional, one performance, and four build/test. None broke a security protection.</p>
<p>(“Regression” refers to a new defect introduced by a change that breaks previously correct and supported behavior along a path a real user or attacker can reach.)</p>
<p>For each patch, an agent looked for potential regressions, confirmed each one with a proof-of-concept (PoC) run before and after the change, and then passed the results to an engineer for review.</p>
<p>The review was noisy: today’s bug disclosures arrive at an unprecedented speed and scale, and for patching to keep pace, the industry needs to increase its signal-to-noise ratio. The 21 confirmed regressions were identified among 58 candidates in a single run (~36% precision). But because agents take many different approaches and reach different results, each run generates more candidates to manually sort through.</p>
<p>That led us to two conclusions:</p>
<ol>
<li>To introduce fewer regressions, we needed a standard way to write patches, with the same checks applied every time.</li>
<li>To catch the regressions we still introduce, we needed a standard way to check for them, with written rules for what counts as a regression.</li>
</ol>
<p>Standardizing both steps also makes every run repeatable and comparable. No fixed checklist will catch every regression, so we collect agent trajectories from our engineers’ patching sessions, and use the tasks that an earlier version failed to benchmark for the next one (figure 1).</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/10/21/your-ai-agent-fixed-the-bug-but-what-else-did-it-change/patching_figure1_hu_fd1b211e358e4802.webp"
alt="“Figure showing the feedback loop for generating and evaluating patches.”"
width="1200"
height="596"
loading="lazy"
decoding="async" />
<figcaption>Figure 1: Feedback loop for generating and evaluating patches.</figcaption>
</figure>
</p>
<h2 id="how-we-designed-the-plugins">How we designed the plugins</h2>
<p>We used two primary sources to guide the design of our plugins: a review of every patch we merged upstream and the thousands of Codex sessions our engineers used to write those patches.</p>
<p>This led to four principles that shaped our patching-bugs and regression-hunt plugins:</p>
<ol>
<li><strong>Opinionated guidance in as few words as possible.</strong> We give the agent wide latitude and record only Trail of Bits’ judgment of what constitutes a good patch and a real regression. The goal is to direct the agent towards the desired result with the least possible guidance.</li>
<li><strong>Modular steps.</strong> You don’t have to run either plugin end-to-end, as both provide multiple skills that can be used in tandem or in isolation.</li>
<li><strong>Strict input and output schemas.</strong> Every step takes and returns a defined schema that includes the claim, the code revision, the required check, the raw evidence, and open questions. Fixed schemas reduce variability across runs and allow each step to verify the previous step’s work rather than trusting its summary.</li>
<li><strong>A live proof of concept for every claim.</strong> Every conclusion depends on a PoC run against a live deployment: a built, running instance of the project, reached through the interfaces a real user would use. When reproducing a bug, proving a fix, and confirming a regression, if a step can’t produce a live PoC, its result is inconclusive.</li>
</ol>
<h2 id="regression-hunt-reduces-false-positive-rates">regression-hunt reduces false positive rates</h2>
<p>The regression-hunt plugin (Figure 2):</p>
<ol>
<li><strong>Enumerates</strong> <strong>candidate regressions</strong> by tracing the changed code (the diff) through its callers to its real interfaces.</li>
<li><strong>Reproduces</strong> each candidate regression on a <strong>live deployment of the system.</strong></li>
<li><strong>Replays</strong> the PoC on the live deployment on a <strong>fresh-context agent.</strong></li>
<li><strong>Judges</strong> the results of all the previous steps to validate that the <strong>proof meets the requirements of a regression.</strong></li>
</ol>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/10/21/your-ai-agent-fixed-the-bug-but-what-else-did-it-change/patching_figure2_hu_ba5a49e1c64e072d.webp"
alt="“Figure showing the regression-hunt workflow”"
width="1200"
height="1037"
loading="lazy"
decoding="async" />
<figcaption>Figure 2: The regression-hunt workflow.</figcaption>
</figure>
</p>
<p>In addition to the four principles above, there are two core aspects that are critical to the plugin:</p>
<ol>
<li><strong>Defining a regression:</strong> The plugin has strong opinions about what a regression is and, more importantly, what a regression is NOT. The burden of proof is placed on the agent (specifically during the “adjudication agent” step) to prove that there is sufficient evidence to show that the suspected regression is not a false positive, an incomplete fix, a latent bug, a pre-existing bug, and so on. The plugin only reports a regression if all of these gates are passed.</li>
<li><strong>Incorporating a threat model:</strong> If a threat model is available, the orchestrator will intentionally pass this document as part of the global context for each individual agentic step. This is an attempt to require each step/agent to refer back to the threat model before reaching its conclusion.</li>
</ol>
<p>Our review of merged PRs yielded a set of 21 confirmed regressions that we could use to evaluate regression-hunt. We used the whole set to compare the plugin with a baseline Codex agent prompted to “review the PR for regressions.”</p>
<p>Across those runs, regression-hunt produced 25% fewer false-positive findings than the baseline, with a 95% confidence interval of 14% to 38%. Its strict evidence requirements also left some known regressions classified as borderline: the plugin identified a possible regression but did not gather enough evidence to confirm it. Fewer false positives therefore came with a tradeoff in how many known regressions it could confidently report.</p>
<p>Next, we’ll investigate why these cases remained borderline and improve the plugin’s strategies for gathering evidence. Our goal is to confirm more real regressions while giving maintainers clearer information when the evidence remains inconclusive.</p>
<h2 id="patching-bugs-streamlines-best-practices-from-thousands-of-agent-sessions">patching-bugs streamlines best practices from thousands of agent sessions</h2>
<p>The patching-bugs plugin is a distillation of all the best practices we’ve identified by analyzing thousands of Codex sessions by Trail of Bits engineers (Figure 3). In addition to the more traditional capabilities (such as reproduction on live deployments and independent adversarial review), the plugin emphasizes:</p>
<ol>
<li><strong>The three-arm proof</strong>: The proof runs the same reproduction against three specifications: the original code must fail, the patched code must pass, and a complete revert must fail again. Bringing the bug back by removing the patch provides stronger evidence that the patch—rather than an unrelated environment or test change—actually fixed the bug.</li>
<li><strong>Invariant-guided repair:</strong> The patch attempts to fix the underlying, violated security invariant rather than fix the specific bug. This helps generalize the patch for possible variants of the same bug class.</li>
<li><strong>Incorporates regression analysis:</strong> The plugin mandates that regression-hunt is run to ensure that any patch goes through the same standard pipeline to check for mistakes.</li>
</ol>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/10/21/your-ai-agent-fixed-the-bug-but-what-else-did-it-change/patching_figure3_hu_7c360ee8fc4c02a3.webp"
alt="“Figure showing the patching-bugs workflow”"
width="1200"
height="933"
loading="lazy"
decoding="async" />
<figcaption>Figure 3: The patching-bugs workflow.</figcaption>
</figure>
</p>
<h2 id="whats-next-for-the-plugins">What’s next for the plugins</h2>
<p>Both patching-bugs and regression-hunt will continue to evolve. Our engineers are using them in their Patch the Planet work now, and we’re collecting data on how they’re being used, what works, and what doesn’t. That data, along with better evaluations, will shape the next version’s capabilities:</p>
<ul>
<li><strong>Evaluate patching-bugs.</strong> We’re building an evaluation that measures whether the plugin’s patches fix the reported bug and its variants without introducing regressions.</li>
<li><strong>Learn from agent traces.</strong> We’re analyzing the first batch of trace-level data from our engineers’ sessions. It will show whether Codex follows the rules and definitions required at each step, which steps it skips, and where its evidence is weakest.</li>
<li><strong>Make the plugins more configurable.</strong> patching-bugs already reads a project’s own patching guidelines (more on that in a bit). Next, we want maintainers to be able to choose whether to minimize patch sets—or, when broader coverage is worth more false positives, to loosen regression-hunt’s rules to surface more candidates.</li>
</ul>
<p>These plugins encode best practices we’ve found for an agent to patch a bug properly, and they improve when you tell them how your project works.</p>
<p>The plugins work best when you input two kinds of project knowledge:</p>
<ol>
<li>A <strong><code>THREAT_MODEL.md</code></strong>, which tells agents what counts as a vulnerability or a regression. The regression-hunt plugin passes it to every step, so each agent has to check its conclusions against the file. It should define the following: assets whose compromise matters, trust boundaries, access controls, supported configurations, specifications on what is or isn’t a vulnerability, and evidence required for a valid bug report (<a href="https://github.com/gpac/gpac/pull/3953">example</a>).</li>
<li>A <strong><code>PATCHING_GUIDELINES.md</code> (or <code>AGENTS.md</code>)</strong>, which tells agents and patching-bugs how your project wants fixes written. It should outline how to build and test the project, how big a fix should be, where a fix should go, how to present proposed changes, and what a regression test must show (<a href="https://github.com/gpac/gpac/pull/3953">example</a>).</li>
</ol>
<p>For our Patch the Planet work with GPAC, our engineers wrote a <a href="https://github.com/gpac/gpac/pull/3953">threat model and a project-specific patching skill</a> that captures how GPAC’s maintainers want bugs reproduced, what evidence a fix needs, and what a patch must preserve. <a href="https://github.com/open-quantum-safe/liboqs/pull/2477">Liboqs</a> and <a href="https://github.com/validatorjs/validator.js/">validator.js</a> have also published threat models in accordance with our guidance.</p>
<p>The more comprehensive and specific these files are to your project, code conventions, and operating style, the better the output you’ll receive.</p>
<h2 id="the-industry-needs-to-focus-on-patching">The industry needs to focus on patching</h2>
<p>As AI accelerates bug discovery, we need to turn those findings into reliable fixes just as quickly. Solutions need to balance speed and quality: an agent needs to understand a report, decide what needs to change, and check that a patch fixes the issue without introducing regressions. Our patching-bugs and regression-hunt plugins bring what we’ve learned from Patch the Planet into that workflow, helping maintainers move from a bug report to a patch they can confidently review and ship.</p>
<p>Install <a href="https://github.com/trailofbits/skills/tree/main/plugins/patching-bugs">patching-bugs</a> and <a href="https://github.com/trailofbits/skills/tree/main/plugins/regression-hunt">regression-hunt</a>, add a <code>THREAT_MODEL.md</code> and a <code>PATCHING_GUIDELINES.md</code> to your repository, and put them to work on your next bug report. Give the tools your project’s context so they can help you focus on the right fix and validate it faster. Then share your <a href="https://github.com/trailofbits/skills/issues">feedback</a>, including comments about where our defaults don’t fit your project. Those real-world cases will help us build the next version.</p>Get 18% more keys for free with this one crazy trick - Johnny.Decimalhttps://johnnydecimal.com/blog/0258-18pc-more-keys-for-free/2026-10-21T03:43:24.000ZJohnny.Decimal<p>You probably only have 78 keys on your keyboard.<sup><a href="#user-content-fn-mac-us" id="user-content-fnref-mac-us" data-footnote-ref="true" aria-describedby="footnote-label" class="footnote">1</a></sup> So why do you never use 12 of them?</p>
<p>These keys, of course, are the F-keys <kbd>F1</kbd> through <kbd>F12</kbd>. By default, macOS uses them for the glyphs printed thereon. But tell me the last time you pressed any of these:</p>
<ul>
<li><kbd>F3</kbd> for Mission Control.</li>
<li><kbd>F4</kbd> for Spotlight.</li>
<li><kbd>F5</kbd> for whatever that microphone does.</li>
<li><kbd>F6</kbd> for Sleep.<sup><a href="#user-content-fn-sleep" id="user-content-fnref-sleep" data-footnote-ref="true" aria-describedby="footnote-label" class="footnote">2</a></sup></li>
<li><kbd>F7</kbd>–<kbd>F9</kbd> for Music control.</li>
</ul>
<p>I'll grant that you might use <kbd>F1</kbd>/<kbd>F2</kbd> for brightness and <kbd>F10</kbd>–<kbd>F12</kbd> for volume control. But still, how often?</p>
<h2 id="let-your-apps-use-them">Let your apps use them</h2>
<p>I'm writing an app. Apps work really well with shortcut keys. We all have 12 perfectly great keys right there, begging to be used – and we never do.</p>
<p><em>'Of course'</em>, you'll say. <em>'The user can press the <kbd>Fn</kbd> key to access the F-keys'</em>. And, right, they <em>can</em> do that. But a fraction of people know that this is possible. So they never, ever will.</p>
<p>I implore you, then, to change this setting. Go to <strong>Settings</strong> > <strong>Keyboard</strong> > <strong>Keyboard Shortcuts…</strong> > <strong>Function Keys</strong>. Turn on <strong>Use F1, F2, etc. keys as standard function keys</strong>.</p>
<p>And there you go. Previously you had 66 usable keys. Now you have 78.</p>
<div data-footnotes="true" class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-mac-us">
<p>US keyboard on a modern Mac laptop. <a href="#user-content-fnref-mac-us" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref footnoteBackLink">↩</a></p>
</li>
<li id="user-content-fn-sleep">
<p>TIL that there's a built-in Sleep shortcut! I've created my own via a Raycast shortcut for <em>years</em> now.<sup><a href="#user-content-fn-my-shortcut" id="user-content-fnref-my-shortcut" data-footnote-ref="true" aria-describedby="footnote-label" class="footnote">3</a></sup> 😭 <a href="#user-content-fnref-sleep" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref footnoteBackLink">↩</a></p>
</li>
<li id="user-content-fn-my-shortcut">
<p>For 'sleep' I use <kbd><kbd>Control</kbd>-<kbd>Option</kbd>-<kbd>L</kbd></kbd>. I use <kbd><kbd>Control</kbd>-<kbd>Option</kbd></kbd> for my own global shortcuts because not much else does. <kbd>L</kbd> because the shortcut, which triggers Raycast's system action <strong>Sleep Displays</strong>, has the effect of <strong>L</strong>ocking my laptop. I may have inherited this from Windows, where <kbd><kbd>Win</kbd>-<kbd>L</kbd></kbd> does the same. <a href="#user-content-fnref-my-shortcut" data-footnote-backref="" aria-label="Back to reference 3" class="data-footnote-backref footnoteBackLink">↩</a></p>
</li>
</ol>
</div>Brainstorming multi-lingual use of Artemis - James' Coffee Bloghttps://jamesg.blog/2026/10/21/brainstorming-multi-lingual-artemis2026-10-21T00:00:00.000ZJames' Coffee Blog
<p>I now follow three websites or feeds whose authors write in French; in at least two cases, the authors write in both French and English. When I see posts in different languages, I use Firefox’s Translate feature to read them. Firefox Translate is not perfect, but as long as I can get the gist of something I am happy (although suggestions for better translation practices, ideally locally, and without complex, internet-connected, or paid technology, would be sincerely appreciated!).</p>
<p>Now that I am seeing more French in my <a href="https://artemis.jamesg.blog">Artemis</a> feed, I have been thinking about what features may be useful to help me make the most of what I see. Here is a snippet of some posts in my web reader right now:</p>
<p><figure><picture><img alt="Five posts in Artemis by four authors. The first three posts are in French. The last two are in English." loading="lazy" src="https://jamesg.blog/assets/artemis-multi-lingual.png" style=" max-width: 130%;"/></picture><div class="alt"><label><input aria-label="Toggle image alt text on screen" type="checkbox"/>ALT</label><div class="content">Five posts in Artemis by four authors. The first three posts are in French. The last two are in English.</div></div></figure></p>
<p>One of the features I am experimenting <sup class="footnote-reference" id="f-1"><a href="https://jamesg.blog/longform-feed#1">1</a></sup> with (seen in the screenshot above) is adding the language code associated with an article before the title of the article, like so:</p>
<blockquote>
<p>[FR] [post title]</p>
</blockquote>
<p>I only add this if the title isn't in a language I know (English).</p>
<p>To determine the language that corresponds with a post, I am using the “<a href="https://pypi.org/project/langdetect/">langdetect</a>” Python package <sup class="footnote-reference" id="f-2"><a href="https://jamesg.blog/longform-feed#2">2</a></sup>. There are likely ways to infer language deterministically (ActivityStreams has a “contentMap” value that contains as keys language codes that map to post content, e.g. “fr” would map to a post written in French).</p>
<p>This feature is most useful when a title is also written in a language I don’t know. The tag gives me a clear visual indication that a post is in a different language before I start reading the title. This helps me while scanning my feed.</p>
<p>One edge case where this tag adds confusion, however, is when all the words in the title happen to be in English. This was the case with one title in my feed, “<a href="https://alexsirac.com/writober-2026-lounge/">Writober 2026 – Lounge </a>”, whose contents are in French but the title is readable in English. In this case, an “[FR]” preface to the title is technically correct, but is jarring given the title co-incidentally is in words that I can read as English.</p>
<p style="text-align: center;">⁂ ⁂ ⁂</p>
<p>Earlier today at HWC Asia/Pacific, I raised the idea of multi-lingual feeds and we had a good discussion. Part of me wants to offer a translated version of a post title, but I am not sure whether I want to be running a full translation model on the server. <a href="https://github.com/argosopentech/argos-translate/">Argos Translate</a> looks like a promising model should I want to go down this path, though I would sincerely appreciate recommendations on this front. The red line is that I want all translation to either happen within Artemis or, if absolutely necessary, the user’s browser. I don’t want to use an external API.</p>
<p>There is an experimental <a href="https://developer.mozilla.org/en-US/docs/Web/API/Translator/translate">Translator API</a> in the browser which could, in theory, allow the use of JavaScript to translate specific parts of the page on load. With that said, this API does not have Firefox or Safari support, and it would mean titles would be translated on every page load.</p>
<p>I am also unsure whether using a translation will deprive me of some part of the experience of seeing multilingual text. I read one Mastodon post in Artemis today that was written in French. I was able to translate the post myself approximately enough to get the joke, even though I know <em>very</em> few words of French. I felt really good after this!</p>
<p style="text-align: center;">⁂ ⁂ ⁂</p>
<p>Reflecting on what multi-lingual features a readers should have has taken me down a long rabbit hole of considerations. If an article has a translated version, could a web reader show an icon to indicate that there is a translated version? Could said reader automatically retrieve the translated version? What could/should Artemis do when the titles of feeds are in a different language? Yesterday I was subscribing to a French blog that uses WordPress. The titles of the feeds were in French and at first I accidentally selected the comments feed as the one to which I wanted to subscribe.</p>
<p>Language use on the web is complicated, and I am only scratching the surface. Stephanie Booth’s talk “<a href="https://www.youtube.com/watch?v=wdAT1P4fKXc">While We Wait for BabelFish: Languages on theInternet</a> [sic]”, although given in 2007, has given me a lot to think about. As I only speak one language (although I do understand the specific Scots dialect/words from where I grew up), I have a limited view of what is best to do. Someone who only speaks one language may prefer a different UI to someone who speaks multiple. That is to say: there is a lot to explore, and I would love help! If you have thoughts, <a href="https://jamesg.blog/email">I would be delighted to hear from you</a>.</p>
<div class="footnote-definition" id="1"><sup class="footnote-definition-label" id="f-3">1</sup>
<p>This experiment is currently enabled only on my account. I do this sometimes so I can get a feel for a feature before releasing it either in the Artemis Labs section of the software as an experiment or as a fully-fledged feature.</p>
<a href="https://jamesg.blog/longform-feed#f-1">[↩]</a></div>
<div class="footnote-definition" id="2"><sup class="footnote-definition-label" id="f-4">2</sup>
<p>Technical note: I check if the post content is more than two words to prevent false positives, something I ran into with short Mastodon posts. This logic will likely need to be made more robust, though.</p>
<a href="https://jamesg.blog/longform-feed#f-2">[↩]</a></div>
<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a4e090377e166586',t:'MTc5MjU4ODg2NQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
<a class="tag" href="https://alexsirac.com/writober-2026-lounge/">Writober 2026 – Lounge</a>
<a class="tag" href="https://developer.mozilla.org/en-US/docs/Web/API/Translator/translate">Translator API</a>
<a class="tag" href="https://github.com/argosopentech/argos-translate/">Argos Translate</a>
<a class="tag" href="https://jamesg.blog/email">I would be delighted to hear from you</a>
<a class="tag" href="https://jamesg.blog/longform-feed#1">1</a>
<a class="tag" href="https://jamesg.blog/longform-feed#2">2</a>
<a class="tag" href="https://jamesg.blog/longform-feed#f-1">[↩]</a>
<a class="tag" href="https://jamesg.blog/longform-feed#f-2">[↩]</a>
<a class="tag" href="https://pypi.org/project/langdetect/">langdetect</a>
<a class="tag" href="https://www.youtube.com/watch?v=wdAT1P4fKXc">While We Wait for BabelFish: Languages on theInternet</a>
Note published on October 20, 2026 at 11:02 PM UTC - Molly White's activity feed6ad7f2fc0ebbcef1160d568e2026-10-20T23:02:20.000ZMolly White<article><div class="entry h-entry hentry"><header></header><div class="content e-content"><p>truly a wild time to be alive when the cryptography world is split between those worried about quantum computers and those whose private key is “4”</p><div class="related-post"><div class="article h-cite hcite"><div class="title"><a class="u-url u-repost-of u-in-reply-to" href="https://arstechnica.com/security/2026/10/the-internet-goes-on-high-alert-after-discovery-of-8-compromised-tls-certs/?utm_source=bsky&utm_medium=social" rel="bookmark">“<span class="p-name">The Internet goes on high alert after discovery of 8 compromised TLS certs</span>”</a>. </div><div class="byline"><span class="p-author h-card">Dan Goodin</span> in <i class="p-publication">Ars Technica</i>. <span class="read-date"></span></div><blockquote class="summary p-summary entry-summary">“That is extremely in the ‘this should not be possible’ category,” Valdorda said. “Maybe some horribly dangerous key generation interface has a ‘size’ parameter and they set it to 1 by mistake???”</blockquote></div></div><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp-block"><div class="timestamp">Posted: <a class="u-url" href="https://www.mollywhite.net/micro/entry/202610201901"><time class="dt-published" datetime="2026-10-20T23:02:20+00:00" title="October 20, 2026 at 11:02 PM UTC">October 20, 2026 at 11:02 PM UTC</time>. </a></div></div><div class="social-links"> <span> Also posted to: </span><a class="social-link u-syndication mastodon" href="https://hachyderm.io/@molly0xfff/117475727199534633" title="Mastodon" rel="syndication">Mastodon, </a><a class="social-link u-syndication bluesky" href="https://bsky.app/profile/molly.wiki/post/3mydqjro3od2x" 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/encryption" title="See all micro posts tagged "encryption"" rel="category tag">encryption</a>. </div></div></footer></div></article>Hilary Duff at the Spark Arena - The Weblog of fLaMEdhttps://flamedfury.com/posts/hilary-duff-at-the-spark-arena/2026-10-20T22:47:52.000ZfLaMEd<p>What’s going on, Internet? Just got back from seeing Hilary Duff at the Spark Arena (on a Tuesday night, whooo).</p>
<p>Great show. I wish I knew her music more as I would have loved to be belting out the lyrics with the rest of the crowd.</p>
<p>Definite millenial energy in the crowd. Loved it.</p>
<p>Hey, thanks for reading this post in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: Hilary Duff at the Spark Arena">Reply by email</a> or add me on <a href="xmpp:flamed@omg.lol">XMPP</a>, or send a <a href="https://flamedfury.com/posts/hilary-duff-at-the-spark-arena/#webmention">webmention</a>. Check out the <a href="https://flamedfury.com/posts/">posts archive</a> on the website.</p>
Read "The Internet goes on high alert after discovery of 8 compromised TLS certs" - Molly White's activity feed6ad7ec7a914413745263cc0d2026-10-20T22:34:34.000ZMolly White<article class="entry h-entry hentry"><header><div class="description">Read: </div></header><div class="content e-content"><div class="article h-cite hcite"><div class="title"><a class="u-url u-repost-of" href="https://arstechnica.com/security/2026/10/the-internet-goes-on-high-alert-after-discovery-of-8-compromised-tls-certs/?utm_source=bsky&utm_medium=social" rel="bookmark">“<span class="p-name">The Internet goes on high alert after discovery of 8 compromised TLS certs</span>”</a>. </div><div class="byline"><span class="p-author h-card">Dan Goodin</span> in <i class="p-publication">Ars Technica</i>. <span class="read-date"> Published <time class="dt-published published" datetime="2026-10-20">October 20, 2026</time>.</span></div><blockquote class="summary p-summary entry-summary">“That is extremely in the ‘this should not be possible’ category,” Valdorda said. “Maybe some horribly dangerous key generation interface has a ‘size’ parameter and they set it to 1 by mistake???”</blockquote><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp">Posted: <time class="dt-published" datetime="2026-10-20T22:34:34+00:00" title="October 20, 2026 at 10:34 PM UTC">October 20, 2026 at 10:34 PM UTC</time>. </div></div></footer></article>AI can weaken relationships between people - and teams suffer as a result. - Werd I/O6ad7a9bf7e1d7000013c22652026-10-20T17:49:51.000ZWerd I/O<p>Link: <a href="https://hbr.org/2026/10/team-dynamics-weaken-when-employees-turn-to-ai-instead-of-colleagues"><em>Team Dynamics Weaken When Employees Turn to AI Instead of Colleagues, by Kate Niederhoffer, Kristina Rapuano, Alex Liebscher, Alexi Robichaux and Jeffrey T. Hancock in Harvard Business Review</em></a></p><p>Relationships take time, effort, and practice to keep alive. So in a sense, it shouldn’t be a surprise to see this finding from a survey of more than a thousand desk workers across 20 industries:</p><blockquote>“The more they turned to AI instead of a teammate, the more their trust in each other and their ability to coordinate seemed to erode.”</blockquote><p>It turns out that if you start asking an AI system instead of your colleague, coordination and trust drop by at least 20%. These technologies are still relatively new; I imagine that over time this will continue to drop. People who feel isolated in their work today will feel more so as this trend solidifies. Similarly, people who feel untrusted today will only feel more so as their teams continue to ask AI systems instead of them.</p><p>That doesn’t mean AI is always inherently bad. Like all work processes, it demands that we think hard about culture: what kinds of behaviors and feelings do we want to promote? What’s important to the organization? And do we care more about an individual’s productivity than creating a high-performing team? (We shouldn’t.)</p><p>This also rings true:</p><blockquote>“People consistently underestimate how enjoyable a human conversation turns out to be. Whether the motivation is fear of judgment or a desire not to impose, avoiding a colleague is hardly a new workplace behavior. AI now provides an alluring alternative that forgoes the social and emotional costs of getting support.”</blockquote><p>One way we can counteract this is by making asking for help (and giving it) an explicit norm in our team cultures, and leading by example by doing it ourselves. In remote or hybrid teams that rely on tools like Slack, that also means doing it in a non-private channel, so that other team members can see it and it can become normalized.</p><p>Although a bit of a cliché and genuinely heinous if they’re done poorly, I think standups can also be really helpful here, if you can do them live. Here, everyone goes round a circle and talks briefly about what they’re working on, with explicit needs for help made as part of the update. Implicit requests for help can be answered once everyone has gone around the circle.</p><p>Can AI help? Totally. As the authors discuss in this piece, you can use technology to help conversations to happen asynchronously, particularly on teams that spread across multiple timezones, and it can actively facilitate connections between people.</p><p>Let’s do that, instead of displacing our people and our relationships. AI can be a facilitator between people, but it should never be an intermediator: our relationships, our communities, and our companies will suffer.</p>Foursquare died at the hands of private equity. What happens next? - Werd I/O6ad79ac77e1d7000013c22432026-10-20T16:45:59.000ZWerd I/O<p>Link: <a href="https://teendrama.substack.com/p/some-final-words-on-foursquare?utm_id=97760_v0_s00_e0_tv4&just_subscribed=true"><em>Some final words on Foursquare, by Dennis Crowley</em></a></p><p>I freaking loved Foursquare. It was a wonderful way to explore cities with the help of my friends: in the same way that Upcoming was my best way of figuring out which events I should be going to, Foursquare let me know which restaurants, bars, parks, etc, were worth checking out. If Chris ranked a cocktail bar, you know it was amazing. Aaron always found the best coffee spots. And so on: my friends were better recommenders than any other source I had.</p><p>My own map lists every state and country I’ve been to over the last few decades. If I’m back in Amsterdam, I can figure out which Indonesian food place I really loved, because there it is on my map. (It’s <a href="https://paonbali.nl/">Paon Bali</a>, by the way. You’re welcome.)</p><p>So this was sad to see as an outcome. I think there are a bunch of important lessons here – not least the dangers of raising too much too soon without tethering the business to revenue. But at the same time, Foursquare launched during a startup explosion, and this kind of fundraising was the norm; I don’t fault Dennis for his decisions. The bigger problem seems to have been the private equity leadership more recently. I can’t think of a time when private equity <em>hasn’t</em> led to toxic leadership and a strip-mined company with an inequitable deal for employees.</p><p>Which leads me to an obvious problem. That check-in data is intimate stuff. It probably shouldn’t be something private equity can just inherit and do <em>whatever</em> with. Journalists and activists should hopefully not have been using Foursquare to check in; if they did, that data can almost certainly have been bought for analysis. And then a future-facing question: how might we have these kinds of social effects <em>without</em> sacrificing privacy?</p><p>Regardless, I’m pouring one out for Foursquare. I loved it. Thanks to everyone involved for building something that I found genuinely meaningful.</p>2026-10-20 16:31: Hooman, we are ready to receive your apple core. 🍎 - Kev Quirkhttps://kevquirk.com/2026-10-20-16312026-10-20T15:31:00.000ZKev Quirk<p>Hooman, we are ready to receive your apple core. 🍎</p>
<p><img loading="lazy" src="https://kevquirk.com/content/images/2026-10-20-1631/1000012549.webp" alt="1000012549" /></p> <div class="email-hidden">
<hr />
<p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p>
<p>You can <a href="mailto:19gy@qrk.one?subject=2026-10-20%2016%3A31">reply to this post by email</a>, or <a href="https://kevquirk.com/2026-10-20-1631#comments">leave a comment</a>.</p>
</div>Book Review: Quackery - A Brief History of the Worst Ways to Cure Everything by Lydia Kang ★★★⯪☆ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=742962026-10-20T11:34:35.000ZTerence Eden’s Blog<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/08/9781523501854.webp" alt="Book cover." width="200" class="alignleft size-full wp-image-74298">
<p>This is a charming and funny book all about the various ways humans have promoted fake medical cures in exchange for money.</p>
<p>Despite the grim (and occasionally distressing) subject matter, the tone remains light and poppy throughout. There are lots of snarky asides (especially about the fake medical practitioners) and a real appreciation for the bizarre. It's fun the whole way through, although sometimes at the expense of people who perhaps didn't know better than to trust charlatans.</p>
<p>One thing that is constantly brought back is how it can be hard to determine what <em>is</em> patent nonsense and what is a <i lang="la">bone fide</i> cure:</p>
<blockquote><p>Prevent blood clotting: Extract mucus from the intestinal membranes of slaughtered pigs or from the lungs of slaughtered cows. Inject. (heparin)</p></blockquote>
<p>Is that any more believable than injecting goat testicles to cure impotence?</p>
<p>It also brings to light how squeamish we can be, especially when faced with unusual medical procedures:</p>
<blockquote><p>We borrow other people’s wombs for surrogacy. And yet, plenty of people squirm at the idea of breastmilk banks. We are a society of contradictions.</p></blockquote>
<p>The eBook is <em>beautifully</em> formatted. For once, images are in-line with the text! Usually in books of this sort, publishers treat the eBook like a mass-market paperback and stick the illustrations at the end.</p>
<p>It ends rather abruptly, after taking us through light, electricity, colour therapy, animal magnetism, and a couple of dozen other "cure-alls"</p>
<p>Sadly, there are no references or footnotes. While I have no reason to doubt the veracity of the claims, for a book about scientific misinformation and malpractice, I'd've expected a way to find out more information.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=74296&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">Wonders of Web Weaving, Episode 24 - James' Coffee Bloghttps://jamesg.blog/2026/10/20/www-242026-10-20T00:00:00.000ZJames' Coffee Blog
<p><a href="https://web-weaving.jamesg.blog/24">The twenty-fourth episode of Wonders of Web Weaving is out</a>:</p>
<blockquote>
<p>In Episode 24, I chat with <a href="https://alexsirac.com">Alex</a>, the author of <a href="https://alexsirac.com">alexsirac.com</a> about, among other things, collective intelligence in public commons, what the IndieWeb can learn from Wikipedia, community in comments, and more.</p>
</blockquote>
<p>I hope you enjoy the episode!</p>
<p><a href="https://web-weaving.jamesg.blog/subscribe/" rel="noreferrer"><em>Wonders of Web Weaving also has an RSS feed</em></a><em> you can use to follow along from wherever you get your podcasts.</em></p>
<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a4d68aa16febfced',t:'MTc5MjQ4Mzc3OA=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
<a class="tag" href="https://alexsirac.com">Alex</a>
<a class="tag" href="https://alexsirac.com">alexsirac.com</a>
<a class="tag" href="https://web-weaving.jamesg.blog/24">The twenty-fourth episode of Wonders of Web Weaving is out</a>
<a class="tag" href="https://web-weaving.jamesg.blog/subscribe/">Wonders of Web Weaving also has an RSS feed</a>
contours - James' Coffee Bloghttps://jamesg.blog/2026/10/19/contours2026-10-19T00:00:00.000ZJames' Coffee Blog
<p>Spectra of coherence — ground, sky; all presents. // Deconstruct.<br/>
Where do I find the word that embodies a step?<br/>
— elevation, propulsion, placing; in cycles, forward, forward.<br/>
A mirror of irreducibility.<br/>
How can a word reflect my cold nose, dripping with winter air,<br/>
Breathing in fast, deeply.<br/>
Stories, of moments — <br/>
Collapsed colour, stark senses, every expression:<br/>
Poem, no contours; possible?<br/>
(But in contours definition exists.)</p>
seen - James' Coffee Bloghttps://jamesg.blog/2026/10/19/seen2026-10-19T00:00:00.000ZJames' Coffee Blog
<p>A flat sky<br/>
Field of fog<br/>
Hidden hills<br/>
Echoes of snowfall —<br/>
Not yet.</p><script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a4d03410e99dec6f',t:'MTc5MjQxNzMxOA=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>