Shellsharks Blogroll - BlogFlock2026-04-02T17:17:39.719ZBlogFlockdestructured, fLaMEd, Trail of Bits Blog, Aaron Parecki, Evan Boehs, gynvael.coldwind//vx.log (pl), Westenberg, James' Coffee Blog, joelchrono, Kev Quirk, cool-as-heck, Posts feed, Sophie Koonin, Adepts of 0xCC, <span>Songs</span> on the Security of Networks, cmdr-nova@internet:~$, Werd I/O, Johnny.Decimal, Robb Knight, Molly White, Hey, it's Jason!, Terence Eden’s BlogConcert Review: London Philharmonic - Pictures at an Exhibition ★★★★★ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=699932026-04-02T11:34:07.000Z<p>A delightful and emotional rendition of three rather different works.</p>
<p>Mark-Anthony Turnage's "Three Screaming Popes" was a chaotic cacophony. Wild, bizarre, inventive, and seemingly driven by excess. A fascinating performance, although not one I'll put on in the background. Turnage himself took to the stage to bask in the applause.</p>
<p>Bartók's Violin Concerto No. 1. Reading the story behind the composition made the performance by soloist Alina Ibragimova even more terrifying than it might have otherwise been. The sounds emanating from her violin were somewhere between a tantrum and flirtatious coquette. Stunning to see her tear up the stage.</p>
<p>Mussorgsky's Pictures at an Exhibition. Outstanding. Hearing a 100 piece orchestra power through the score was exhilarating. It is such a vivid piece. There's no other way to describe it - each movement is distinct and full of character. One of those rare pieces where you can feel the music worming its way into your brain.</p>
<p>You can <a href="https://www.bbc.co.uk/sounds/play/m002t01v">listen to the concert on BBC Radio 3</a>.</p>
<h2 id="pre-and-post-show"><a href="https://shkspr.mobi/blog/2026/04/concert-review-london-philharmonic-pictures-at-an-exhibition/#pre-and-post-show">Pre- and Post-Show</a></h2>
<p>I've written before about <a href="https://shkspr.mobi/blog/2024/12/the-art-of-the-pre-show-and-post-show/">The art of the Pre-Show and Post-Show</a>. Venues and shows have multiple ways to make an event special for an audience.</p>
<p>This concert did some things really well. For a start - the programme was free! I wish the West End was a bit more like Broadway with a free "Playbill" at every show. Even better, the programme was actually useful! Some nice blurbs about the performers and the pieces.</p>
<p>I particularly liked this little snippet:</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/04/Classical.webp" alt="Longer classical pieces are often made up of movements, or shorter sections. Applause is usually saved for after the final movement. May an encore! The soloist might play a little extra surprise piece, if the applause is loud enough!" width="1024" height="768" class="aligncenter size-full wp-image-69994"/>
<p>How wonderful! It's always someone's first time at an orchestral concert. More programmes should have these little comfort notes.</p>
<p>Other than that, there wasn't much. There was no interaction between the conductor and audience, which felt a little odd. The programme had a QR code to a 31(!) point questionnaire. I'm not sure how many people would be bothered to complete that.</p>
<p>Royal Festival Hall is a delight - plenty of space, multiple bars, lots of seating areas, and a larger number of spacious & clean toilets. An excellent venue.</p>
Time is a User-Interface - Westenberg69cdb5c3b19a140001e32fde2026-04-02T00:32:14.000ZUsing my edit button shortcut - James' Coffee Bloghttps://jamesg.blog/2026/04/02/using-my-edit-button-shortcut2026-04-02T00:00:00.000Z
<style media="(prefers-color-scheme: dark)">pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #49483e }
.highlight { background: #272822; color: #F8F8F2 }
.highlight .c { color: #959077 } /* Comment */
.highlight .err { color: #ED007E; background-color: #1E0010 } /* Error */
.highlight .esc { color: #F8F8F2 } /* Escape */
.highlight .g { color: #F8F8F2 } /* Generic */
.highlight .k { color: #66D9EF } /* Keyword */
.highlight .l { color: #AE81FF } /* Literal */
.highlight .n { color: #F8F8F2 } /* Name */
.highlight .o { color: #FF4689 } /* Operator */
.highlight .x { color: #F8F8F2 } /* Other */
.highlight .p { color: #F8F8F2 } /* Punctuation */
.highlight .ch { color: #959077 } /* Comment.Hashbang */
.highlight .cm { color: #959077 } /* Comment.Multiline */
.highlight .cp { color: #959077 } /* Comment.Preproc */
.highlight .cpf { color: #959077 } /* Comment.PreprocFile */
.highlight .c1 { color: #959077 } /* Comment.Single */
.highlight .cs { color: #959077 } /* Comment.Special */
.highlight .gd { color: #FF4689 } /* Generic.Deleted */
.highlight .ge { color: #F8F8F2; font-style: italic } /* Generic.Emph */
.highlight .ges { color: #F8F8F2; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #F8F8F2 } /* Generic.Error */
.highlight .gh { color: #F8F8F2 } /* Generic.Heading */
.highlight .gi { color: #A6E22E } /* Generic.Inserted */
.highlight .go { color: #66D9EF } /* Generic.Output */
.highlight .gp { color: #FF4689; font-weight: bold } /* Generic.Prompt */
.highlight .gs { color: #F8F8F2; font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #959077 } /* Generic.Subheading */
.highlight .gt { color: #F8F8F2 } /* Generic.Traceback */
.highlight .kc { color: #66D9EF } /* Keyword.Constant */
.highlight .kd { color: #66D9EF } /* Keyword.Declaration */
.highlight .kn { color: #FF4689 } /* Keyword.Namespace */
.highlight .kp { color: #66D9EF } /* Keyword.Pseudo */
.highlight .kr { color: #66D9EF } /* Keyword.Reserved */
.highlight .kt { color: #66D9EF } /* Keyword.Type */
.highlight .ld { color: #E6DB74 } /* Literal.Date */
.highlight .m { color: #AE81FF } /* Literal.Number */
.highlight .s { color: #E6DB74 } /* Literal.String */
.highlight .na { color: #A6E22E } /* Name.Attribute */
.highlight .nb { color: #F8F8F2 } /* Name.Builtin */
.highlight .nc { color: #A6E22E } /* Name.Class */
.highlight .no { color: #66D9EF } /* Name.Constant */
.highlight .nd { color: #A6E22E } /* Name.Decorator */
.highlight .ni { color: #F8F8F2 } /* Name.Entity */
.highlight .ne { color: #A6E22E } /* Name.Exception */
.highlight .nf { color: #A6E22E } /* Name.Function */
.highlight .nl { color: #F8F8F2 } /* Name.Label */
.highlight .nn { color: #F8F8F2 } /* Name.Namespace */
.highlight .nx { color: #A6E22E } /* Name.Other */
.highlight .py { color: #F8F8F2 } /* Name.Property */
.highlight .nt { color: #FF4689 } /* Name.Tag */
.highlight .nv { color: #F8F8F2 } /* Name.Variable */
.highlight .ow { color: #FF4689 } /* Operator.Word */
.highlight .pm { color: #F8F8F2 } /* Punctuation.Marker */
.highlight .w { color: #F8F8F2 } /* Text.Whitespace */
.highlight .mb { color: #AE81FF } /* Literal.Number.Bin */
.highlight .mf { color: #AE81FF } /* Literal.Number.Float */
.highlight .mh { color: #AE81FF } /* Literal.Number.Hex */
.highlight .mi { color: #AE81FF } /* Literal.Number.Integer */
.highlight .mo { color: #AE81FF } /* Literal.Number.Oct */
.highlight .sa { color: #E6DB74 } /* Literal.String.Affix */
.highlight .sb { color: #E6DB74 } /* Literal.String.Backtick */
.highlight .sc { color: #E6DB74 } /* Literal.String.Char */
.highlight .dl { color: #E6DB74 } /* Literal.String.Delimiter */
.highlight .sd { color: #E6DB74 } /* Literal.String.Doc */
.highlight .s2 { color: #E6DB74 } /* Literal.String.Double */
.highlight .se { color: #AE81FF } /* Literal.String.Escape */
.highlight .sh { color: #E6DB74 } /* Literal.String.Heredoc */
.highlight .si { color: #E6DB74 } /* Literal.String.Interpol */
.highlight .sx { color: #E6DB74 } /* Literal.String.Other */
.highlight .sr { color: #E6DB74 } /* Literal.String.Regex */
.highlight .s1 { color: #E6DB74 } /* Literal.String.Single */
.highlight .ss { color: #E6DB74 } /* Literal.String.Symbol */
.highlight .bp { color: #F8F8F2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #A6E22E } /* Name.Function.Magic */
.highlight .vc { color: #F8F8F2 } /* Name.Variable.Class */
.highlight .vg { color: #F8F8F2 } /* Name.Variable.Global */
.highlight .vi { color: #F8F8F2 } /* Name.Variable.Instance */
.highlight .vm { color: #F8F8F2 } /* Name.Variable.Magic */
.highlight .il { color: #AE81FF } /* Literal.Number.Integer.Long */ .highlight .nn, .highlight .n{color: light-dark(black, var(--dark-foreground-color)) }</style><style media="(prefers-color-scheme: light)">pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #F00 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666 } /* Operator */
.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #9C6500 } /* Comment.Preproc */
.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #E40000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #008400 } /* Generic.Inserted */
.highlight .go { color: #717171 } /* Generic.Output */
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #04D } /* Generic.Traceback */
.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008000 } /* Keyword.Pseudo */
.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #B00040 } /* Keyword.Type */
.highlight .m { color: #666 } /* Literal.Number */
.highlight .s { color: #BA2121 } /* Literal.String */
.highlight .na { color: #687822 } /* Name.Attribute */
.highlight .nb { color: #008000 } /* Name.Builtin */
.highlight .nc { color: #00F; font-weight: bold } /* Name.Class */
.highlight .no { color: #800 } /* Name.Constant */
.highlight .nd { color: #A2F } /* Name.Decorator */
.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #00F } /* Name.Function */
.highlight .nl { color: #767600 } /* Name.Label */
.highlight .nn { color: #00F; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #19177C } /* Name.Variable */
.highlight .ow { color: #A2F; font-weight: bold } /* Operator.Word */
.highlight .w { color: #BBB } /* Text.Whitespace */
.highlight .mb { color: #666 } /* Literal.Number.Bin */
.highlight .mf { color: #666 } /* Literal.Number.Float */
.highlight .mh { color: #666 } /* Literal.Number.Hex */
.highlight .mi { color: #666 } /* Literal.Number.Integer */
.highlight .mo { color: #666 } /* Literal.Number.Oct */
.highlight .sa { color: #BA2121 } /* Literal.String.Affix */
.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
.highlight .sc { color: #BA2121 } /* Literal.String.Char */
.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
.highlight .sx { color: #008000 } /* Literal.String.Other */
.highlight .sr { color: #A45A77 } /* Literal.String.Regex */
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
.highlight .ss { color: #19177C } /* Literal.String.Symbol */
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #00F } /* Name.Function.Magic */
.highlight .vc { color: #19177C } /* Name.Variable.Class */
.highlight .vg { color: #19177C } /* Name.Variable.Global */
.highlight .vi { color: #19177C } /* Name.Variable.Instance */
.highlight .vm { color: #19177C } /* Name.Variable.Magic */
.highlight .il { color: #666 } /* Literal.Number.Integer.Long */</style>
<style>
@font-face {
font-family: 'MonaspaceArgon';
src: url('/assets/fonts/MonaspaceArgon-Regular.woff2') format('woff2');
font-weight: 400;
font-style: normal;
}
pre, code {
font-family: 'MonaspaceArgon', ui-monospace, monospace;
}
</style>
<p>In 2025 I built a <a href="https://jamesg.blog/2025/05/21/building-an-edit-button-browser-extension">browser extension that adds an edit button to your browser</a>. The edit button pages if a page either has:</p><ul><li>A <code>rel=edit</code> link;</li><li>A custom edit link set in the extension preferences, or;</li><li>A link with an anchor like “edit page” (only available if you enable the setting, since this is a heuristic).</li></ul><p>Back when I built the extension, I added in a keyboard shortcut to open the edit link associated with a page. On Mac, the shortcut is Command + Shift + E.</p><p>I forgot all about this shortcut until recently, when I accidentally pressed Command + Shift + E instead of Command + Shift + R, the shortcut to refresh a page. At first, I was surprised, but the mis-press gave me the reminder I needed that this feature exists.</p><p>Since then, I have been using the Command + Shift + E shortcut almost daily to edit pages on my website.</p><p>I like that the shortcut has a similar hand position to refreshing, a shortcut that I find relatively comfortable to use. I also like that the shortcut only requires use of my left hand, so that I can press the edit button while using my mouse to navigate to my next task.</p><p>My flow to edit a page now usually looks something like this:</p><ul><li>Go to a page on my website (i.e. my <a href="https://jamesg.blog/software-notes" rel="noreferrer">software notes page</a>).</li><li>Press Command + Shift + E.</li><li>Ghost opens in my browser.</li><li>I use my mouse to navigate to Apple Notes, where I usually have notes I want to copy onto my website.</li><li>I use my mouse to go back to Ghost where I paste in my notes and organise and develop them a bit where necessary.</li><li>I save my edits.</li></ul><p>While I could also use the mouse to press the edit link button that appears in my browser, the shortcut is so convenient.</p><p>The irony is that I forgot the shortcut existed until I accidentally encountered it. Indeed, overall, I struggle with remembering keyboard shortcuts beyond the basics (copy, paste, quit, refresh), preferring to opt for a menu or another visible affordance. But the edit keyboard shortcut is now becoming one I use regularly so it is increasingly etched into my memory. I think there was a gap to bridge between adding the shortcut as a feature in the development process and making a habit around its use.</p>
<a class="tag" href="https://jamesg.blog/2025/05/21/building-an-edit-button-browser-extension">browser extension that adds an edit button to your browser</a>
<a class="tag" href="https://jamesg.blog/software-notes">software notes page</a>
For The Seiko of It - Hey, it's Jason!https://grepjason.sh/2026/for-the-seiko-of-it2026-04-02T00:00:00.000ZI wasn't going to pick up any new watches on this trip. Then I picked up a new watch. 🤷March 2026 Summary - Joel's Log Fileshttps://joelchrono.xyz/blog/march-2026-summary2026-04-01T15:50:50.000Z<p>The year continues to move at an incredible pace, and I continue to engage with so many forms of media, keeping track is starting to get a bit confusing! Nothing impossible to manage of course, it’s fun to have so many more things going on.</p>
<h2 id="podcasts">Podcasts</h2>
<p>Once again, my podcast listening has been diminishing this year, as music continues to go upwards! I think that now that I fully settled on scrobbling with Listenbrainz, plus going to sleep with music over podcasts, has helped quite a bunch. Another big reason might be that I haven’t listened to <em>Welcome to Night Vale</em> in a while, which was what I listened to before sleep. In any case I listened to 23 horus of podcasts in March!</p>
<figure class="img">
<picture>
<source srcset="/assets/img/blogs/2026-03-31-podcasts.webp" type="image/webp"/>
<source srcset="/assets/img/blogs/2026-03-31-podcasts.png" type="image/png"/>
<img class="mx-auto" src="https://joelchrono.xyz/assets/img/blogs/2026-03-31-podcasts.png" alt="The podcasts I have been listening"/>
</picture>
<figcaption class="caption">The podcasts I have been listening</figcaption></figure>
<ul>
<li><strong>Into The Aether</strong> - The usual run of <a href="https://intothecast.transistor.fm/episodes/wacky-wally-s-big-bassoon-solo-feat-persona-5-royal-soulcalibur-iii-marathon-and-more">current</a> <a href="https://intothecast.transistor.fm/episodes/teddie-is-for-everyone-feat-paranormasight-the-mermaid-s-curse-slay-the-spire-ii-minishoot-adventures-and-more">weekly</a> <a href="https://intothecast.transistor.fm/episodes/scyther-is-my-roommate-feat-pokemon-pokopia-slay-the-spire-2-and-resident-evil-requiem">episodes</a>. The run so far has been amazing, featuring all maner of games like <em>Resident Evil Requiem</em>, <em>Persona 4 Golden</em>, <em>Pokémon Pokopia</em>, <em>Danganronpa</em>, <em>Marathon</em>, <em>Slay The Spire 2</em> and <em>Minishoot Adventures</em>.</li>
<li><strong>99% Invisible</strong> - A couple of great episodes on <a href="https://99percentinvisible.org/episode/658-the-em-dash/">the Em Dash</a>, and the history behind <a href="https://99percentinvisible.org/episode/661-where-the-f-are-we/">knowing where we are.</a></li>
<li><strong>Wolf 359</strong> - Listened up to episode 45 of this show. The story continues to be incredible, some of my favorites episodes that I still remembered from my first listen around 5 years ago. I drama and the stakes are getting real.</li>
<li><strong>Revolutions</strong> - Listened to another four episodes or so of the French Revolution. This historical event has so much to unpack, I have listened to 50 episodes of it so far.</li>
<li><strong>Stuff You Should Know</strong> - Just a random selection of episodes I listened to. Like an episode on <a href="https://stuffyoushouldknow.com/episode/keeping-time/">tracking time</a>, and <a href="https://intothecast.transistor.fm/episodes/scyther-is-my-roommate-feat-pokemon-pokopia-slay-the-spire-2-and-resident-evil-requiem">flood myths</a>.</li>
<li><strong>Dungeons and Daddies</strong> - Listened to one episode and a half of Season 3! It got interested by the end so I expect to keep this up next month a bit more.</li>
<li><strong>They’re Just Movies</strong> - This one is no longer around, but I listened to their overview of the <a href="https://youtu.be/hz0jTJnVZKE">Aliens</a> movie, and want to check some more of their episodes. I kinda miss it.</li>
<li><strong>Trash Taste</strong> - Just picking episodes at random, not much else.</li>
</ul>
<h2 id="gaming">Gaming</h2>
<p>Gaming took over, and despite it all, I didn’t finish a single game! I just started so many at once and I am kind of having fun just jumping around between them without any rhyme or reason. But hey, they’re games, meant to be fun, after all.</p>
<figure class="img">
<picture>
<source srcset="/assets/img/blogs/2026-03-31-games.webp" type="image/webp"/>
<source srcset="/assets/img/blogs/2026-03-31-games.png" type="image/png"/>
<img class="mx-auto" src="https://joelchrono.xyz/assets/img/blogs/2026-03-31-games.png" alt="The games I have been playing"/>
</picture>
<figcaption class="caption">The games I have been playing</figcaption></figure>
<h3 id="started">Started</h3>
<ul>
<li>
<p><strong>Resident Evil</strong> - I decided to venture into the world… of <em>Survival Horror</em>. The game that started it all! After the sequel, I thought I’d visit the original, and I have to say, I have really enjoyed it so far. I am happy to say I’ve managed to figure out all of the puzzles without help, except for the one that uses the <em>chemical</em>. Other than that, it’s been fun.</p>
</li>
<li>
<p><strong>Metroid Fusion</strong> - I have so many Metroidvanias avilable to me, and I haven’t finished <em>Silksong</em> in ages, and yet again, I’ve decided to start another run of <em>Fusion</em> on my Miyoo Mini Flip. This game rules, and I’ve already reached the third boss of the game. I want to finish it as quickly as I can without using save states!</p>
</li>
<li>
<p><strong>Ridge Racer Type 4</strong> - I listened to the soundtrack of this game and I wanted to check it out. There are so many menus and modes and an actual story? I just jumped into a race as quick as I could and enjoyed the soundtrack a bit, but I admit I didn’t do more, I prefer the PSP physics and gameplay.</p>
</li>
<li>
<p><strong>River City Ransom</strong> - This is a game that I tried online with <a href="https://burgeonlab.com">Naty</a> playing via NSO. It is a fairly deep game for its time, and we definitely had a lot of fun with its gameplay and mechanics, we played it for like 40 minutes but ran out of time and we haven’t returned to it.</p>
</li>
<li>
<p><strong>What Did I Do To Deserve This, My Lord!? 2</strong> - This is considered a hidden gem of the PSP. A game where you create an underground dungeon and grow your own army of creatures who grow by themselves and follow basic movement patterns to fight against the heroes. It’s a fun subversion, but not my cup of tea, I think.</p>
</li>
<li>
<p><strong>Pokémon Emerald Legacy</strong> - I played the first 20 minutes of this game and I am tempted to give it a proper go. The Legacy romhack is supposed to be the ultimate way to enjoy the game and I look forward to having the mood to get into it.</p>
</li>
<li>
<p><strong>Caves of Qud</strong> - I played a bit of the tutorial since I’ve heard so many great things, but I didn’t go much deeper than that, it seems huge and I’m definitely interested though.</p>
</li>
</ul>
<h3 id="ongoing">Ongoing</h3>
<ul>
<li>
<p><strong>CrossCode</strong> - A wonderful game that really grew up on me during this month. I made a bunch of progress and since I’m playing it alongside some friends, I’ve really looked forward to what they think or have to say about stuff. I like that I’m ahead too, not gonna lie. In any case, all the dungeons have been awesome, and even if the puzzle design can be a little tiresome, it definitely gets my brain working and I love the feeling of figuring things out. The puzzles can definitely get long though.</p>
</li>
<li>
<p><strong>Super Mario 3D World</strong> - This has been a fun game to play with friends, and even to go through by myself a couple of times. We are trying to get every single star and sticker from this before finishing the story! We made it to the final stage now that it’s kind of like a circus, and I’m looking forward to beating this game at some point in the next couple of months.</p>
</li>
<li>
<p><strong>Ridge Racer</strong> - This masterpiece for the PSP continues to be excellent to play. I have made some progress doing World Tours in the EX class, and I love how this game just hooks me and won’t let me go at all.</p>
</li>
<li>
<p><strong>Into The Breach</strong> - I ended up returning to this gem of a game and finally managed to complete a run on it, even if it was on easy. The tactics and mechanics of this masterpiece are just amazing. I want to keep playing more of it and master all the available mechs too.</p>
</li>
<li>
<p><strong>Balatro</strong> - Ended up playing this game with friends a couple of times, however, I ended up finally caving in and purchasing the title for my phone… It is fun, and I am scared. I am yet to win a game though, despite it all.</p>
</li>
<li>
<p><strong>Gladiator Begins</strong> - This title for the PSP is an arena battler that I’ve played on and off. I touched it for a bit during the PSP season of Into The Aether, but didn’t even bring it up much. I have played some more lately and yeah, it’s very fun! I’m currently stock in a boss fight though, where I simply need to git gud.</p>
</li>
<li>
<p><strong>Vampire Survivors</strong> - This roguelike “bullet heaven” is finally losing its spell among my group of friends, we play it for time to time, but it definitely feels a bit more like homework lately, just to complete the unlockables and achievements. We will keep playing though, just not as crazy as before.</p>
</li>
<li>
<p><strong>Grapple Dog</strong> - I barely touched this game, although I had a lot of fun with it last month, I need to get back to it, I really enjoyed the physics and mechanics of it, but I guess that Switch and handheld gaming took over to compensate for the Laptop-focused gaming of February.</p>
</li>
<li>
<p><strong>Super Smash Bros Ultimate</strong> - Just a couple of matches with friends… I’ve been tempted to play the solo campaign lately though, to unlock more characters and just test myself.</p>
</li>
</ul>
<h2 id="movies">Movies</h2>
<figure class="img">
<picture>
<source srcset="/assets/img/blogs/2026-03-31-movies.webp" type="image/webp"/>
<source srcset="/assets/img/blogs/2026-03-31-movies.png" type="image/png"/>
<img class="mx-auto" src="https://joelchrono.xyz/assets/img/blogs/2026-03-31-movies.png" alt="I just watched this one movie"/>
</picture>
<figcaption class="caption">I just watched this one movie</figcaption></figure>
<p>The only movie I got to watch in March was <strong>David</strong>. An animated, faith-based, musical film about the traditional story of David and his rise to the throne as a King. I already said it on my weeknotes, this film is pretty good for what it is, but and probably among the best when it comes to Christian animation, with a few truly awesome scenes.</p>
<p>However, it falls short in other aspects, it gets preachy at times—although not as bad as others—and the songs, while good in the moment and with an OK message, they just aren’t very memorable, and there’s maybe one or two that weren’t really necessary. I also would have liked to see a bit more action. I don’t expect anything gruesome from a kids movie, but at the very least some swords clashing would have been fun.</p>
<h2 id="manga">Manga</h2>
<p>What a great month this was for manga, other than the fact two of the ones I finished didn’t meet my expectations, the rest of what I read was rather enjoyable!</p>
<figure class="img">
<picture>
<source srcset="/assets/img/blogs/2026-03-31-manga.webp" type="image/webp"/>
<source srcset="/assets/img/blogs/2026-03-31-manga.png" type="image/png"/>
<img class="mx-auto" src="https://joelchrono.xyz/assets/img/blogs/2026-03-31-manga.png" alt="The mange I have been reading"/>
</picture>
<figcaption class="caption">The mange I have been reading</figcaption></figure>
<h3 id="started-1">Started</h3>
<ul>
<li><strong>Kagurabachi</strong> - Up to chapter 115. Speaking of swords clashing, this was a manga that completely hooked me and wouldn’t let me go at all. I read from the start to the latest released chapter as of now, catching up with it. This is a revenge story, and features some amazing characters, excellent action and panelling, simple, yet breath-taking artwork and some actually good writing for once! I’ve enjoyed everything thus far, zero complaints, genuinely surprised.</li>
</ul>
<h3 id="ongoing-1">Ongoing</h3>
<ul>
<li>
<p><strong>Fly Me To The Moon</strong> - Up to chapter 214. This is a manga I started ages ago, and this month I finally decided to return to it. It starts as a fun rom-com manga about a newly wed couple, but it has turned into something much more interesting. There is a mystery to it all, and everything has started to finally unveil, if at a slow pace. However, I don’t mind, even without the mystery, the humor and wholesome moments are plenty. I enjoy it.</p>
</li>
<li>
<p><strong>DanDaDan</strong> - Up to chapter 226. I barely read any of this manga, but at the very least I managed to get to the big bad guy of the current arc, I think, and it’s definitely an interesting premise. I am only a few chapters behind, so I am honestly just waiting for more chapters to release and build up some momentum.</p>
</li>
<li>
<p><strong>Blue Lock</strong> - Up to chapter 340. I catched up and I’m reading week by week. This match against France has definitely been an epic one. I enjoy the challenge that Isagi has been facing. So many questions, doubts and tactics that don’t work. I really love the drama thus far.</p>
</li>
<li>
<p><strong>Love’s in Sight!</strong> - Up to chapter 56. It had been a while since I revisited this one as well, it’s a cute rom-com about a blind girl and a delinquent guy with a soft heart. It’s pretty wholesome, and it actually deals with a lot of the accesibility and life of a blind person. Way more educational than I expected, and some of the narratives focused on that are really well done.</p>
</li>
<li>
<p><strong>Kingdom</strong> - Up to chapter 866. This continues to be an absolutely epic tale. There were a couple of great moments going on during the current arc (The Battle against Zhao), and I am only three or so chapters behind. Some great developments have been made.</p>
</li>
<li>
<p><strong>Spy x Family</strong> - Up to chapter 130. Currently on a very fun arc where Loid, Yor and Yor’s brother are held hostage, and while the three of them could easily get away and stop the whole thing, neither of them wants to blow off their cover. The conflict is solving itself in the most hilarous way, I love this manga.</p>
</li>
</ul>
<h3 id="complete">Complete</h3>
<ul>
<li>
<p><strong>Planetes</strong> - This is <strong>definitely a must read</strong>, a great science fiction manga in space in a nearby future that follows a group of garbage collectors that keep Earth’s space as clean as it can be. We follow multiple characters of this crew, all of them with their own journeys and ideal, forming relationships, dealing with the struggles of life in space. We meet some of their families, we see how technology continues to develop, we see the impact that seeking for the stars can have in life. There are so many topics, there are so many incredible moments, so much conflict, be it in political drama, between characters, and of course, internal dilemmas, depression, trauma, joy, hope, love. This is a true piece of art, up there with <em>Yokohama Kaidashi Kikou</em>, <em>Vagabond</em> and <em>Kingdom</em>. In only 22 chapters, this gave me so much food for thought. Just read it if you can.</p>
</li>
<li>
<p><strong>Chainsaw Man</strong> - I have no words to describe what finishing this feels like. It is such an internal conflict. I absolutely loved Part 1 of this, and early on, I also loved Part 2. But something happened, and things started to look way too dire. Nonsense after nonsense, and chapters kept getting shorter and uglier. In the end, this manga finished with a 6-page long issue. I don’t know what to say. It was definitely a journey, and there’s a way to see this as the only ending Chainsaw Man could have had, but nah, I needed more out of it. I have a sour taste in my mouth. Thankfully I read plenty of masterpieces this month I even forgot to bring it up on my weeknotes—I edited them now, but still. I hope the anime fixes it.</p>
</li>
<li>
<p><strong>Jujutsu Kaisen Modulo</strong> - Another manga that also started with a lot of promise, but didn’t manage to stick the landing at all. Its redeeming grace is that it only really had 25 chapters, and that 15 or so of them are very good. The art itself is awesome though, and even though the final sequences are super rushed, the art is great to see.</p>
</li>
</ul>
<h2 id="anime">Anime</h2>
<figure class="img">
<picture>
<source srcset="/assets/img/blogs/2026-03-31-anime.webp" type="image/webp"/>
<source srcset="/assets/img/blogs/2026-03-31-anime.png" type="image/png"/>
<img class="mx-auto" src="https://joelchrono.xyz/assets/img/blogs/2026-03-31-anime.png" alt="The only anime I watched this month"/>
</picture>
<figcaption class="caption">The only anime I watched this month</figcaption></figure>
<p><strong>Orb: On the Movements of the Earth</strong> was the only anime I started, and I watched up to episode 4. This is an anime that caught me by surprise. A story set in the middle ages about a smart kid with a love for astronomy who eventually learns and the Earth revolves around the Sun, in an era where the Catholic Church considered the heliocentric model to be heresy.</p>
<p>The conflict and the relationship between truth, faith and science is very interesting to see. I definitely need to watch the rest of the season, it loks very promising.</p>
<h2 id="books">Books</h2>
<p>So many books were read, I actually started a couple more than the ones I mention here, but these are the significant ones, to be honest.</p>
<figure class="img">
<picture>
<source srcset="/assets/img/blogs/2026-03-31-books.webp" type="image/webp"/>
<source srcset="/assets/img/blogs/2026-03-31-books.png" type="image/png"/>
<img class="mx-auto" src="https://joelchrono.xyz/assets/img/blogs/2026-03-31-books.png" alt="The books I read this month"/>
</picture>
<figcaption class="caption">The books I read this month</figcaption></figure>
<h3 id="started-2">Started</h3>
<ul>
<li>
<p><strong>Clarkesworld Magazine #211</strong> by Neil Clarke - I finally started going through the Clarkesworld magazines that I subscribed to a couple years back. I went through the first two stories found on this issue—<em>The Lark Ascending</em> and An Intergalactic Smugglers Guide to Homecoming—the third one is the longest thus far, but I’ll hopefully deal with it soon! The second story is my favorite thus far.</p>
</li>
<li>
<p><strong>Strange Dogs</strong> by James S.A. Corey. - A novella that takes place before <em>Persepolis Rising</em>, so far so good! I barely read it though because reading on my XTEINK X4 took over.</p>
</li>
</ul>
<h3 id="completed">Completed</h3>
<ul>
<li>
<p><strong>Chrono Trigger</strong> by Michael P. Williams - A memoir, a critique, and retrospective of my favorite game of all time. It was quite cool! And contained plenty of information I didn’t know at all. It also featured some great interviews with the translators of the game. I enjoyed it, it’s a fun read but you definitely need to play the game before getting to it.</p>
</li>
<li>
<p><a href="https://joelchrono.xyz/blog/non-stop/"><strong>Non-Stop</strong></a> by Brian W. Aldiss - An incredible story that makes great use of the generation ship plot. I loved it from start to finish and flew through it in a matter of days. I already published my review of it so I won’t say much more. It’s worth a read despite its age, in my opinion.</p>
</li>
<li>
<p><a href="https://joelchrono.xyz/blog/persepolis-rising/"><strong>Persepolis Rising</strong></a> by James S.A. Corey - The seventh entry in <em>The Expanse</em> series. This journey does a timeskip and places us in a new status quo, which is about to be challenged by Humanity’s greatest enemy once again, itself. A great start to this last trilogy. I look forward to the rest!</p>
</li>
</ul>
<p>This is day 44 of <a href="https://100daystooffload.com">#100DaysToOffload</a></p>
<h2 id="goals">Goals</h2>
<p>Last month I set some goals that I would pursue during March, but I think I should do some more general goals that I can do during the year, and during the month itself. This is what I came up with. I added those I completed from last month, but I don’t think I want to list everything I completed as the year goes, so, yeah, just ongoing goals and progress updates, I guess.</p>
<p><strong>Completed:</strong></p>
<ul class="task-list">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked"/>Survived my work</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked"/>Finished <em>Persepolis Rising</em></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked"/>Went to the movies once</li>
</ul>
<p><strong>New</strong></p>
<ul class="task-list">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>Fully sorting and labelling everything on my shelves for once</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>Finish a pending commission for a friend</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>Finish a pending commission for my parents</li>
</ul>
<p><strong>In progress</strong></p>
<ul class="task-list">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>A full website redesign (??)</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>Read the whole Bible in a year (9/365)</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>Finish listening to <em>Wolf 359</em> (45/61)</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>Complete 15 books (4/15)</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>Complete 15 videogames (2/15)</li>
</ul>
<h2 id="finishing-thoughts">Finishing thoughts</h2>
<p>This month was wild. Work really took over a lot of my life since my coworker went on his long vacation, and yet, despite it all, I managed to surpass expectations when it comes to the amount of media I watched. I am particularly happy about the books and manga I got to read.</p>
<p>It’s getting to a point I may just highlight some specific things instead of mentioning everything.</p>
<p>And all the blogposts I managed to do this month? It’s not my best or the most constant, but I am rather happy about it. Plus all the small changes and additions to my website. A good month all around, even if I could have gone without the extra workload. Can’t complain much though.</p>
<p>Definitely looking forward to what April has in store, I hope things will go alright.</p>
<p>Until next time!</p>
<p>This is day 44 of <a href="https://100daystooffload.com">#100DaysToOffload</a></p>
<p>
<a href="mailto:me@joelchrono.xyz?subject=March 2026 Summary">Reply to this post via email</a> |
<a href="https://fosstodon.org/@joel/116330247160565542">Reply on Fediverse</a>
</p>What Digital Isolation and Censorship Evasion Look Like In Wartime Iran - Werd I/O69cd27e7e82ba400019c86302026-04-01T14:12:55.000Z<p>[<a href="https://www.techpolicy.press/what-digital-isolation-and-censorship-evasion-look-like-in-wartime-iran/?ref=werd.io">Laura Scherling in Tech Policy Press</a>]</p><p>I’ve worried that the internet will become a casualty of our worsening global politics. The inherent co-operation needed to let global networks talk to each other is aligned with an open world but not so much with an authoritarian one. Walled-off national internets — often called splinternets — may become more common.</p><p>While I worry about this for the US as the authoritarian screws continue to tighten, this is the concrete reality for people in Iran and 20 other countries today. As <a href="https://www.techpolicy.press/what-digital-isolation-and-censorship-evasion-look-like-in-wartime-iran/?ref=werd.io">this piece in Tech Policy Press</a> points out:</p><blockquote>“The cybersecurity company Surfshark recorded 81 new internet restrictions in 2025 <a href="https://surfshark.com/research/study/internet-shutdowns-2025?ref=werd.io">across 21 countries</a>, pointing to evolving patterns of repression. Out of the 81 restrictions Surfshark tracked, 51 of these restrictive measures were taken <a href="https://surfshark.com/research/study/internet-shutdowns-2025?ref=werd.io">in response to</a> political situations.”</blockquote><p>News and information needs to be shared differently in this kind of environment: the digital distribution techniques we’ve spent the last few decades learning simply don’t apply. Last year, in <a href="https://werd.io/building-distributed-media-for-a-democratic-breakdown/"><em>Building distributed media for a democratic breakdown</em></a>, I wrote about how we might learn from Cuba’s <em>‌El Paquete Semanal</em> and take advantage of both sneakernets and peer-to-peer networks to overcome these kinds of blockades. In a restrictive environment, people need news and journalism more than ever.</p><p>I wrote that piece somewhat speculatively, but the reception to it in journalistic circles took me by surprise. It’s an idea and a worry that people are taking seriously. And over the last six months, in a world that has seen more conflict, more restrictions, and more attacks on free speech, there have only been reasons to take it more so.</p><p>[<a href="https://www.techpolicy.press/what-digital-isolation-and-censorship-evasion-look-like-in-wartime-iran/?ref=werd.io">Link</a>]</p>The Right Is Using AI Content Scanners to Try to Supercharge Book Banning - Werd I/O69cd20c1e82ba400019c86292026-04-01T13:42:25.000Z<p>[<a href="https://www.404media.co/blockade-the-right-is-using-ai-content-scanners-to-try-to-supercharge-book-banning/?ref=werd.io">Claire Woodcock at 404 Media</a>]</p><p>This AI-powered effort is intentionally designed to create chilling effects and reduce support for vulnerable communities:</p><blockquote>“Conservative parents’ advocacy groups have been experimenting with using commercially available artificial intelligence tools to help them flag more books they’ve deemed pornographic to be removed from public schools and libraries. Even though LLMs are notoriously error-prone, and the books in question aren’t pornographic, these groups continue to explore use cases for AI anyway.”</blockquote><p>According to 404 Media’s reporting, the script has a list of 300 or so words that form the basis of a heuristic that applies an “appropriateness” score to each one. If the book is deemed inappropriate, the script creates an automated report designed to be attached to book challenges at the school district level.</p><p>This reminds me of DOGE itself, which <a href="https://www.propublica.org/article/ted-cruz-woke-grants-national-science-foundation?ref=werd.io">used a keyword-based system to flag “woke” grants that should be defunded</a> that led to some incredibly dumb decisions about what should go:</p><blockquote>“Among them, for example, was a $470,000 grant to study the evolution of mint plants and how they spread across continents. As best we can tell, the project ran into trouble with Republicans on the Senate Committee on Commerce, Science and Transportation because of two specific words used in its application to the NSF: “diversify,” referring to the biodiversity of plants, and “female,” where the application noted how the project would support a young female scientist on the research team.”</blockquote><p>These techniques are clearly inaccurate, but that’s not the point: it’s enough to cause havoc and make people second guess publishing books on certain topics. It’s the same culture of chaos that led to <a href="https://www.nbcnews.com/news/education/tennessee-librarian-fired-refusing-move-lgbtq-books-childrens-adult-rcna266119?ref=werd.io">a school librarian being fired for (correctly) refusing to remove over a hundred LGBTQ books from the children’s to the adult section of her library</a>. And it’s all designed to harm some of the people who need the most support.</p><p>[<a href="https://www.404media.co/blockade-the-right-is-using-ai-content-scanners-to-try-to-supercharge-book-banning/?ref=werd.io">Link</a>]</p>Random File Format - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=650272026-04-01T11:34:57.000Z<p>This was an idea I had back in the days of Naptster.</p>
<p>At the turn of the century, it was common to listen to an "acquired" music file only to find it was missing a few seconds at the end due to a prematurely stopped download. Some video formats would refuse to play at all if the <a href="https://www.cnwrecovery.com/manual/Fragmented3GPMP4Files.html"><code>moov</code> atom at the end of the file was missing</a>.</p>
<p>I wondered if it would be possible to make a file format which was close to impossible to read unless the <em>entire</em> file was intact. I don't mean including a checksum to detect download errors - I mean a layout which was <strong>intrinsically fragile</strong> to corruption.</p>
<p>While digging through an old backup CD, I found my original notes. I'm rather impressed at what neophyte-me had constructed. My outline was:</p>
<ul>
<li>The file ends with a 32 bit pointer. This points to the location of the first information block.</li>
<li>The information block describes the length of the data block which follows it.</li>
<li>At the end of the data block is another 32 bit pointer. This points to the location of the next information block.</li>
<li>The start of the file may be a pointer, or it may be padded with random data.</li>
<li>There may be random data padded between the data blocks.</li>
</ul>
<p>This ensures that a file which has been only partially downloaded - whether truncated at the end or missing pieces elsewhere - cannot be successfully read.</p>
<p>Here's a worked example. Start at the end and follow the thread.</p>
<ol start="0">
<li>Random data.</li>
<li>Data block size is 2.</li>
<li>Data</li>
<li>Data</li>
<li>EOF.</li>
<li>Data block size is 1.</li>
<li>Data.</li>
<li>Go to location 1.</li>
<li>Random data.</li>
<li>Go to location 5.</li>
</ol>
<p>There are, of course, a few downsides to this idea.</p>
<p>Most prominently, it bloats file size. If the data block size was a constant 1MB, that would pad the size a negligible amount. But with variable data block size, it could increase it significantly. Random padding also increases the size.</p>
<p>If the block size is consistent and there's no random padding data, the files can be mostly reconstructed.</p>
<p>Depending on which parts of the file are missing, it may be possible to recover the majority of the file.</p>
<p>A location block size of 32 bits restricts the file-size to less than 4GB. A 64 bit pointer might be excessive or might be future-proof!</p>
<p>Highly structured files with predictable patterns, or text files, may be easy to recover large bits of information.</p>
<p>A malformed file could contain an infinite loop of pointers.</p>
<p>Perhaps a <a href="https://en.wikipedia.org/wiki/File_format#Magic_number">magic number</a> should be at the start (or end) of the file?</p>
<p>While reading the file is as simple as following the pointers, <em>constructing</em> the file is more complex, especially if blocks have variable lengths.</p>
<h2 id="code"><a href="https://shkspr.mobi/blog/2026/04/random-file-format/#code">Code</a></h2>
<p>Here's a trivial encoder. It reads a file in consistently sized chunks of 1,024 bytes. It shuffles them up and writes them to a new file. The last 4 bytes contain a pointer to the first block, which says the data length is 1,024. After that, there is a 4 byte pointer to the next block location.</p>
<pre><code class="language-python">import random
# Size of data, headers, and pointers.
data_length = 1024
header_length = 4
pointer_length = 4
# Read the file into a data structure.
original_blocks = list()
with open( "test.jpg", "rb") as file:
for data in iter( lambda: file.read( data_length ), b"" ):
# Add padding if length is less than the desired length.
padding = data_length - len( data )
data += b"\0" * padding
original_blocks.append( data )
# How many blocks are there?
original_length = len( original_blocks )
# Create a random order of blocks.
order = list( range( 0, original_length ) )
random.shuffle( order )
# Where is the start of the file?
first_block_index = order.index( 0 )
first_block_pointer = first_block_index * ( header_length + data_length + pointer_length )
# Loop through the order and write to a new file.
i = 0
# Open as binary file to add the pointers correctly.
with open( "output.rff", "wb" ) as output:
while i < original_length:
# Where are we?
current_block = i
current_block_value = order[i]
# Write length of data in little-endian 32 bytes.
output.write( data_length.to_bytes( header_length, "little") )
# Write data
output.write( original_blocks[ current_block_value ] )
i = i+1
# Last block. Write an EOF header.
if ( current_block_value + 1 >= original_length ):
eof = 4294967295
output.write( eof.to_bytes( header_length, "little") )
else:
next_block = order.index( current_block_value + 1 )
# Write pointer to next block
next_block_location = next_block * ( header_length + data_length + pointer_length )
output.write( next_block_location.to_bytes( pointer_length, "little" ) )
# At the end of the file, write the pointer to block 0.
output.write( first_block_pointer.to_bytes( pointer_length, "little" ) )
</code></pre>
<p>And here is a similarly trivial decoder. It reads the last 32 bits, moves to that location, reads the block size, reads the data and writes it to a new file, then reads the next pointer.</p>
<pre><code class="language-python">import os
# Size of data, headers, and pointers.
header_length = 4
pointer_length = 4
# File name to write to.
decoded_file = "decoded.bin"
# Create an empty file.
with open( decoded_file, "w") as file:
pass
# Function to loop through the blocks.
def read_block( position, i ):
# Move to the position in the file.
input_file.seek( position, 0 )
# Read the data length header.
data_length = int.from_bytes( input_file.read( header_length ), "little" )
# Move to the data block.
input_file.seek( position + header_length, 0 )
# Read the data.
data = input_file.read( data_length )
# Read the pointer header.
next_position = int.from_bytes( input_file.read( pointer_length ), "little" )
# If this is the final block, it may have null padding. Remove it.
if ( next_position == 4294967295 ) :
data = data.rstrip(b"\0")
# Append the data to the decoded file.
with open( decoded_file, "ab" ) as file:
file.write( data )
# If this is the final block, finish searching.
if ( next_position == 4294967295 ) :
print("File decoded.")
else:
# Move to the next position.
read_block( next_position, i+1 )
# Open the file as binary.
input_file = open( "output.rff", "rb" )
# Read the last 4 bytes.
input_file.seek( -4, 2 )
# Get position of first block
first_block = int.from_bytes( input_file.read(), "little" )
# Start reading the file.
seek_to = first_block
read_block( seek_to, 0 )
</code></pre>
<p>As I said, these are both trivial. They are a bit buggy and contain some hardcoded assumptions.</p>
<p>Here are two files encoded as "RFF" - Random File Format - <a href="https://shkspr.mobi/blog/wp-content/uploads/2026/03/output.jpg.rff">an image</a> by Maria Sibylla Merian, and the <a href="https://shkspr.mobi/blog/wp-content/uploads/2026/03/output.txt.rff">text of Romeo and Juliet</a>.</p>
<p>Have fun decoding them!</p>
Mutation testing for the agentic era - Trail of Bits Bloghttps://blog.trailofbits.com/2026/04/01/mutation-testing-for-the-agentic-era/2026-04-01T11:00:00.000Z<p>Code coverage is one of the most dangerous quality metrics in software testing. Many developers fail to realize that code coverage lies by omission: it measures execution, not verification. Test suites with high coverage can obfuscate the fact that critical functionality is untested as software develops over time. We saw this when mutation testing uncovered a <a href="https://github.com/trailofbits/publications/blob/master/reviews/2024-12-arkis-defi-prime-brokerage-securityreview.pdf">high-severity Arkis protocol vulnerability</a>, overlooked by coverage metrics, that would have allowed attackers to drain funds.</p>
<p>Today, we’re announcing <a href="https://github.com/trailofbits/muton">MuTON</a> and <a href="https://github.com/trailofbits/mewt">mewt</a>, two new mutation testing tools optimized for agentic use, along with a <a href="https://github.com/trailofbits/skills/tree/main/plugins/mutation-testing">configuration optimization skill</a> to help agents set up campaigns efficiently. MuTON provides first-class support for TON blockchain languages (FunC, Tolk, and Tact), while mewt is the language-agnostic core that also supports Solidity, Rust, Go, and more.</p>
<p>The goal of mutation testing is to systematically introduce bugs (mutants) and check if your tests catch them, flagging hot spots where code is insufficiently tested. However, mutation testing tools have historically been slow and language-specific. MuTON and mewt are built to change that. To understand how, it helps to first understand what they’re replacing.</p>
<h2 id="the-regex-era">The regex era</h2>
<p>Mutation testing dates to the 1970s, but for a long time, the technique rarely saw much adoption in the blockchain space as a software quality measurement. Testing frameworks are coupled tightly to target languages, making support for new languages expensive.</p>
<p><a href="https://agroce.github.io/icse18t.pdf">Universalmutator</a> changed this with its regex engine. After a commit on March 10, 2018 added Solidity support, the tool gained immediate traction in the blockchain space. We collaborated with the universalmutator team to advance smart contract testing and highlighted the tool in our <a href="https://blog.trailofbits.com/2019/01/23/fuzzing-an-api-with-deepstate-part-2/">2019 blog post</a>. Despite (or perhaps because of) its elegant approach and compact codebase, universalmutator generated impressive mutant counts, enabling developers to assess test coverage more thoroughly than simpler tools could. Vyper and other language support followed, establishing universalmutator as the leading mutation testing tool for blockchain.</p>
<p>But regex has fundamental limits. Line-based patterns cannot mutate multi-line statements, a critical gap acknowledged by the original paper. More problematic: without mutant prioritization, the tool wastes time on redundant mutations. When commenting a line triggers no test failures, universalmutator still generates and tests every possible variation of that line, dramatically extending campaign runtime. Printing the results to <code>stdout</code> adds further friction for humans and AI agents reviewing campaigns. Later improvements (including a <a href="https://agroce.github.io/fse24.pdf">2024 switch to comby</a> for better syntactic handling) addressed some pain points, but remaining limitations prompted the development of more focused alternatives.</p>
<p>Between 2019 and 2023, several tools emerged to address them, including our own <a href="https://github.com/crytic/slither/blob/master/docs/src/tools/Mutator.md">slither-mutate</a> solution. Each took a different approach to the core problems of language comprehension, scalability, and test quality.</p>
<h2 id="slither-mutate-speed-through-prioritization">slither-mutate: Speed through prioritization</h2>
<p>We launched <a href="https://github.com/crytic/slither/blob/master/docs/src/tools/Mutator.md">slither-mutate</a> in August 2022, after our wintern, <a href="https://github.com/vishnuram1999">Vishnuram</a>, brought the concept to life. Because Slither already parsed Solidity’s AST and provided a Python API, the groundwork was laid to generate syntactically valid mutations and implement a cleaner tweak-test-restore cycle (earlier tools polluted repositories with mutated files).</p>
<p>The tool’s key innovation was mutant prioritization: high-severity mutants replace statements with reverts (exposing unexecuted code paths), medium-severity mutants comment out lines (revealing unverified side effects), and low-severity mutants make subtle changes, such as swapping operators. The tool skips lower-severity mutants when higher-severity ones already indicate missing coverage on the same line, dramatically reducing campaign runtime, the biggest obstacle to wider mutation testing adoption. By late 2022, we were deploying slither-mutate across most Solidity audits.</p>
<p>Two limitations remained. First, tight coupling to Solidity meant there was no path to easily support other blockchain languages. Second, dumping results to <code>stdout</code> persisted as a problem, but adding a database to Slither creates unacceptable friction for the broader Slither user base.</p>
<h2 id="introducing-muton-and-mewt-the-tree-sitter-era">Introducing MuTON and mewt: The tree-sitter era</h2>
<p>MuTON, our newest mutation testing tool, provides first-class support for all three TON blockchain languages: Tolk, Tact, and FunC. We’re grateful to the <a href="https://ton.foundation/">TON Foundation</a> for supporting its development. MuTON is built on mewt, a language-agnostic mutation testing core that also supports Solidity, Rust, and more.</p>
<p>MuTON achieves language comprehension comparable to slither-mutate while supporting multiple languages by using Tree-sitter as its parser. Tree-sitter powers syntax highlighting in modern editors, building a concrete syntax tree that distinguishes language keywords from comments. This allows MuTON to target expressions like if-statements in a well-structured way, handling multi-line statements gracefully. Traditionally, integrating Tree-sitter grammars for new language support takes orders of magnitude longer than writing regex rules, but AI agents paired with <a href="https://github.com/trailofbits/mewt/blob/main/.claude/skills/add-language-support/SKILL.md">bespoke skills</a> invert this calculus, delivering Tree-sitter’s power with regex-like ease of extension.</p>
<p>MuTON stores all mutants and test results in a SQLite database, a quality-of-life improvement that became evident while using slither-mutate but wasn’t feasible to retrofit. Results persist across sessions; campaigns can be paused and resumed without losing progress. If you accidentally close your terminal during a 24-hour campaign, your work survives. Persistent storage also enables flexible filtering and formatting: print only uncaught mutants in specific files, or translate results to SARIF for improved review. This flexibility helps humans and AI agents explore results, triage findings, and hunt for bugs.</p>
<h2 id="the-future-of-mutation-testing">The future of mutation testing</h2>
<p>MuTON addresses many historical pain points, but significant friction remains. Three challenges stand between mutation testing and widespread adoption: configuring campaigns for reasonable runtimes, triaging results to separate signal from noise, and generating tests that encode requirements rather than accidents. AI agents, equipped with specialized skills, promise to transform each of these obstacles into routine tasks.</p>
<h2 id="optimizing-configuration">Optimizing configuration</h2>
<p>Performance remains the biggest obstacle to mutation testing. If your test suite takes five minutes and you have 1,000 mutants, that’s 83 hours of unavoidable runtime. Mutation testing tools can’t fix slow tests, but smart configuration can dramatically reduce wasted time. MuTON already gives you powerful options to tune campaigns: target critical components instead of everything, use two-phase campaigns that run fast targeted tests first and then retest uncaught mutants with the full suite, configure per-target test commands so mutations in authentication code only trigger authentication tests, or restrict to high and medium severity mutations when time is tight. These tools work today and deliver real speedups.</p>
<p>But the decision tree branches endlessly: should you split by component or severity? Two-phase or targeted tests? What timeout accounts for incremental recompilation? We’ve released a <a href="https://github.com/trailofbits/skills/tree/main/plugins/mutation-testing">configuration optimization skill</a> that guides AI agents through these choices, measuring your test suite, estimating runtimes, and proposing optimal configurations tailored to your project structure. Try it now—it’s available in our public skills repository and makes the process painless.</p>
<h2 id="triaging-results">Triaging results</h2>
<p>Not all uncaught mutants matter. Mutations that change <code>x > 0</code> to <code>x != 0</code> are semantic no-ops when <code>x</code> is an unsigned integer. A perfect mutator wouldn’t generate such mutations in the first place, but that would require deeper language-specific understanding than Tree-sitter provides. Manual triage traditionally requires slogging through hundreds of results, checking types, and understanding context to extract actionable insights.</p>
<p>MuTON’s database and flexible filtering already make this dramatically easier. Filter by mutation type or specific files to highlight high-value results. More importantly, these filters make AI-assisted triage token-efficient in ways earlier tools dumping raw output to <code>stdout</code> never could. Even today, asking an agent to review filtered mutation results and summarize true positives delivers 80% of the insights for 1% of the manual work. We’re developing a triage skill that systematically guides agents through result analysis, identifying patterns such as clustered uncaught mutants (a strong bug indicator) versus isolated operator mutations in utility functions (likely false positives or low priority). The skill will help agents flag high-risk areas and explain why specific mutations matter, turning raw results into actionable security insights.</p>
<h2 id="the-promise-and-peril-of-mutation-driven-test-generation">The promise and peril of mutation-driven test generation</h2>
<p>At first glance, using mutation testing to guide AI agents in writing tests seems like an elegant solution: test mutants, find escapees, generate tests to catch them, repeat until coverage is complete. But this naive approach harbors a subtle danger: an uncritical agent doesn’t know whether it’s encoding correct behavior or propagating bugs into your test suite.</p>
<p>When mutation testing reveals that changing <code>priority >= 2</code> to <code>priority > 2</code> alters behavior, should the agent write a test asserting that <code>priority == 2</code> triggers an action? Maybe. Or maybe that’s a bug, and now you’ve corrupted your tests with the same incorrect logic, giving false confidence while doubling your maintenance burden. The real challenge isn’t generating tests that just catch mutants; it’s generating tests that encode requirements rather than implementation accidents.</p>
<p>We believe the solution lies in building agents that are skeptical, that halt and ask questions when they encounter suspicious or ambiguous patterns, and that demand external validation before crystallizing behavior into tests. It’s a subtle problem that balances AI’s strengths with developers’ limited attention, but we’re working on it. Stay tuned.</p>
<h2 id="dive-in">Dive in</h2>
<p>Ready to test your smart contracts? Install <a href="https://github.com/trailofbits/muton?tab=readme-ov-file#installation">MuTON</a> for TON languages, or <a href="https://github.com/trailofbits/mewt?tab=readme-ov-file#installation">mewt</a> for Solidity, Rust, and more. Run a campaign and discover your blind spots. Found a bug in TON language support? File an issue in MuTON. See room for improvement in the core framework or other languages? Join us in the mewt repository. Both projects are open source and welcome contributions.</p>
<p>Watch our <a href="https://github.com/trailofbits/skills">skills</a> repository for new skills that will guide AI agents through campaign setup and result analysis, transforming mutation testing from a manual slog into a routine part of the development process.</p>Museum Memories: Roundup - James' Coffee Bloghttps://jamesg.blog/2026/04/01/museum-memories-roundup2026-04-01T00:00:00.000Z
<p>This month I had the pleasure of hosting the March 2026 IndieWeb Carnival on the topic of “<a href="https://jamesg.blog/2026/03/01/indieweb-carnival-museum-memories">Museum memories</a>”, in which I invited participants to write about a memory of a museum. To everyone who participated – we had over 30 participants this month! – thank you. It was a delight to read everyone’s stories.</p><p>Reading the contributions to this month’s Carnival will take you around the world, covering everywhere from Canada to Japan to Goa to Cairo. There are a breadth of perspectives, covering everything from a behind-the-scenes look at writing for museums (<a href="https://vhbelvadi.com/museums" rel="noreferrer">V.H. Belvadi</a>), to cities themselves as museums (<a href="https://paultibbetts.uk/2026/03/17/museum-memories/">Paul</a>), to the role of context in understanding art exhibits (<a href="https://littledigitalplumgarden.vercel.app/indie-web-carnival/a-museum-reflections-march-2026-the-wag-qaumajuq/" rel="noreferrer">Ginny</a>).</p><p>In this post I briefly summarise the contributions, drawing attention to one point that stood out to me as I read each blog post. I invite you to read the round-up and follow the links to any post that interests you.</p><p>While the "Museum memories" Carnival is now over, I am still accepting contributions. Feel free to email me at readers [at] jamesg [dot] blog and I will make sure your post is represented in the round-up. In addition, if I have missed your blog post in the round-up, please email me so I can add your post.</p><p>The Carnival for April is on the topic of "<a href="https://lifeofpablo.com/blog/indieweb-carnival-2026-adventure" rel="noreferrer">Adventure</a>", hosted by Pablo.</p><h2 id="submissions">Submissions</h2><p><a href="https://robida.net/entries/2026/03/02/museum-memories">Beto</a> walks the reader through his experiences with modern art, starting with the Centre Pompidou in Paris. He notes the extent to which modern art opened his eyes, to the extent of reflecting on the very nature of what art could be:</p><blockquote>My earliest memory of being in love with a museum was when I visited the <a href="https://en.wikipedia.org/wiki/Centre_Pompidou">Centre Pompidou</a>, in Paris, with my dad. I was 15, and we were traveling from Brazil through France, Italy, and Spain. This was my first contact with modern art, and I was deeply affected by everything I saw. It changed my perception of art, and of what art <em>could be</em>.</blockquote><p>⁂</p><p><a href="https://artlung.com/blog/2026/03/03/two-museum-memories/">Joe</a> starts by reflecting on how thought-provoking the topic of museum memories was: “As I thought about what that prompt brought to mind, I was flooded with memory.” He then goes on to share two memories of museums: the first, seeing WIRED magazine in a museum; the second, in the pride he felt seeing an exhibition run by his sister at the Smithsonian in Washington, D.C.</p><blockquote>What a wonder it is to remember the totality of my sister’s life and experience that kind of accomplishment. I mean, I remember the day when my sister was born. I remember her first step. That I can hold those memories in my head along with the memory of the day she earned her Master’s Degree and the day she shared her exhibit with me and our Dad.</blockquote><p>⁂</p><p><a href="https://jeffbridgforth.com/two-museum-memories">Jeff</a> followed in Joe’s footsteps of exploring two museum memories: his time in the Design Museum of Barcelona and the Salvador Dalí Museum in St. Petersburg, Florida. Reflecting on visiting the design museum in Barcelona, Jeff shares how the visit was brought to life by being accompanied by family:</p><blockquote>This visit stands out because of the shared experience with my son. The museum was focused on design, which we are both involved in. […] So the exhibits touched something deep inside of who we are as designers/creatives. I am so glad that I got to be with him when he visited this museum. </blockquote><p>⁂</p><p>Like Joe, I was flooded with memories when I started to think about writing <a href="https://jamesg.blog/2026/03/05/museum-memories">my entry to the Carnival</a> for this month. I shared my experience visiting the National Museum of Flight with my grandparents when I as a kid. I am still in awe of the scale and grandeur of the museum, and have many fond memories of the trip:</p><blockquote>I feel that same sense of awe now in art galleries when I look at large paintings: the scale of the thing in front of me can be so grand – or indeed small and extensively detailed – that, for a moment, I can’t help but think “wow!” That feeling never gets old.</blockquote><p>⁂</p><p><a href="https://shellsharks.com/notes/2026/03/06/museum-memories">Mike</a> shared his excitement of visiting the Steven F. Udvar-Hazy Center (Air & Space Museum) in Northern Virginia and the wonders of seeing a real-life spaceship in person:</p><blockquote>Sure, if you’re a flight geek, or a war buff, you’re going to be in heaven there. But as neither of those really, I can attest to how really cool it is to walk around there regardless of your interests. I mean, how can you not gaze in wonderment at an actual spaceship, imagining the many stellar voyages it took. <em>Wondrous</em>.</blockquote><p>⁂</p><p><a href="https://www.zinzy.website/2026/03/06/museum-memories/">Zinzy</a> then takes us to London to the National Gallery, where she reflects on how the words on a plaque next to an artwork in the National Portrait Gallery changed her perception of a work. I will leave this quotation as your invitation to read the post in full:</p><blockquote>Picture me entering the National Portrait Gallery for a photo exhibit, and walking heart-first into a room with an enormous print of a woman in complete disarray. Cheeks red from hours of crisis, a frown pressed into her forehead, shoulders held up as if tenseness were the only form of comfort she had left to know</blockquote><p>Zinzy’s experiences match my own in seeing paintings in museums: the plaques help us understand a piece, but our initial impressions still stick with us.</p><p>⁂</p><p>We’re now leaving London to explore the Museum of Possibilities in Chennai with <a href="https://thoughts.jatan.space/posts/the-museum-of-possibilities">Jatan</a>. The museum has a range of exhibits on assistive technologies, a few of which Jatan explores in the post both in words and with images. At the start of the post, Jatan shares a wonderful tool:</p><blockquote>One of the display themes was tech tools which bridge accessibility gaps for people. These tools were in working states. I particularly loved this e-pen which reads text out loud as you slide it over any page with words. It can even save said text as a file.</blockquote><p>⁂</p><p><a href="https://xn--ri8hp8b.ws/blog/the-200-year-old-roti-maker/">twitu</a> then takes us to the Goa Chitra Museum, which displays “many daily use tools and equipment by the people of Goa in the 19th and early 20th century.” twitu reflects on the experience of seeing tools used over a hundred years ago, noting:</p><blockquote>I find it fascinating to know what occupied the lives of people 100+ years ago. The tiresome beat of daily chores and tools to automate them. And some of them have stayed fundamentally the same for the pass 100 years!!</blockquote><p>⁂</p><p><a href="https://lastencore.org/posts/museum-memories/">Last Encore</a> takes us to Japan to explore how the architecture of museums impacts our experience as visitors, reflecting on the tension between interior design, architectural visions, and function:</p><blockquote>In such establishments, one is bombarded with buzzwords like “immersive” or “free-flowing,” where the layout is intentionally ambiguous. Under the guise of “exploring in any order you like,” I find myself pacing the same gallery over and over, muttering, “I am quite certain I have seen this room already.” Finding the exit becomes a genuine struggle.</blockquote><p>Last Encore’s experiences brought back my own memories of museums that feel almost labyrinthine: full of wonderful art, but hard to navigate.</p><p>⁂</p><p><a href="https://littledigitalplumgarden.vercel.app/indie-web-carnival/a-museum-reflections-march-2026-the-wag-qaumajuq/">Ginny</a> takes us to the WAG-Qaumajuq museum in Winnipeg:</p><blockquote>The WAG-Qaumajuq is home to the largest collection of Inuit art pieces in Canada. Qaumajuq (pronounced KOW-ma-yourk) means "it is lit, it is bright" in Inuktitut.</blockquote><p>Ginny’s post introduces her post through the lens of context, which she considers an essential part of art galleries:</p><blockquote>The most important part of an art gallery for me is context. Why was this piece created, what was the artist's inspirations, what part of their history informed the art?</blockquote><p>Full of fascinating facts about Inuit and Indigenous culture, Ginny’s post is a wonderful read.</p><p>⁂</p><p>Next, <a href="https://zl4bv.com/posts/2026-03-10-power-museum-memories/">Ben</a> explores the power of museum memories through the lens of exhibitions on power generation. Ben starts with a concise history of how humans generated power, and then shares several experiences of getting up close with power generation machines of all kinds in several museums. In his post, he reflects on how one display case can display the chronology of a technology over a century:</p><blockquote>Something that stood out to me is a <a href="https://collections.museumsvictoria.com.au/items/1219473">display case</a> with functioning models of industrial-era steam machines all connected together by belts to overhead drive shafts. […] The evolution of the display case over 100 years shows the versatility of rotational energy: networks of power distribution can be built with interchangeable power generators and power consumers.</blockquote><p>⁂</p><p><a href="https://vhbelvadi.com/museums">V.H. Belvadi</a> invites us behind the scenes to see what it is like to work with a museum. V.H. explores what museums could be if they had more support, the role everyday objects play in museums, the intricacies of communicating to the public through exhibit plaques, and more. I especially appreciated his eye-opening perspective on what museums could be with more support:</p><blockquote>Speaking to multiple curators a common confession I have heard is that if only the museum could afford floor space for everything they own, they would love to display all of it. For many museums that might mean an extra room or storey. For the likes of the British Museum it probably means several additional buildings.</blockquote><p>⁂</p><p><a href="https://www.nicksimson.com/posts/2026-lost-in-the-met.html">Nick</a> then takes us to the Metropolitan Museum of Art in New York through the lens of his visit as a seventh grader. Nick reflects on, among other things, the grandeur of the building and how it felt to be visit:</p><blockquote>What I can recall most vividly is the feeling of wandering through this enormous museum on my own. Stepping into the grand entrances of the Met is akin to visiting the world’s great cathedrals. High ceilings, marble floors, brilliant lighting. I was still naive in my art education at this point, but these art works felt so important, so elevated in that remarkable space. I did not actually get lost in the Met, but I did lose track of time.</blockquote><p>Nick wraps up his post with a delightful conclusion: “I may have gotten a little lost in the Met, but I found a part of myself too.”</p><p>⁂</p><p><a href="https://sammieland.neocities.org/posts/2026-03_IndieWeb-Blog-Carnival_Museum-Memories">Sammie</a> brings a new perspective to what we consider to be a museum, inviting us to think of museums not only as a discrete physical location but as any place in the world that sparks your curiosity:</p><blockquote>Similarly, seeing things physically in general. Watching train cars drive by and seeing all the art on the sides of them displayed, or watching the wheels and considering how they fit in the tracks. Questioning how wires connect and following them from one machine to the next. Studying walls and furniture, paintings on the walls of waiting rooms. There are so many things that you get to see and question and wonder. </blockquote><p>⁂</p><p><a href="https://blog.virek.net/2026/03/11/growing-up-around-a-museum.html">Matthew</a> tells us the story of his experience growing up near the Blists Hill outdoor museum complex, and the lasting influence the space had on his life. Matthew notes how the museum allowed him to “smell and really feel the past”:</p><blockquote>Once onsite, I was given a lot of freedom to roam around and look at the various shops and interests of the site, and then we’d go home for lunch. The site, it is a reproduction victorian village, with shops, banks, and other artefacts that faithfully recreate the era. It was fairly rudimentary in those days, having not long opened, but quickly developed into one of those rare but popular destinations where you get to not only see, but touch, smell and really feel the past.</blockquote><p>⁂</p><p>Andrei made two contributions to the Carnival this month: first exploring the relationship between art and wealth in “<a href="https://andrei.xyz/post/exit-through-the-gift-shopthe-fine-line-between-culture-and-ostentation/">Exit through the gift shop > The fine line between culture and ostentation</a>”, and then documenting several museums he has visited in “<a href="https://andrei.xyz/post/museums-along-the-road/">Museums along the Road</a>”.</p><p>Andrei invites readers to seek a slower experience in museums by visiting an exhibition that really appeals to us:</p><blockquote>So instead of going for the huge art and history museums where you spend tens if not hundreds of euros for the tickets, go for the slow experience. Stay away from the Louvres and MOMAs and Tates of the world, they’re usually filled with stolen shit taken from oppressed people so rich people can get richer. Instead, search an exhibition of an artist that you like, or visit something special.</blockquote><p>⁂</p><p><a href="https://davidmeissner.com/blog/museum-memories">David</a> starts his post by talking about the variety of museums that he enjoys, from art institutions like the Louvre to rural historical museums. He then explores how there is nothing like seeing a piece of art in person:</p><blockquote>I learned early on that there is no substitute for seeing actual works of art whenever possible. It’s a wonderful experience to finally see a painting that you are familiar with through reproductions. A painting is alive in a way that even a high quality reproduction is not. The colors are true, but it’s more than that. It’s the life, the physicality, the hand of the artist, sometimes obscured but always present. A reproduction can show you how something looks, but it can’t capture any of that life.</blockquote><p>⁂</p><p><a href="https://noahie.xyz/blog/cogito/03-2026/museums/">Noahie</a> documents how our relationship with museums can transform with time. Starting by mentioning how he explored the Dallas Museum of Art with an “irreverent attitude” as a kid, he now sees museums as a place to have a “peaceful and interesting day.” Noahie then reflects on the increased accessibility to art in the modern day, and the lasting influence art has had on his life:</p><blockquote>Overall, I think that museums have become a more humble institution despite their aristocratic beginnings. These days, good art is accessible to everyone, and I think that's important. The influence it has had on my life is vast, and these days, it's one of the things I most look forward to in life.</blockquote><p>⁂</p><p><a href="https://web.archive.org/web/20260308150224/https://bix.blog/posts/2026-03-01-on-museum-memories-daniels-story/">Bix</a> shares his experience visiting a travelling exhibit from the United States Holocaust Memorial Museum at the time of the Bosnian War, which left them with a chilling impression:</p><blockquote>Mostly, I just remember that even as the exhibition itself eschewed showing images of the camps from one war, we daily were seeing images of camps from the latest war.</blockquote><p>⁂</p><p><a href="https://theresmiling.eu/blog/2026/03/museum-memories">Elena</a> begins her blog post with a story of a museum guard who had particular expectations of how someone should and should not appreciate art:</p><blockquote>I still had my ticket in my hand and used that to point to all the cool parts. I admit, I was also very close to the glass, but I didn't touch anything. Anyway, it didn't take long and a guard came literally stomping towards us. He then said in a very upset tone: "This is great art you're looking at. Do not use your ticket to point at it! One does not point at great art with a ticket!"</blockquote><p>This museum did not deter Elena from enjoying the rest of the museum with her colleagues, thankfully. Instead, she took it in her stride:</p><blockquote>But when it had finally sunken in, we quoted him at every other artwork to remind one another to please absolutely not use our tickets to point at this great art that's exhibited here.</blockquote><p>⁂</p><p><a href="https://z1nz0l1n.com/26w11/">Anthony</a> puts museums at the heart of his holidays. When visiting, he is “looking for, over anything else, is evidence of how things were made”, connecting the marks of how art is made to his love of analog writing tools:</p><blockquote>My love of fountain pens, typewriters and block printing isn’t rooted in nostalgia, but in the fact that they leave their mark on my work. The nib, the slug and the carvings literally imprint every decision, every mistake and every happy accident into the paper. They prove that i was here. At their best, museums do the same thing on a much larger scale. They prove that people were there.</blockquote><p>⁂</p><p><a href="https://kiko.io/post/IndieWeb-Carnival-Museum-Memories/">Kristof</a> shares three memories of museums: the Deutsches Museum in Munich, exploring various museums in Sweden, and his experience at Yad Vashem, the World Holocaust Remembrance centre. Kristof’s reflections of Yad Vashem from the perspective of someone who grew up in Germany are stark:</p><blockquote>This museum leaves no one unmoved, but what struck me deeply in retrospect is the fact that my language and my familiar culture were visible in the pictures. Beautiful facades of German cities… with corpses lying in the streets in front of them. Beautiful German landscapes… with barbed wire, half-dead people, and the headline “Arbeit macht frei”. The culture of my ancestors was visible everywhere. MY damn culture! I felt shame because my people were the perpetrators. I felt anger because my people were the victims.</blockquote><p>⁂</p><p><a href="https://reillyspitzfaden.com/posts/2026/03/the-antique-telecommunications-museum/">Reilly</a> documents his experience visiting the Communication Technologies Museum, where he was able to get up close to – and even try – some technologies. Reilly’s experience illuminates how interactive exhibits add a new dimension to museums: from being an observer who reads and studies an exhibit to an active participant:</p><blockquote>One of my favorite exhibits was a set of teletype machines, all linked together. A teletype is similar to a typewriter, but keypresses can be transmitted and received. Typing on one of these machines sends a code for each character — traditionally the 5-bit Baudot code. When a teletype on the other end of the line receives Baudot code, it types out the same character as the unit sending the code. The museum as kind enough to let visitors type on one of the teletypes, and it was extremely cool to see them communicate with each other, with another unit duplicating what we typed.</blockquote><p>⁂</p><p><a href="https://paultibbetts.uk/2026/03/17/museum-memories/">Paul</a> takes us to the biggest museum we have seen yet in submissions to the Carnival by positing that the city of Barcelona itself is a museum:</p><blockquote>I mention all of this because the city itself is a giant museum. You can step back in time, in design, and urban planning, and wander through the narrow cobbled streets of the Old Quarter, then walk ten minutes to Eixample to see an extension, started two hundred years ago, that’s still celebrated for how modern it is.</blockquote><p>Paul’s blog post is almost a web-based walking tour of Barcelona, covering ancient building foundations, the city planning of the Eixample neighbourhood, the Castell de Montjuïc, street art, the Sagrada Família, and more.</p><p>⁂</p><p>We’re now off to Philadelphia to explore the Franklin Institute with <a href="https://miksimum.com/2026/03/18/the-franklin-institutes-rhythmic-machines/">Jesse</a>. In his post, Jesse walks through the architecture of the building, its striking exhibits, and the personal resonance of the health exhibits in the museum. The pendulum in the museum inspires Jesse to ask us to consider the role of rhythm in our own lives:</p><blockquote>And we are also rhythmic machines, aren’t we? — rhythm being the way nature imposes order on her own chaos. The body’s algorithms, circulation and respiration, and the mind as well. Inhale, exhale. Sleep, wake, sleep.</blockquote><p>⁂</p><p><a href="https://loreleice.net/notebook/iwc-mar2026.html">Loreleice</a> takes readers through an exhibition in Museo Sugbo, which documents the history of the Cebu area in the Philippines. Loreleice describes photos of both a “baro't saya, a traditional costume for Filipina women”, and “pots and bowls, which seem to come from the pre-colonial era.” I feel like Loreleice is my tour guide while I read this post.</p><p>Toward the end of the blog post, Loreleice notes the potential of museums to deepen our knowledge of a subject:</p><blockquote>Since I only get surface-level knowledge about the Philippine history from textbooks (and possibly the Internet world), I feel like museum visits could deepen that.</blockquote><p>⁂</p><p><a href="https://theoo.dev/notes/30">Theo</a>, inspired by the range of memories he has in museums, prepared a list of moments spent in museums. The list covers everything from seeing his grandfather “‘ice-skating’ for the first time in like 20 years” to “running around in an ancient Roman villa, making bread and visiting the herbs garden; Twice”.</p><p>Theo’s post ends with the central role people play in their memories of museums:</p><blockquote>I think I realised that what made museums so special to me is the people I shared these moments with. Some of these people I'll never see again, others I could but won't. People I miss, people I love.</blockquote><p>⁂</p><p>For <a href="https://darthmall.net/2026/museum-people/">Evan</a>, museums are woven through his life, from visiting the National Museum of Natural History as a kid, to exploring the museums of Paris with family, to going to the Carnegie Museum of Art in Pittsburgh on a first date with the woman who became his wife. Evan introduces his post with a label I might have to start using myself: being a Museum Person:</p><blockquote>I think of myself as a Museum Person. I come from a family of Museum People. I married a Museum Person. I take my kid to museums. We’ve been going to museums for longer than I can remember.</blockquote><p>⁂</p><p><a href="https://khleedril.org/blog/2026-03-22--museum-memories.html">Dale</a> discusses the delightful surprise of encountering the Spirit Museum in Stockholm. His blog post makes me think about how many “gems” there are to discover outside of the headline museums in cities:</p><blockquote>Honestly, in a city with lots of really good museums, the Spirit Museum is a real gem, and maybe the best ‘accidental’ discovery Iʼve made. Despite that it is small by capital museum standards, they seem to have a knack of attracting really interesting visiting exhibitors and punch above their weight in variety and entertainment value.</blockquote><p>⁂</p><p><a href="https://britthub.co.uk/dinosaurs-and-bees/">Britt</a> recalls moments from childhood spent in museums run by North East Museums in England, including the “Hancock Museum (natural history) and Discovery Museum (science and local history)”. The memories span from a close encounter with an animatronic triceratops to seeing a beehive at work through the glass in a museum staircase.</p><p>Britt notes that museums have had a lasting influence on her passion for learning:</p><blockquote>My many childhood visits to museums are part of why I love learning things and sharing what I learn with other people. </blockquote><p>⁂</p><p>Next, we’re off to Egypt with <a href="https://jeremycherfas.net/blog/cairo-diary-4">Jeremy</a> to explore the Cairo Museum. Jeremy submitted a post from 2005 for this month’s Carnival, which I accepted with great delight owing to its vividness. Jeremy’s post walks through several exhibits and his reactions to them. He also discusses how the information available in museums builds over time: </p><blockquote>OK, there are still fabulous gaps in my knowledge. Like, what is the relationship between Dunmutef the jackal and Anubis the jackal? But I feel that I have made something of a breakthrough, all on my own. Bits of information, scattered observations, have come together in something that resembles coherence.</blockquote><p>⁂</p><p><a href="https://sarajaksa.eu/2026/03/indieweb-carnival-march-202-the-museum-of-my-childhood-and-the-museums-of-the-community/">Sara</a> starts by sharing a childhood memory of the Technological Museum of Bistra, and then goes on to discuss the everyday role that museums have in our lives, with a particular focus on museums in Ljubljana. Sara’s conclusion reminds us that museums are for everyone:</p><blockquote>While I know a lot of people here dismiss museums and galleries as something that only intellectual and pretentious people do, I do think that the museums and galleries do have their role in our everyday life as well and I am seeing that in my everyday life. They deserve the support they are getting and more. </blockquote><p>⁂</p><p><a href="https://francescrossley.com/museum-memories/">Frances</a> shares a memory of visiting the British Museum at the age of ten or eleven during which they took many photos. Reflecting on the one of the pictures, Frances connects their childhood museum visit to their current field of study:</p><blockquote>Here we have Mithras slaying a bull. Apparently I was already intending to study ancient and mediaeval history at university.<br/><br/>It does not appear my interests have changed all that much.</blockquote><p>⁂</p><p>By way of the 21_21 DESIGN SIGHT exhibit, <a href="https://pinewind.bearblog.dev/museum-memories-wild-untamed-mind/">kwist</a> reflects on how all the parts of an exhibition come together to build an impression:</p><blockquote>Instead, an exhibition's concept, selection of exhibits, their arrangement in relation to each other, and even things like the use of the museum space and its soundscape come together to offer a unique experience, and a view at the world from a different perspective.</blockquote><p>kwist also shares the moment when the exhibit, which was about the concept of “wildness”, came to life:</p><blockquote>But at least for me, it also just ... worked. Somewhere along the way, I decided to go along with it, and started thinking about this more abstract concept of "wildness" the exhibition was trying to convey - and it <em>clicked</em> somehow. It was an almost meditative experience that had a strong impact on how I view museums, and deepened my appreciation of them.</blockquote><p>⁂</p><p>Moving on, <a href="https://ken.fyi/hirshhorn">Ken’s post</a> takes us back to Washington, D.C., this time to the Hirshhorn Museum. Ken notes that the building was “One of the first times modern architecture seriously captured my curiosity.” Describing the building and his experiences visiting the museum, he says:</p><blockquote>On the inside, it’s all post-WWII modern and contemporary visual art, each floor a continuous loop of gallery space. And then on the top (publicly-accessible) floor, one of the galleries has a balcony overlooking the National Mall.<br/><br/>Something about the novelty of the subject matter and my malleable state of mind at the time, but certain exhibitions are just seared into my being.</blockquote><p>⁂</p><p>Next, we are visiting <a href="https://michaelkupietz.com/blog-post/indieweb-carnival-march-2026-museum-memories/">Michael’s blog</a>, in which he shares five stories from museums across the United States, from Philadelphia to San Francisco. Michael’s post reflects on the nature of life and time, museums near and far, using poetry to describe an exhibition, and more.</p><p>Reflecting on his visit to the Exploratorium in San Francisco, Michael explores how what seemed far away as a child became close as an adult as he stood inside the museum 20 years after reading about it in a magazine:</p><blockquote>Sure thing, kid. It's amusing now, having lived here for 30 years, to remember just how far away San Francisco was to a suburban 9-year-old growing up on Long Island.</blockquote><p>This has me thinking that, indeed, museums themselves bring what may be so far away a little bit closer to us.</p><p>⁂</p><p>Thomas takes us to the heart of Paris to explore a specific exhibit at Musee d’Orsay that left a lasting impression: the Three Mixed-media Arabs. Thomas shares his reaction to the sculptures, studying them in close detail from many angles:</p><blockquote>Part of what struck me was the movement of the alabaster cloth. But, with the cloaked sculpture and a hood, I couldn’t sort out how the hood, face, and head worked. Each angle and time I’d look I was see another detail of the sculpture that drew me in and distracted me from the static mechanics of how it was done. Whomever I’m with often nudges me onward, but my mind is stuck and enrapt with the hooded in hard alabaster bronze face that seems to have the alabaster moving freely like cloth captured and frozen in an instance (yet crafted over much time).</blockquote><p>Thomas shares his impression that the works do not get as much attention as others, noting:</p><blockquote>When I am there and taking in the three pieces I am usually the only one around it looking at them for anything more than a few seconds or passing glance. It feels like they are hidden in plain sight. </blockquote><p>⁂</p><p>Thank you again to everyone who contributed to the Carnival, and to all readers who have followed along with the Carnival this month!</p>
<!--kg-card-begin: html-->
<p>This post was <a class="u-syndication" href="https://news.indieweb.org/en">syndicated to IndieNews</a>.</p>
<!--kg-card-end: html-->
<a class="tag" href="https://andrei.xyz/post/exit-through-the-gift-shopthe-fine-line-between-culture-and-ostentation/">Exit through the gift shop > The fine line between culture and ostentation</a>
<a class="tag" href="https://andrei.xyz/post/museums-along-the-road/">Museums along the Road</a>
<a class="tag" href="https://artlung.com/blog/2026/03/03/two-museum-memories/">Joe</a>
<a class="tag" href="https://blog.virek.net/2026/03/11/growing-up-around-a-museum.html">Matthew</a>
<a class="tag" href="https://britthub.co.uk/dinosaurs-and-bees/">Britt</a>
<a class="tag" href="https://collections.museumsvictoria.com.au/items/1219473">display case</a>
<a class="tag" href="https://darthmall.net/2026/museum-people/">Evan</a>
<a class="tag" href="https://davidmeissner.com/blog/museum-memories">David</a>
<a class="tag" href="https://en.wikipedia.org/wiki/Centre_Pompidou">Centre Pompidou</a>
<a class="tag" href="https://francescrossley.com/museum-memories/">Frances</a>
<a class="tag" href="https://jamesg.blog/2026/03/01/indieweb-carnival-museum-memories">Museum memories</a>
<a class="tag" href="https://jamesg.blog/2026/03/05/museum-memories">my entry to the Carnival</a>
<a class="tag" href="https://jeffbridgforth.com/two-museum-memories">Jeff</a>
<a class="tag" href="https://jeremycherfas.net/blog/cairo-diary-4">Jeremy</a>
<a class="tag" href="https://ken.fyi/hirshhorn">Ken’s post</a>
<a class="tag" href="https://khleedril.org/blog/2026-03-22--museum-memories.html">Dale</a>
<a class="tag" href="https://kiko.io/post/IndieWeb-Carnival-Museum-Memories/">Kristof</a>
<a class="tag" href="https://lastencore.org/posts/museum-memories/">Last Encore</a>
<a class="tag" href="https://lifeofpablo.com/blog/indieweb-carnival-2026-adventure">Adventure</a>
<a class="tag" href="https://littledigitalplumgarden.vercel.app/indie-web-carnival/a-museum-reflections-march-2026-the-wag-qaumajuq/">Ginny</a>
<a class="tag" href="https://loreleice.net/notebook/iwc-mar2026.html">Loreleice</a>
<a class="tag" href="https://michaelkupietz.com/blog-post/indieweb-carnival-march-2026-museum-memories/">Michael’s blog</a>
<a class="tag" href="https://miksimum.com/2026/03/18/the-franklin-institutes-rhythmic-machines/">Jesse</a>
<a class="tag" href="https://news.indieweb.org/en">syndicated to IndieNews</a>
<a class="tag" href="https://noahie.xyz/blog/cogito/03-2026/museums/">Noahie</a>
<a class="tag" href="https://paultibbetts.uk/2026/03/17/museum-memories/">Paul</a>
<a class="tag" href="https://pinewind.bearblog.dev/museum-memories-wild-untamed-mind/">kwist</a>
<a class="tag" href="https://reillyspitzfaden.com/posts/2026/03/the-antique-telecommunications-museum/">Reilly</a>
<a class="tag" href="https://robida.net/entries/2026/03/02/museum-memories">Beto</a>
<a class="tag" href="https://sammieland.neocities.org/posts/2026-03_IndieWeb-Blog-Carnival_Museum-Memories">Sammie</a>
<a class="tag" href="https://sarajaksa.eu/2026/03/indieweb-carnival-march-202-the-museum-of-my-childhood-and-the-museums-of-the-community/">Sara</a>
<a class="tag" href="https://shellsharks.com/notes/2026/03/06/museum-memories">Mike</a>
<a class="tag" href="https://theoo.dev/notes/30">Theo</a>
<a class="tag" href="https://theresmiling.eu/blog/2026/03/museum-memories">Elena</a>
<a class="tag" href="https://thoughts.jatan.space/posts/the-museum-of-possibilities">Jatan</a>
<a class="tag" href="https://vhbelvadi.com/museums">V.H. Belvadi</a>
<a class="tag" href="https://web.archive.org/web/20260308150224/https://bix.blog/posts/2026-03-01-on-museum-memories-daniels-story/">Bix</a>
<a class="tag" href="https://www.nicksimson.com/posts/2026-lost-in-the-met.html">Nick</a>
<a class="tag" href="https://www.zinzy.website/2026/03/06/museum-memories/">Zinzy</a>
<a class="tag" href="https://xn--ri8hp8b.ws/blog/the-200-year-old-roti-maker/">twitu</a>
<a class="tag" href="https://z1nz0l1n.com/26w11/">Anthony</a>
<a class="tag" href="https://zl4bv.com/posts/2026-03-10-power-museum-memories/">Ben</a>
Nesting social posts under blog posts in Artemis - James' Coffee Bloghttps://jamesg.blog/2026/04/01/artemis-nesting-social-posts2026-04-01T00:00:00.000Z
<style media="(prefers-color-scheme: dark)">pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #49483e }
.highlight { background: #272822; color: #F8F8F2 }
.highlight .c { color: #959077 } /* Comment */
.highlight .err { color: #ED007E; background-color: #1E0010 } /* Error */
.highlight .esc { color: #F8F8F2 } /* Escape */
.highlight .g { color: #F8F8F2 } /* Generic */
.highlight .k { color: #66D9EF } /* Keyword */
.highlight .l { color: #AE81FF } /* Literal */
.highlight .n { color: #F8F8F2 } /* Name */
.highlight .o { color: #FF4689 } /* Operator */
.highlight .x { color: #F8F8F2 } /* Other */
.highlight .p { color: #F8F8F2 } /* Punctuation */
.highlight .ch { color: #959077 } /* Comment.Hashbang */
.highlight .cm { color: #959077 } /* Comment.Multiline */
.highlight .cp { color: #959077 } /* Comment.Preproc */
.highlight .cpf { color: #959077 } /* Comment.PreprocFile */
.highlight .c1 { color: #959077 } /* Comment.Single */
.highlight .cs { color: #959077 } /* Comment.Special */
.highlight .gd { color: #FF4689 } /* Generic.Deleted */
.highlight .ge { color: #F8F8F2; font-style: italic } /* Generic.Emph */
.highlight .ges { color: #F8F8F2; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #F8F8F2 } /* Generic.Error */
.highlight .gh { color: #F8F8F2 } /* Generic.Heading */
.highlight .gi { color: #A6E22E } /* Generic.Inserted */
.highlight .go { color: #66D9EF } /* Generic.Output */
.highlight .gp { color: #FF4689; font-weight: bold } /* Generic.Prompt */
.highlight .gs { color: #F8F8F2; font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #959077 } /* Generic.Subheading */
.highlight .gt { color: #F8F8F2 } /* Generic.Traceback */
.highlight .kc { color: #66D9EF } /* Keyword.Constant */
.highlight .kd { color: #66D9EF } /* Keyword.Declaration */
.highlight .kn { color: #FF4689 } /* Keyword.Namespace */
.highlight .kp { color: #66D9EF } /* Keyword.Pseudo */
.highlight .kr { color: #66D9EF } /* Keyword.Reserved */
.highlight .kt { color: #66D9EF } /* Keyword.Type */
.highlight .ld { color: #E6DB74 } /* Literal.Date */
.highlight .m { color: #AE81FF } /* Literal.Number */
.highlight .s { color: #E6DB74 } /* Literal.String */
.highlight .na { color: #A6E22E } /* Name.Attribute */
.highlight .nb { color: #F8F8F2 } /* Name.Builtin */
.highlight .nc { color: #A6E22E } /* Name.Class */
.highlight .no { color: #66D9EF } /* Name.Constant */
.highlight .nd { color: #A6E22E } /* Name.Decorator */
.highlight .ni { color: #F8F8F2 } /* Name.Entity */
.highlight .ne { color: #A6E22E } /* Name.Exception */
.highlight .nf { color: #A6E22E } /* Name.Function */
.highlight .nl { color: #F8F8F2 } /* Name.Label */
.highlight .nn { color: #F8F8F2 } /* Name.Namespace */
.highlight .nx { color: #A6E22E } /* Name.Other */
.highlight .py { color: #F8F8F2 } /* Name.Property */
.highlight .nt { color: #FF4689 } /* Name.Tag */
.highlight .nv { color: #F8F8F2 } /* Name.Variable */
.highlight .ow { color: #FF4689 } /* Operator.Word */
.highlight .pm { color: #F8F8F2 } /* Punctuation.Marker */
.highlight .w { color: #F8F8F2 } /* Text.Whitespace */
.highlight .mb { color: #AE81FF } /* Literal.Number.Bin */
.highlight .mf { color: #AE81FF } /* Literal.Number.Float */
.highlight .mh { color: #AE81FF } /* Literal.Number.Hex */
.highlight .mi { color: #AE81FF } /* Literal.Number.Integer */
.highlight .mo { color: #AE81FF } /* Literal.Number.Oct */
.highlight .sa { color: #E6DB74 } /* Literal.String.Affix */
.highlight .sb { color: #E6DB74 } /* Literal.String.Backtick */
.highlight .sc { color: #E6DB74 } /* Literal.String.Char */
.highlight .dl { color: #E6DB74 } /* Literal.String.Delimiter */
.highlight .sd { color: #E6DB74 } /* Literal.String.Doc */
.highlight .s2 { color: #E6DB74 } /* Literal.String.Double */
.highlight .se { color: #AE81FF } /* Literal.String.Escape */
.highlight .sh { color: #E6DB74 } /* Literal.String.Heredoc */
.highlight .si { color: #E6DB74 } /* Literal.String.Interpol */
.highlight .sx { color: #E6DB74 } /* Literal.String.Other */
.highlight .sr { color: #E6DB74 } /* Literal.String.Regex */
.highlight .s1 { color: #E6DB74 } /* Literal.String.Single */
.highlight .ss { color: #E6DB74 } /* Literal.String.Symbol */
.highlight .bp { color: #F8F8F2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #A6E22E } /* Name.Function.Magic */
.highlight .vc { color: #F8F8F2 } /* Name.Variable.Class */
.highlight .vg { color: #F8F8F2 } /* Name.Variable.Global */
.highlight .vi { color: #F8F8F2 } /* Name.Variable.Instance */
.highlight .vm { color: #F8F8F2 } /* Name.Variable.Magic */
.highlight .il { color: #AE81FF } /* Literal.Number.Integer.Long */ .highlight .nn, .highlight .n{color: light-dark(black, var(--dark-foreground-color)) }</style><style media="(prefers-color-scheme: light)">pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #F00 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666 } /* Operator */
.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #9C6500 } /* Comment.Preproc */
.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #E40000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #008400 } /* Generic.Inserted */
.highlight .go { color: #717171 } /* Generic.Output */
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #04D } /* Generic.Traceback */
.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008000 } /* Keyword.Pseudo */
.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #B00040 } /* Keyword.Type */
.highlight .m { color: #666 } /* Literal.Number */
.highlight .s { color: #BA2121 } /* Literal.String */
.highlight .na { color: #687822 } /* Name.Attribute */
.highlight .nb { color: #008000 } /* Name.Builtin */
.highlight .nc { color: #00F; font-weight: bold } /* Name.Class */
.highlight .no { color: #800 } /* Name.Constant */
.highlight .nd { color: #A2F } /* Name.Decorator */
.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #00F } /* Name.Function */
.highlight .nl { color: #767600 } /* Name.Label */
.highlight .nn { color: #00F; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #19177C } /* Name.Variable */
.highlight .ow { color: #A2F; font-weight: bold } /* Operator.Word */
.highlight .w { color: #BBB } /* Text.Whitespace */
.highlight .mb { color: #666 } /* Literal.Number.Bin */
.highlight .mf { color: #666 } /* Literal.Number.Float */
.highlight .mh { color: #666 } /* Literal.Number.Hex */
.highlight .mi { color: #666 } /* Literal.Number.Integer */
.highlight .mo { color: #666 } /* Literal.Number.Oct */
.highlight .sa { color: #BA2121 } /* Literal.String.Affix */
.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
.highlight .sc { color: #BA2121 } /* Literal.String.Char */
.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
.highlight .sx { color: #008000 } /* Literal.String.Other */
.highlight .sr { color: #A45A77 } /* Literal.String.Regex */
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
.highlight .ss { color: #19177C } /* Literal.String.Symbol */
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #00F } /* Name.Function.Magic */
.highlight .vc { color: #19177C } /* Name.Variable.Class */
.highlight .vg { color: #19177C } /* Name.Variable.Global */
.highlight .vi { color: #19177C } /* Name.Variable.Instance */
.highlight .vm { color: #19177C } /* Name.Variable.Magic */
.highlight .il { color: #666 } /* Literal.Number.Integer.Long */</style>
<style>
@font-face {
font-family: 'MonaspaceArgon';
src: url('/assets/fonts/MonaspaceArgon-Regular.woff2') format('woff2');
font-weight: 400;
font-style: normal;
}
pre, code {
font-family: 'MonaspaceArgon', ui-monospace, monospace;
}
</style>
<p>In <a href="https://jamesg.blog/2025/03/03/grouping-link-posts-in-a-web-reader">Grouping link posts in a web reader</a>, I described a feature in Artemis to show when someone whose website you are following has bookmarked a post by an author you also follow. The motivation for this feature was to reduce clutter in a user’s reader by grouping shares of a post under the original post.</p><p>Whether an entry should be nested was determined by the URL of an entry in a feed, which meant that the feature triggered only for people who publish bookmarks feeds that link directly to other websites.</p><p>Yesterday, I started working on an expansion to this feature to cover another case: when someone you follow publishes a blog post, then announces that post on another account like Mastodon whose feed you also follow. I have seen this happen a few times since there are a few people whose blog and Mastodon account I follow. Ideally, the Mastodon post would be grouped under the main post. </p><p>Here is an example of the new feature in action:</p><figure><picture><img alt='The Artemis web reader showing three posts. The first post has one post nested under it that says "Shared as a link by Thomas Vander Wal."' loading="lazy" src="https://editor.jamesg.blog/content/images/2026/04/artemis_nesting_social.png" style=" max-width: 130%;"/></picture><div class="alt"><label><input aria-label="Toggle image alt text on screen" type="checkbox"/>ALT</label><div class="content">The Artemis web reader showing three posts. The first post has one post nested under it that says "Shared as a link by Thomas Vander Wal."</div></div></figure><p>Above, vanderwal.net’s <a href="https://www.vanderwal.net/random/entrysel.php?blog=2141">Musee d’Orsay and the Three Mixed-media Arabs</a> blog post is the main entry. Below the entry is the text “Shared as a link by Thomas Vander Wal”, which links to the <a href="https://mastodon.social/users/vanderwal/statuses/116326375105168555">Mastodon post</a> announcing the blog post.</p><p>When a post is retrieved by the Artemis polling system, all outgoing links are saved in a list. Then, when a user’s reader is being displayed, any post that links to another post will appear nested under the post to which it links. This feature only triggers if the feed that contains the link is a Mastodon account <sup id="f-1">1</sup>. This prevents a scenario where someone writes a <em>blog post</em> that links to another blog post, where, with the logic above, the blog post that links to another post would be hidden.</p><p><em>(Note for users: This feature works if you are subscribed to a feed using the ActivityPub syntax like <code>@jamesg.blog@jamesg.blog</code>; if you follow the RSS feed for a Mastodon account this will not work. This feature may work for Bluesky replies too, although I haven’t yet tested it on Bluesky accounts).</em></p><p>While a relatively small change, this feature helps to create focus on blog posts as opposed to presenting both a blog post and an announcement post in the same way.</p><p>[<strong>1</strong>] This feature may also work with other ActivityPub-based systems, although I haven’t tested it yet.</p>
<a class="tag" href="https://jamesg.blog/2025/03/03/grouping-link-posts-in-a-web-reader">Grouping link posts in a web reader</a>
<a class="tag" href="https://mastodon.social/users/vanderwal/statuses/116326375105168555">Mastodon post</a>
<a class="tag" href="https://www.vanderwal.net/random/entrysel.php?blog=2141">Musee d’Orsay and the Three Mixed-media Arabs</a>
The Entire Internet Is a UGC Reaction Video Now - Westenberg69cc58e31ee8f600019f0b012026-03-31T23:32:07.000Z<img src="https://images.unsplash.com/photo-1676380362680-85260af12dca?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDh8fHJlYWN0aW9uJTIwdmlkZW98ZW58MHx8fHwxNzc0OTk5ODY4fDA&ixlib=rb-4.1.0&q=80&w=2000" alt="The Entire Internet Is a UGC Reaction Video Now"><p>I keep a folder in Apple Notes called “cursed websites,” where I save various artefacts that make me feel like the social contract has dissolved. Call it an act of self-loathing. Call it collecting evidence of the fall. Dansugc.com went straight into the folder this morning.</p><p>It’s a site where marketers // entrepreneurs (and I find the line between those two groups has become blurred to the point of being illegible) can buy pre-recorded “Reaction” videos for $3 apiece. You browse a library of 2k clips, sorted by emotion (shocked! Happy! Crying! Excitement!), pick a face you find particularly appealing, download a 5-10 second clip of a stranger performing surprise // delight at nothing in particular, and splice it into your own content. The idea is to make it look like an actual someone had an actual emotional response to your app on TikTok. Custom orders run to $8 and let you specify outfits, emotional arcs etc.</p><p>The tagline reads: “100% Real Humans. Zero AI.”</p><p>And I think that tells you almost everything you need to know about where we are. And where we are is a place where “at least the fake fuckery was produced by a biological organism” counts as a premium feature. The pitch for selling manufactured authenticity at scale is that at least the people in the factory are still real people. That’s the floor. That’s what passes for premium. We are drowning in content that is functionally the same as so many designer handbags stitched up alongside so many dupes.</p><p>The internet is the most powerful communication technology in human history, and we’re using it to sell each other $3 clips of faked surprise.</p><p>I don’t blame Dan, if that’s even his real name. He’s running a business filling a niche. He’s recognised that the entire internet advertising “ecosystem” now runs on simulated, casual, spontaneous “cool girl” energy. He’s simply the shovel-seller in an authenticity gold rush; except the gold is parasocial trust, and the shovels are clips of various women pretending to have their minds blown by your calorie-counting app.</p><p>100, ready to post UGC videos per month costs $800. A fully managed campaign for 500 videos goes for $10k. Dan claims over 5 billion total views generated, and I don’t doubt his numbers at all. But if this stuff doesn’t set off your alarms, even a little, you’ve probably been marinating in it so long you’ve lost the ability to smell it.</p><p>What Dan’s business lays bare - if you actually sit with it - is that the internet, as a social and cultural space is almost entirely performance. The whole apparatus has been hollowed into a content mill that grinds human attention into micro-conversions. I’m aware that I’m not the first person to make the complaint that the internet sucks - but every point of suck has now compounded into the final boss of shitty experiences. The algorithmic timelines, the social media homogeneity, the death of truth, the proliferation of monetisation strategies and side hustles etc have all contributed to this moment: a growth hacked, engagement optimised, brand-building logic that has destroyed our ability to distinguish between a person sharing something they give a shit about, and a person executing a “content” strategy.</p><p>Open TikTok right now and ~try to find a video that isn’t, at some level, attempting to sell you something - a political identity, a digital product, a lifestyle, a personal brand. It's next to impossible. Every piece of content carries this faint whiff of ~strategy behind it. The girl doing a “Get Ready With Me” video has an affiliate link in her bio, and the asshole ranting about immigration has a Substack he can’t wait to funnel you to. The therapist explaining attachment styles is, naturally, building a course she’ll launch next month, and the couple doing a “day in our van-life” vlog is negotiating a brand deal in their DMs. There is always a funnel, always a CTA, and the output, no matter how “down to earth” it’s designed to feel, is always doubling as a mechanism to convert your attention into revenue.</p><p>Jean Baudrillard (read Simulacra and Simulation) identified how modern society replaces reality with the symbols and signs of reality. He mapped the process in four stages: first the image reflects reality, then it masks reality, then it masks the absence of reality, and finally it has no relation to reality whatsoever. A UGC reaction video purchased for $3 and spliced into a TikTok ad is operating at that fourth stage, because the reaction doesn't reference a real reaction, there was never a real reaction, and the whole thing is a sign pointing at nothing, wearing the costume of spontaneity.</p><p>You might say who cares, advertising has always been manipulative, and sure, that's true. When Grigory Potemkin allegedly erected fake village facades along the Dnieper River in 1787 to impress Empress Catherine II during her tour of Crimea, he was doing UGC marketing for the Russian Empire (the historical consensus is that the villages were probably real settlements that had been tidied up rather than total fabrications, but the legend stuck because the concept is so useful as shorthand). The instinct to manufacture the appearance of prosperity for the benefit of powerful onlookers is old as dirt. What's different now is the scale and the fact that regular people are doing it to each other all day long, voluntarily, for free or for pennies.</p><p>There's a phrase you hear in marketing: "everyone is a creator now." It sounds democratizing, hopeful even, like the whole internet has become a Renaissance workshop where artisans and thinkers reach audiences directly. In practice, everyone is a marketer now. The "creator economy" turned out to be an economy where the thing being created, more and more, is demand for more of yourself. Your aesthetic, your opinions, your morning routine, your trauma, your fitness journey, your face: all raw material for the content machine, all measured against growth metrics that would make a mid-career product manager feel right at home.</p><p>The result is an internet that feels, to use a technical term, like shit. Scroll any platform and you're wading through a river of optimized slop, and what makes it depressing is how same-y it all is despite the theoretically infinite diversity of human expression available online.</p><p>Political content looks like beauty content and beauty content looks like finance content and finance content looks like fitness content, because they’re all using the same hooks and they’re all built on the same emotional beats. The provocative claim in the first 2 seconds, the false tension, the extreme language, comment if you agree, like and subscribe and so on and on. Don’t forget to share this with someone who ~needs to hear this. Make sure you follow for part 2. The playbook is identical, whether someone’s raving about the best skin serum, or about their least favourite ethnic groups...</p><p>AI makes all of this both worse and darkly funny at the same time. AI slop and human slop have now converged to the point that Dan can credibly market “zero AI” as a premium feature, while his customers’ output offers no real elevation from the realm of deepfakes. And as much as Real Humans is a selling point for the internet today, the AI is getting better, too. It can produce damn-near the same hooks, the same engagement-bait captains, the same dead-eyed reaction that a human can churn out today. AI content creators aren’t even poisoning the well; not really. They’re simply drawing from a well we already puked in years ago.</p><p>AI slop is human slop with the labor costs removed, and that's why nobody can tell the difference, and that's why Dan has to specify that his product is made by real humans, like a carton of eggs stamped "cage-free."</p><p>There's a moment in Don DeLillo's <em>White Noise</em> where a character visits "The Most Photographed Barn in America" and realizes that nobody can actually see the barn anymore because the barn has been completely replaced by the aura of the photographs of the barn. Once you've seen the signs about the barn, he says, it becomes impossible to see the barn. The internet has done this to basically everything. You scroll past enough UGC reaction videos and you can't encounter a real reaction without wondering if it's bought, you read enough performative vulnerability posts and you can't encounter real vulnerability without suspecting it's a hook. The constant presence of the fake thing corrodes your ability to trust the real thing, and the really vicious part is that a lot of the "real things" were fake too, which means the thing you're mourning the loss of may never have existed in the form you remember it.</p><p>This is, I suspect, why nostalgia for "the old internet" has become its own genre of content (which is, of course, itself being optimized for engagement, because there's no exit door). People remember a time when someone's blog was their blog and nothing more, when a forum post was written because a person had a thing to say and they said it and moved on. Whether that era was actually as good as we remember is debatable, and I think there's a strong case that we're romanticizing it. Sturgeon's Law applied then too: 90% of everything was crap. But the crap was sincere crap. The crap was some guy with a Blogspot writing 3,000 words about his favorite Star Trek episodes because he liked Star Trek and had opinions about the Borg, with zero intention of building an audience or selling a course called "How I Built a 6-Figure Blog About Star Trek."</p>Read "CPAC Had the Stage in Texas—but Not Much of a Crowd" - Molly White's activity feed69cc4dce7bbd252405c81f0d2026-03-31T22:42:22.000Z<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.dmagazine.com/frontburner/2026/03/cpac-had-the-stage-in-texas-but-not-much-of-a-crowd/" rel="bookmark">“<span class="p-name">CPAC Had the Stage in Texas—but Not Much of a Crowd</span>”</a>. </div><div class="byline"><span class="p-author h-card">Steven Monacelli</span> in <i class="p-publication">D Magazine</i>. <span class="read-date"> Published <time class="dt-published published" datetime="2026-03-31">March 31, 2026</time>.</span></div><blockquote class="summary p-summary entry-summary">When CPAC chairman Schlapp asked the crowd, “How many of you would like to see impeachment hearings?” they erupted in cheers. “No, that was the wrong answer,” Schlapp said. “Let me try again. How many of you would like to see impeachment hearings?” Some in the crowd cheered again. “No,” Schlapp said, clearly frustrated.</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-03-31T22:42:22+00:00" title="March 31, 2026 at 10:42 PM UTC">March 31, 2026 at 10:42 PM UTC</time>. </div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/extremism" title="See all feed posts tagged "extremism"" rel="category tag">extremism</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/us_politics" title="See all feed posts tagged "US politics"" rel="category tag">US politics</a>. </div></div></footer></article>An alternate history of social media - Werd I/O69ab5c362355be0001ada6492026-03-31T21:20:00.000Z<img src="https://werd.io/content/images/2026/03/83a40593a527540667564cefc009ea38-1.png" alt="An alternate history of social media"><p>I've been remiss about sharing it here, but I really enjoyed my conversation with <a href="https://evan.henshaw-plath.com/?ref=werd.io">Rabble</a> on his excellent <a href="https://revolution.social/?ref=werd.io">Revolution.Social</a> podcast, which published earlier this month. Revolution.Social describes itself as a podcast about the future of social media built on permissionless open protocols. It's hosted by Twitter's first employee, <a href="https://evan.henshaw-plath.com/?ref=werd.io" rel="noreferrer">Rabble, a.k.a. Evan Henshaw-Plath</a>.</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/HdyOihQnWv0?start=205&feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="An Alternate History of Social Media (with Ben Werdmuller)"></iframe></figure><p><a href="https://revolution.social/episodes/?ref=werd.io">The list of other guests is an impressive who’s who of thinkers and change agents on the web</a> — <a href="https://revolution.social/episodes/silicon-valley-has-lost-its-moral-compass-with-ani/?ref=werd.io">Anil Dash</a>, <a href="https://revolution.social/episodes/decentralized-social-media-for-40-million-users-wi/?ref=werd.io">Jay Graber</a>, <a href="https://revolution.social/episodes/cory-doctorow-on-escaping-big-tech-privacy-battles/?ref=werd.io">Cory Doctorow</a>, <a href="https://revolution.social/episodes/invisible-rulers-author-renee-diresta-on-propagand/?ref=werd.io">Renee DiResta</a>, <a href="https://revolution.social/episodes/i-ve-never-been-more-optimistic-flipboard-s-mike-m/?ref=werd.io">Mike McCue</a>, <a href="https://revolution.social/episodes/building-human-rights-into-the-social-web-with-mal/?ref=werd.io">Mallory Knodel</a>, <a href="https://revolution.social/episodes/rudy-fraser-on-blacksky-mutual-aid-reclaiming-soci/?ref=werd.io">Rudy Fraser</a>, and more — and I’m honored to be in this company. These are all great conversations.</p><p>It’s available on <a href="https://podcasts.apple.com/us/podcast/revolution-social/id1824528874?ref=werd.io">Apple Podcasts</a>, <a href="https://open.spotify.com/show/4wAyssF5EFAPi9WyMuGS33?ref=werd.io">Spotify</a>, <a href="https://www.youtube.com/@rabble/podcasts?ref=werd.io">YouTube Music</a>, and wherever you get your podcasts. <a href="https://revolution.social/?ref=werd.io">You should go and subscribe.</a></p><p>And if you listen or watch – I'd love to hear what you think.</p>Read "Prediction markets backlash builds possible stormcloud for 2027" - Molly White's activity feed69cc2b287bbd252405c8187c2026-03-31T20:14:32.000Z<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.coindesk.com/news-analysis/2026/03/30/prediction-markets-backlash-builds-possible-stormcloud-for-2027" rel="bookmark">“<span class="p-name">Prediction markets backlash builds possible stormcloud for 2027</span>”</a>. </div><div class="byline"><span class="p-author h-card">Jesse Hamilton</span>. <span class="read-date"> Published <time class="dt-published published" datetime="2026-03-31">March 31, 2026</time>.</span></div><blockquote class="summary p-summary entry-summary">Odds favor a Democratic rise in Congress next year, when lawmakers who've begun going after firms such as Kalshi and Polymarket may have greater sway.</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-03-31T20:14:32+00:00" title="March 31, 2026 at 8:14 PM UTC">March 31, 2026 at 8:14 PM UTC</time>. </div></div><div class="bottomRow"><div class="tags">Tagged: <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>. </div></div></footer></article>Published on Citation Needed: "Issue 103 – The President’s Council of Podcasters" - Molly White's activity feed69cc0464dac7d0a8c7e78b882026-03-31T17:29:08.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-103" rel="syndication">Issue 103 – The President’s Council of Podcasters </a></h2></header><div class="content e-content"><div class="media-wrapper"><a href="https://www.citationneeded.news/issue-103"><img src="https://www.citationneeded.news/content/images/size/w2000/format/webp/2026/03/43329867122_8b775b382a_c.jpg" alt="A podcasting microphone with a pop filter and shock mount, mounted on a microphone arm"/></a></div><div class="p-summary"><p>Coinbase is accused of holding the cryptocurrency industry hostage over stablecoin rewards, prediction markets face an onslaught of opposition, and a Stand With Crypto poll can’t even get enthusiasm from its own activists</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-103"><time class="dt-published" datetime="2026-03-31T17:29:08+00:00" title="March 31, 2026 at 5:29 PM UTC">March 31, 2026 at 5:29 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/116324973513867792" title="Mastodon" rel="syndication">Mastodon</a><a class="social-link u-syndication bluesky" href="https://bsky.app/profile/molly.wiki/post/3miep6ckqgk2g" title="Bluesky" rel="syndication">Bluesky</a><a class="social-link u-syndication youtube" href="https://www.youtube.com/watch?v=Q053g75r-Q0" title="Youtube" rel="syndication">Youtube</a></div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/coinbase" title="See all feed posts tagged "Coinbase"" rel="category tag">Coinbase</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/crypto" title="See all feed posts tagged "crypto"" rel="category tag">crypto</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/crypto_lobby" title="See all feed posts tagged "crypto lobby"" rel="category tag">crypto lobby</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/law" title="See all feed posts tagged "law"" rel="category tag">law</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>.</div></div></footer></article>How we made Trail of Bits AI-native (so far) - Trail of Bits Bloghttps://blog.trailofbits.com/2026/03/31/how-we-made-trail-of-bits-ai-native-so-far/2026-03-31T11:00:00.000Z<p><em>This post is adapted from a talk I gave at <a href="https://unpromptedcon.org/">[un]prompted</a>, the AI security practitioner conference. Thanks to <a href="https://twitter.com/gadievron">Gadi Evron</a> for inviting me to speak. You can watch the recorded presentation below or download the <a href="https://github.com/trailofbits/publications/blob/master/presentations/How%20we%20made%20Trail%20of%20Bits%20AI-Native%20(so%20far)/slides.pdf">slides</a>.</em></p>
<p>Most companies hand out ChatGPT licenses and wait for the productivity numbers to move. We built a system instead.</p>
<p>A year ago, about 5% of Trail of Bits was on board with our AI initiative. The other 95% ranged from passively skeptical to actively resistant. Today we have 94 plugins, 201 skills, 84 specialized agents, and on the right engagements, AI-augmented auditors finding 200 bugs a week. This post is the playbook for how we got there. We <a href="https://github.com/trailofbits/skills">open sourced most of it</a>, so you can steal it today.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/kgwvAyF7qsA?autoplay=0&controls=1&end=0&loop=0&mute=0&start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
</div>
<br>
<p>A <a href="https://fortune.com/2026/02/17/ai-productivity-paradox-ceo-study-robert-solow-information-technology-age/">recent Fortune article</a> reported that a <a href="https://www.nber.org/papers/w34984">National Bureau of Economic Research study</a> of 6,000 executives across the U.S., U.K., Germany, and Australia found AI had no measurable impact on employment or productivity. Two-thirds of executives said they use AI, but actual usage came out to 1.5 hours per week, and 90% of firms reported zero impact. Economists are calling it the new Solow paradox, referencing the pattern Robert Solow identified in 1987: “you can see the computer age everywhere but in the productivity statistics.”</p>
<p>AI works. Most companies are using it wrong. They give people tools without changing the system. That’s the gap between AI-assisted and AI-native. One is a tool, the other is an operating system.</p>
<h2 id="what-ai-native-actually-means">What AI-native actually means</h2>
<p>“AI-native” gets thrown around a lot. The way I think about it, there are three levels:</p>
<p><strong>AI-assisted</strong> is where almost everyone starts. You give people access to ChatGPT or Claude. They use it to draft emails, generate boilerplate, summarize documents. It’s a productivity tool. The org doesn’t change. The workflows don’t change. You just do the same things a little faster.</p>
<p><strong>AI-augmented</strong> is where you start redesigning workflows. You’re not just using AI as a tool. You’re putting agents in the loop, changing how work actually flows. Maybe the AI does the first pass on a code review and the human does the second. The process itself is different.</p>
<p><strong>AI-native</strong> is the structural shift. The org is designed from the ground up assuming AI is a core participant. Not a tool you pick up, but a teammate that’s always there. Your knowledge management, your delivery model, your expertise, all designed to be consumed and amplified by agents.</p>
<p>At Trail of Bits, what this means concretely: our security expertise compounds as code. Every engagement we do, the skills and workflows we build make the next engagement faster. Every engineer operates with an arsenal of specialized agents built from 14 years of audit knowledge. That’s not “we use AI.” That’s “AI is on the team.”</p>
<h2 id="what-people-are-actually-resisting">What people are actually resisting</h2>
<p>When I first launched this initiative inside Trail of Bits, there was an incredible amount of pushback. Studies of technology adoption consistently show the same thing: the problem is never the software. It’s people’s unwillingness to accept that something else might be better than their intuition. I had to understand four specific psychological barriers before I could design a system that works within them.</p>
<p><strong>Self-enhancing bias.</strong> We overestimate our own judgment. Paul Meehl and Robyn Dawes <a href="https://www.cmu.edu/dietrich/sds/docs/dawes/the-robust-beauty-of-improper-linear-models-in-decision-making.pdf">showed</a> that if you take the variables an expert says they use and build even a crude linear model, the model outperforms the expert. Not because it’s smarter, but because it applies the same weights every time. You don’t. You’re hungover some days, distracted others, and you never notice because you take credit for your wins and blame external factors for your misses. This gets worse with seniority. The more expert you are, the more you trust your gut, and the less you believe a machine could do better. As <a href="https://www.gsb.stanford.edu/faculty-research/faculty/jonathan-levav">Jonathan Levav</a> frames it: the more unique you feel you are, the more you resist a machine making decisions for you.</p>
<p><strong>Identity threat.</strong> In <a href="https://journals.sagepub.com/doi/abs/10.1177/0022243718818423">one study</a>, researchers showed people the same kitchen automation device framed two ways: “does the cooking for you” versus “helps you cook better.” People who identified as cooks rejected the first framing and accepted the second, for the same device. There’s a symbolic dimension too: people don’t want robots giving them tattoos (human craft), but they’re fine with a tattoo-<em>removing</em> robot (instrumental, no symbolism). Security auditing is symbolic work. AI that replaces skill feels like an attack on who you are.</p>
<p><strong>Intolerance for imperfection.</strong> Dietvorst et al. <a href="https://marketing.wharton.upenn.edu/wp-content/uploads/2016/10/Dietvorst-Simmons-Massey-2014.pdf">ran a study</a> where participants watched an algorithm outperform a human forecaster. But after seeing the algorithm make one error, they abandoned it and went back to the human, even though the human was demonstrably worse. We forgive our own mistakes but not the machine’s. <a href="https://pubsonline.informs.org/doi/10.1287/mnsc.2016.2643">Their follow-up</a> found the fix: let people modify the algorithm. Even one adjustable parameter was enough to overcome the aversion.</p>
<p><strong>Opacity.</strong> A <a href="https://www.nature.com/articles/s41562-021-01146-0">2021 study in Nature Human Behaviour</a> found that people’s subjective understanding of human judgment is high and AI judgment is low, but objective understanding of both is near zero. People feel like they understand how a doctor diagnoses. They can’t explain it either. The feeling of not understanding kills the feeling of control.</p>
<h2 id="the-remedies-that-actually-worked">The remedies that actually worked</h2>
<p>We designed the system around the resistance, not against it.</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/03/31/how-we-made-trail-of-bits-ai-native-so-far/remedies_hu_467a5bd562219c7f.webp"
alt="The remedies that actually worked"
width="960"
height="540"
loading="lazy"
decoding="async" />
<figcaption>The remedies that actually worked</figcaption>
</figure>
</p>
<p>For <strong>self-enhancing bias</strong>, we built a maturity matrix. Nobody likes being told they’re at level 1. But that’s the point: you can’t argue you’re already good enough when there’s a visible ladder. It makes the conversation concrete instead of “I don’t think AI is useful.” It also creates social proof. When you see peers at level 2 or 3, the passive majority starts moving.</p>
<p>For <strong>identity threat</strong>, we never asked anyone to stop being a security expert. We gave them a new way to express that identity. When a senior auditor writes a constant-time-analysis skill, they’re not being replaced. They’re becoming more permanent. Their expertise is encoded and reusable. That’s an identity upgrade, not a threat. The maturity matrix reinforces this: level 3 isn’t “uses AI the most.” It’s “invents new ways, builds tools.” The identity of the expert shifts from “I don’t need AI” to “I’m the one who makes the AI dangerous.”</p>
<p>For <strong>intolerance for imperfection</strong>, we invested heavily in reducing the ways AI can fail embarrassingly. A curated marketplace means no random plugins with backdoors. Sandboxing means Claude Code can’t accidentally delete your work. Guardrails and footgun reduction mean fewer “AI did something stupid” stories circulating in Slack. If someone’s first AI experience is bad, you’ve lost them for months.</p>
<p>For <strong>opacity</strong>, we wrote an AI Handbook that made everything concrete: here’s what’s approved, here’s what’s not, here are the exceptions, here’s who to ask. Clear rules restored the feeling of control.</p>
<p>And underlying everything: we made adoption visible and fast. Deferred benefits kill adoption. If setup takes an hour and the first result is mediocre, you’ve confirmed every skeptic’s priors. Copy-pasteable configs, one-command setup, standardized toolchain, all designed so the first experience is fast and good. And the CEO going first matters more than people think. The passive 50% watches what leadership actually does, not what it says.</p>
<h2 id="the-operating-system-model">The operating system model</h2>
<p>Here’s the actual system we built. Six parts, each designed to address the barriers I just described:</p>
<table>
<thead>
<tr>
<th>Barrier</th>
<th>Core problem</th>
<th>What we built</th>
</tr>
</thead>
<tbody>
<tr>
<td>Self-enhancing bias</td>
<td>“I’m already good enough”</td>
<td>Maturity Matrix with visible levels and real consequences</td>
</tr>
<tr>
<td>Identity threat</td>
<td>“AI is replacing who I am”</td>
<td>Skills repos + hackathons that reward building, not just using</td>
</tr>
<tr>
<td>Intolerance for imperfection</td>
<td>One bad experience = months lost</td>
<td>Curated marketplace, sandboxing, guardrails</td>
</tr>
<tr>
<td>Opacity / trust</td>
<td>“I don’t understand how it decides”</td>
<td>AI Handbook that explains the risk model, not just the rules</td>
</tr>
</tbody>
</table>
<ol>
<li><strong>Pick a standard toolchain</strong> so you can support it</li>
<li><strong>Write the rules</strong> so risk conversations stop being ad hoc</li>
<li><strong>Create a capability ladder</strong> so improvement is expected, measurable, and rewarded</li>
<li><strong>Run tight adoption sprints</strong> so the org keeps pace with releases</li>
<li><strong>Package the learnings</strong> into reusable artifacts (repos, configs, sandboxes) so the system compounds</li>
<li><strong>Make autonomy safe</strong> with sandboxing, guardrails, and hardened defaults</li>
</ol>
<p>This isn’t a strategy deck we wrote and handed to someone. We built every piece ourselves, open sourced most of it, and iterated on it in production with a 140-person company doing real client work.</p>
<h3 id="standardize-on-tools">Standardize on tools</h3>
<p>Step one was boring but critical: we standardized. We got everyone on Claude Code, and we treat it like any other enterprise tool: supported configs, known-good defaults, and a clear path to “this is how we do it here.”</p>
<p>If you skip this step, you can’t build anything else. You end up with 40 different workflows and zero leverage.</p>
<h3 id="write-the-rules">Write the rules</h3>
<p>We wrote an AI Handbook. Not to teach people how to prompt. It’s there to remove ambiguity.</p>
<p>The key part is the usage policy: what tools are approved, what isn’t, especially for sensitive data. Cursor can’t be used on client code (except blockchain engagements; use Claude Code or Continue.dev instead). Meeting recorders are disallowed for client meetings conducted under legal privilege. Now, when a client asks what we’re using on their codebase, everyone gives the same answer.</p>
<p>The handbook doesn’t just list what’s approved. It explains the risk model behind each decision, so people understand <em>why</em>. That’s what addresses the opacity barrier: not “just trust this,” but “here’s our reasoning.” Once you have policy, you can safely push harder on adoption.</p>
<h3 id="make-it-measurable">Make it measurable</h3>
<p>We built an AI Maturity Matrix that makes AI usage a first-class professional capability, like “can you use Git” or “can you write tests.”</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/03/31/how-we-made-trail-of-bits-ai-native-so-far/ai_maturity_matrix_hu_ff36c1b5bdec79c7.webp"
alt="Trail of Bits AI Maturity Matrix"
width="1200"
height="975"
loading="lazy"
decoding="async" />
<figcaption>Trail of Bits AI Maturity Matrix, as of March 2026</figcaption>
</figure>
</p>
<p>It’s not a vibe. It’s a ladder: clear levels, clear expectations, a clear path up, and real consequences for staying stuck. What level 3 looks like depends on your role. An engineer at level 3 builds agent systems that ship PRs and close issues autonomously. A sales rep at level 3 has agents producing pipeline reports and QBR prep without hand-holding. An auditor at level 3 runs agents that execute full analysis passes and produce findings, triage, and report drafts.</p>
<p>This is how you avoid two failure modes: leadership wishing adoption into existence, and the org splitting into “AI people” and everyone else.</p>
<h3 id="create-an-adoption-engine">Create an adoption engine</h3>
<p>We run hackathons as a management system: short, focused sprints of 2-3 days with one objective. They’re how we keep pace when the ecosystem changes every week.</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/03/31/how-we-made-trail-of-bits-ai-native-so-far/hackathons_hu_a7c3913f590385f5.webp"
alt="Claude Code Hackathon v2: Autonomous Agents"
width="1200"
height="1296"
loading="lazy"
decoding="async" />
<figcaption>Claude Code Hackathon v2: Autonomous Agents</figcaption>
</figure>
</p>
<p>One recent example: “Claude Code Hackathon v2: Autonomous Agents.” The two lines that mattered were:</p>
<ul>
<li><strong>Objective:</strong> Ship the most impactful changes across our AI toolchain and public repos</li>
<li><strong>Twist:</strong> Engineers must work in bypass permissions mode (fully autonomous agent, not approve-every-action)</li>
</ul>
<p>That twist is intentional. It forces everyone to learn the real constraints: sandboxing, guardrails, and how to structure work so agents can succeed.</p>
<p>A few design choices matter here: we focus on public repos so we can move fast and show real outcomes. We measure success by activity (issues filed/fixed, PRs reviewed/merged), not lines of code. Everyone works in pairs, and every change gets reviewed by a buddy. Even the “move fast” sprint has quality control built in.</p>
<h3 id="capture-the-work-as-reusable-artifacts">Capture the work as reusable artifacts</h3>
<p>Hackathons create motion. But motion doesn’t compound unless you capture it.</p>
<p>The most important artifact is a <strong>skills repo</strong>. Skills are reusable, structured workflows, ideally with examples, constraints, and a way to verify output. We maintain an internal skills repo for company-specific workflows and an <a href="https://github.com/trailofbits/skills">external skills repo</a> so the broader community can validate and improve what we’re doing.</p>
<p>We also created a <strong><a href="https://github.com/trailofbits/skills-curated">curated marketplace</a></strong>, a “known good” place for third-party skills. Once you tell people “go use skills and plugins,” they’ll install random stuff. This is basic enterprise thinking applied to agent tooling: if you want adoption, you need a safe supply chain.</p>
<p>We made <strong>defaults copy-pasteable</strong>. We built a <a href="https://github.com/trailofbits/claude-code-config">repo that centralizes recommended Claude Code configuration</a> so onboarding isn’t tribal knowledge. This is where we put known-good settings, recommended patterns for personal <code>~/.claude/CLAUDE.md</code>, and anything we want to standardize.</p>
<p>We made <strong>sandboxing the default</strong>. If you want autonomous agents, you need sandboxing. We give people multiple safe lanes: a <a href="https://github.com/trailofbits/claude-code-devcontainer">devcontainer option</a>, <a href="https://code.claude.com/docs/en/sandboxing">native macOS sandboxing</a>, and <a href="https://github.com/trailofbits/dropkit">Dropkit</a>. The point isn’t that everyone uses the same sandbox. The point is everyone has a safe sandbox, and it’s easy to adopt.</p>
<p>We <strong>reduced footguns</strong>. We hardened defaults through MDM. For example, we rolled out more secure package manager defaults via Jamf, including <a href="https://socket.dev/blog/npm-introduces-minimumreleaseage-and-bulk-oidc-configuration">mandatory package cooldown policies</a>. The easiest way to reduce risk is to make the default path the safe path.</p>
<p>Finally, we <strong>connected agents to real tools</strong>. Once you have policy, guardrails, sandboxes, and skills, you can connect agents to real tools. One example we’ve published is an <a href="https://github.com/trailofbits/slither-mcp">MCP server for Slither</a>. Even if you don’t care about Slither specifically, the point is: MCP turns your internal tools into something agents can use reliably, and your org can govern.</p>
<h2 id="results-so-far">Results so far</h2>
<p>Let me give you some numbers on what this system actually produced.</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/03/31/how-we-made-trail-of-bits-ai-native-so-far/results_hu_d317e9018c8a275d.webp"
alt="The numbers that got the room’s attention at [un]prompted"
width="1200"
height="904"
loading="lazy"
decoding="async" />
<figcaption>The numbers that got the room's attention at [un]prompted</figcaption>
</figure>
</p>
<p><strong>Tooling scale:</strong> Across our internal and public skills repos, we have 94 plugins containing 201 skills, 84 specialized agents, 29 commands, 125 scripts, and over 414 reference files encoding domain expertise. That’s the compounding effect: every engagement, every auditor, every experiment adds to the arsenal.</p>
<p>The breadth matters. We have skills for writing sales proposals, tracking project hours, onboarding new hires, prepping conference blog posts, and delivering government contract reports. The internal repo has 20+ plugins targeting specific vulnerability classes: ERC-4337, merkle trees, precision loss, slippage, state machines, CUDA/Rust review, integer arithmetic in Go. Each one packages expertise that used to live in someone’s head into something any auditor can invoke.</p>
<p><strong>Delivery impact:</strong> For certain clients where the codebase and scope allow it, we went from finding about 15 bugs a week to 200. An auditor runs a fleet of specialized agents doing targeted analysis across an entire codebase in parallel, then validates the results.</p>
<p>About 20% of all bugs we report to clients are now initially discovered by AI in some form. They go into real client reports. An auditor validates every one, but the AI is surfacing things humans would have missed or wouldn’t have had time to look for.</p>
<p><strong>Business impact:</strong> Our sales team averages $8M in revenue per rep against a consulting industry benchmark of $2-4M. The sales team uses the same skills repos for proposal drafting, competitive positioning, conference prep, and lead enrichment. Same system, same compounding effect.</p>
<p>And this is maybe a year into building the system seriously. The models are getting better every month. The skills repo grows every week.</p>
<h2 id="open-questions">Open questions</h2>
<p>Here’s what we’re actively working on and don’t have great answers for yet.</p>
<p><strong>Private inference.</strong> We want local models for cost and confidentiality, but open models aren’t good enough yet. There’s still a significant gap versus the best closed models on coding benchmarks. We’re evaluating on-prem inference servers to run 230B+ models at full precision. Key insight: speed drives adoption more than capability. Nobody uses a slow model, even if it’s smart. In the meantime, private inference providers like <a href="https://tinfoil.sh">Tinfoil.sh</a> (confidential computing on NVIDIA GPUs, cryptographically verifiable) are getting compelling.</p>
<p><strong>Prompt injection and client code protection.</strong> This is an existential question for using AI on client code. The data the agent works on is inherently accessible to it. Today we use blunt instruments: sensitive clients mean no web access. Longer term, we’re looking at agent-native shells like <a href="https://github.com/always-further/nono">nono</a> and <a href="https://github.com/erans/agentsh">agentsh</a> that enforce policy at the kernel level.</p>
<p><strong>Policy enforcement and continuous learning.</strong> We push settings via MDM, but we’re not yet pulling signal back. The goal is to turn the whole company into a feedback loop that improves the operating system weekly. One possible long-term architecture: a <a href="https://stripe.dev/blog/minions-stripes-one-shot-end-to-end-coding-agents-part-2">master MCP server between agents and internal resources</a>, enforcing policy server-side. We’re not there yet.</p>
<p><strong>The future of consulting.</strong> This is the one that keeps me up at night. The consulting business model assumes you’re billing for time, and that time roughly correlates with expertise. But when some people can outperform others by orders of magnitude with the right agent setup, that correlation breaks. The question shifts from “how many hours did the auditor spend” to “did the auditor know where to point the agents and which findings are real.”</p>
<p>We don’t have the answer yet. But the nature of how Trail of Bits offers services will probably change in the next 6 to 12 months. Audit scoping, pricing, deliverables, all of it is on the table. The firms that figure this out first will have a structural advantage, and the ones that keep billing by the hour will watch their margins compress as their competitors ship more in less time. We’re not waiting to find out which side we’re on.</p>
<h2 id="the-replicable-recipe">The replicable recipe</h2>
<p>If you want to copy this, copy the system, not the specific tools:</p>
<ol>
<li>Standardize on one agent workflow you can support</li>
<li>Write an AI Handbook so risk decisions aren’t ad hoc</li>
<li>Create a capability ladder so improvement is expected</li>
<li>Run short adoption sprints that force hands-on usage</li>
<li>Capture everything as reusable artifacts: skills + configs + curated supply chain</li>
<li>Make autonomy safe with sandboxing + guardrails + hardened defaults</li>
</ol>
<p>That’s what we’ve done so far, and it’s already changed how fast we can ship and how quickly we can adapt.</p>
<h2 id="resources">Resources</h2>
<p>All of our tooling is open source:</p>
<ul>
<li><a href="https://github.com/trailofbits/skills">trailofbits/skills</a> - Our public skills repository</li>
<li><a href="https://github.com/trailofbits/skills-curated">trailofbits/skills-curated</a> - Curated third-party skills marketplace</li>
<li><a href="https://github.com/trailofbits/claude-code-config">trailofbits/claude-code-config</a> - Recommended Claude Code configurations</li>
<li><a href="https://github.com/trailofbits/claude-code-devcontainer">trailofbits/claude-code-devcontainer</a> - Devcontainer for sandboxed development</li>
<li><a href="https://github.com/trailofbits/dropkit">trailofbits/dropkit</a> - macOS sandboxing for agents</li>
<li><a href="https://github.com/trailofbits/slither-mcp">trailofbits/slither-mcp</a> - MCP server for Slither</li>
</ul>
<p>We’re hiring! We’re looking for an <a href="https://apply.workable.com/j/B85863C121">AI Systems Engineer</a> to work directly with me on accelerating everything in this post, and a <a href="https://apply.workable.com/j/4A48CBB705">Head of Application Security</a> to lead a team of about 15 exceptionally overperforming consultants. Check out <a href="https://trailofbits.com/careers">trailofbits.com/careers</a>.</p>Bic Runga At Te Paepae Theatre - The Weblog of fLaMEdhttps://flamedfury.com/posts/bic-runga-at-te-paepae-theatre/2026-03-31T06:34:28.000Z<p>What’s going on, Internet? Friday night my wife and I enjoyed a couple hours out in the evening to catch Bic Runga perform the second show on her Red Sunset tour at the recently opened Te Paepae Theatre.</p>
<p>We got into town 30 minutes before doors opened, but rather than stress about catching the warm up act we grabbed dinner at an old favourite, Depot.</p>
<p>We enjoyed clams, snapper slides, skirt steak and potato skins. Comforting knowing this is the same food we’d get here when we last visited a decade ago.</p>
<p>We arrived at Te Paepae around 8 pm, headed up stairs and found our seats. The warm up band which turned out to be Bic’s husband’s band were just finishing up. We had to double check, but yes that was Bic on the drums.</p>
<p>After a short 15-20 minute interval the show was back on with Bic taking the mic, and her husband returning the favour on drums.</p>
<p>Bic wove in old favourites among new songs from the latest album Red Sunset. Red Sunset is her first album in 15 years (if we don’t include 2016’s cover album). I hadn’t managed to listen to <a href="https://flamedfury.com/recordshelf/records/red-sunset-red-vinyl/">Red Sunset</a> yet, so the new songs were a first listen live. Pretty sure she opened with Drive. The new songs sounded great and I can’t wait to dive into the album on an upcoming roadtrip. As the show drew to an end Bic let us know that the show was wrapping up and rather than piss around with leaving the stage and coming back for the encore she got straight into her biggest and favourite track, Sway. What a tune to end the show with.</p>
<p>After the show Bic headed straight to the merch tent and was signing vinyls and CDs and posing for selfies with fans. I grabbed a copy of her 1997 album <a href="https://flamedfury.com/recordshelf/records/drive/">Drive</a> and got it signed by her. The vinyl itself wasn’t anything special. A single cardboard sleeve with a standard black vinyl. Sony obviously didn’t put a lot of effort into the production of this classic kiwi album.</p>
<p>Drive will always be a favourite of mine, it is one of my earliest memories of really getting into kiwi music. During third form (Year 9) for a music class project we had to find a local artist to do a report on, I wasn’t clued up on local music back then like I am now. Dad shared a newspaper or magazine article on this new album from a 17 year old, Bic Runga. And that I would say was my awakening to local music. It wasn’t too long until the third labour government under Helen Clark would invest heavily into the arts and we’d all be exposed to kiwi music for a solid few years.</p>
<p>Leaving the venue with my wife and the signed copy of Drive in my hand was a nice way to wrap up the evening and a good reminder of why I love kiwi music.</p>
<p>Laters 🤙</p>
<p>Hey, thanks for reading this post in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: Bic Runga At Te Paepae Theatre">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/bic-runga-at-te-paepae-theatre/#webmention">webmention</a>. Check out the <a href="https://flamedfury.com/posts/">posts archive</a> on the website.</p>
22.00.0192 March's YouTube roundup - Johnny.Decimalhttps://johnnydecimal.com/22.00.0192/2026-03-31T02:34:08.000Z<h1 id="marchs-youtube-roundup">March's YouTube roundup</h1>
<p>Here's your monthly round-up.</p>
<h3 id="make-your-llm-more-efficient-with-johnnydecimal">Make your LLM more efficient with Johnny.Decimal</h3>
<p><em>2026-03-04</em></p>
<a href="https://youtu.be/h5TUFFQEJgw"><a href="https://youtu.be/h5TUFFQEJgw">https://youtu.be/h5TUFFQEJgw</a></a>
<h3 id="attention-to-detail-gets-you-hired">Attention to detail gets you hired</h3>
<p><em>2026-03-07</em></p>
<a href="https://youtu.be/J2Sm9oIfj9A"><a href="https://youtu.be/J2Sm9oIfj9A">https://youtu.be/J2Sm9oIfj9A</a></a>
<h3 id="johnnydecimal-wasnt-designed-to-organise-everything">Johnny.Decimal wasn't designed to organise everything</h3>
<p><em>2026-03-11</em></p>
<a href="https://youtu.be/DaK99lMlHH4"><a href="https://youtu.be/DaK99lMlHH4">https://youtu.be/DaK99lMlHH4</a></a>
<h3 id="meetings--at-least-theyre-not-email">Meetings – at least they're not email</h3>
<p><em>2026-03-14</em></p>
<a href="https://youtu.be/EybKGE_TM_k"><a href="https://youtu.be/EybKGE_TM_k">https://youtu.be/EybKGE_TM_k</a></a>
<h3 id="i-use-the-structure-like-a-big-checklist">I use the structure like a big checklist</h3>
<p><em>2026-03-18</em></p>
<a href="https://youtu.be/2jSjo-94cCU"><a href="https://youtu.be/2jSjo-94cCU">https://youtu.be/2jSjo-94cCU</a></a>
<h3 id="fly-around-your-system-with-these-terminal-tricks">Fly around your system with these terminal tricks</h3>
<p><em>2026-03-21</em></p>
<a href="https://youtu.be/SM2TlZMOIYo"><a href="https://youtu.be/SM2TlZMOIYo">https://youtu.be/SM2TlZMOIYo</a></a>
<h3 id="an-easy-way-to-save-20-minutes-a-day">An easy way to save 20 minutes a day</h3>
<p><em>2026-03-30</em></p>
<a href="https://youtu.be/dEv7EYeX1Po"><a href="https://youtu.be/dEv7EYeX1Po">https://youtu.be/dEv7EYeX1Po</a></a>
<p>Decimal <code>ozhoom</code> from the forum sent me this AppleScript that you can hack to automate this process. Change the paths at the top.</p>
<pre><code># enter the folder location in quotes:
set path1 to "Users:john:xxxxxxxxxxxx" as alias
set path2 to "Users:john:P68 Personal Life" as alias
set path3 to "Users:john:xxxxxxxxxxxxx" as alias
set path4 to "Users:john:Downloads" as alias
tell application "Finder"
open path1
end tell
tell application "System Events" to perform action "AXPress" of menu item "New Tab" of menu "File" of menu bar item "File" of menu bar 1 of application process "Finder"
tell application "Finder"
activate
set target of front window to path2
end tell
tell application "System Events" to perform action "AXPress" of menu item "New Tab" of menu "File" of menu bar item "File" of menu bar 1 of application process "Finder"
tell application "Finder"
activate
set target of front window to path3
end tell
tell application "System Events" to perform action "AXPress" of menu item "New Tab" of menu "File" of menu bar item "File" of menu bar 1 of application process "Finder"
tell application "Finder"
activate
set target of front window to path4
end tell
</code></pre>The World's First Bullshit - Westenberg69cb12a51ee8f600019f09e42026-03-31T00:20:34.000Z<img src="https://www.joanwestenberg.com/content/images/2026/03/7LCmCnmV2iRCrFQZrwHjoF8muB8hcQcyet70v1gE-1873866828.png" alt="The World's First Bullshit"><p>I opened Twitter this morning and three different startups were announcing "the world's first" something. An AI CMO, an autonomous AI marketer, and a design agent "with taste," which is a phrase that made me close my laptop for about ten minutes.</p><p>None of them are the world's first anything. I'd bet money there are 40 AI marketing tools already shipping, maybe more, and the category lines are so blurry that "first" really comes down to how specific you're willing to get with your label. I could build an AI that writes haikus about SaaS pricing pages. I could call it the world's first AI SaaS Pricing Haiku Engine. Nobody could argue, because nobody else would have tried. That's what "first" means now. You've found an unclaimed sliver of territory so narrow that being the only person there is trivially easy.</p><p>But OK, forget that the claims are fake. What bothers me more is that "world's first" is the wrong thing to want in the first place. It's the wrong trophy entirely.</p><p>Thomas Newcomen bolted together the first commercially successful steam engine in 1712 and the thing was, by every measure, awful. Maybe 1% thermal efficiency. It ate coal like a bonfire eats kindling and it leaked through every cycle. James Watt showed up 57 years later, added a separate condenser, and built a version you could run a factory with. Newcomen got a Wikipedia footnote. Watt got a unit of measurement named after him. Google wasn't the first search engine. Facebook wasn't the first social network (Friendster was, and if you remember Friendster, congratulations, you're old). The iPhone showed up years after the Blackberry and the Palm Treo. Who ended up mattering? The ones people actually liked. Every single first mover on that list became a piece of bar trivia.</p><p>Founders keep doing this, I think, for two overlapping reasons and one of them is almost sympathetic. Silicon Valley has a mythology, basically a religion at this point, where the inventor is the saint and the timestamp is the sacred relic. The Xerox PARC researchers who built the graphical user interface were visionaries; Steve Jobs was the guy who walked through their lab, took notes, and shipped something your mom could buy at a mall. The mythology says PARC mattered more. In practice, Jobs built the product, and products are what people use.</p><p>But I think the bigger driver is more cynical than that, and it has to do with Twitter specifically. "World's first" is a cheat code for the algorithm. You can't verify it while you're scrolling, it sounds historic, and it carries a weight that "we also built an AI marketing tool, we think ours is pretty good" never will. The most extreme claim gets the most retweets, and retweets are what your investors see before they decide whether to write a check. I get why people do it. I'd probably be tempted too.</p><p>The problem is who it attracts. Novelty-chasers. People who'll try your product once, talk about it at a dinner party, and never open it again. The people who actually make a product successful long-term are the ones who care that your thing works well, and those people could not care less whether you were first or forty-first.</p><p>The second version of something is almost always better than the first, because the second version watched the first one break. Every good product is a correction of somebody else's bad product. That's how engineering works in practice: you watch someone else's bridge come down and you build yours with thicker cables.</p><p>What would it look like if founders were honest about this? "We looked at the 14 AI marketing tools that already exist and we think we've solved the 3 problems they all share." A less exciting tweet. But it's certainly more useful. It tells potential customers that you've done your homework and you're competing on substance rather than on who filed their launch post on Tuesday instead of Wednesday. Most founders would rather sound historic than sound competent, and their customers can tell.</p><p>The AI startup space right now feels like the early days of a gold rush, when the most important thing is to stake your claim loudly before anyone else reaches the same patch of dirt. But gold rushes end.</p><p>The people who built lasting wealth in the California Gold Rush were largely the ones selling picks and denim jeans to miners, the ones who understood that being best at serving a need that wasn't going away beat being first to a plot of land every time.</p><p>Levi Strauss arrived in San Francisco in 1853, 3 years after California became a state, and he wasn't first to anything, but he's still around.</p><p>Every founder tweeting "world's first" today should ask one question about their product: would anyone still care about this if 10 other people had built the same thing? If yes, you might have something, and if no, if the only interesting thing about the product is the claim of novelty, what you're looking at is marketing copy where the product should be.</p><p>You can announce "world's first" on launch day, before anyone has used your product, before anyone has even seen a demo. You can never announce "world's best." Other people have to say that about you, and they'll only say it if you've given them a reason to.</p>