Shellsharks Blogroll - BlogFlock2026-08-12T14:52:44.610ZBlogFlockAdepts of 0xCC, destructured, Aaron Parecki, fLaMEd, Trail of Bits Blog, Westenberg, gynvael.coldwind//vx.log (pl), James' Coffee Blog, joelchrono, Evan Boehs, Kev Quirk, cool-as-heck, Posts feed, Sophie Koonin, cmdr-nova@internet:~$, <span>Songs</span> on the Security of Networks, Werd I/O, Johnny.Decimal, Robb Knight, Molly White, Hey, it's Jason!, Terence Eden’s BlogHTML Day 2026 - The Weblog of fLaMEdhttps://flamedfury.com/posts/html-day-2026/2026-08-12T20:18:41.000Z<p>What’s going on, Internet? Last Saturday was <a href="https://2026.html.energy/" rel="noopener">HTML Day</a>, a yearly celebration of hand-writing HTML started by Elliott Cost and Laurel Schwulst. Meetups happen in cities all over the world, and <a href="https://zacharykai.net/events/htmlday" rel="noopener">Zachary Kai</a> ran an online session for those of us nowhere near one. Ten minutes of introductions, forty minutes of writing HTML, ten minutes sharing what we made. Zachary has a <a href="https://zacharykai.net/notes/html26recap" rel="noopener">recap of the session</a> up on his site.</p>
<p>I went in with a plan. At the recent <a href="https://flamedfury.com/posts/my-first-hwc/">Homebrew Website Club</a> I talked about a question we hear all the time at the <a href="https://32bit.cafe/" rel="noopener">32-Bit Cafe</a>: “What should I put on my website? I don’t know what to put on my website.” These web surfers have the HTML and CSS basics down. Their homepages are full of badges, blinkies and custom cursors. What they don’t have is content. After thirty seconds of surfing I know nothing about the person behind the site.</p>
<p>So for HTML Day I started hand-writing a little zine about it: Grow Your Website. Forty minutes was enough to plant the first pages. I’ll finish the rest over the weekend and share the link once it’s online.</p>
<p>The method is one page and a way to grow it. You start with a seed: a title, a paragraph about who you are, and a bullet list of your interests. The intro grows into an about page. A bullet grows into its own page. The new page grows its own list, and every item on it is another seed. Repeat forever, because a website is never finished.</p>
<p>The zine needed someone to grow a site, so I invented PyRo, a webmaster from Aotearoa who works at a garden centre, has a cat called Savage, and listens to a lot of NZ hip-hop. PyRo’s site is the example the zine follows. When it’s finished you can click through the zine and watch it grow from one page to five. (PyRo was one of my earliest handles.)</p>
<p>PyRo has good taste too. The NZ hip-hop page covers the Years Gone By crew, the Zips (+++!) collective, and a few others. That list deserves a proper post of its own. More on that soon.</p>
<p>Hey, thanks for reading this post in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: HTML Day 2026">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/html-day-2026/#webmention">webmention</a>. Check out the <a href="https://flamedfury.com/posts/">posts archive</a> on the website.</p>
Rebirth - Kev Quirkhttps://kevquirk.com/rebirth2026-08-12T07:48:00.000Z<div class="book card"><h2>Rebirth</h2><p><b>Author:</b> RR Haywood<br><b>Genre:</b> Sci-fi<br><b>Released:</b> 2026<br><b>Rating:</b> <span class="star-rating"><span class="star-rating" aria-label="4/5 ★★★★☆">★★★★☆</span></span></p><p>How do you prevent a hero from saving the world?In the first trilogy, three heroes were extracted from their timelines to save the world. Now we need them again.</p>
<p>Meet Ben Ryder, Safa Patel, and Harry Madden.</p>
<p>Just not as you knew them.</p>
<p>Three selfish b*stards who hate each other almost as much as they hate everyone else.</p>
<p>REBIRTH takes us back into the Extracted world for another wild adventure chock-full of Nazi gold, Soviet soldiers, dystopian future landscapes, greed, lust, wrath ... and a sabre-toothed tiger called Tiddles.</p><p><a class="button" target="_blank" href="https://www.goodreads.com/book/show/251460796-rebirth-the-instant-1-time-travel-adventure">Learn more on Goodreads ➡</a></p></div>
<hr>
<p>The 4th book in the Extracted series, RR Haywood continues to make these books great.</p>
<p>It's a complete pivot from the first trilogy of books. Same characters, but completely different storyline. The book ends with <em>"to be continued..."</em> so I'm hoping this will be another trilogy of books, as the story is just getting started. Great series of books, highly recommended.</p>
<p>A few people have recommended <a href="https://www.goodreads.com/book/show/211721806-dungeon-crawler-carl" rel="noopener noreferrer">Dungeon Crawler Carl</a> to me, and I think I'm in the mood for something with a little more humour. So that's what I'm going to start reading next.</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=Rebirth">reply to this post by email</a>, or <a href="https://kevquirk.com/rebirth#comments">leave a comment</a>.</p>
</div>Impressions; museums - James' Coffee Bloghttps://jamesg.blog/2026/08/12/impressions-museums2026-08-12T00:00:00.000Z
<p>On my desk there is a painting of Monet’s “Bridge over a Pond of Water Lilies” <sup class="footnote-reference" id="f-1"><a href="https://jamesg.blog/longform-feed#1">1</a></sup> that I purchased when I was on holiday last year. I wanted to bring something back that I could put in my living space, something that would both be a memory of the trip but also a work of art in itself to be enjoyed. Every time I go to my desk, the painting is there: a reminder of one of my favourite artists.</p><p>I brought back a fridge magnet from the same trip, too, which brings art to the kitchen. And when I go to museums I like to collect pin badges. I keep them with all the other mementos I collect: gallery tickets, maps, and other artefacts from a trip. I don’t look at my badges often, but I love having a little collection of things that grows only when I happen to be in a museum gift shop and see a badge I like.</p><p>This week, I have been thinking about how these artefacts are only the beginning of what I “bring back” from museums. After I visit a museum, I bring home memories of art, maps of the space I walked through, memories of specific places, of the people with whom I visited a museum, of all the moments I had before, during, and after my visit. I remember the discussions about works of art, of being intrigued by what stood out to people I know.</p><p>I bring back questions and perspectives. Why do some paintings stand out more than others? What if we had mini galleries all across the country to show artefacts that national galleries do not have space to put on display? What would an artist’s workshop in 1500s Italy be like? Why are art museums so magnetic?</p><p>I bring back the feeling of moving between rooms – of noticing that the narrow entranceway with two small doors is an opportunity to be kind to others by holding the door open, of feeling the textures change beneath my feet as I go from the stone floor of the entrance to the carpeted area of the museum, and of feeling textures of the carpet change as I move between rooms and floors and spaces. I bring back my memories of the architecture: the tall ceilings, the pillars, the walls, the rooms, how rooms connect.</p><p>These solidify with time; every visit an opportunity to reinforce a memory, while also being at the whims of the serendipity that art galleries create.</p><p>I was recently talking with a friend about the room of Rembrandt paintings in the National Gallery in London. I last visited several months ago. I don’t know how long I spent in the room; it was quite a while. I was fascinated by every painting: all of the varying expressions, all of the people, all of the stories; and, the conversations I had in the gallery with other visitors. When I was talking with my friend, I could see the arrangement of the room. I didn’t know what paintings were where, but I knew roughly how many there were. I guessed 18. There were 19. <sup class="footnote-reference" id="f-2"><a href="https://jamesg.blog/longform-feed#2">2</a></sup></p><p>I have similarly vivid memories of different rooms: of the corner of the room in The Met where Monet’s Ice Floes painting is on display, of the wall of Romantic paintings in the National Gallery of Scotland, of the part of the Courtauld Institute in London where Manet’s A Bar at the Folies-Bergère <sup class="footnote-reference" id="f-3"><a href="https://jamesg.blog/longform-feed#3">3</a></sup> is on display, and where there are so many other paintings I love.</p><p>I bring back snippets of knowledge I learn from information plaques. I don’t remember most of the details I read, but what I do read helps me understand a work in the moment, and influences the impression that I will take away. There are some details I will remember; paintings with vivid stories, paintings that use a technique I have never seen before, information plaques where the author has included a detail that sticks in my mind.</p><p>Museums leave a lingering impression on my mind, each one a home both of art and of memories.</p>
<div class="footnote-definition" id="1"><sup class="footnote-definition-label" id="f-4">1</sup>
<p> https://www.metmuseum.org/art/collection/search/437127</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-5">2</sup>
<p>https://courtauld.ac.uk/highlights/a-bar-at-the-folies-bergere/</p>
<a href="https://jamesg.blog/longform-feed#f-2">[↩]</a></div>
<div class="footnote-definition" id="3"><sup class="footnote-definition-label" id="f-6">3</sup>
<p>https://www.nationalgallery.org.uk/visiting/floorplans/level-2/room-22</p>
<a href="https://jamesg.blog/longform-feed#f-3">[↩]</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:'a29f7944cac76c7a',t:'MTc4NjUzNzY0MQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
<a class="tag" href="https://jamesg.blog/longform-feed#1">1</a>
<a class="tag" href="https://jamesg.blog/longform-feed#2">2</a>
<a class="tag" href="https://jamesg.blog/longform-feed#3">3</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://jamesg.blog/longform-feed#f-3">[↩]</a>
Edinburgh Fringe - Justina Seselskaite: Settled ★★★★☆ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=739302026-08-11T22:23:14.000Z<p>Sometimes at the Edinburgh Fringe, you take a punt on a random show because it's close by and you can't be bothered walking any further. Justina Seselskaite's set was round the corner and started in 7 ½ minutes - so we scurried into one of the less glamorous rooms of The Hilton, sat at the front (as is our wont), and wondered what on earth Lithuanian stand-up was like.</p>
<p>It was sublime!</p>
<p>There's a rich history of foreign comedians coming to these shores and <del>stealing our jobs</del> making us laugh by pointing out the UK's foibles as only an outsider can. Seselskaite has a witty outlook on the perils of being mistaken for Polish while working in Waitrose, how high-class a Wetherspoons is, and what's up with Manchester’s weird obsession with bees.</p>
<p>The show isn't the most innovative thing on the Fringe; it's mostly straight stand-up. But the game of "guess which English song was plagiarised by Lithuanian singers" was surprisingly entertaining. OK, I won a badge by guessing correctly, so I'm biased.</p>
<p>Settled is a solid piece of work which has obviously been road-tested and honed into a tight set. Excellent observational stand-up from a unique perspective (come on, how many other Lithuanian comedians have you been to see?).</p>
<p><a href="https://www.edfringe.com/tickets/whats-on/justina-seselskaite-settled"><img src="https://shkspr.mobi/blog/wp-content/uploads/2026/08/settled-poster.webp" alt="Poster for a comedy show." width="1347" height="1679" class="aligncenter size-full wp-image-73933"></a></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=73930&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">Published on Citation Needed: "Issue 108 – In a word, applesauce" - Molly White's activity feed6a7ba02552b01ca28c3fefcb2026-08-11T22:20:21.000Z<article class="entry h-entry hentry"><header><div class="description">Published an issue of <a href="https://www.citationneeded.news/"><i>Citation Needed</i></a>: </div><h2 class="p-name"><a class="u-syndication" href="https://www.citationneeded.news/issue-108" rel="syndication">Issue 108 – In a word, applesauce </a></h2></header><div class="content e-content"><div class="media-wrapper"><a href="https://www.citationneeded.news/issue-108"><img src="https://www.citationneeded.news/content/images/size/w2000/format/webp/2026/08/applesauce.jpg" alt="A spoon lifting a spoonful of applesauce from a glass bowl"/></a></div><div class="p-summary"><p>Firms close up shop amid a continued crypto winter, a Trump venture ditches its crypto plans, and the Clarity Act fails to reach a vote before August recess</p></div></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp">Posted: <a class="u-url" href="https://www.citationneeded.news/issue-108"><time class="dt-published" datetime="2026-08-11T22:20:21+00:00" title="August 11, 2026 at 10:20 PM UTC">August 11, 2026 at 10:20 PM UTC</time>. </a></div><div class="social-links"> <span>Also posted to:</span><a class="social-link u-syndication mastodon" href="https://hachyderm.io/@molly0xfff/3mstn4jce322z" title="Mastodon" rel="syndication">Mastodon</a><a class="social-link u-syndication bluesky" href="https://bsky.app/profile/molly.wiki/post/3mstn4jce322z" 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/feed/tag/crypto" title="See all feed posts tagged "crypto"" rel="category tag">crypto</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/donald_trump" title="See all feed posts tagged "Donald Trump"" rel="category tag">Donald Trump</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/prediction_markets" title="See all feed posts tagged "prediction markets"" rel="category tag">prediction markets</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/sec" title="See all feed posts tagged "SEC"" rel="category tag">SEC</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/trump_administration" title="See all feed posts tagged "Trump administration"" rel="category tag">Trump administration</a>.</div></div></footer></article>Edinburgh Fringe: Handel Nine German Arias ★★★⯪☆ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=739112026-08-11T20:21:05.000Z<p>Part of going to The Fringe is to expose yourself to new ideas, different art forms, and a range of artworks. Not everything needs to be a "zany" comedy about AI or a loving pastiche of that 1990s disaster movie you love.</p>
<p>So I found myself sat in a Unitarian Church listening to a harpsichord and choral organ intertwined with a violin and cello while a soprano soared through Handel's greatest hits.</p>
<p>I'm too much of a philistine to assess its merits - but there's always pleasure watching technically accomplished professionals at the top of their game. I assumed they played the right notes (and in the right order) as the music was delightful.</p>
<p>It was restful and restorative after a long day pounding Edinburgh's pavements.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=73911&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">Leviathan Falls - Joel's Log Fileshttps://joelchrono.xyz/blog/leviathan-falls2026-08-11T18:50:00.000Z<p>So, The Expanse is over, at last, and I will probably write a different post talking about the whole series and my thoughts overall. For now, these are only my thoughts on the last book, let’s get to them, after the summary!</p>
<blockquote>
<p>The Laconian Empire has fallen, setting the thirteen hundred solar systems free from the rule of Winston Duarte. But the ancient enemy that killed the gate builders is awake, and the war against our universe has begun again.</p>
<p>In the dead system of Adro, Elvi Okoye leads a desperate scientific mission to understand what the gate builders were and what destroyed them, even if it means compromising herself and the half-alien children who bear the weight of her investigation. Through the wide-flung systems of humanity, Colonel Aliana Tanaka hunts for Duarte’s missing daughter. . . and the shattered emperor himself. And on the Rocinante, James Holden and his crew struggle to build a future for humanity out of the shards and ruins of all that has come before.</p>
<p>As nearly unimaginable forces prepare to annihilate all human life, Holden and a group of unlikely allies discover a last, desperate chance to unite all of humanity, with the promise of a vast galactic civilization free from wars, factions, lies, and secrets if they win.</p>
<p>But the price of victory may be worse than the cost of defeat.</p>
</blockquote>
<p>This book is the last stand and as such, it had a lot of things going on and it has to deal with bringing closure to plenty of plotlines. This book goes rather fast, introducing a character we already know as the main antagonist of the whole ordeal. Except we also have a returning antagonist and of course the alien menace that wants to destroy all of Humanity!</p>
<p>Somehow—and this is the first chapter of the book but a spoiler if you haven’t read the previous book!—Duarte has managed to regain a certain consciousness. And just like that, he has managed to vanish from Laconia, escaping through unknown means towards the ring gates.</p>
<p>With pretty much no clue as to where he went, Trejo—Laconia’s very, very tired interim leader—gives Colonel Tanaka—featured in the first book of the last trilogy—ultimate authority for a mission to find him. Of course, through her perspective we will discover a rather interesting character with a lot of problems and a temperament that is not particularly pleasant. All she cares about is the mission, but we will soon find out about her secrets, and how these will intertwine and clash with her decisiones and behaviour as the story moves forward.</p>
<p>Elvi is the one who ended up in charge of every investigation regarding alien technology for the Laconian Empire, and with the help of some friends, they’ll be doing their best to decipher the mystery behind the aliens who built the ring gates, as well as clues as to how to defeat the aliens that remain, the ones who have caused Humanity to go unconscious and some ships to go Dutchman or be torn apart in strange ways. There will also be some interesting chatter about what science is willing to do for the sake of knowledge and the like here.</p>
<p>Through Naomi, Holden and Alex, we will follow the Rocinante as they live a life as fugitives alongside Teresa Duarte, the newest teenage crewmate in the ship—actually two counting her dog!—who happens to be the heir to the Empire’s throne and their main shield against the Laconian ships utterly destroying them on sight. Each of these characters will go through some interesting challenges, with Naomi as the leader of the underground, managing 1300 little groups, Jim Holden dealing with his trauma and the stress of making hard decisions for the sake of others, and Alex being separated from his family and keeping the Rocinante afloat.</p>
<p>Teresa will be an interesting view point, due to her advanced education yet her lack of experience and young eyes. Being on the run, she learns to embrace her place in the Rocinante, plus some engineering thanks to Amos, who continues to treat her as a normal kid despite himself being very much not a normal human anymore, which the others still struggle with. Of course, she also has to deal with the fact her father is a crazy person living a power fantasy, and that pretty much everybody is after her.</p>
<p>Another new point of view will be that of Kit, Alex’s son, who has a pretty personal and human story, where he’s trying to do his best to provide for his wife and their young baby, while taking on a trip for new opportunities on a different planet. As normal as this sounds, there will be quite a lot of drama going on here too, and I ended up caring quite a bit for the wellbeing of everybody here.</p>
<p>This has way too many plots going on at the same time, and the stakes are as big as ever, we get to see glimpses of cosmic scale stuff. We will go to a couple places, meet some characters under dire circumstances, do a lot of epic ship manouvers and combat and space wars and the like. The conflict between the underground and Laconian and the alien entities will be something to behold!</p>
<p>Despite everything, I think the book sticks the landing rather well. It does leave me with a lot of questions, but you can sort of guess how things would go from there, and that’s perfectly okay.</p>
<p>I will now provide a list with some spoilered complaints and moments I found weird, which is something I didn’t do for the previous books, but anyway.</p>
<details>
<summary>Some spoilers and rambley thoughts</summary>
<ul>
<li>
<p>I feel like bringing Duarte back was a very weird decision that undermined a lot of the previous novel. A part of me feels like he wasn’t truly necessary and I don’t particularly enjoy what he does. However, he does move the plot forward.</p>
</li>
<li>
<p>The idea of leaving Teresa in some random school should not have even crossed their minds. Like, isn’t facial recognition a thing? It should not have gone that wrong.</p>
</li>
<li>
<p>Tanaka is way too crazy for an antagonist, like, it’s hard to think of her as an actual human that exists. So many of her decisions are questionable for a leader, especially after the class she seemed to have on the first novel. The one thing she did well was giving everyone pills to withstand the mind control.</p>
</li>
<li>
<p>That said, having some pills that are capable of resisting the hivemind feels a bit flakey, like I’m not sure it’s something that should have worked at all.</p>
</li>
<li>
<p>Having Duarte take charge against the resistance with the hivemind instead the evil alien entities doing something felt weird to me, I was not super satisfied with how being primates instead of jellyfish actually helps.</p>
</li>
<li>
<p>I do like how the fact we keep using the gates helps to “confuse” the aliens and fool them into thinking their experiment didn’t work even though they did manage to kill a whole solar system with humans on it.</p>
</li>
<li>
<p>The hive mind of Humanity kind of feels like the finale of another novel which I won’t mention here but I read it, also like a certain anime which I won’t mention either.</p>
</li>
<li>
<p>One of the questions I wish I had answers for was Cara and Xan. It seems like Cara was getting addicted to the experiments but I don’t see how that would necessarily damage her any further if they had done a few more experiemnts you know?</p>
</li>
<li>
<p>Ghost Miller coming back was absolutely epic for me, it worked and I loved it and it was nice to see him once again.</p>
</li>
<li>
<p>I really enjoyed seeing Amos being epic in the faraway future, very cool stuff.</p>
</li>
<li>
<p>I miss these characters so much already, what happened to Alex and his family? Naomi is pretty much alone again, though I guess she’d adopt Teresa as a sort of future leaer along Amos or something, or just help her live a normal teenage life while things are rebuilt.</p>
</li>
<li>
<p>I actually don’t care that much about all of these comments, I really loved the book as what it is and how it ties things and I enjoy that they didn’t answer quite a lot of things.</p>
</li>
</ul>
</details>
<p>In any case, read the whole series right now!</p>
<p>This is day 16 of <a href="https://100DaysToOffload.com">#100DaysToOffload</a> and day 11 of <a href="https://nerdgirlthoughts.game.blog/2026/07/15/blaugust-2026-is-coming">#Blaugust2026</a></p>
<p>
<a href="mailto:me@joelchrono.xyz?subject=Leviathan Falls">Reply to this post via email</a> |
<a href="https://fosstodon.org/@joel/117078428474845872">Reply on Fediverse</a>
</p>Edinburgh Fringe: Hamlet The Musical ★★☆☆☆ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=739062026-08-11T18:19:16.000Z<p>🎼"Hamlet's Mum Has Got It Going On"🎵</p>
<p>There you go, now you've seen the show. That's about the height it reaches. Distil the tortured Prince of Denmark down to an hour and sprinkle in parody pop songs.</p>
<p>It so nearly works. There are a few good chuckles and a smattering of clever lyrics but, even for an hour, it feels a bit flabby.</p>
<p>The cast are game, with KT Ihnatyszyn giving a tour-de-force performance as Hamlet. But for every decent pun there's a piece of uninspired mugging to the audience.</p>
<p>The main weakness is that it looks <em>cheap</em>. There can be a certain charm to "we'll put on the show right here - I just think Fringe audiences deserve better than tatty cardboard props and flimsy plastic swords.</p>
<p>Tightened up, it could be something really special - it just fell flat for me.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=73906&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">How Trail of Bits helps verify the integrity of your Signal chats - Trail of Bits Bloghttps://blog.trailofbits.com/2026/08/11/how-trail-of-bits-helps-verify-the-integrity-of-your-signal-chats/2026-08-11T17:30:00.000Z<p>Every Signal chat starts the same way: the client asks the Signal server for the public key associated with your contact’s phone number. But how do you know the server gave you the right key? A compromised server could provide a false public key, allowing the client to encrypt messages to an attacker rather than the intended recipient.</p>
<p>Until now, the only way to detect such malfeasance was to verify safety numbers with your contact in person or over a trusted channel. Signal recently launched an alternative: <a href="https://signal.org/blog/automatic-key-verification">Automatic Key Verification</a>, a feature that helps validate that your chats are secure without requiring direct <a href="https://support.signal.org/hc/en-us/articles/360007060632-What-is-a-safety-number-and-why-do-I-see-that-it-changed">safety number comparison</a>. Trail of Bits built and operates one of the three auditors that make this system trustworthy. Our auditor, which is an independent implementation written from scratch, continuously checks that the Automatic Key Verification system behaves honestly.</p>
<h2 id="how-key-verification-works">How key verification works</h2>
<p>Automatic Key Verification is a form of “key transparency” that makes mismatch attacks harder to hide by creating a globally consistent view of the set of public keys associated with each phone number. The Signal app now performs a periodic self-check to ensure that all keys stored in the global map for your account belong to your devices. If the app is unable to verify the log, or finds that not all keys are expected, the user is presented with a warning that “Automatic Key Verification is currently unavailable for your device.” Automatic Key Verification may also be unavailable for other reasons, as outlined in <a href="https://support.signal.org/hc/en-us/articles/10223569377562-Automatic-Key-Verification">Signal’s documentation</a>.</p>
<h2 id="what-our-auditor-does">What our auditor does</h2>
<p>Automatic Key Verification depends on external auditors. Trail of Bits helps this system function by providing external verification that the user ↔ public key map is globally consistent and well formed, and does not hide any entries. Each time a new entry is added, we update our local copy of the map, stored as a Merkle tree. Periodically, we sign the head of the tree using a signing key that only we know. Because we commit to only ever signing one consistent lineage of Merkle trees, clients know that they are seeing the same set of public keys as everyone else in the system. Clients currently require signatures from each of three auditors: one operated by Signal, one operated by Cloudflare, and one operated by Trail of Bits.</p>
<p>When Automatic Key Verification is turned on, the Signal client periodically fetches Merkle tree heads from the Signal key transparency server. The client <a href="https://github.com/signalapp/libsignal/blob/main/rust/keytrans/src/verify.rs#L136-L268">requires</a> that each tree head belong to a lineage endorsed by all <a href="https://github.com/signalapp/libsignal/blob/622d0d52471f3cc9215fe4e9abaac1970018f79c/rust/net/src/env.rs#L392">registered auditors</a> within the last seven days. If the server does not present valid auditor signatures, the client will raise a warning and Automatic Key Verification will fail. A fully malicious server may therefore maintain a split view of the system for at most one week before client applications start to display warning messages.</p>
<p>We chose to implement our auditor from scratch, based on the <a href="https://github.com/trailofbits/signal-auditor/blob/main/docs/Key_Transparency_Auditor_Spec.pdf">specification</a>, to provide independent verification; the code is <a href="https://github.com/trailofbits/signal-auditor">open source</a>. Signal also publishes a <a href="https://github.com/signalapp/key-transparency-auditor">reference implementation</a>.</p>
<p>We will provide updates to this blog post if we need to make substantive changes to our signing policy, such as resetting the state of our auditor or rotating our signing key. Our current public key is:</p>
<figure class="highlight">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">7fe5d91de235188486d8fb836a6da37e625e2b10eb6d144185b9364cc83cbbb6</span></span></code></pre>
</figure>
<h2 id="how-to-use-automatic-key-verification">How to use Automatic Key Verification</h2>
<p>You can enable Automatic Key Verification in Signal by going to “Settings &gt; Privacy &gt; Advanced” and enabling Automatic Key Verification. In supported chats, you can verify the public key of your counterparty by visiting the safety number verification screen and clicking “Verify Automatically.” Automatic Key Verification often does not support chats where you started the conversation by searching for a recipient&rsquo;s username. See Signal’s <a href="https://support.signal.org/hc/en-us/articles/10223569377562-Automatic-Key-Verification">help page</a> for more information. If automatic verification fails, users should fall back on safety number comparison.</p>
<h2 id="why-were-doing-this">Why we’re doing this</h2>
<p>We believe that free and private communication is a critical public good. We are not paid by Signal or any other party for this service; we operate it in the interest of users and the community broadly.</p>
<p>Some form of public key integrity is an important component of any full end-to-end encryption system. If you would like to implement key transparency or end-to-end encryption generally, <a href="https://trailofbits.com/contact/">contact us</a>.</p>Edinburgh Fringe: Afronauts ★★★★☆ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=738912026-08-11T16:17:12.000Z<p>Afrofuturism is a hot topic in the world of sci-fi. This is the circus version of "For All Mankind" where the Zambia Space Academy (<a href="https://en.wikipedia.org/wiki/Edward_Makuka_Nkoloso">a 100% real thing</a>) attempt to land on the moon and win the space race.</p>
<p>Told in an acrobatic style, naturally.</p>
<p>It is delightful to see classic acrobatics find a whole new audience - the children in the audience (and the adults) screamed with delight at the human pyramids, handstands, cartwheels, and aerial work.</p>
<p>An absolutely joyful cast of kinesthetic clowns bring to life the bizarre and (again) <a href="https://airandspace.si.edu/stories/editorial/story-behind-zambian-space-program">absolutely true story</a>.</p>
<p>Lots of fun, a heartfelt message, and a zippy soundtrack. No way to describe it other than fun for all ages.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=73891&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">An unusual commute to work - Joel's Log Fileshttps://joelchrono.xyz/blog/an-unusual-commute-to-work2026-08-11T14:50:00.000Z<p>I usually take the bus to work, this is provided for free by my workplace.</p>
<p>Today however, I was on a rush, I got out of my house way too late and I knew I would have to run if I wanted to make it in time…</p>
<p>I didn’t want to run.</p>
<p>Instead, I knew that I could make it to the opposite side of the neighborhood and catch a regular bus. If it arrived on time, I could rendezvous with my work transport just in time.</p>
<p>The public bus failed me.</p>
<p>It got to the stop with only one minute left on the clock. I could still catch up to the work transport if the driver was a little late, which happens sometimes.</p>
<p>My hopes paid off, I saw the bus waiting for me and I was only a couple streets away in a direction where the driver would see me running towards the vehicle.</p>
<p>I got off the public bus and ran, my hands up to let the driver know I wanted to get in. Still waving my hands and walking towards the bus, it started moving towards me, I made it—I was only a dozen steps away from it now.</p>
<p>Then it drove past me.</p>
<p>Well, swinging my arms around as if I was stranded on an island and a plane flew by. I ran after the bus making myself as visible as I could, I even managed to catch up with it for a few seconds, before it inevitable sped up. It didn’t see me on the mirror, or at all. Or maybe the driver chose to ignore me because I was late and the guy was grumpy this morning.</p>
<p>I was left there stranded with no clear idea of what to do next.</p>
<p>I send a message to my mom though she doesn’t see it, I think of calling her, I think something else instead—a risky bet that could pay off.</p>
<p>My work bus takes a pretty roundabout route to pick a bunch of people up, the public transport is more streamlined, and there is one spot where both transports meet again, which means I could still take the route to work from there—if everything goes well.</p>
<p>Another public bus is taken, and I think about some other options. Scrolling for a bit, I consider complaining in the the bus chat group. There, I remember a coworker who recently got a car, so I call and ask for a ride. Thankfully, he agrees to help me out, though there’s a catch—the public bus has no stops near his place.</p>
<p>There are two options: hope the public bus catches up to the work bus and hope the work bus sees me this time, or walking for about ten or fifteen minutes and have a sure way to get to work.</p>
<p>I can depend on variables I don’t control, or I can submit myself to walking what I should have walked from the start.</p>
<p>I learned the lesson now, don’t you worry.</p>
<p>We settle on a spot about ten minutes away, I have plenty of adrenaline rushing through me by now because of the stress of the whole thing I don’t even feel tired after the fact.</p>
<p>As I make it to the pick-up spot, something hilarious happens. I see the work bus on its way! I am too far to get on it this time, but now I know I could have met up with it if I had followed my original plan. Something to consider next time.</p>
<p>In any case, my friend asks me if I can make it to another spot instead, only about three minutes of walking distance, totally fine at this point.</p>
<p>A friend from church drives by, sees me and asks me if I need a ride or anything. Truly divine providence and pretty unexpected stuff. I’m so thankful, but I let him know I already have someone to pick me up and he goes his way.</p>
<p>My mom finally messages me worried, telling me I should have called her, she says she’s at the gym and it’s late and all of that. I let her know all is fine and send her a pic of where I’m at. I’m waiting for my friend in that very same gym.</p>
<p>Soon after my ride arrives and we head to work like nothing happened.</p>
<p>This is day 15 of <a href="https://100DaysToOffload.com">#100DaysToOffload</a> and day 10 of <a href="https://nerdgirlthoughts.game.blog/2026/07/15/blaugust-2026-is-coming">#Blaugust2026</a></p>
<p>
<a href="mailto:me@joelchrono.xyz?subject=An unusual commute to work">Reply to this post via email</a> |
<a href="https://fosstodon.org/@joel/117077467289400656">Reply on Fediverse</a>
</p>Edinburgh Fringe: Noted ★★★⯪☆ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=738872026-08-11T12:45:28.000Z<p>It is a brave children's show which starts with the song "I'm a smooth muthafukker"…</p>
<p>This is sort of a live-action XKCD cartoon. A frenetic troupe of performers are decked with hand-drawn portraits and then… well, it is somewhere between a Sesame Street animation and the stick-figure kung-fu Flash animations of yesterday.</p>
<p>The whole design is technically impressive. An endless stream of paper litters the floor as the cast rip them from their bodies to reveal more underneath.</p>
<p>I found it enjoyable enough for an early morning show - but the children around me went bananas for it!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=73887&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">Gadget Review: Soundpeats POP Clip2 Earphones ★★★★⯪ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=729722026-08-11T11:34:37.000Z<p>Last year, I reviewed a new type of Clip-On earphone - <a href="https://shkspr.mobi/blog/2025/11/gadget-review-soundpeats-clip1-cuff-headphones/">the Soundpeats Clip1 Cuff</a>. I was a bit sceptical, but was won around by their comfort. The good folks at Soundpeats have sent me their new version to review. I had a few niggles with the Clip1 - so let's see how the <a href="https://soundpeats.com/en-gb/products/soundpeats-pop-clip-physical-bttons-clip-on-earbuds">UU2 Clip2</a> compare.</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/07/soundpeats-clip2-promo.webp" alt="A small cuff style headphone set, charging box, and short cable." width="1500" height="1500" class="aligncenter size-full wp-image-72976">
<h2 id="design"><a href="https://shkspr.mobi/blog/2026/08/gadget-review-soundpeats-pop-clip2-earphones/#design">Design</a></h2>
<p>The "cuff" design is fairly new to the UK - but is already popular in other parts of the world. Rather than sticking the buds in your earholes, they clip around the flappy bits of your ears. The aren't like a bulldog clip - more like a gentle caress. The speaker sits just outside your ear canal, so you can still hear ambient sounds from around you. Look, you do <em>not</em> want a close-up of my waxy lugs, so here's a model:</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/07/model-wearing-ear-cuffs.webp" alt="model wearing ear cuffs." width="913" height="684" class="aligncenter size-full wp-image-72977">
<p>You don't have to wear them in that position. Mine tend to hang around my earlobes - your ears might be a different shape.</p>
<p>They are <em>ridiculously</em> comfortable. I've had them on for a several hour train journey and forgot they were there. They don't leave a mark, they don't ache, they don't pinch, and most importantly they don't fall off. Even if I shook my head vigorously or did any exercise, they stayed put.</p>
<p>I am happy to declare them the most comfortable headphones I own - even more so than my <a href="https://shkspr.mobi/blog/2020/11/review-aftershokz-titanium-bone-conducting-headphones/">Bone Conducting headset</a>.</p>
<p>But, of course, there are some downsides. The previous version had touch-only controls which were a bit shit. It was far too easy to accidentally brush your finger against your ears and skip a track. The Clip2 improves this somewhat by adding a small physical button to each headphone. You can set them to play/pause, skip tracks, adjust volume (if you can remember the precise sequence of taps you need).</p>
<p>Bluetooth range was good - I was able to wander all over my house without losing connection. Sound quality - even on the default setting - was excellent. You can push up the bass or fiddle with the equaliser if that'll make you happy. Battery life is going to depend on how hard you drive them and if you choose a more energy efficient codec or not. They lasted several hours in my test and recharged quickly in their included case. Naturally, the case has a USB-C connection so it'll use the same cable as all your other gadgets.</p>
<h2 id="android"><a href="https://shkspr.mobi/blog/2026/08/gadget-review-soundpeats-pop-clip2-earphones/#android">Android</a></h2>
<p>They just work. They paired instantly, accepted AAC as a high quality audio codec, the sound quality was excellent as was the microphone quality. Once I used the app to switch to <a href="https://www.whathifi.com/advice/ldac-what-is-it-how-can-you-get-it">LDAC</a>, the Clip2 restarted and Android started playing in the higher fidelity mode.</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/07/LDAC.webp" alt="LDAC in Android." width="504" height="704" class="aligncenter size-full wp-image-72983">
<h3 id="app"><a href="https://shkspr.mobi/blog/2026/08/gadget-review-soundpeats-pop-clip2-earphones/#app">App</a></h3>
<p><em>*sigh*</em> Why is that hardware manufacturers make the crappiest software? You don't <em>need</em> the app - everything will work without it. But if you want to customise the buttons, change the EQ, or enable <a href="https://www.whathifi.com/advice/ldac-what-is-it-how-can-you-get-it">LDAC</a> you'll need it.</p>
<p>Annoyingly, you can't do <em>anything</em> unless you're logged in and have an Internet connection. Want to change the EQ while you're on a train with no signal? Tough.</p>
<p>The app also handles firmware updates - there was one waiting for me - but doesn't offer any information beyond the usual platitudes of bug fixes and stability improvements.</p>
<p>Note, you need the <a href="https://play.google.com/store/apps/details?id=com.xingkeqi.peats">PeatsAudio app</a> not the "Soundpeats" app.</p>
<p>Honestly, find an EQ you like, update the firmware, toggle the settings, then uninstall it.</p>
<p>There are <em>some</em> nice touches - like the personalised EQ test - but it is slim pickings. Here are some screenshots.</p>
<p><img src="https://shkspr.mobi/blog/wp-content/uploads/2026/07/eq.webp" alt="Various default EQ options." width="400" class="size-full wp-image-72984" style="display:inline"><img src="https://shkspr.mobi/blog/wp-content/uploads/2026/07/More-functions.webp" alt="Lots of functions in a settings screen." width="400" class="size-full wp-image-72985" style="display:inline"><img src="https://shkspr.mobi/blog/wp-content/uploads/2026/07/effects.webp" alt="Various sound effects." width="400" class="size-full wp-image-72982" style="display:inline"><img src="https://shkspr.mobi/blog/wp-content/uploads/2026/07/adaptive.webp" alt="Personalised EQ test." width="400" class="size-full wp-image-72981" style="display:inline"><img src="https://shkspr.mobi/blog/wp-content/uploads/2026/07/buttons.webp" alt="Various options triggered by tapping on buttons." width="400" class="alignnone size-full wp-image-72980" style="display:inline"></p>
<h2 id="linux"><a href="https://shkspr.mobi/blog/2026/08/gadget-review-soundpeats-pop-clip2-earphones/#linux">Linux</a></h2>
<p>Yup! Connected perfectly the first time and gave access to all the supported codecs.</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/07/linux-soundpeats.webp" alt="Linux config screen showing AAC and SBC codecs." width="787" height="377" class="aligncenter size-full wp-image-72979">
<h2 id="a-few-niggles"><a href="https://shkspr.mobi/blog/2026/08/gadget-review-soundpeats-pop-clip2-earphones/#a-few-niggles">A Few Niggles</a></h2>
<p>Despite looking superficially similar to the Clip1 - these new ones don't fit into the charging case of the originals. That's unfortunate. I guess they don't want users mixing up pairs and getting confused?</p>
<p>Rather annoyingly, they don't pause the sound when you take them off. The old Clip1 would detect if it was in-ear and pause if you popped one out to chat to someone.</p>
<p>They supply a short USB-A to C lead. That's just e-Waste and shouldn't be included.</p>
<p>Because of the design they won't block out all external noise and there's no noise cancelling function. But that's offset by the fact that they do let you retain some awareness of your surroundings.</p>
<h2 id="price-and-final-thoughts"><a href="https://shkspr.mobi/blog/2026/08/gadget-review-soundpeats-pop-clip2-earphones/#price-and-final-thoughts">Price and Final Thoughts</a></h2>
<p>The Clip2 cuff headphones are usually around £60, but <a href="https://link.amazon/B00MTYd9T">are on offer now for about £48</a>. I think that's excellent value for money.</p>
<p>Readers of this blog can use code <code>SPUU2810</code> for 30% off until August 31, 2026.</p>
<p>I am an absolute convert to cuff-style. They don't tightly grip your head like bone-conducting ones, they're less noisy than rear-firing open-ear cans, and they're a good deal more comfortable than sticking something deep in your ear-wax chambers.</p>
<p>The app is a bit shit - but you'll probably only use it once. The buttons are slightly fiddly, but I can't see a way to make them any more tactile without sacrificing their small size.</p>
<p>Sounds quality - on Linux and Android - was excellent. They're perfect if you spend a long time with headphones on.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=72972&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">I Was a Guest on Web Weaving - Robb Knight • Posts • Atom Feedhttps://rknight.me/blog/i-was-a-guest-on-web-weaving/2026-08-11T08:41:57.000Z<div class="markdown-alert markdown-alert-note"><p class="markdown-alert-title"><svg class="octicon octicon-info mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg>Update</p><p>This episode was recorded prior to me deciding to shut down EchoFeed</p>
</div>
<p><a href="https://jamesg.blog">James</a> invited me onto his podcast, <a href="https://web-weaving.jamesg.blog/">Web Weaving</a>, to discuss the IndieWeb, EchoFeed (<a href="https://rknight.me/blog/shutting-down-echofeed/">RIP</a>), stickers, pens, and some of my other web projects.</p>
<p>A full transcript is available on the website.</p>
<p><a href="https://web-weaving.jamesg.blog/14">Listen to Web Weaving 14: Robb</a></p>Wonders of Web Weaving, Episode 14 - James' Coffee Bloghttps://jamesg.blog/2026/08/11/www-142026-08-11T00:00:00.000Z
<p><a href="https://web-weaving.jamesg.blog/14" rel="noreferrer">The fourteenth episode of Wonders of Web Weaving is out</a>:</p><blockquote>In Episode 14, I chat with <a href="https://rknight.me.com">Robb</a>, the author of <a href="https://rknight.me">rknight.me</a> about, among other things, metaphors for websites, the importance of sharing things you like on the web, running an indie service (Echo Feed), and more.</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:'a2962d323e4a8703',t:'MTc4NjQ0MDE1Mw=='};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://rknight.me">rknight.me</a>
<a class="tag" href="https://rknight.me.com">Robb</a>
<a class="tag" href="https://web-weaving.jamesg.blog/14">The fourteenth 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>
Doodle Scan - Robb Knight • Posts • Atom Feedhttps://rknight.me/blog/doodle-scan/2026-08-10T20:46:01.000Z<p>While scanning my <a href="https://rknight.me/blog/types-of-time-travel-zine/">time travel zine</a> I thought it would be nice to include some drawings I've done as part of my website, similar to how <a href="https://ohhelloana.blog/">Ana</a> has on her site.</p>
<figure><img src="https://cdn.rknight.me/site/2026/anas-illstrations.jpg" alt="Two boxes on Anas website. One says cursed thoughts with a drawing of a bird, the other says blogroll and has a spider web drawing" /></figure>
<p>Whenever I've tried in the past, removing a background to standard that is good enough to put on another colour background is near impossible without spending a long time in Pixelmator fixing all the edge artifacts.</p>
<p>I came across <a href="https://removewhite.com/scan/">a couple</a> of <a href="https://pinetools.com/threshold-image">websites</a> that do this and I noticed that they do it all in-browser so I started digging around — they convert the uploaded image to a bitmap with <a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/createImageBitmap"><code>createImageBitmap</code></a> and then going over every pixel and it's rgba values to determine if it should be kept, or made transparent. It was time to do some maths which I am famously not good at - most of what is below is my best estimate at explaining how this works.</p>
<p>tl;dr: The website is up at <a href="https://doodlescan.rknight.me">doodlescan.rknight.me</a> — read on for the technical nonsense. Also Jeff is back.</p>
<figure><img src="https://cdn.rknight.me/site/2026/doode-scan-logo.jpg" alt="A beige backround that says Doodle Scan at the top in red and a dinosaur holding a pencil below it." /></figure>
<h3>Removing the Background</h3>
<p>"Relative luminance" is the key to this part as <a href="https://www.w3.org/WAI/GL/wiki/Relative_luminance">defined by WCAG 2.x</a>. Take the RGB values and do the following calculation to get the relative luminance, a single value to compare against. I can't find where I read this now but green and blue are weighted higher because the human eye are more sensitive to those colours. An easy example is a grey where all the values are the same — given an RGB value of <code>51,51,51</code> the output will be <code>51</code>. For something like <a href="https://htmlcolorcodes.com/colors/sky-blue/">sky blue</a> the RGB is <code>130,200,222</code> we get <code>186.7064</code>.</p>
<pre class="language-js"><code class="language-js"><span class="token function-variable function">getLuminance</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">r<span class="token punctuation">,</span> g<span class="token punctuation">,</span> b</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> <span class="token number">0.2126</span> <span class="token operator">*</span> r <span class="token operator">+</span> <span class="token number">0.7152</span> <span class="token operator">*</span> g <span class="token operator">+</span> <span class="token number">0.0722</span> <span class="token operator">*</span> b <span class="token operator">=</span> <span class="token number">5154.213</span><br /><span class="token punctuation">}</span><br /><br /><span class="token keyword">const</span> r <span class="token operator">=</span> g <span class="token operator">=</span> b <span class="token operator">=</span> <span class="token number">51</span><br /><span class="token function">getLuminance</span><span class="token punctuation">(</span>r<span class="token punctuation">,</span> g<span class="token punctuation">,</span> b<span class="token punctuation">)</span> <span class="token comment">// 51</span><br /><br /><span class="token keyword">const</span> r <span class="token operator">=</span> <span class="token number">130</span><br /><span class="token keyword">const</span> g <span class="token operator">=</span> <span class="token number">200</span><br /><span class="token keyword">const</span> b <span class="token operator">=</span> <span class="token number">222</span><br /><br /><span class="token function">getLuminance</span><span class="token punctuation">(</span>r<span class="token punctuation">,</span> g<span class="token punctuation">,</span> b<span class="token punctuation">)</span> <span class="token comment">// 186.7064</span></code></pre>
<p>This example range of six colours from pure black to pure white gives an easy to understand example of how the threshold affects what gets removed. The default I set of <code>235</code> will only removed the pure white one but the lower than threshold gets, we only keep colours closer to black.</p>
<figure><img src="https://cdn.rknight.me/site/2026/doodle-scan-test-scan.jpg" alt="Six coloured squared starting at black getting increasingly lighter until the last one is white" /></figure>
<p>So for each pixel, get the relative luminance value, then compare it to the threshold. If it's lower than the threshold, it gets kept, otherwise it gets set to fully transparent. I'm also checking if it's transparent already and if it is, ignoring it.</p>
<pre class="language-js"><code class="language-js"><span class="token keyword">const</span> <span class="token punctuation">{</span> <span class="token literal-property property">r</span><span class="token operator">:</span> inkR<span class="token punctuation">,</span> <span class="token literal-property property">g</span><span class="token operator">:</span> inkG<span class="token punctuation">,</span> <span class="token literal-property property">b</span><span class="token operator">:</span> inkB <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">hexToRGB</span><span class="token punctuation">(</span>settings<span class="token punctuation">.</span>inkColour<span class="token punctuation">)</span><br /><span class="token keyword">const</span> <span class="token punctuation">{</span> <span class="token literal-property property">r</span><span class="token operator">:</span> paperR<span class="token punctuation">,</span> <span class="token literal-property property">g</span><span class="token operator">:</span> paperG<span class="token punctuation">,</span> <span class="token literal-property property">b</span><span class="token operator">:</span> paperB <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">hexToRGB</span><span class="token punctuation">(</span>settings<span class="token punctuation">.</span>paperColour<span class="token punctuation">)</span><br /><span class="token keyword">const</span> alpha <span class="token operator">=</span> settings<span class="token punctuation">.</span>transparent <span class="token operator">?</span> <span class="token number">0</span> <span class="token operator">:</span> <span class="token number">255</span><br /><br /><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> data<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i <span class="token operator">+=</span> <span class="token number">4</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">let</span> lum <span class="token operator">=</span> <span class="token number">0.2126</span> <span class="token operator">*</span> data<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span> <br /> <span class="token number">0.7152</span> <span class="token operator">*</span> data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> <br /> <span class="token number">0.0722</span> <span class="token operator">*</span> data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">]</span><br /><br /> <span class="token keyword">const</span> isNotTransparent <span class="token operator">=</span> data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">></span> <span class="token number">0</span><br /> <span class="token keyword">const</span> keep <span class="token operator">=</span> lum <span class="token operator"><</span> threshold <span class="token operator">&&</span> isNotTransparent<br /><br /> <span class="token keyword">if</span> <span class="token punctuation">(</span>ui<span class="token punctuation">.</span>controlBW<span class="token punctuation">.</span>checked<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token comment">// For black and white/single colour</span><br /> <span class="token comment">// set the ink colour</span><br /> data<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> keep <span class="token operator">?</span> inkR <span class="token operator">:</span> paperR<br /> data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> keep <span class="token operator">?</span> inkG <span class="token operator">:</span> paperG<br /> data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> keep <span class="token operator">?</span> inkB <span class="token operator">:</span> paperB<br /> data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> keep <span class="token operator">?</span> <span class="token number">255</span> <span class="token operator">:</span> alpha<br /> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br /> <span class="token comment">// when keeping colour, keep the pixels colour</span><br /> data<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> keep <span class="token operator">?</span> data<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">:</span> paperR<br /> data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> keep <span class="token operator">?</span> data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">:</span> paperG<br /> data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> keep <span class="token operator">?</span> data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">:</span> paperB<br /> data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> keep <span class="token operator">?</span> <span class="token number">255</span> <span class="token operator">:</span> alpha<br /> <span class="token punctuation">}</span><br /><span class="token punctuation">}</span></code></pre>
<p>I wanted a black ink only mode where it would set all kept pixels to black (or a colour of my choice) which is what that <code>if/else</code> is doing above. I also added options to set the paper colour because why not. I actually ended up using that feature to make the logo for the site.</p>
<p>A bonus of the threshold control is how much it helps in removing backgrounds on uneven scans or photos, like the example below. With the default threshold nothing gets removed but if I drop it to ~100 and switch to black and white mode, I'm able to remove most of the background while not losing too much detail on the drawings themselves. If this were more important I would use a proper scanner or light the image better but this will be handy for quick doodles.</p>
<figure><img src="https://cdn.rknight.me/site/2026/doodle-scan-uneven-comparison.jpg" alt="On the top is a badly lit photo of dotgrid paper with sketches of some people. The bottom shows the same image but with the paper removed" /></figure>
<h3>Edge Shrink</h3>
<p>I looked through how this worked on the other websites I found, read the code, made some notes, had a little cry, drew some diagrams, read more code, then I finally understood it. It looks at every pixel and if it has a transparent neighbour, then set it to transparent and do the same for each pass up to five times. This diagram I made explains better than I can about how it works over two passes.</p>
<figure><img src="https://cdn.rknight.me/site/2026/doodle-scan-edge-shrink.jpg" alt="sdfasd" /></figure>
<h3>Darken Lines</h3>
<p>This was the the part where I really had to focus to understand what this was doing. The darken lines slider sets a percentage which is then used to determine how much to darken the ink by. It involves getting the darkness or inverse luminance of the pixel, then calculating the amount to darken by by multiplying the darken value by darkness squared, multplied by the alpha level divided by 255 — as best I can tell this last bit reduces the effect on semi-transparent pixels. So yeah, maths. This feature is only useful when using colour mode.</p>
<pre class="language-js"><code class="language-js"><span class="token keyword">const</span> darkness <span class="token operator">=</span> <span class="token number">1</span> <span class="token operator">-</span> <span class="token punctuation">(</span><span class="token number">0.2126</span> <span class="token operator">*</span> r <span class="token operator">+</span> <span class="token number">0.7152</span> <span class="token operator">*</span> g <span class="token operator">+</span> <span class="token number">0.0722</span> <span class="token operator">*</span> b<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">255</span><br /><span class="token keyword">const</span> amountToDarken <span class="token operator">=</span> strength <span class="token operator">*</span> darkness <span class="token operator">*</span> darkness <span class="token operator">*</span> <span class="token punctuation">(</span>alpha <span class="token operator">/</span> <span class="token number">255</span><span class="token punctuation">)</span><br /><br />data<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">round</span><span class="token punctuation">(</span>r <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">-</span> amountToDarken<span class="token punctuation">)</span><span class="token punctuation">)</span><br />data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">round</span><span class="token punctuation">(</span>g <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">-</span> amountToDarken<span class="token punctuation">)</span><span class="token punctuation">)</span><br />data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">round</span><span class="token punctuation">(</span>b <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">-</span> amountToDarken<span class="token punctuation">)</span><span class="token punctuation">)</span></code></pre>
<h3>Out of the rabbit hole</h3>
<p>Now I'm "done" with this I can loop back around to where I started which was making some illustrations for my new website design and all I had to do was build an entirely new tool to do it. This will also be handy in September when where I'll be doing <a href="https://rknight.me/blog/get-okay/">drawings for St Jude</a> again.</p>Edinburgh Fringe: 15 Minutes of Shame ★★★★⯪ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=738302026-08-10T20:43:10.000Z<p>Sex work is work, so we're told. There's no difference between picking up a night job stacking shelves and a night job jacking-off on screen. Right?</p>
<p>Perhaps a couple need a little bit of extra cash and the siren song of OnlyFans is <em>right</em> there. Let's fire up the webcam and release ourselves from financial drudgery!</p>
<p>Then reality hits.</p>
<p>The script by Sean Stillmaker sounds like it was ripped straight out of LinkedIn. Under a lesser cast, lines about synergising brand strategy to optimise the subscriber funnel would sound contrived; here they sound like hyper-savvy young adults rationalising their poor decisions. If influencers are the dominant cultural force in the world, then it seems right that their language now infiltrates dialogue in the same way "Valley Girl" speech conquered early 2000s TV and movies.</p>
<p>The cast - Ellen Pallant and Anton Bibby - flit about the stage with poise and grace. Their kinetic energy buzzes out into the audience who remained transfixed throughout the performance. They each have an intensity and passion which fills the space - fully bringing to life characters dominated by hubris and helplessness. Full praise must go to Adébayo Bolaji, the director, for finding a way to stage the show without it becoming tawdry and exploitative.</p>
<p>The political polemic around the exploitation of the working class (and of the working girl) isn't exactly subtle. But it fits right in with the themes of being in slavish thrall to both bosses, the algorithm, and - ultimately - the fans who love/hate you.</p>
<p>The ending feels a bit abrupt, but had the audience gleefully discussing it as we were expelled into the cold light of day.</p>
<iframe title="15 Minutes of Shame trailer" width="620" height="349" src="https://www.youtube.com/embed/W1Yq7uuyF5E?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=73830&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">Edinburgh Fringe - Kat Ronson: Millennial Girl ★★★★☆ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=738522026-08-10T17:45:36.000Z<p>OMG! If you remember A/S/Ling your way through MSN to fill in your MySpace top 8, then you'll love this show. You're also over 30 and, therefore, <em>old</em>. Ew.</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/08/876f40e3-4575-4e7a-a55c-684af7c29fef.jpg" alt="A girl rendered in MS Paint." width="250" height="250" class="aligncenter size-full wp-image-73853">
<p>The stage is littered with a Nokia 3310, Bliss Magazine, and Charlie Red. Katie (15/F/UK) talks us through the complexities of her nascent love life, what shag band colours mean, and which quotes sum up millennial angst. All the while serenading us with her musical takes on the <strong>tragic</strong> Aniston/Pitt split.</p>
<p>Consistently funny and just the right amount of embarrassing.</p>
<p>As befits a work in progress, it is a <em>little</em> one note. That said, Katie is an expertly observed caricature of the size-zero obsessed, Vauxhall Corsa chasing girl that those of us of a certain vintage remember with fondness / body quaking cringe.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=73852&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">Edinburgh Fringe - Michael Brunström: William Tell vs the Algorithm ★★★☆☆ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=738272026-08-10T15:57:27.000Z<p>The terror of AI has come to comedy. There are a dozen shows this year about the threat that technology poses to the way we live, laugh, and love.</p>
<p>In this case, AI stands for Austrian Imperialism and the fight is for Switzerland's independence.</p>
<p>Well, sort of. It gets a bit lost in an endless stream of rambly diversions. There's a fine line between surrealist comedy and utter nonsense. If you like seeing a man getting the audience to sing to a magical (albeit potentially traitorous) hat, attempting to pull up his trousers without his hands, and doing cuckoo impressions - this'll satisfy those cravings.</p>
<p>It does produce a steady stream of chuckles but suffers by being presented in an airless yurt.</p>
<p>The highlight for me was the confession that the comedian has "a rare form of synaesthesia which allows me to literally see colours!"</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=73827&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">Edinburgh Fringe - Rachel Creeger: Ultimate Jewish Mother 2026 ★★★★★ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=738242026-08-10T13:56:32.000Z<p>My mum's friend Rachel has a one-woman show on at the Fringe. As, apparently, the only orthodox Jew on the UK comedy circuit she has constructed a fully interactive Jewish Mother experience.</p>
<p>Like several shows on the fringe, it relies on the audience writing questions on cards and the comedian riffing on them. Unlike other shows, Rachel has a huge stream of anecdotes and songs to weave into her answers. She has the easy and relaxed delivery of a seasoned professional who knows her material inside and out.</p>
<p>She is a delightfully deranged matriarch with strong options from the exact number of carcasses to throw into a chicken soup to how to get rid of your daughter's goyim boyfriend.</p>
<p>Tickets are pay-what-you-can and you'd be a schmuck if you missed it.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=73824&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">