Shellsharks Blogroll - BlogFlock 2026-03-02T12:23:20.265Z BlogFlock Werd I/O, Robb Knight, destructured, Molly White, fLaMEd, Aaron Parecki, Trail of Bits Blog, James' Coffee Blog, gynvael.coldwind//vx.log (pl), Westenberg, Evan Boehs, joelchrono, cool-as-heck, Kev Quirk, Posts feed, Sophie Koonin, Adepts of 0xCC, <span>Songs</span> on the Security of Networks, cmdr-nova@internet:~$, Johnny.Decimal, Hey, it's Jason!, Terence Eden’s Blog Book Review: Under Fire - Black Britain in Wartime by Stephen Bourne ★★★★☆ - Terence Eden’s Blog https://shkspr.mobi/blog/?p=67762 2026-03-01T12:34:27.000Z <img src="https://shkspr.mobi/blog/wp-content/uploads/2026/02/underfire.webp" alt="Book cover. A black soldier in uniform stands in front of Big Ben." width="200" class="alignleft size-full wp-image-67763"/> <p><em>Everyone</em> knows that Black people didn&#39;t exist in the UK until recently, right? Despite mountains of evidence of everything from <a href="https://shkspr.mobi/blog/2020/07/book-review-black-tudors-the-untold-story-miranda-kaufmann/">Black Tudors</a> and <a href="https://shkspr.mobi/blog/2022/02/book-review-ira-aldridge-the-african-roscius-by-bernth-lindfors/">Victorian actors</a>, some myths perniciously persist.</p> <p>What was the experience for Black Britons during the second world war?</p> <p>I find it fascinating how the US cultural hegemony rewrites history. I&#39;ve heard people in the UK talk about &#34;Jim Crow laws&#34; as though that was a thing that happened in the UK. It wasn&#39;t. While there <em>were</em> barriers and racism (as the book makes clear) the experience of Black people in the UK was vastly different than it was for African Americans. To the point that <a href="https://www.youtube.com/watch?v=iCliC9MHSFg&amp;t=422s">white American GIs were routinely castigated</a> for trying to impose their vile racism onto our country.</p> <p>What makes this book special is the contemporary reports and modern interviews. There are some amazing stories to be told and it is fascinating to hear first-hand accounts. The book also contains a list of prominent Black people living in the UK (including their addresses) which feels a little like padding - but then this is fleshed out with mini-biographies of most of them. What is astounding is, given the range of people living in Britain, you occasionally get little revelations like this:</p> <blockquote><p>Only one black evacuee has ever been interviewed for a television documentary.</p></blockquote> <p>Some people profiled are, for want of a better word, ordinary. People who had normal lives, kept the home fires burning, and took part in ordinary civic life. And then there are guys like <a href="https://www.bbc.co.uk/sport/horse-racing/54695641">Ras Prince Monolulu</a> who were bona-fide celebrities.</p> <p>It is fair to say that modern Britain&#39;s relationship with the notion of &#34;Empire&#34; is complicated. When the call to arms came, people from the farthest colonies rushed to aide the &#34;motherland&#34;. In many cases, they were initially rejected due to formal or informal colour-bars. The social acceptability of and legal ramifications of these practices is evidenced in <a href="https://en.wikipedia.org/wiki/Constantine_v_Imperial_Hotels_Ltd">Constantine v Imperial Hotels Ltd</a>.</p> <p>But for every story of casual and institutional racism towards people who came to help, there are stories of love and acceptance.</p> <blockquote><p>The English people opened their homes to us, we were invited out for dinners, teas, no problems at all. There were problems with the American forces, but it didn’t hinder us.</p></blockquote> <p>As with any history book, some of the language used can feel a little shocking or distasteful. History is never easy to engage with, but this book presents an even handed look at a turbulent period. It ends a little abruptly, but it is an excellent overview of the literature. Recommended for anyone who wants to understand <em>our</em> history.</p> IndieWeb Carnival March 2026: Museum memories - James' Coffee Blog https://jamesg.blog/2026/03/01/indieweb-carnival-museum-memories/ 2026-03-01T08:14:54.000Z <p>Museums and galleries are places we can go to learn about the past, think about the present, and consider the future. Museums are places we can connect: with times, people, and place. We can have conversations in museums. We learn in museums. We can explore.</p><p>The topic I have chosen for this month’s IndieWeb Carnival is “Museum memories”.</p><p>This month, I invite you to write a blog post about a memory that you have of a museum. It can be any museum: your local art gallery, a museum you visit often, a museum you visited on holiday, a museum dedicated to one of your interests (the sea, video games, transportation, your favourite football team), or a museum at a historic site you have visited.</p><p>To get you thinking about this month’s topic, I have a few questions that you can use as starting points:</p><ul><li>What is your favourite museum? When did you realise it became your favourite?</li><li>Do you recall a time when an object in a museum or an art gallery made you feel something? What was the feeling?</li><li>Do you remember when you first stumbled upon a new kind of history or art that you hadn’t thought or known about before?</li><li>Have you met anyone interesting at a museum? A new friend? A tour guide that got you thinking about something in a new way?</li><li>Is there a museum you loved as a child? What made it so interesting to you?</li><li>How does/did the physical space of a museum you visit or have visited affect you? Do you feel a certain way when you enter?</li></ul><p>This month’s IndieWeb Carnival runs from March 1st to March 31st. To participate, write a blog post on the topic of “Museum memories” on our website. Then, send me an email at <a href="mailto:readers@jamesg.blog">readers@jamesg.blog</a> with a link to your submission.</p><p>I will curate all of the submissions I receive on this page as I receive them. At the beginning of April, I will write a round-up that summarises all of the submissions I have received.</p><p>Entries are listed below in reverse chronological order of submission. This means that the most recently received posts are at the top of the list.</p><h2 id="entries"><strong>Entries</strong></h2><p>No entries have been received yet.</p> Finished reading Dead Beat - Molly White's activity feed 69a39d668d9cd5e2490713d7 2026-03-01T01:59:02.000Z <article class="entry h-entry hentry"><header><div class="description">Finished reading: </div></header><div class="content e-content"><div class="book h-entry hentry"><a class="book-cover-link" href="https://www.mollywhite.net/reading/books?search=Dead%20Beat"><img class="u-photo book-cover" src="https://m.media-amazon.com/images/S/compressed.photo.goodreads.com/books/1627927030i/17683.jpg" alt="Cover image of Dead Beat" style="max-width: 300px;"/></a><div class="book-details"><div class="top"><div class="series-info"><i>The Dresden Files</i> series, book <span class="series-number">7</span>. </div><div class="title-and-byline"><div class="title"><i class="p-name">Dead Beat</i> </div><div class="byline">by <span class="p-author h-card">Jim Butcher</span>. </div></div><div class="book-info">Published <time class="dt-published published" datetime="2006">2006</time>. 528 pages. </div></div><div class="bottom"><div class="reading-info"><div class="reading-dates"> Started <time class="dt-accessed accessed" datetime="2026-02-23">February 23, 2026</time>; completed February 28, 2026. </div></div></div></div></div><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp">Posted: <time class="dt-published" datetime="2026-03-01T01:59:02+00:00" title="March 1, 2026 at 1:59 AM UTC">March 1, 2026 at 1:59 AM UTC</time>. </div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/reading/books?tags=fantasy" title="See all books tagged "fantasy"" rel="category tag">fantasy</a>, <a class="tag p-category" href="https://www.mollywhite.net/reading/books?tags=mystery" title="See all books tagged "mystery"" rel="category tag">mystery</a>, <a class="tag p-category" href="https://www.mollywhite.net/reading/books?tags=urban_fantasy" title="See all books tagged "urban fantasy"" rel="category tag">urban fantasy</a>. </div></div></footer></article> Read "A Nationwide Book Ban Bill Has Been Introduced in the House of Representatives" - Molly White's activity feed 69a2f3458d9cd5e24906fa4e 2026-02-28T13:53:09.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://bookriot.com/hr7661-book-ban-legislation/" rel="bookmark">“<span class="p-name">A Nationwide Book Ban Bill Has Been Introduced in the House of Representatives</span>”</a>. </div><div class="byline"><span class="p-author h-card">Kelly Jensen</span> in <i class="p-publication">Book Riot</i>. <span class="read-date"> Published <time class="dt-published published" datetime="2026-02-26">February 26, 2026</time>.</span></div><blockquote class="summary p-summary entry-summary">Hours after the State of the Union address, House republicans introduced legislation banning LGBTQ+ books from public schools nationwide.</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-02-28T13:53:09+00:00" title="February 28, 2026 at 1:53 PM UTC">February 28, 2026 at 1:53 PM UTC</time>. </div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/books" title="See all feed posts tagged "books"" rel="category tag">books</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/free_speech" title="See all feed posts tagged "free speech"" rel="category tag">free speech</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/lgbt" title="See all feed posts tagged "LGBT"" rel="category tag">LGBT</a>. </div></div></footer></article> 30 months to 3MWh - some more home battery stats - Terence Eden’s Blog https://shkspr.mobi/blog/?p=67818 2026-02-28T12:34:19.000Z <p>Back in August 2023, we installed a <a href="https://shkspr.mobi/blog/2023/08/review-moixa-4-8kwh-solar-battery/">Moixa 4.8kWh Solar Battery</a> to pair with our solar panels. For the last year and a half it has chugged away slurping up electrons and sending them back as needed. Its little fan whirrs and the lights on its Ethernet port flicker happily as it does its duty.</p> <p>I estimate that it has saved us around 3 MegaWatt hours since it was commissioned. In monetary terms, that&#39;s roughly £1,000 taken off our electricity bills.</p> <p>How did I work that out? Well, maths is hard, <a href="https://www.youtube.com/watch?v=SOKhRVSriB0">as Barbie knows</a>, so take all this with a pinch of monosodium glutamate.</p> <p>Here&#39;s a typical month - October 2025:</p> <img src="https://shkspr.mobi/blog/wp-content/uploads/2026/02/October-Battery.webp" alt="Two squiggly graphs of dense complexity." width="2088" height="894" class="aligncenter size-full wp-image-67819"/> <p>Yikes! What&#39;s going on here?</p> <p>We use <a href="https://share.octopus.energy/metal-dove-988">a <em>variable</em> electricity tariff</a>. Prices fluctuate every 30 minutes. At peak times our electricity prices can shoot up to 60p per Kwh. Overnight or when the wind is high, prices can drop to zero. Yes, free electricity! Sometimes the excess in the grid means that prices go negative and we are <em>paid</em> to use electricity. Hurrah!</p> <p>Our battery knows this. Its Internet connection allows it to download the tariff for the day ahead and plan accordingly. If the electricity prices are cheap, the battery fills up. The battery can decide to discharge when we&#39;re using more electricity than solar provides, or it can wait until prices are more expensive after the sun has gone down.</p> <p>Here&#39;s an example, again from October:</p> <img src="https://shkspr.mobi/blog/wp-content/uploads/2026/02/Energy-Profile.webp" alt="Bar chart showing how energy was stored and used." width="2064" height="633" class="aligncenter size-full wp-image-67824"/> <p>In October, about a third of the power stored in the battery came from the sun. About 92% was used by our house with the remainder being sold back to the grid if it was profitable to do so.</p> <p>By contrast, here&#39;s June 2025 - a sunny month in the Northern Hemisphere:</p> <img src="https://shkspr.mobi/blog/wp-content/uploads/2026/02/June.webp" alt="Chart showing a lot more solar usage." width="2052" height="633" class="aligncenter size-full wp-image-67825"/> <p>Here, only 12% of the battery charging was done by the grid. 88% was done for free by solar power. But because solar was so plentiful, about 15% of the battery was sold back to the grid.</p> <h2 id="maths-is-hard"><a href="https://shkspr.mobi/blog/2026/02/30-months-to-3mwh-some-more-home-battery-stats/#maths-is-hard">Maths. Is. HARD!</a></h2> <p>I&#39;ve been playing around with various charts, graphs, spreadsheets, modellers, and a bit of calculus. I basically came to the conclusion that the easiest way was to assume I was saving the <a href="https://www.ofgem.gov.uk/information-consumers/energy-advice-households/get-energy-price-cap-standing-charges-and-unit-rates-region">energy price capped value of a kWh</a>.</p> <p>That varies from 25p to 35p. If I fudge the numbers just right, it rounds off at an even grand.</p> <h2 id="its-payback-time"><a href="https://shkspr.mobi/blog/2026/02/30-months-to-3mwh-some-more-home-battery-stats/#its-payback-time">It&#39;s Payback Time</a></h2> <p>No-one ever asks what the payback period is of buying a car vs taking public transport. You never see anyone amortising an engagement ring over the length of a marriage. Still, here we are.</p> <p>We paid £2,700 for the supply, install, and commissioning of our battery.</p> <p>That means the payback time for the battery will be between 6 and 7 years. If energy prices go up, the payback time goes down. Its capacity is showing no degradation yet and I hope it will provide us with many years of savings before it needs to be repaired or upgraded.</p> <p>Solar batteries are getting cheaper and their capacity is getting bigger - although <a href="https://shkspr.mobi/blog/2025/09/how-big-a-solar-battery-do-i-need-to-store-all-my-homes-electricity/">not big enough to store <em>all</em> my home&#39;s electricity</a>.</p> <p>If you can afford the upfront costs, it&#39;s like pre-paying for a chunk of your energy usage and can help protect you against sudden price rises.</p> <p>You can <a href="https://share.octopus.energy/metal-dove-988">sign up to Octopus</a> and get a £50 bill credit if you want to switch to a variable tariff.</p> Resident Evil 2 (1998) - Joel's Log Files https://joelchrono.xyz/blog/resident-evil-2-review 2026-02-28T03:40:00.000Z <p>A few days ago I wrote about how I recently decide to just <a href="https://joelchrono.xyz/blog/just-poking-away-at-videogames/">poke away at games</a> without actually feeling any rush to focus on a single game completely. But of course, sometimes a game just grips me from beginning to end, and I have to commit, because it’s just that cool.</p> <p>I have lots of memories of watching speedruns, challenges, reviews and retrospectives of the Resident Evil games, I have to say I’m just not sure where the interest for the series came from, I never had a friend with a console who played them, and they never figured in the list of games I’d emulate when I got introduced to that world.</p> <p>It wasn’t until I had my PSP and realized that I could play PS1 games on it, that an interest on the franchise developed, so I got them for the system. This was the case for Resident Evil 2, a game that I actually tried out years ago, even mentioning it as one of the many games I just <a href="https://joelchrono.xyz/blog/almost-completing-videogames/">left abandoned</a> when I tried playing it on my PSP, as other titles simply stole my attention from it.</p> <p>I was seriously kind of enamoured with the lore of the franchise, and I had an interest on Zombie movies, like George Romero’s <em>Night of the Living Dead</em> films, I think <em>Parasite Eve</em> played a role as well at the time, since I even read the novel back in 2020.</p> <p>The point is, despite it all, I never gave the games a fair shot until now.</p> <p><em>Resident Evil 2</em> was picked for February in the Low Key Game Club from the <a href="https://discord.com/invite/xQ7ht3V">TWG Discord</a>—which is also the reason I played <a href="https://joelchrono.xyz/blog/jet-lancer/">Jet Lancer</a> and <a href="https://joelchrono.xyz/blog/legacy-of-kain-soul-reaver/">Soul Reaver</a>—and for some reason it just felt like the perfect time to actually play this title and survive through Raccoon City myself.</p> <p><img src="https://joelchrono.xyz/assets/img/blogs/2026-02-27-re2.webp" alt="Resident Evil 2 artwork"/></p> <h2 id="story">Story</h2> <p>The story of this game is presented in a great way, letting you experience <strong>two different points of view and two alternate stories</strong>. While playing as two different characters in the game.</p> <p>Leon Kennedy is a rookie cop who got a job to work in Raccoon City’s Police Department, where as Claire Redfield is currently looking for his brother, Chris—one of the protagonists from the first game—who is currently missing, but worked as an agent in the STARS division of the police.</p> <p>Each character will see different moments of a single narrative, and there are moments where you’ll encounter and see the effects of what the other character did on their side.</p> <p>These characters meet while trying to survive the zombies running rampant in the city. However, they end up separated in the chaos, and <strong>the game lets you choose who to play as</strong>. The characters planned to meet at the Police Station, so now you have to find your way there, where the adventure truly begins.</p> <p>As the story progresses, you will find reports and documents detailing the events prior to the game, unlock doors, solve puzzles and survive against enemies that want to eat your brains. You will also meet new characters as you venture deeper into the police station, and even meet companions during certain parts of the story that you’ll get to control as well, slowly uncovering the truth behind the virus spreading through Raccoon City.</p> <figure class="img"> <picture> <source srcset="/assets/img/blogs/2026-02-27-re2-1.webp" type="image/webp"/> <source srcset="/assets/img/blogs/2026-02-27-re2-1.webp"/> <img class="mx-auto" src="https://joelchrono.xyz/assets/img/blogs/2026-02-27-re2-1.webp" alt="Leon makes it to the Police Station, the main location of the game."/> </picture> <figcaption class="caption">Leon makes it to the Police Station, the main location of the game.</figcaption></figure> <h2 id="gameplay">Gameplay</h2> <p>The gameplay that makes the original trilogy so special—and controversial among new players who want to get into them—are the <a href="https://en.wikipedia.org/wiki/Tank_controls">tank controls</a> and the fixed camera angles. These two features limit both movement and vision, and while they can be hard to get used to at first, they are essential to the original experience, and they don’t really take much effort to understand, after half and hour or so of playtime.</p> <p>This is the franchise that coined the term <a href="https://en.wikipedia.org/wiki/Survival_horror">survival horror</a>, and these limitations and lack of agency challenge the player as they try to survive and explore the environments of the game. The limited ammo and items you can carry with you, means you’ll have to be strategic about the path you follow as you try to make progress.</p> <p>Of course, multiple rooms will be overrun by zombies, and other enemies like the lickers, or worse. However, enemies don’t respawn, which makes killing them worth it to make traversal and backtracking easier.</p> <p>When it comes to horror, it really isn’t that scary, yes, the atmosphere is amazing, but it’s kinda campy and other than some jump scares, it really won’t mess with your mind that much.</p> <p>All of the Police Station is a giant escape room, and it is where the game shines most, as it is basically a sort of <a href="https://en.wikipedia.org/wiki/Metroidvania">Metroidvania</a>.</p> <p>The game features <strong>no interface during gameplay</strong>, something that heightens the cinematic camera angles. You can know your health based on the character animation while standing and walking. You can find herbs, ammo and other items scattered in the game to help you out. There’s a menu you can access to see your items, combine them, and check them for clues, there is a section to access files and documents you’ve collected, as well as a <strong>map screen</strong>, which shows the doors available to you and the color of the key needed to unlock them.</p> <p>Saving your progress is limited too. <strong>You can only save in specific rooms</strong> with a typewriter, and you need ink ribbons to use it, occupying an extra item slot too. Save too often and you’ll run out of ribbons, putting your progress in danger until you find more of them. You can also find item boxes in some save rooms where you can <strong>store items and access them in other item boxes</strong> in the game, very handy to free up your storage.</p> <p>I honestly think this game is designed masterfully. It makes you feel powerless at first, and you are scared of the dangers around each turn of the camera, but if you explore more and take risks here and there, you can be rewarded with more resources and weapon upgrades, which are useful against stronger enemies and bosses later in the game.</p> <p>There are bosses, but they just sponges that require you to shoot them with your strongest weapon and nothing more, making them kinda meh, and unfortunately they will deal tons of damage, so a lot of healing items are required as well. The bosses go through different transformations and are definitely cool to see the first time, but the <strong>boss battle design isn’t great.</strong></p> <p>The game is also <strong>very replayable</strong>, thanks to the different scenarios you can play, and the unlockable modes it features. The game featurs the <a href="https://residentevil.fandom.com/wiki/Zapping">zapping system</a>. A fantastic mechanic that let’s you perform actions that <strong>affect the other character’s scenario</strong>, for example, you can take a weapon as Leon which will become unavailable on Claire’s side.</p> <p>Each scenario changes the route, features very different puzzles and also exclusive bosses and characters you meet on them, it’s really amazing stuff that expands the game while reusing some assets.</p> <p>In my case, I only went through the Leon A and Claire B scenario, but the story plays out differently if you do Claire first. I will probably replay this game at some point starting with her, just because it is that fun.</p> <figure class="img"> <picture> <source srcset="/assets/img/blogs/2026-02-27-re2-2.webp" type="image/webp"/> <source srcset="/assets/img/blogs/2026-02-27-re2-2.webp"/> <img class="mx-auto" src="https://joelchrono.xyz/assets/img/blogs/2026-02-27-re2-2.webp" alt="The environment is done with prerrendered backgrounds, which allow greater detail, and more complex character models"/> </picture> <figcaption class="caption">The environment is done with prerrendered backgrounds, which allow greater detail, and more complex character models</figcaption></figure> <h2 id="art--music">Art &amp; Music</h2> <p>The amount of work that went into these games is just incredible. As stated before, the game features fixed camera angles, making use of incredibly <strong>detailed prerrendered backgrounds</strong> that allow for the game to look extremely nice. The areas of the game, especially in the police station, really feel like a place that went through a lot, as everything looks messy and real, with most rooms being rather memorable, even if they can feel a bit croweded sometimes. Everything blends in perfectly.</p> <p>It is important to note, that <strong>these graphics were made for the PS1</strong>, at a 240p resolution, and they don’t look nearly as well as they would on a proper CRT display, like was common at the time, and that often blended things together, smoothing out the pixels beautifully. The images shown in this review are edited with some blur and a filter to mimmick the effect.</p> <p>There are some great fan projects out there that upscale those backgrounds for the bigger displays, such as <a href="https://www.reshdp.com/re2/">RESHDP</a>, but I think they all look way too smooth and shiny compared to the gritty look of the original art. I feel like <strong>using a CRT filter is the best way to play these</strong> if you don’t have a proper display.</p> <p>I played the game on my <a href="https://joelchrono.xyz/blog/the-gba-experience-i-wanted/">Anbernic RG35XX SP</a>, which features a 480p 3.5 inch display, and given the display size and pixel density, I had a fantastic time enjoying the game on the go without complains.</p> <p>Besides the backgrounds, the <strong>character models</strong> of the playable characters and enemies alike feature a ton of detail, we see faces, although not many expressions, and the model textures change as the story continues.</p> <p>The <strong>music</strong> of course is also amazing, I played most of the game wearing earphones, and the atmosphere was awesome and very terrifying. There are many tracks in the game that fit very well, like the beautiful yet melancholic melody that plays when <a href="https://www.youtube.com/watch?v=53aDI5K49F4">reaching a safe room</a>, or a character theme playing when you <a href="https://www.youtube.com/watch?v=srcXOYjKR6s">meet them </a>. Other themes build up the tension or get you hyped up during a boss fight or action sequences, and everything just works.</p> <p>Audio is actually a core part of the gameplay, as it often signals enemies that can’t be seen on screen due to the camera angle, so staying alert is very helpful to avoid getting scared by a zombie popping up around the corner. Gunshots, steps sounds varying due to the floor surface and the like are very well done, so much detail has gone into this, it’s unreal for the time.</p> <p>This game also features <strong>voice acting</strong> for everything, there’s actually no subtitles for them, which is a little annoying at least on the PS1 version. Still, the voices are iconic at this point, even if the delivery is cheesy and a bit over the top, it works really well and I found it really enjoyable and it kept me invested on these characters quite a lot. Don’t expect something on the level of <em>Soul Reaver</em>, but it fits the vibes of watching an old campy horror film and it’s perfect from that perspective.</p> <figure class="img"> <picture> <source srcset="/assets/img/blogs/2026-02-27-re2-3.webp" type="image/webp"/> <source srcset="/assets/img/blogs/2026-02-27-re2-3.webp"/> <img class="mx-auto" src="https://joelchrono.xyz/assets/img/blogs/2026-02-27-re2-3.webp" alt="Leon and Claire find each other inside the police station"/> </picture> <figcaption class="caption">Leon and Claire find each other inside the police station</figcaption></figure> <h2 id="overall-thoughts">Overall thoughts</h2> <h3 id="the-good">The good</h3> <ul> <li>The background art and character models look amazing.</li> <li>The map design for the police station is very good.</li> <li>Cinematic camera angles and sounds that keep you on your toes.</li> <li>Scattered in files and documents that is intersesting to read and find clues.</li> <li>More than enough resources to complete the game if you manage items well.</li> <li>Short playtime and lots of replayability.</li> <li>Great side characters</li> </ul> <h3 id="the-bad">The bad</h3> <ul> <li>Bosses are average bullet sponges and not cleverly designed.</li> <li>Sometimes the camera angle will be messy, when hit by enemies or due to weapon recoil.</li> <li>Item management is part of the deal, but backtracking to organize it can be annoying.</li> <li>The game gets more linear as it goes on, this is good for me but maybe not you.</li> <li>Poison status is a thing that exists, although it’s not common.</li> <li>The puzzles are not as complex as other classic RE games, I didn’t mind though.</li> <li>Turning around completely with tank controls is a pain, fixed until <em>Resident Evil 3</em></li> <li>It’s not really that scary, don’t expect to be traumatized or anything, just jumpscared.</li> </ul> <h3 id="some-tips-and-reminders">Some tips and reminders</h3> <ul> <li>There is more ammo and healing items that you may expect, just explore and clear out rooms with zombies freely, you’ll get all you need.</li> <li>Since the backgrounds are prerrendered, most interactable objects stand out quite a bit, keep an eye on things out of place.</li> <li>Overall you can just inspect every corner of a room and there can be a variety of messages or at least fun texts to describe things</li> <li>You can usually find the big weapons at least twice, so if you can’t carry (or decide not to) carry a certain weapon, you can often find it later, or you can do without it anyway.</li> <li>It’s great to feel the weight of your own actions, don’t just reload a save if you feel like you did bad, try to keep going and you may surprise yourself.</li> <li>Or you can just be lazy like me and use save states because you worry too much, you’ll end up with plenty of extra ammo in the end, by the way.</li> </ul> <h2 id="finishing-words">Finishing words</h2> <p>The game is currently on sale until March 3, 2026, excusively available for PC on <a href="https://www.gog.com/en/game/resident_evil_2">GOG</a>, you can even get the whole original trilogy there, in case you want to give them a go! I’ll stick with my emulation handhelds though.</p> <p>Everything this game tries to do, is done perfectly well. Maybe the difficulty is not as high if you have already played other survival horror games like Signalis, as the item and ammo is actually plenty, but what makes it difficult is not being familiar with how these games should be played—exploring every nook and cranny to trigger as many checks as possible.</p> <p>Also, yes, the bosses are not great. After experiencing the immaculate boss design of <em>Soul Reaver</em>, these bullet sponges that deal a bunch of damage and can make you lose a bunch of progress really didn’t do it for me, they were just a matter of healing items and ammo rather than actual skill.</p> <p>Other than that, I really loved everything about this game. I played it on my commutes to work, like 20 or 40 minutes at a time, and I always managed to do some good progress and find something new to explore in those sessions. Even if it was not a game with portability in mind, it really lends itself well to it perfectly, at least thanks to the autosave and resume feature of my device when closing its lid.</p> <p>The game holds up and is perfectly playable today, and very close to taking a position in my personal <a href="https://joelchrono.xyz/blog/top-25-games-of-all-time/">Top 25 Games</a>, something I didn’t expect to happen so quickly, especially with a title I had abandoned before. Highly recommended!</p> <p>This is day 23 of <a href="https://100daystooffload.com">#100DaysToOffload</a></p> <p> <a href="mailto:me@joelchrono.xyz?subject=Resident Evil 2 (1998)">Reply to this post via email</a> | <a href="https://fosstodon.org/@joel/116146196121205808">Reply on Fediverse</a> </p> Book Review: Weird Things Customers Say in Bookshops by Jen Campbell ★★☆☆☆ - Terence Eden’s Blog https://shkspr.mobi/blog/?p=66620 2026-02-27T12:34:11.000Z <img src="https://shkspr.mobi/blog/wp-content/uploads/2026/03/1366054116.webp" alt="Book cover" width="200" class="alignleft size-full wp-image-66622"/> <p>Remember back in the early 2010s when any moderately popular Twitter account could become a book (or even a <a href="https://en.wikipedia.org/wiki/Shit_My_Dad_Says">TV series</a>)?</p> <p>This is a collection of Tweet-sized &#34;overheard in&#34; stories. All set in book shops.</p> <p>Isn&#39;t it funny that some people don&#39;t know how books work! ROFL!</p> <p>Aren&#39;t the general public strange? LOLOL!</p> <p>That&#39;s a bit harsh of me. It only rarely becomes mean-spirited. But in a book this short, it rather contaminates the joy.</p> <p>That said, this one will live rent-free in my head for a while:</p> <blockquote><p>Did Beatrix Potter ever write a book about dinosaurs?</p></blockquote> <p>It&#39;s the sort of stocking-filler book which is reasonable for perusing on the loo. Light-hearted but ultimately disposable.</p> <p>Still, at least Neil Gaiman found it funny enough to leave a blurb…</p> Firefox AI Killswitch - Kev Quirk https://kevquirk.com/firefox-ai-killswitch 2026-02-27T12:07:00.000Z <p>Nice to see that the Firefox team have actually implemented their "AI killswitch" in the way that they said they would. Here's a screenshot from my copy of Firefox 148:</p> <p><img src="https://kevquirk.com/content/images/firefox-ai-killswitch/ff-ai-settings.webp" alt="Firefox AI settings" /></p> <p>Very happy to see this land, and it means I can end <a href="https://kevquirk.com/i-still-havent-found-a-new-browser-and-thats-ok">my hunt for a new browser</a> for the time being.</p> <div class="email-hidden"> <hr /> <p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p> <p>You can <a href="mailto:72ja@qrk.one?subject=Firefox%20AI%20Killswitch">reply to this post by email</a>, or <a href="https://kevquirk.com/firefox-ai-killswitch#comments">leave a comment</a>.</p> </div> Quick Clarification on Pure Comments - Kev Quirk https://kevquirk.com/quick-clarification-on-pure-comments 2026-02-27T09:26:00.000Z <p>A couple of people have reached out to me asking if I can offer a version of <a href="https://comments.purecommons.org">Pure Comments</a> for their site, as they don't run <a href="https://pureblog.org">Pure Blog</a>.</p> <p>I obviously didn't make this clear in the <a href="https://kevquirk.com/introducing-pure-comments-and-pure-commons">announcement</a>, or on the (now updated) Pure Comments site.</p> <p><strong>Pure Comments can be used on <em>ANY</em> website.</strong></p> <p>It's just an embed script, just like Disqus (only with no bloat or tracking). So you just have to upload the files to wherever you want to host Pure Comments, then add the following embed code wherever you want comments to display (replacing the example domain):</p> <pre><code>&lt;div id="comments"&gt;&lt;/div&gt; &lt;script src="https://comments.example.com/public/embed.js" defer&gt;&lt;/script&gt;</code></pre> <p>You can use Pure Comments on WordPress, Bear Blog, Jekyll, 11ty, Hugo, Micro.blog, Kirby, Grav, and even Pure Blog! Anywhere you can inject the little snippet of code above, Pure Comments will work.</p> <div class="email-hidden"> <hr /> <p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p> <p>You can <a href="mailto:72ja@qrk.one?subject=Quick%20Clarification%20on%20Pure%20Comments">reply to this post by email</a>, or <a href="https://kevquirk.com/quick-clarification-on-pure-comments#comments">leave a comment</a>.</p> </div> Published on Citation Needed: "Issue 101 – Bought and paid for" - Molly White's activity feed 69a0c2e2498c9cae1763b0e8 2026-02-26T22:02:10.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-101" rel="syndication">Issue 101 – Bought and paid for </a></h2></header><div class="content e-content"><div class="media-wrapper"><a href="https://www.citationneeded.news/issue-101"><img src="https://www.citationneeded.news/content/images/size/w1200/format/webp/2026/02/trump-tahnoon.jpg" alt="President Trump walks with Sheikh Tahnoon bin Zayed Al Nahyan at the White House in March 2025"/></a></div><div class="p-summary"><p>Bitcoin is down 50%, several prominent industry figures have been uncovered in the Epstein files, Trump’s facing a probe into his family’s $500M deal with the UAE, and crypto super PACs spend their first $6 million in the midterms.</p></div></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp">Posted: <a href="https://www.citationneeded.news/issue-101"><time class="dt-published" datetime="2026-02-26T22:02:10+00:00" title="February 26, 2026 at 10:02 PM UTC">February 26, 2026 at 10:02 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/116139192506197110" title="Mastodon" rel="syndication">Mastodon</a><a class="social-link u-syndication bluesky" href="https://bsky.app/profile/molly.wiki/post/3mfs72z72as2n" title="Bluesky" rel="syndication">Bluesky</a></div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/binance" title="See all feed posts tagged "Binance"" rel="category tag">Binance</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/corruption" title="See all feed posts tagged "corruption"" rel="category tag">corruption</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/sec" title="See all feed posts tagged "SEC"" rel="category tag">SEC</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/trump_administration" title="See all feed posts tagged "Trump administration"" rel="category tag">Trump administration</a>.</div></div></footer></article> A Sunday of chaos and quiet - Joel's Log Files https://joelchrono.xyz/blog/sunday 2026-02-26T17:00:00.000Z <p>I woke up early, turned on my laptop and opened the presentation for today’s sermon, the preacher sent it overnight and I was revising it. It took longer than expected, but it was bound to happen—AI generated graphics were used.</p> <p>Helping with the media and worship presentations during service at my local church is a common task of mine. I probably should have done more to prevent this and set some guidelines beforehand, but now that it happened, I wouldn’t let it fly. After a short explanation of why, I saved the day, and educated one more person about the horrors of AI slop. I wish that had been the biggest mess of the day…</p> <p>The morning kept going, I finished the presentation, song lyrics, the usual stuff. I have no breakfast on Sundays, I dressed up—more formal than usual, I was feeling fancy—and headed out with my family!</p> <p>After the service was over—with AI nowhere to be seen—everyone stayed to have lunch together.</p> <p>My church has been collecting money for a new building, so each week a different family prepares and sells a meal for everyone—we are a rather small group—to acquire funds and enjoy the time together.</p> <p>I get in line for my serving—some great <em>tacos de bistec</em> that I couldn’t stop eating—and I sat on a different spot than normal, since most of my friend group helped prepare the orders, or handle cash. I was enjoying myself, listening to the chatter without saying much. I start to hear about violence going on in the streets, about drones flying above some areas, things start to get a little tense.</p> <p>As much as I hate it, I install Facebook again—still the most popular social network in Mexico. I read the headlines, I read posts from the government in my state and my city. I hear the people around me, sharing their own thoughts and updates on the situation.</p> <p>Some people with friends or contacts elsewhere start to get phone calls, people checking up on each other, people making sure everyone is safe. A few leave early, but things keep going pretty well.</p> <p>I talk about it on the fediverse, in some group chats. I check up and see this is news worldwide. Flights are delayed, roads are blocked, hotels closed their doors— nobody in, nobody out.</p> <p>The leader of the biggest drug cartel in Mexico died.</p> <p>After this military operation, the narco is acting in retaliation with terrorist acts all over the country. The posts online from the local government are clear: go home and stay inside.</p> <p>Things were going fine. People left at a rather slow pace, those who stayed finished their meal, and things went on as usual—the kids played and ran around outside. We were all rather calm, it was no big deal.</p> <p>Perhaps is in moments like these where faith shines through, and being together brought a sense of peace amidst the chaos. Maybe it’s naive, maybe we are oblivious to reality. But we rest assured, beyond any despair this world may bring.</p> <p>And the day went on, we returned home, and enjoyed a quiet evening. My mom decided to catch up on her current TV show of choice, my grandma joined her, even my dad. They made some popcorn too.</p> <p>I wasn’t feeling like watchting TV, and I stopped reading the news. It had been a while since we had popcorn, so I got my own bowl and went to my bedroom to <del>watch Resident Evil retrospective videos and essays</del> clean up and get it tidy.</p> <p>Later I returned to my playthrough of <em>Resident Evil 2</em>. It has been such an enjoyable experience, and it felt a bit surreal this time, I couldn’t help but think about the fact that I’m surviving a zombie apocalypse while there are vehicles on fire and buildings closed all over my state. At least I don’t think Zombies stand a chance in Mexico, I admit I chuckled at the intrusive thought.</p> <p>Checking my emails, I realize I won’t have to work on Monday, and that my gym would be closed too. Not much to worry about, just an unexpected day off, a welcome development despite the circumstances.</p> <p>A bit later, my church did an online call, where we prayed together about the whole situation going on, everyone arrived home well, and even though shops and the like were closed, we all had our needs covered. We prayed for the authorities, forgiveness for those committing these acts and their repentance, for the people who suffered a loss, and those who struggled because of it all.</p> <p>My dad prepared some <em>migas con huevo</em> for dinner—probably my favorite way to eat eggs. I was happy that I wouldn’t have to wake up early tomorrow, and things went as normal, then it was time to go to sleep.</p> <hr/> <p>The thought about how I could have realized absolutely nothing if I hadn’t been with other people is also weird, I really am completely unaware of the news most of the time, but when stuff like this could happen all of a sudden, I see now why some folks are often very worried on what’s going on around them.</p> <p>I guess I should try to find a balance. It’s easy to ignore that which doesn’t affect you, I guess, but then it does, and <em>now what?</em> I do hope that I’ll remain calm even then, maybe I can say it because nothing really affected me much, just the tension in the moment. I don’t know, I’ll figure something out.</p> <p>I’d also like to thank those who checked up on me! I’m writing this last couple paragraphs a few days later now, and it really does feel kinda melancholic. I thought about writing about my day off too, but it really was just a normal time staying at home and playing videogames. That Sunday though, that was a day full of mixed emotions, but it kind of got me to see so some things differently, it was an interesting experience.</p> <p>This is day 22 of <a href="https://100daystooffload.com">#100DaysToOffload</a></p> <p> <a href="mailto:me@joelchrono.xyz?subject=A Sunday of chaos and quiet">Reply to this post via email</a> | <a href="https://fosstodon.org/@joel/116138132859293592">Reply on Fediverse</a> </p> This time is different - Terence Eden’s Blog https://shkspr.mobi/blog/?p=64559 2026-02-26T12:34:39.000Z <p>3D TV, AMP, Augmented Reality, Beanie Babies, Blockchain, Cartoon Avatars, Curved TVs, Frogans, Hoverboards, iBeacons, Jetpacks, Metaverse, NFTs, Physical Web, Quantum Computing, Quibi, Small and Safe Nuclear Reactors, Smart Glasses, Stadia, WiMAX.</p> <p>The problem is, the same dudes (and it was nearly always dudes) who were pumped for all of that bollocks now won&#39;t stop wanging on about Artificial Fucking Intelligence.</p> <p>&#34;It&#39;s gonna be the future bro, just trust me!&#34;</p> <p>&#34;I dunno, man. Seems like you say that about every passing fancy - and they all end up being utterly underwhelming.&#34;</p> <p>&#34;This time is different!&#34;</p> <p><em>*sigh*</em></p> <blockquote><p>The investor who says, “This time is different,” when in fact it’s virtually a repeat of an earlier situation, has uttered among the four most costly words in the annals of investing.</p> <p><a href="https://www.franklintempleton.com/forms-literature/download/TL-R16">16 rules for investment success - Sir John Templeton</a></p></blockquote> <p>All of the above technologies are still chugging along in some form or other (well, OK, not Quibi). Some are vaguely useful and others are propped up by weirdo cultists. I don&#39;t doubt that AI will be a <em>part</em> of the future - but it is obviously just going to be one of <em>many</em> technology which are in use.</p> <blockquote><p>No enemies had ever taken Ankh-Morpork. Well technically they had, quite often; the city welcomed free-spending barbarian invaders, but somehow the puzzled raiders found, after a few days, that they didn&#39;t own their horses any more, and within a couple of months they were just another minority group with its own graffiti and food shops.</p> <p>Terry Pratchet&#39;s <del>Faust</del> Eric</p></blockquote> <p>The ideology of &#34;winner takes all&#34; is unsustainable and not supported by reality.</p> Making fLaMEd fury Glow Everywhere With an Eleventy Transform - The Weblog of fLaMEd https://flamedfury.com/posts/making-flamed-fury-glow-everywhere-with-an-eleventy-transform/ 2026-02-26T12:00:00.000Z <p>What’s going on, Internet? I originally added a <code>.gradient-text</code> CSS class as a fun way to make my name (fLaMEd) and site name (fLaMEd fury) pop on the homepage. <a href="https://shellsharks.com/notes/2026/02/17/citations-css" rel="noopener">shellsharks</a> gave me a shoutout for it, which inspired me to take it further and apply the effect site-wide. Site wide was the original intent and the problem was it was only being applied manually in a handful of places, and I kept forgetting to add it whenever I wrote a new post or created a new page. Classic.</p> <p>Instead of hunting through templates and markdown files, I’ve added an Eleventy HTML transform that automatically applies the glow up.</p> <aside class="aside flow note"> <p class="aside__content">I had Claude Code help me figure out the regex and the transform config. This allowed me to get this done before the kids came home. Don't @ me.</p> </aside> <p>The effect itself is a simple utility class using <code>background-clip: text</code>:</p> <pre class="language-css"><code class="language-css"><span class="token selector">.gradient-text</span> <span class="token punctuation">{</span> <span class="token property">color</span><span class="token punctuation">:</span> transparent<span class="token punctuation">;</span> <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--gradient-flames<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token property">padding</span><span class="token punctuation">:</span> 0.6rem 0<span class="token punctuation">;</span> <span class="token property">background-size</span><span class="token punctuation">:</span> 50%<span class="token punctuation">;</span> <span class="token property">background-clip</span><span class="token punctuation">:</span> text<span class="token punctuation">;</span> <span class="token punctuation">}</span></code></pre> <p>Swap <code>--gradient-flames</code> for whatever gradient custom property you have defined. The <code>background-size: 50%</code> repeats the gradient across the text for a more dynamic flame effect.</p> <p>The transform lives in its own plugin file and gets registered in <code>eleventy.config.js</code>. It runs after Eleventy has rendered each <code>.html</code> page, tokenises the HTML by splitting on tags, tracks a skip-tag stack, and only replaces text in text nodes.</p> <pre class="language-js"><code class="language-js"><span class="token keyword">export</span> <span class="token keyword">const</span> <span class="token function-variable function">glowUp</span> <span class="token operator">=</span> <span class="token parameter">eleventyConfig</span> <span class="token operator">=></span> <span class="token punctuation">{</span> eleventyConfig<span class="token punctuation">.</span><span class="token function">addTransform</span><span class="token punctuation">(</span><span class="token string">'glow-up'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token parameter">content<span class="token punctuation">,</span> outputPath</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>outputPath<span class="token operator">?.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'.html'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> content<span class="token punctuation">;</span> <span class="token keyword">const</span> skipTags <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Set</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'a'</span><span class="token punctuation">,</span> <span class="token string">'code'</span><span class="token punctuation">,</span> <span class="token string">'h1'</span><span class="token punctuation">,</span> <span class="token string">'h1'</span><span class="token punctuation">,</span> <span class="token string">'h3'</span><span class="token punctuation">,</span> <span class="token string">'pre'</span><span class="token punctuation">,</span> <span class="token string">'script'</span><span class="token punctuation">,</span> <span class="token string">'style'</span><span class="token punctuation">,</span> <span class="token string">'textarea'</span><span class="token punctuation">,</span> <span class="token string">'title'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> skipStack <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">let</span> result <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">const</span> token <span class="token keyword">of</span> content<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">(&lt;[^>]*>)</span><span class="token regex-delimiter">/</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>token<span class="token punctuation">.</span><span class="token function">startsWith</span><span class="token punctuation">(</span><span class="token string">'&lt;'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> isClosing <span class="token operator">=</span> token<span class="token punctuation">.</span><span class="token function">startsWith</span><span class="token punctuation">(</span><span class="token string">'&lt;/'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> isSelfClosing <span class="token operator">=</span> token<span class="token punctuation">.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'/>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> tagMatch <span class="token operator">=</span> token<span class="token punctuation">.</span><span class="token function">match</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">^&lt;\/?([a-zA-Z][a-zA-Z0-9-]*)</span><span class="token regex-delimiter">/</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>tagMatch <span class="token operator">&amp;&amp;</span> <span class="token operator">!</span>isSelfClosing<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> tag <span class="token operator">=</span> tagMatch<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>isClosing<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>skipTags<span class="token punctuation">.</span><span class="token function">has</span><span class="token punctuation">(</span>tag<span class="token punctuation">)</span><span class="token punctuation">)</span> skipStack<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>tag<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>tag <span class="token operator">===</span> <span class="token string">'span'</span> <span class="token operator">&amp;&amp;</span> token<span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span><span class="token string">'gradient-text'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> skipStack<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'gradient-text-span'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> skipStack<span class="token punctuation">.</span>length <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>skipStack<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">===</span> tag <span class="token operator">||</span> <span class="token punctuation">(</span>tag <span class="token operator">===</span> <span class="token string">'span'</span> <span class="token operator">&amp;&amp;</span> skipStack<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">===</span> <span class="token string">'gradient-text-span'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> skipStack<span class="token punctuation">.</span><span class="token function">splice</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> result <span class="token operator">+=</span> token<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>skipStack<span class="token punctuation">.</span>length <span class="token operator">===</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> token<span class="token punctuation">)</span> <span class="token punctuation">{</span> result <span class="token operator">+=</span> token<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">flamed( fury)?</span><span class="token regex-delimiter">/</span><span class="token regex-flags">gi</span></span><span class="token punctuation">,</span> <span class="token parameter">match</span> <span class="token operator">=></span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">&lt;span class="gradient-text"></span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>match<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">&lt;/span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> result <span class="token operator">+=</span> token<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> result<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre> <p>Tags in the <code>skipTags</code> set, along with any span already carrying the <code>gradient-text</code> class, push onto the stack. No replacement happens while the stack is non-empty, so link text, code examples, the page <code>&lt;title&gt;</code>, and already-wrapped instances are all left alone. HTML attributes like <code>alt</code> and <code>href</code> are never touched because they sit inside tag tokens, not text nodes.</p> <p>A single regex <code>/flamed( fury)?/gi</code> handles everything in one pass. The optional group greedily matches &quot; fury&quot; when present, so “fLaMEd fury” is always wrapped as a unit rather than just “fLaMEd”. The <code>i</code> flag covers every capitalisation variant (“fLaMEd fury”, “Flamed Fury”, “FLAMED FURY”) with the original casing preserved in the output. This helps because I can be inconsistent with the styling at times.</p> <p>Export the plugin from wherever you manage your Eleventy plugins:</p> <pre class="language-js"><code class="language-js"><span class="token keyword">import</span> <span class="token punctuation">{</span> glowUp <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./plugins/glow-up.js'</span><span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> <span class="token comment">// ...other plugins</span> glowUp<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre> <p>Then register it in <code>eleventy.config.js</code>. Register it before any HTML prettify transform so the spans are in place before reformatting runs:</p> <pre class="language-js"><code class="language-js">eleventyConfig<span class="token punctuation">.</span><span class="token function">addPlugin</span><span class="token punctuation">(</span>plugins<span class="token punctuation">.</span>glowUp<span class="token punctuation">)</span><span class="token punctuation">;</span> eleventyConfig<span class="token punctuation">.</span><span class="token function">addPlugin</span><span class="token punctuation">(</span>plugins<span class="token punctuation">.</span>htmlConfig<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// html prettify</span></code></pre> <p>That’s it. Any mention of the site name (fLaMEd fury) in body text gets the gradient automatically, in posts, templates, data-driven content, wherever.</p> <p>Look out for the easter egg I’ve dropped in. Later.</p> <p>Hey, thanks for reading this post in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: Making fLaMEd fury Glow Everywhere With an Eleventy Transform">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/making-flamed-fury-glow-everywhere-with-an-eleventy-transform/#webmention">webmention</a>. Check out the <a href="https://flamedfury.com/posts/">posts archive</a> on the website.</p> Four More Years - The Weblog of fLaMEd https://flamedfury.com/posts/four-more-years/ 2026-02-26T11:21:43.000Z <p>What’s going on, Internet? I’ve been using my iPhone 13 Pro for a little over four years now, since September 2021 and I want to keep using it for a couple more.</p> <p>Keyboard lag. Apps taking a second to think before opening. Battery health sitting at 80%.</p> <p>I had a quick look at the iPhone 17 and couldn’t justify it when everything else about this phone is still good. Storage is only half full. Camera is fine. It’s fast when it wants to be.</p> <p>So I tried the logical fix first: a $90 battery replacement from a local repair shop.</p> <img src="https://flamedfury.com/assets/images/posts/2026/2026-02-18-extending-the-life-of-my-iphone-01.jpeg" alt="iPhone battery health screen showing 80% maximum capacity" style="max-inline-size: 280px; display: block; margin-inline: auto" /> <p>This is where it had been sitting for a while. Still usable, but clearly the reason iOS had started throttling performance.</p> <p>Straight after the swap I got a warning about the battery not being genuine which I was only made aware of right before pulling the trigger on this after reading a comment on the <a href="https://www.ifixit.com/products/iphone-13-pro-battery" rel="noopener">iPhone 13 Battery page on iFixit</a>.</p> <img src="https://flamedfury.com/assets/images/posts/2026/2026-02-18-extending-the-life-of-my-iphone-02.jpeg" alt="iOS Important Battery Message warning after fitting a third-party battery" style="max-inline-size: 280px; display: block; margin-inline: auto" /> <p>I made peace with myself and I was prepared to live with it. For $90 and being done in 30 minutes without having to schedule with an authorised repair dealer and being without the phone for up to four days. I just wanted the speed back.</p> <p>But apparently because I’m on a newer version of iOS, I had the option to run Apple’s verification process. So I did… and it passed.</p> <img src="https://flamedfury.com/assets/images/posts/2026/2026-02-18-extending-the-life-of-my-iphone-03.jpeg" alt="iPhone battery health screen restored to 100% maximum capacity after Apple verification" style="max-inline-size: 280px; display: block; margin-inline: auto" /> <p>Battery health back to 100%, full stats restored, and the warning moved to Parts &amp; Service History where it belongs.</p> <img src="https://flamedfury.com/assets/images/posts/2026/2026-02-18-extending-the-life-of-my-iphone-04.jpeg" alt="Parts and Service History screen showing the third-party battery listed as a note rather than a warning" style="max-inline-size: 280px; display: block; margin-inline: auto" /> <p>That’s basically the authorised-repair end result for third-party-repair money.</p> <p>I followed the usual calibration cycle: charge to 100%, leave it on the charger for a couple more hours, run it down until it turns off, charge back to 100%. Mostly to give iOS a clean read on the new battery.</p> <p>The battery fixes the hardware bottleneck. The other half is software. Years of installed apps, background processes, cached junk. So I’m preparing for a full wipe and setting the phone up as new. No restoring from backup, sign into iCloud and let the data sync back, reinstall apps one at a time. Only the things I actually use get to come back. It’s the closest you get to a new phone without buying one.</p> <p>This whole reset cost less than a case for a new phone. If the lag disappears, that’s another couple of years out of a device that’s still more than good enough. If it doesn’t, then I look at upgrading. But it makes more sense to solve the worn-out-battery problem before spending thousands to avoid it.</p> <p>I’ll report back once the clean install is done and I’ve lived with it for a few days.</p> <p>Hey, thanks for reading this post in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: Four More Years">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/four-more-years/#webmention">webmention</a>. Check out the <a href="https://flamedfury.com/posts/">posts archive</a> on the website.</p> Members Only: Your anonymity set has collapsed and you don't know it yet - Westenberg 699fa289bb486a00012c43ed 2026-02-26T01:41:29.000Z Introducing Pure Comments (and Pure Commons) - Kev Quirk https://kevquirk.com/introducing-pure-comments-and-pure-commons 2026-02-25T15:04:00.000Z <p>A few weeks ago I <a href="https://kevquirk.com/introducing-pure-blog">introduced Pure Blog</a> a simple PHP based blogging platform that I've <a href="https://kevquirk.com/ive-moved-to-pure-blog">since moved to</a> and I'm very happy. Once Pure Blog was done, I shifted my focus to start <a href="https://kevquirk.com/updates-to-my-commenting-system">improving my commenting system</a>. I ended that post by saying:</p> <blockquote> <p>At this point it's battle tested and working great. However, there's still some rough edges in the code, and security could definitely be improved. So over the next few weeks I'll be doing that, at which point I'll probably release it to the public so you too can have comments on your blog, if you want them.</p> </blockquote> <p>I've now finished that work and I'm ready to release <a href="https://comments.purecommons.org">Pure Comments</a> to the world. 🎉</p> <p>I'm really happy with how Pure Comments has turned out; it slots in perfectly with Pure Blog, which got me thinking about creating a broader suite of apps under the <em>Pure</em> umbrella.</p> <h2>Enter Pure Commons</h2> <p>I've had <a href="https://simplecss.org">Simple.css</a> since 2022, and now I've added Pure Blog and Pure Comments to the fold. So I decided I needed an umbrella to house these disparate projects. That's where <a href="https://purecommons.org">Pure Commons</a> comes in.</p> <p>My vision for Pure Commons is to build it into a suite of simple, privacy focussed tools that are easy to self-host, and have just what you need and no more.</p> <h2>What's next for Pure Commons?</h2> <p>Well, concurrent to working on Pure Comments, I've also started building a fully managed version that people will be able to use for a small monthly fee. That's about 60% done at this point, so I should be releasing that over the next few weeks.</p> <p>In the future I plan to add a managed version of Pure Blog too, but that will be far more complex than a managed version of Pure Comments. So I think that will take some time.</p> <p>I'm also looking at creating <em>Pure Guestbook</em>, which will obviously be a simple, self-hosted guestbook along the same vein as the other <em>Pure</em> apps. This should be relatively simple to build, as a guestbook is basically a simplified commenting system, so most of the code is already exists in Pure Comments.</p> <p>Looking beyond <em>Pure Guestbook</em> I have some other ideas, but you will have to wait and see...</p> <p>In the meantime, please take a look as <a href="https://comments.purecommons.org">Pure Comments</a> - download the <a href="https://github.com/kevquirk/purecomments">source code</a>, take it for a spin, and provide any feedback/bugs you find.</p> <p>If you have any ideas for apps I could add to the <em>Pure Commons</em> family, please get in touch.</p> <div class="email-hidden"> <hr /> <p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p> <p>You can <a href="mailto:72ja@qrk.one?subject=Introducing%20Pure%20Comments%20%28and%20Pure%20Commons%29">reply to this post by email</a>, or <a href="https://kevquirk.com/introducing-pure-comments-and-pure-commons#comments">leave a comment</a>.</p> </div> Book Review: Of Monsters and Mainframes - Barbara Truelove ★★★⯪☆ - Terence Eden’s Blog https://shkspr.mobi/blog/?p=67527 2026-02-25T12:34:02.000Z <img src="https://shkspr.mobi/blog/wp-content/uploads/2026/02/monsters.webp" alt="Book cover." width="225" class="alignleft size-full wp-image-67528"/> <p>This is fun, silly, charming, and <em>much</em> better than <a href="https://shkspr.mobi/blog/2026/02/book-review-all-systems-red-the-murderbot-diaries-by-martha-wells/">The Murderbot Diaries</a> despite being superficially similar.</p> <p>Imagine you are an interstellar ship and, of course, your AI is conscious. What would you do if your passengers were killed - not by a terrifying alien, but by Count Dracula???</p> <p>What if, on the return journey, another set of your passengers were similarly slaughtered. Except, this time, by a Werewolf? How would that make you feel? Would it drive you mad? Could you cope with the bullying from other starships? Or would you feel the need… the need for REVENGE!</p> <p>As I said, silly and campy fun. It is episodic adventure with just the right amount of Hammer-style horror and not too much technobabble. All the classic monsters are here - depression, intrusive thoughts, envy, fear.</p> <p>Oh, and Frankenstein’s spider.</p> <p>As an ebook, it makes great use of fonts - which give it a delightfully retrofuturistic feel. There are some fun binary Easter-Eggs as well.</p> mquire: Linux memory forensics without external dependencies - Trail of Bits Blog https://blog.trailofbits.com/2026/02/25/mquire-linux-memory-forensics-without-external-dependencies/ 2026-02-25T12:00:00.000Z <p>If you’ve ever done Linux memory forensics, you know the frustration: without debug symbols that match the exact kernel version, you’re stuck. These symbols aren’t typically installed on production systems and must be sourced from external repositories, which quickly become outdated when systems receive updates. If you’ve ever tried to analyze a memory dump only to discover that no one has published symbols for that specific kernel build, you know the frustration.</p> <p>Today, we’re open-sourcing <a href="https://github.com/trailofbits/mquire">mquire</a>, a tool that eliminates this dependency entirely. mquire analyzes Linux memory dumps without requiring any external debug information. It works by extracting everything it needs directly from the memory dump itself. This means you can analyze unknown kernels, custom builds, or any Linux distribution, without preparation and without hunting for symbol files.</p> <p>For forensic analysts and incident responders, this is a significant shift: mquire delivers reliable memory analysis even when traditional tools can&rsquo;t.</p> <h2 id="the-problem-with-traditional-memory-forensics">The problem with traditional memory forensics</h2> <p>Memory forensics tools like <a href="https://github.com/volatilityfoundation/volatility3">Volatility</a> are essential for security researchers and incident responders. However, these tools require debug symbols (or &ldquo;profiles&rdquo;) specific to the exact kernel version in the memory dump. Without matching symbols, analysis options are limited or impossible.</p> <p>In practice, this creates real obstacles. You need to either source symbols from third-party repositories that may not have your specific kernel version, generate symbols yourself (which requires access to the original system, often unavailable during incident response), or hope that someone has already created a profile for that distribution and kernel combination.</p> <p>mquire takes a different approach: it extracts both type information and symbol addresses directly from the memory dump, making analysis possible without any external dependencies.</p> <h2 id="how-mquire-works">How mquire works</h2> <p>mquire combines two sources of information that modern Linux kernels embed within themselves:</p> <p><strong>Type information from BTF</strong>: <a href="https://www.kernel.org/doc/html/next/bpf/btf.html">BPF Type Format</a> is a compact format for type and debug information originally designed for eBPF&rsquo;s &ldquo;compile once, run everywhere&rdquo; architecture. BTF provides structural information about the kernel, including type definitions for kernel structures, field offsets and sizes, and type relationships. We&rsquo;ve repurposed this for memory forensics.</p> <p><strong>Symbol addresses from Kallsyms</strong>: This is the same data that populates <code>/proc/kallsyms</code> on a running system—the memory locations of kernel symbols. By scanning the memory dump for Kallsyms data, mquire can locate the exact addresses of kernel structures without external symbol files.</p> <p>By combining type information with symbol locations, mquire can find and parse complex kernel data structures like process lists, memory mappings, open file handles, and cached file data.</p> <h3 id="kernel-requirements">Kernel requirements</h3> <ul> <li><strong>BTF support</strong>: Kernel 4.18 or newer with BTF enabled (most modern distributions enable it by default)</li> <li><strong>Kallsyms support</strong>: Kernel 6.4 or newer (due to format changes in <code>scripts/kallsyms.c</code>)</li> </ul> <p>These features have been consistently enabled on major distributions since they&rsquo;re requirements for modern BPF tooling.</p> <h2 id="built-for-exploration">Built for exploration</h2> <p>After initialization, mquire provides an interactive SQL interface, an approach directly inspired by <a href="https://github.com/osquery/osquery">osquery</a>. This is something I&rsquo;ve wanted to build ever since my first Querycon, where I discussed forensics capabilities with other osquery maintainers. The idea of bringing osquery&rsquo;s intuitive, SQL-based exploration model to memory forensics has been on my mind for years, and mquire is the realization of that vision.</p> <p>You can run one-off queries from the command line or explore interactively:</p> <figure class="highlight"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">$ mquire query --format json snapshot.lime <span class="s1">&#39;SELECT comm, command_line FROM </span></span></span><span class="line"><span class="cl"><span class="s1">tasks WHERE command_line NOT NULL and comm LIKE &#34;%systemd%&#34; LIMIT 2;&#39;</span> </span></span><span class="line"><span class="cl"><span class="o">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;column_order&#34;</span>: <span class="o">[</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;comm&#34;</span>, </span></span><span class="line"><span class="cl"> <span class="s2">&#34;command_line&#34;</span> </span></span><span class="line"><span class="cl"> <span class="o">]</span>, </span></span><span class="line"><span class="cl"> <span class="s2">&#34;row_list&#34;</span>: <span class="o">[</span> </span></span><span class="line"><span class="cl"> <span class="o">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;comm&#34;</span>: <span class="o">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;String&#34;</span>: <span class="s2">&#34;systemd&#34;</span> </span></span><span class="line"><span class="cl"> <span class="o">}</span>, </span></span><span class="line"><span class="cl"> <span class="s2">&#34;command_line&#34;</span>: <span class="o">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;String&#34;</span>: <span class="s2">&#34;/sbin/init splash&#34;</span> </span></span><span class="line"><span class="cl"> <span class="o">}</span> </span></span><span class="line"><span class="cl"> <span class="o">}</span>, </span></span><span class="line"><span class="cl"> <span class="o">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;comm&#34;</span>: <span class="o">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;String&#34;</span>: <span class="s2">&#34;systemd-oomd&#34;</span> </span></span><span class="line"><span class="cl"> <span class="o">}</span>, </span></span><span class="line"><span class="cl"> <span class="s2">&#34;command_line&#34;</span>: <span class="o">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;String&#34;</span>: <span class="s2">&#34;/usr/lib/systemd/systemd-oomd&#34;</span> </span></span><span class="line"><span class="cl"> <span class="o">}</span> </span></span><span class="line"><span class="cl"> <span class="o">}</span> </span></span><span class="line"><span class="cl"> <span class="o">]</span> </span></span><span class="line"><span class="cl"><span class="o">}</span></span></span></code></pre> <figcaption><span>Figure 1: mquire listing tasks containing systemd</span></figcaption> </figure> <p>The SQL interface enables relational queries across different data sources. For example, you can join process information with open file handles in a single query:</p> <figure class="highlight"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">mquire query --format json snapshot.lime <span class="s1">&#39;SELECT tasks.pid, </span></span></span><span class="line"><span class="cl"><span class="s1">task_open_files.path FROM task_open_files JOIN tasks ON tasks.tgid = </span></span></span><span class="line"><span class="cl"><span class="s1">task_open_files.tgid WHERE task_open_files.path LIKE &#34;%.sqlite&#34; LIMIT 2;&#39;</span> </span></span><span class="line"><span class="cl"><span class="o">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;column_order&#34;</span>: <span class="o">[</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;pid&#34;</span>, </span></span><span class="line"><span class="cl"> <span class="s2">&#34;path&#34;</span> </span></span><span class="line"><span class="cl"> <span class="o">]</span>, </span></span><span class="line"><span class="cl"> <span class="s2">&#34;row_list&#34;</span>: <span class="o">[</span> </span></span><span class="line"><span class="cl"> <span class="o">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;path&#34;</span>: <span class="o">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;String&#34;</span>: <span class="s2">&#34;/home/alessandro/snap/firefox/common/.mozilla/firefox/ </span></span></span><span class="line"><span class="cl"><span class="s2"> 4f1wza57.default/cookies.sqlite&#34;</span> </span></span><span class="line"><span class="cl"> <span class="o">}</span>, </span></span><span class="line"><span class="cl"> <span class="s2">&#34;pid&#34;</span>: <span class="o">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;SignedInteger&#34;</span>: <span class="m">2481</span> </span></span><span class="line"><span class="cl"> <span class="o">}</span> </span></span><span class="line"><span class="cl"> <span class="o">}</span>, </span></span><span class="line"><span class="cl"> <span class="o">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;path&#34;</span>: <span class="o">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;String&#34;</span>: <span class="s2">&#34;/home/alessandro/snap/firefox/common/.mozilla/firefox/ </span></span></span><span class="line"><span class="cl"><span class="s2"> 4f1wza57.default/cookies.sqlite&#34;</span> </span></span><span class="line"><span class="cl"> <span class="o">}</span>, </span></span><span class="line"><span class="cl"> <span class="s2">&#34;pid&#34;</span>: <span class="o">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;SignedInteger&#34;</span>: <span class="m">2846</span> </span></span><span class="line"><span class="cl"> <span class="o">}</span> </span></span><span class="line"><span class="cl"> <span class="o">}</span> </span></span><span class="line"><span class="cl"> <span class="o">]</span> </span></span><span class="line"><span class="cl"><span class="o">}</span></span></span></code></pre> <figcaption><span>Figure 2: Finding processes with open SQLite databases</span></figcaption> </figure> <p>This relational approach lets you reconstruct complete file paths from kernel <code>dentry</code> objects and connect them with their originating processes—context that would require multiple commands with traditional tools.</p> <h2 id="current-capabilities">Current capabilities</h2> <p>mquire currently provides the following tables:</p> <ul> <li><code>os_version</code> and <code>system_info</code>: Basic system identification</li> <li><code>tasks</code>: Running processes with PIDs, command lines, and binary paths</li> <li><code>task_open_files</code>: Open files organized by process</li> <li><code>memory_mappings</code>: Memory regions mapped by each process</li> <li><code>boot_time</code>: System boot timestamp</li> <li><code>dmesg</code>: Kernel ring buffer messages</li> <li><code>kallsyms</code>: Kernel symbol addresses</li> <li><code>kernel_modules</code>: Loaded kernel modules</li> <li><code>network_connections</code>: Active network connections</li> <li><code>network_interfaces</code>: Network interface information</li> <li><code>syslog_file</code>: System logs read directly from the kernel&rsquo;s file cache (works even if log files have been deleted, as long as they&rsquo;re still cached in memory)</li> <li><code>log_messages</code>: Internal mquire log messages</li> </ul> <p>mquire also includes a <code>.dump</code> command that extracts files from the kernel&rsquo;s file cache. This can recover files directly from memory, which is useful when files have been deleted from disk but remain in the cache. You can run it from the interactive shell or via the command line:</p> <figure class="highlight"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">mquire <span class="nb">command</span> snapshot.lime <span class="s1">&#39;.dump /output/directory&#39;</span></span></span></code></pre> </figure> <p>For developers building custom analysis tools, the <code>mquire</code> library crate provides a reusable API for kernel memory analysis.</p> <h2 id="use-cases">Use cases</h2> <p>mquire is designed for:</p> <ul> <li><strong>Incident response</strong>: Analyze memory dumps from compromised systems without needing to source matching debug symbols.</li> <li><strong>Forensic analysis</strong>: Examine what was running and what files were accessed, even on unknown or custom kernels.</li> <li><strong>Malware analysis</strong>: Study process behavior and file operations from memory snapshots.</li> <li><strong>Security research</strong>: Explore kernel internals without specialized setup.</li> </ul> <h2 id="limitations-and-future-work">Limitations and future work</h2> <p>mquire can only access kernel-level information; BTF doesn&rsquo;t provide information about user space data structures. Additionally, the Kallsyms scanner depends on the data format from the kernel&rsquo;s <code>scripts/kallsyms.c</code>; if future kernel versions change this format, the scanner heuristics may need updates.</p> <p>We&rsquo;re considering several enhancements, including expanded table support to provide deeper system insight, improved caching for better performance, and DMA-based external memory acquisition for real-time analysis of physical systems.</p> <h2 id="get-started">Get started</h2> <p>mquire is available on <a href="https://github.com/trailofbits/mquire">GitHub</a> with prebuilt binaries for Linux.</p> <p>To acquire a memory dump, you can use <a href="https://github.com/504ensicsLabs/LiME">LiME</a>:</p> <figure class="highlight"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">insmod ./lime-x.x.x-xx-generic.ko <span class="s1">&#39;path=/path/to/dump.raw format=padded&#39;</span></span></span></code></pre> </figure> <p>Then you can run mquire:</p> <figure class="highlight"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Interactive session</span> </span></span><span class="line"><span class="cl">$ mquire shell /path/to/dump.raw </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Single query</span> </span></span><span class="line"><span class="cl">$ mquire query /path/to/dump.raw <span class="s1">&#39;SELECT * FROM os_version;&#39;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Discover available tables</span> </span></span><span class="line"><span class="cl">$ mquire query /path/to/dump.raw <span class="s1">&#39;.schema&#39;</span></span></span></code></pre> </figure> <p>We welcome contributions and feedback. Try <a href="https://github.com/trailofbits/mquire">mquire</a> and let us know what you think.</p> Good vibes, bad vendors - Werd I/O 699e69f4fbb6790001143bc8 2026-02-25T10:00:03.000Z <img src="https://werd.io/content/images/2026/02/getty-images--t1Gbn-p29Y-unsplash.jpg" alt="Good vibes, bad vendors"><p>When I was thirteen or fourteen I had a really comfortable sweatshirt that I wore to school all the time &#x2014; but it did have a few inherent problems. For one thing, it had a great big target on it, and wearing a literal target to high school was just asking for it. For another, on top of that, in Looney Tunes writing, was the confident phrase: &#x201C;It&#x2019;s a good vibe!&#x201D;</p><p>I was bullied as mercilessly as one might expect, but I honestly think it might have killed in the AI era. I&#x2019;d like to think I was just ahead of my time.</p><p>Andrej Karpathy, an early OpenAI researcher who now works <a href="https://eurekalabs.ai/?ref=werd.io">at his own startup</a>, coined the phrase <em>vibe coding</em> last year. To vibe code is to use an LLM like Claude or ChatGPT to generate source code instead of writing it yourself. He meant it as a way to loosely prototype code or to make progress on a weekend project. LLMs, at least at the time, could not be fully trusted to write well-written, working code. It was an out-there idea.</p><p>What a difference a year makes. Today, it&#x2019;s a mainstream conversation that is rapidly reshaping technology strategy &#x2014; and informing layoffs across industries.</p><p>AI conversations are always fraught, for good reasons that include the underlying power dynamics and the bad behavior of most of the AI vendors. At the same time, the whole AI landscape is changing incredibly rapidly, and it&#x2019;s become a clich&#xE9; to point out that any discussion of what LLMs can and can&#x2019;t do today will probably be invalid two or three months from now. And, of course, millions of words have been written about it at this point. But even despite all that, I still think it&#x2019;s worth talking about.</p><p>If you&#x2019;re running technology in a small, resource-constrained environment &#x2014; like a newsroom or a non-profit &#x2014; how should you think about AI-enhanced software engineering? Come to that, how should <em>I</em>?</p><p>Let&#x2019;s talk about it.</p><h3 id="first-things-first-does-it-work">First things first: does it work?</h3><p>It didn&#x2019;t, and then it did.</p><p>Six months ago, LLMs could generate a certain amount of code, but they would often make inefficient decisions or hallucinate libraries and API endpoints, and you&#x2019;d need to babysit them a lot. Their use was mostly passive: they would generate code snippets based on immediate user prompts, and engineers would have to spend a bunch of time debugging the output. And in terms of security, it was the Wild West; there were essentially no security considerations. LLMs are famously stochastic (their output is randomly determined, not deterministic) and prone to hallucinations. The result was unreliable code.</p><p>A lot has changed since then. In particular, the models released in February, 2026 are a sea change in reliability: given the right prompt, they often genuinely can write decent code in one shot. Tools like Claude Code can go off, spawn multiple agents, investigate a problem, build a reasonable plan, and then execute on it, while working in a safely sandboxed environment.</p><p>It&#x2019;s not just about improved models, although they obviously have a central part to play. An ecosystem is developing around doing AI-assisted software engineering well. Plugins like <a href="https://blog.fsck.com/?ref=werd.io">Jesse Vincent</a>&#x2019;s <a href="https://github.com/obra/superpowers?ref=werd.io">Superpowers</a> encourage good decision-making based on principles of excellent software architecture design and product management. Structured frameworks like <a href="https://github.blog/ai-and-ml/generative-ai/spec-driven-development-with-ai-get-started-with-a-new-open-source-toolkit/?ref=werd.io">spec-driven development</a> similarly help lead the agent to sensible outcomes; both are incorporated in all-in-one coding lifecycle toolkits like <a href="https://github.com/dsifry/metaswarm?ref=werd.io">Metaswarm</a>. A rigorous process is preserved, and throughout, there are far more safety guardrails to prevent security incidents (although it&#x2019;s easy to overcome them, or they&#x2019;re sometimes not on by default), and using AI to generate code is much safer than it was.</p><p>Claude Code absolutely can write the code, build a plan, and document its work. I have been an AI skeptic, but in my experiments I&#x2019;ve found that it really can feel like magic. You can reasonably object to AI for any number of reasons, but this is no longer one. It works.</p><p>The thing to understand is that this is a tool for engineers &#x2014; and senior engineers will get the best results. It takes real engineering skill to craft a prompt that will do the right thing and result in a strong architecture.</p><p>The process changes the center of gravity from writing source code in a programming language to crafting goals, understanding your user, being crystal clear about the experience and the value you want to convey, and thinking about architectural implications. That probably means talking to people, forming a hypothesis about what they need, testing it with them, and considering the ongoing technical implications of the work.</p><p>Those are things that senior engineers already spend much of their time doing &#x2014; indeed, I&#x2019;d argue that it&#x2019;s what separates a great senior engineer from a mid-level one. The core question a senior engineer navigates well comes down to: lots of people <em>can</em> write code, but <em>should</em> they? Why, and for whom? Those questions only become more important in a world where AI is writing the source code. When implementation is faster, problem selection and scoping become the scarce skills.</p><p>Friction is training: we learn how to engineer software through our terrible experiences. When things go wrong, we learn. When we have to refactor, we learn. When we talk to our peers about our work, we learn. AI removes most of this friction and hides the complexity away from us: it obscures failure, compresses the process of debugging, and automates refactoring. When these hard-earned skills are the reason we can make good software engineering decisions with AI, but the AI doesn&#x2019;t offer newcomers the ability to build those skills, who will train the AI once we are gone?</p><p>Opinions on that change in center of gravity will be intensely divided. <a href="https://werd.io/2025-the-year-in-llms/">I stand by this New Year&#x2019;s Day thought about Claude Code</a>:</p><blockquote>It has the potential to transform all of tech. I also think we&#x2019;re going to see a real split in the tech industry (and everywhere code is written) between people who are outcome-driven and are excited to get to the part where they can test their work with users faster, and people who are process-driven and get their meaning from the engineering itself and are upset about having that taken away.</blockquote><p>I&#x2019;m very much an outcome-driven developer, and to me it&#x2019;s a giant relief. Not everyone will feel the same way.</p><p>Resource-constrained environments <em>must</em> be outcome-driven. They can&#x2019;t spend their time on the process of software engineering; the best way for them to move forward is to start small, release a valuable core that solves a problem for some set of users as early as possible, and then continually iterate around it, using user feedback as a guide.</p><p>There&#x2019;s no alternative to having empathetic, human-centered senior engineers on your team &#x2014; with or without AI. But AI engineering tools may have an interesting side effect: I can see a world where pushing these product and spec questions to the forefront helps more engineers build those skills more quickly. The first step, after all, is understanding that those answers are needed to begin with.</p><p>It&#x2019;s worth saying that there will be many managers who hope that tools like Claude Code will mean they can do away with engineers or dramatically cut their workforces. Of course there will. They may even see engineers as gatekeepers, and there may be resentment that they&#x2019;re needed at all &#x2014; and a hope that this work can be done directly by managers or other key employees. In a newsroom, for example, can&#x2019;t the <em>journalists</em> produce tools now?</p><p>For non-engineers, they can be a useful prototyping tool: for a product manager, for example, it may help assess a user interface or experiment with an idea. But those prototypes are not enduring software; nor are they projects that can be &#x201C;handed off&#x201D; to engineers to support.</p><p>To properly architect a system, there&#x2019;s a lot you need to consider. This includes performance, scalability, and the ongoing overhead of maintaining a project and keeping it safe: nobody wants to rely on software that proves to be slow, insecure, or impossible to update. You also need to assess the technical implications of a project: are there technical standards that the project should be adhering to, or battle-tested best practices that the design should take into consideration? For all these reasons, an engineer must be involved from the beginning.</p><p>These tools can&#x2019;t replace technical staff, and they shouldn&#x2019;t. Like I said, these tools are <em>for</em> engineers, not a replacement for them.</p><h3 id="okay-but-what-about-those-power-dynamics">Okay, but what about those power dynamics?</h3><p>Consider an individual, indie developer. Over the last few decades, they&#x2019;ve become more and more empowered: developer tools have become cheaper and more of them are open source. Power and control have been devolved to the individual; you can run the tools you want on your own hardware, configure or recode them to your needs, use them for free, and share any of your changes. Engineering has become more and more of an open collective built on radical collaboration. That allows developers with fewer resources to build more easily, widening the pool of people who can build startups, create useful tools, and learn these skills to begin with.</p><p>AI-assisted engineering centralizes power back in the other direction. Claude Code, Codex, and so on are all centralized, proprietary tools that become harder to move away from the longer they&#x2019;re relied upon. They&#x2019;re also expensive: while open source tools are decentralized and free, it&#x2019;s incredibly easy to spend large amounts on Claude. Based on my own experimentation and anecdotes from friends and peer companies, any engineer that relies on Claude Code as part of their daily work is likely to spend hundreds of dollars a week; these are new costs that didn&#x2019;t previously exist.</p><p>Those extra costs could theoretically be offset by significant performance or efficiency gains. The thing is, those gains aren&#x2019;t as strong as you might expect given the apparent magic of automatically generated code. A study recently published in Harvard Business Review indicated that <a href="https://hbr.org/2026/02/ai-doesnt-reduce-work-it-intensifies-it?ref=werd.io">adding AI actually intensified the workload, putting engineers at risk of burning out</a>:</p><blockquote>The changes brought about by enthusiastic AI adoption can be unsustainable, causing problems down the line. Once the excitement of experimenting fades, workers can find that their workload has quietly grown and feel stretched from juggling everything that&#x2019;s suddenly on their plate. That workload creep can in turn lead to cognitive fatigue, burnout, and weakened decision-making. The productivity surge enjoyed at the beginning can give way to lower quality work, turnover, and other problems.</blockquote><p>These can be mitigated by good work hygiene: enforcing breaks and sensible work hours. But the employers who are most enthusiastic about introducing AI may also be the ones that are least enthusiastic about benefits that center employee well-being over productivity.</p><p>I&#x2019;ve already mentioned that some managers may hope that AI can reduce their investment in software engineers. One can easily imagine that the presence of AI &#x2014; or, rather, the threat of being replaced by it &#x2014; could be used as a cudgel to depress engineer salaries. It gives managers more leverage beyond money, too: those longer hours and more intense workloads that the HBR study found could burn engineers out might be more likely in a world where engineers fear for their jobs.</p><p>The long-term implications are even starker. Consider a world where the recentralization of power from individuals to large, centralized companies continues at the current pace. When AI writes most source code, fewer and fewer engineers will be capable of doing this work themselves, which will lead to even more dependence and lock-in.</p><p>It&#x2019;s been noted in the past that while generative AI robs artists of the interesting work and leaves them with the mundane bits, for outcome-oriented engineers it robs them of the mundane bits and leaves them with the interesting parts. I&#x2019;d argue that the real value is in the intersection between coding and the higher-level work; they&#x2019;re inseparable. By improving the way we code, we improve the way we can solve problems for real people. (How can you solve a problem if you don&#x2019;t really understand how the solution works?) By improving the way we think about solving problems, we improve the way we code. (How can you code something well if you don&#x2019;t know who it&#x2019;s for or why it needs to exist?) They aren&#x2019;t two separate processes; they&#x2019;re parts of the same thing. Removing one makes the other less effective.</p><p>Without concerted effort, an entire industry will be de-skilled and de-valued, their human expertise replaced with software that charges by the token.</p><h3 id="so-let%E2%80%99s-put-in-the-effort">So let&#x2019;s put in the effort</h3><p>AI isn&#x2019;t going away, and AI-assisted software engineering is a permanent addition to the way we build software. But that&#x2019;s not the same thing as saying that the way we use AI <em>today</em> won&#x2019;t change.</p><p>Any policy for AI-assisted engineering has to take into account risks of various kinds. I&#x2019;d loosely separate them into the following categories:</p><ul><li><strong>Employee risk:</strong> preventing burnout, staff turnover, and poor morale.</li><li><strong>Security risk:</strong> preventing data leaks and security incidents that compromise customers, sources, employees, or other members of the community.</li><li><strong>Quality risk:</strong> preventing low-quality code that impacts the efficiency, experience, or perceived quality of the organization&#x2019;s work.</li><li><strong>Supplier risk:</strong> reducing the potential impact of potentially harmful choices made by AI vendors.</li></ul><p>While I&#x2019;m not going to go into a full framework here &#x2014; that&#x2019;s part of what I do at my day job &#x2014; let&#x2019;s talk about how we might think about addressing them together.</p><h4 id="employee-risk">Employee risk</h4><p>In that Harvard Business School report about AI-driven burnout in engineers, the authors suggested some sensible mitigations. These included creating, as team norms, structured time for quiet reflection on the project at hand, and limiting interruptions; intentional processes for limiting the work that can move forward, to prevent engineers from taking on (or being asked to take on) too many tasks just because they think they can; and creating more space for empathetic human connection as a team.</p><p>Those are all things that every team should do, whether or not they use AI! But they become even more important on an AI-accelerated team. If you don&#x2019;t have any norms about tightly controlling when work moves forward, for example, adding a tool that accelerates the work will result in a higher volume of work getting processed, but not necessarily any strategic selection about the most <em>important</em> work to do.</p><p>Perhaps most importantly, engineers are worried that they&#x2019;ll be replaced at the hands of managers who may not understand what they do. They need to have the emotional safety and security that comes from knowing that they won&#x2019;t. It needs to be communicated to them that the importance of their skills is understood. They are experts in their fields, and they&#x2019;ve just gained another tool to help them; they are not interchangeable with the tool.</p><h4 id="security-and-quality-risk">Security and quality risk</h4><p>It turns out that you go a long way towards addressing a lot of security, quality, and efficiency issues &#x2014; as well as some of the morale issues that lead to employee risk &#x2014; by placing engineers at the center of the process. Some AI processes talk about &#x201C;human in the loop&#x201D;. That term was borrowed from more traditional machine learning processes; in the case of anything where AI takes an action in the world on behalf of a user, like engineering, I&#x2019;d prefer to reframe it as a tool that is always directly under human control.</p><p>In that light, all code must have a human owner who will take responsibility for it. It&#x2019;s <em>their</em> code, just as if they&#x2019;d written it in an integrated development environment; they just happened to use a different tool. If all generated code must ultimately be owned and reviewed by a human, that person is able to tune the results for safety, efficiency, and quality.</p><p>Most well-run engineering teams have a peer review process where code written by an engineer must be officially reviewed by a second engineer before it can be merged into the main codebase. If we assume that generated code is owned by Engineer A, that means there must be a human Engineer B to give it a second pair of eyes. They might also be using automated tools to help their review along, but they&#x2019;re the ones who ultimately take responsibility for a review.</p><p>This isn&#x2019;t enough. All projects need to have comprehensive automated testing: tests that must run on code that is about to be merged into the main codebase in order to make sure everything still functions. Tests for efficiency, adherence to style guidelines, and security issues can be run here too. What&#x2019;s kind of fun is that when these are in place, tools like Claude Code will look at the test output, make corrections when something doesn&#x2019;t pass, and try again &#x2014; all automatically.</p><h4 id="supplier-risk">Supplier risk</h4><p>The centralization that removes power and agency from engineers also introduces a serious business risk. If a core part of an organization&#x2019;s value comes from software development, inexorably placing a centralized service in the middle of your process makes you heavily dependent on their decision-making. They can increase their prices, make changes to their stack, or change the way they think about keeping your data and source code safe, and there&#x2019;s very little you can do about it.</p><p>The good news is that, right now, no AI vendor can lock you into their services, because your source code itself and your infrastructure stack are independent of your AI tools. Your code is managed, stored, and hosted in different places, and you can think of source code itself as being a kind of open protocol: because it&#x2019;s plain text, you can use virtually any tool with it. Source code still has the devolved, open, decentralized properties of the open source ecosystem that has put power in engineers&#x2019; hands for decades. That provides at least some protection against an AI vendor suddenly increasing their prices or changing their privacy stance: you can always vote with your feet.</p><p>If you&#x2019;re uncomfortable using one of the major model providers, open source alternatives are available. Tools like <a href="https://aider.chat/?ref=werd.io">Aider</a> and <a href="https://cline.bot/?ref=werd.io">Cline</a> can provide agentic coding using any model, including local models that could theoretically be run on an organization&#x2019;s own infrastructure. In practice, though, this requires more powerful hardware than most smaller organizations can afford; this may become less of an issue over time, as new hardware emerges, but it certainly is one now. Still, local models could help prevent lock-in &#x2014; and may prevent some security issues, too.</p><p>This inherent openness could change as AI vendors look for ways to increase their revenue and reduce churn. We may see AI-specific alternatives to git and GitHub; I can even imagine programming languages that are &#x201C;optimized for AI&#x201D; but that just happen to be proprietary and locked in to a vendor. Every company that builds software should watch for these forms of lock-in and reject them.</p><p>We should also be wary of marketing that tells us to just let the AI write code autonomously. These are ideas that cement vendors as a full replacement for the software development process, moving a center of expertise that was previously owned by an organization into a centralized technology owned by someone else. It&#x2019;s a trap: that world is one where the source code can&#x2019;t be moved between agents and your products are fully locked into their services without a credible exit.</p><h3 id="do-we-want-to-invite-these-companies-into-our-workplaces">Do we want to invite these companies into our workplaces?</h3><p>A <em>ton</em> has been written on the issues surrounding AI. <a href="https://werd.io/evaluating-ai/">Last summer, I wrote a broader guide to navigating AI that I think still holds up.</a> In it, I noted:</p><blockquote>A lot of money has been spent to encourage businesses to adopt AI &#x2014; which means deeply embed services provided by these vendors into their processes. The intention is to make their services integral as quickly as possible. That&#x2019;s why there&#x2019;s heavy sponsorship at conferences for various industries, programs to sponsor adoption, and so on. Managers and board members see all this messaging and start asking, &#x201C;what are we doing with AI?&#x201D; specifically because this FOMO message has reached them.</blockquote><p>My approach to evaluating AI remains through two main lenses: the technology itself and the vendors who make it. <a href="https://werd.io/evaluating-ai/#further-reading">The further reading section of that earlier piece is a good place to start.</a></p><p>The thing that I didn&#x2019;t mention then, but is worth calling out now, is the sheer precarity of these vendors. AI vendors <a href="https://www.wheresyoured.at/why-everybody-is-losing-money-on-ai/?ref=werd.io#:~:text=Generative%20AI%20companies%20%E2%80%94%20OpenAI%20and%20Anthropic,(EG:%20OpenAI%20and%20Anthropic)%20is%20losing%20money.">are offering their services for below cost</a> and have struggled to articulate value in a way that could credibly lead to profitability. Apparently feeling this gap, OpenAI is experimenting with <a href="https://searchengineland.com/chatgpt-ads-spotted-and-they-are-quite-aggressive-469651?ref=werd.io">ads</a> and <a href="https://gizmodo.com/chatgpts-adult-mode-is-coming-in-2026-2000698677?ref=werd.io">porn</a>, while finding itself under scrutiny for <a href="https://www.cnn.com/2025/11/06/us/openai-chatgpt-suicide-lawsuit-invs-vis?ref=werd.io">putting teen wellbeing at risk</a> through choices it made to boost engagement. Anthropic <a href="https://technologymagazine.com/articles/why-reddit-sues-anthropic-the-dangers-of-ai-data-privacy?ref=werd.io">was sued by Reddit last year</a> for scraping Reddit data for training without authorization, and <a href="https://www.wired.com/story/anthropic-settles-copyright-lawsuit-authors/?ref=werd.io">had to settle a high-profile lawsuit</a> brought by book authors whose work it stole for training data. I&#x2019;ve mentioned Claude Code a bunch in this piece, because it works really well, but it was trained using stolen work.</p><p>Meanwhile, from a technical standpoint, there has been some research that <a href="https://www.ineteconomics.org/research/research-papers/the-ai-bubble-and-the-u-s-economy-how-long-do-hallucinations-last?ref=werd.io">there are diminishing returns to new LLM development</a> and we&#x2019;re already past the peak.</p><p>There&#x2019;s no guarantee these companies will make it. If an organization has invested in agentic coding processes that don&#x2019;t substantially keep humans in the loop and the vendors that power them disappear, they will be left in a bind, with no in-house expertise, and company strategies that depend on AI. That makes it a dangerous gamble. We will have lost internal skill while increasing our dependence on very fragile external suppliers.</p><h3 id="so-how-should-you-think-about-it">So how should you think about it?</h3><p>AI coding works. It shifts the center of gravity from implementation to judgment, which increases the value of senior engineering skills. It also introduces significant power, labor, and supplier risks. That means that solid guardrails and cultural norms are non-optional.</p><p>Even if you haven&#x2019;t rolled it out yet, your engineers are almost certainly using it. In conversations with my peers, I&#x2019;ve heard countless stories of organizations that banned it but discovered that its workforce had just taken matters into their own hands. While there are many engineers who refuse to touch it, many more are eager to have it.</p><p>You could ban it, but it&#x2019;d likely be fruitless: those engineers who use their own accounts will probably keep doing so. It&#x2019;s better to have the tools in a place that&#x2019;s under your control and observable than used in the shadows in a way that might put your data at risk. Given that, it&#x2019;s better to roll it out than to not. But you need to do it with your eyes wide open and with a sense of intentionality. Be aware of the risks, and mitigate them in advance with common sense cultural norms like the ones I discussed earlier: pay attention to your employee and supplier risks in particular. Don&#x2019;t let AI push to production without oversight. And keep humans not just in the loop but fully in control.</p><p>I don&#x2019;t think it&#x2019;s productive to <em>mandate</em> the use of AI-assisted engineering, which runs the risk of alienating some engineers &#x2014; the split between AI skeptics and those who are excited about the technology is real &#x2014; and preventing nuanced discussions about how the technology can be used inside your workplace. What happens in practice when you just let it roll out to anyone who wants to try it is that people <em>do</em> try it; they find that it&#x2019;s useful for some tasks, and then quickly find its limitations. That&#x2019;s a healthy exploration.</p><p>How should <em>I</em> think about it? I&#x2019;m still figuring it out. Jesse Vincent compares the process of hating &#x201C;agentic&#x201D; development and pushing through it to discover that code was never the most important part of building software <a href="https://primeradiant.com/blog/2026/what-we-are-working-on.html?ref=werd.io">to the process of being a manager and asking your team to build things instead of coding them yourself</a>. I agree that these experiences rhyme &#x2014; but of course, when you lead a team, you&#x2019;re investing in human beings, working alongside them, and helping them to grow in the process. That&#x2019;s exponentially more rewarding than leading software agents built to provide value for a megacorporation.</p><p>But it doesn&#x2019;t need to be that way. You can do both. If you treat the technology as a tool, albeit one that has been made by genuinely problematic companies, you can roll it out to a real, human team and continue to build things together. You can invest in and support them while you navigate new kinds of software problems; together, you can figure out how to shape the culture of an engineering team that is undergoing a paradigm shift. You can train the next generation of software engineers, both keeping the long history of software development in mind, and taking into account these new skills. And you can look for the next thing that properly devolves power down the stack to the individual, for the benefit of everyone.</p><p>Software development is still human. You can work together towards a shared mission, pick and choose the pieces of this new technology that make sense according to your strategy and values, and build community in the process.</p><p><em>That&#x2019;s</em> a good vibe.</p> Everything is awesome (why I'm an optimist) - Westenberg 699e45e472729900014f842d 2026-02-25T01:39:00.000Z <img src="https://www.joanwestenberg.com/content/images/2026/02/ChatGPT-Image-Feb-25--2026--12_03_25-PM.png" alt="Everything is awesome (why I&apos;m an optimist)"><p>February is the month the internet decided we&apos;re all going to die.</p><p>In the span of about two weeks, Matt Shumer&apos;s <a href="https://shumer.dev/something-big-is-happening?ref=joanwestenberg.com">Something Big is Happening</a> racked up over 80 million views on X with its breathless comparison of AI to the early days of COVID, telling his non-tech friends and family that we&apos;re in the &quot;this seems overblown&quot; phase of something much, much bigger than a pandemic. Before anyone had finished arguing about that, Citrini Research published <a href="https://www.citriniresearch.com/p/2028gic?ref=joanwestenberg.com">THE 2028 GLOBAL INTELLIGENCE CRISIS</a> (all caps) a fictional dispatch from June 2028 in which unemployment has hit 10.2%, the S&amp;P 500 has crashed 38% from its highs, and the consumer economy has been hollowed out by what they coined &quot;Ghost GDP&quot;: output that shows up in the national accounts but never circulates through the real economy, because, as Citrini helpfully observed, machines spend zero dollars on discretionary goods. Michael Burry signal-boosted it. <a href="https://www.bloomberg.com/news/articles/2026-02-23/software-payments-shares-tumble-after-citrini-post-on-ai-risks?ref=joanwestenberg.com">Bloomberg covered it</a>. IBM fell 13%. Software and payments stocks shed over $200 billion in market cap in a single day, apparently because a Substack post called upon them by name and investors decided that constituted news.</p><p>The doom loop Citrini described is simple: AI capabilities improve, companies need fewer workers, white-collar layoffs increase, displaced workers spend less, margin pressure pushes firms to invest more in AI, AI capabilities improve. Repeat until civilization unravels. Shumer, meanwhile, told people to get their financial houses in order because the permanent underclass is imminent. </p><p>Both pieces went stratospherically viral, and both, I believe, are entirely wrong about where this is heading.</p><p>I want to make a case for optimism. </p><p>For anyone who read those pieces and felt the dread, whether you&apos;re building AI and worrying about what it means, or you&apos;ve absorbed the pessimist consensus and started treating decline as a foregone conclusion, or you&#x2019;re in the bucket of people Shumer insists are fucked; I&apos;m going to argue that the pessimists have the best narratives and the worst track record. The doom scenarios require assumptions that don&apos;t survive contact with economic history, and the psychological posture you bring to this moment actually matters for how it turns out.</p><h2 id="why-the-doom-loop-feels-so-right">Why the doom loop feels so right</h2><p>The central mechanism of the Citrini thesis: when you make intelligence abundant and cheap, you destroy the income that 70% of GDP depends on. A single GPU cluster in North Dakota generating the output previously attributed to 10,000 white-collar workers in midtown Manhattan is, in their framing, &quot;more economic pandemic than economic panacea.&quot; The velocity of money flatlines. The consumer economy withers. Ghost GDP accumulates in the national accounts while real humans stop being able to pay their mortgages.</p><p>Noah Smith, writing on <a href="https://www.noahpinion.blog/p/the-citrini-post-is-just-a-scary?ref=joanwestenberg.com">Noahpinion</a> the day after the selloff, called it &quot;a scary bedtime story&quot; and pointed out that Citrini doesn&apos;t use an explicit macroeconomic model, so you can&apos;t actually see what assumptions are driving the doom spiral. Smith noted that none of the analysts whose job it is to track Visa and Mastercard stock had apparently thought about AI disruption until a blogger spelled it out for them, which tells you more about sentiment-driven trading than it does about macroeconomics. The economist Gerard MacDonell described the entire piece as &quot;allegorical&quot; but pointed out that it ignores a basic economic principle: production generates income.</p><p>Ben Thompson, on Stratechery, has been making a version of this counterargument for months, most forcefully in his January piece <a href="https://stratechery.com/2026/ai-and-the-human-condition/?ref=joanwestenberg.com">AI and the Human Condition</a>, where he argued that even if AI does all of the jobs, humans will still want humans, creating an economy for labor precisely because it is labor. Thompson&apos;s framing cuts to something the doom narratives consistently miss. They model AI exclusively as labor substitution: the same economy, minus humans. Every section of the Citrini piece is about replacing workers and squeezing margins on existing activity. What they don&apos;t model is what the freed-up surplus creates. As Thompson put it in <a href="https://stratechery.com/2026/another-viral-ai-doomer-article-the-fundamental-error-doordashs-ai-advantages/?ref=joanwestenberg.com">his analysis of the Citrini selloff</a>, this is the real error: a refusal to believe in human choice and markets.</p><p>It&apos;s an error that has been made, in nearly identical form, about every major technological transformation in modern history. Every single time, the pessimists looked at what was being destroyed and extrapolated catastrophe, while failing to imagine what would be created, because the thing that would be created hadn&apos;t been invented yet.</p><h2 id="catastrophists-keep-being-wrong">Catastrophists keep being wrong</h2><p>In 1810, 81% of the American workforce was employed in agriculture. Two hundred years later, it&apos;s about 1%. If you had shown someone in 1810 a chart of agricultural employment decline and asked them to model the economic consequences, the only rational projection would have been apocalypse. Where would 80% of the population find work? What would they do? How would anyone eat if the farmers were all displaced by machines?</p><p>The answer, of course, is that entirely new categories of work were created that no one in 1810 could have conceived of, and these new jobs paid dramaticaly more than subsistance farming. Factory work, office work, services, knowledge work, the entire apparatus of modernity: none of it was visible from the vantage point of the pre-industrial economy. The transition was brutal and uneven. The handloom weavers of England suffered. Dickens documented the squalor of early industrialization in prose that still makes you flinch. But the trajectory was real, and the people projecting permanent immiseration from the displacement of agricultural labor were, in the fullest sense, catastrophically wrong.</p><p>Tom Lee of Fundstrat made this point with a specific example that I find clarifying. The invention of flash-frozen food in the early 1900s disrupted farming, taking agriculture from 30-40% of employment down to its current sliver. The economy didn&apos;t collapse. It reallocated value elsewhere, into industries and occupations that the frozen food pioneers couldn&apos;t have imagined. And today, I can&apos;t name a single family that subsists on frozen TV dinners. </p><p>The Citrini scenario expects you to believe that AI will be the first major technological revolution in which this reallocation mechanism fails entirely. Where every previous wave of automation freed up human labor and capital to flow into new, higher-value activities, this time the loop... <em>stops</em>. The surplus accrues to the owners of compute, consumers lose purchasing power, and the negative feedback loop has no natural brake. It&apos;s worth sitting with how strong a claim that is. It requires every previous pattern of technological adaptation to be wrong, or at least irrelevant. And when you look at the actual data, there are signs that white-collar job postings have stabilized, layoff mentions on earnings calls remain well below early 2023 peaks, and forward-looking labor indicators show no sign of the displacement spiral that the doom thesis predicts.</p><p>Does that mean AI won&apos;t disrupt specific industries and jobs? Obviously it will. Some of those disruptions will be painful and dislocating for the people caught in them. But there&apos;s an enormous gap between &quot;this technology will cause serious labor market disruption that we need to manage&quot; and &quot;this technology will cause a self-reinforcing economic death spiral from which there is no recovery.&quot; Citrini is arguing the latter, while the evidence supports the former.</p><h2 id="why-vivid-scenarios-beat-boring-probabilities">Why vivid scenarios beat boring probabilities</h2><p>There&apos;s a reason the doom narratives go viral while the measured counterarguments get a polite nod // a fraction of the engagement. It has nothing to do with the quality of the underlying analysis. It has everything to do with how human brains process information.</p><p>Daniel Kahneman&apos;s work on the availability heuristic showed that we judge the probability of events by how easily we can imagine them. Dystopia is easy to imagine. We have an extraordinarily rich cultural tradition of imagining technological nightmare scenarios in exquisite detail. Orwell did it brilliantly. Every season of Black Mirror does it competently. The Terminator gave us the visual grammar for AI catastrophe decades before anyone had a working language model. When Citrini describes a world where the unemployment rate hits 10.2% and the S&amp;P crashes 38%, you can picture it. You can feel the dread. Hollywood has been training you to feel exactly this dread for your entire life.</p><p>Now try to imagine the positive scenarios. Try to picture, in concrete sensory detail, a world where AI helps us solve protein folding problems across thousands of neglected tropical diseases, where it accelerates materials science research by orders of magnitude, where it makes high-quality legal and medical advice accessible to people who currently can&apos;t afford it, where it enables forms of creative expression and economic activity that we can&apos;t yet name because they don&apos;t exist yet. It&apos;s fuzzy and abstract. You can state it intellectually, but you can&apos;t feel it the way you can feel the unemployment spiral.</p><p>This asymmetry isn&apos;t trivial. The <a href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5637576&amp;ref=joanwestenberg.com">Ifo Institute</a> has published research showing that investors are willing to pay more for economic narratives than for raw forecasts, and that pessimistic narratives command higher prices among certain investor types. As <a href="https://klementoninvesting.substack.com/p/why-pessimists-make-more-money?ref=joanwestenberg.com">Joachim Klement</a> put it in his response to the Citrini selloff: investors value narratives more than actual recession forecasts. Stories travel faster than spreadsheets.</p><p>Shumer&apos;s piece is a narrative construction, and a questionable piece of analysis. He opens with the COVID comparison: remember February 2020, when a few people were talking about a virus and everyone thought it was overblown? He positions himself as the insider who sees what&apos;s coming, who&apos;s been &quot;giving the polite, cocktail-party version&quot; but can&apos;t hold back the truth any longer. <a href="https://carvao.substack.com/p/the-problem-with-techs-latest-something?ref=joanwestenberg.com">Paulo Carvao</a>, writing in Forbes, noted that it reads at times like a sales pitch. It&#x2019;s a used-car pitch at that. The Guardian pointed out that Shumer &quot;previously excited the internet by announcing the release of the world&apos;s &apos;top open-source model,&apos; which it was not.&quot; (To be clear: this is a kinder way of saying <a href="https://x.com/jawestenberg/status/2021782902342922514?s=20&amp;ref=joanwestenberg.com" rel="noreferrer">it was fraud.</a>)</p><p>But criticism doesn&apos;t travel like fear does. Fear is a better story. And so the doom narratives accumulate cultural mass while the boring, incremental, statistically-grounded counterarguments remain niche reading for economists and strategists.</p><h2 id="we-remember-disasters-not-the-ones-we-dodged">We remember disasters, not the ones we dodged</h2><p>Humans are spectacular at remembering disasters, passed down in every format from the written word to the oral tradition. We are (for obvious reasons) terrible at remembering the disasters that didn&apos;t happen. In 1962, during the Cuban Missile Crisis, a Soviet submarine officer named Vasili Arkhipov refused to authorize the launch of a nuclear torpedo, overriding two other officers who wanted to fire. The world didn&apos;t end. Most people today have never heard of Arkhipov. Everyone knows about Hiroshima and Nagasaki. The bomb that fell is seared into collective memory. The bomb that didn&apos;t fall is a footnote.</p><p>The Y2K bug was going to crash civilization; then billions of dollars of engineering work fixed it, and everyone retroactively decided it was never a real threat. The ozone layer was going to disintegrate; then the Montreal Protocol worked better than almost anyone predicted, and ozone depletion feels like a quaint 1990s worry. Acid rain was dissolving the forests of North America; then sulfur dioxide regulations cut emissions drastically, and the whole issue evaporated from public consciousness. Every one of these was a genuine threat. Every one was met by human ingenuity and institutional coordination. Every one was subsequently memory-holed, because success is boring and failure is vivid.</p><p>We&apos;re running our forecasting models on a dataset that systematically excludes our wins. It should be entirely unsurprising that the forecasts come out somewhat bearish.</p><h2 id="ben-thompson-as-usual-gets-it-right">Ben Thompson (as usual) gets it right</h2><p>Thompson&apos;s core insight is that humans want humans. He points to the agricultural revolutions: in the pre-Neolithic era, zero percent of humans worked in agriculture. By 1810, 81%. By today, 1%. Machines replaced human agricultural labor entirely, and rather than the economy collapsing, entirely new categories of work were created that paid dramatically more. This cycle played out again with industrialization, with computing, with the internet. Every time, the displacement was real, and every time, new forms of human-valued work emerged that couldn&apos;t have been predicted.</p><p>Citrini called DoorDash &quot;the poster child&quot; for AI disruption, imagining vibe-coded competitors fragmenting the market overnight. Thompson flips it: DoorDash is the poster child for why the article is absurd. DoorDash didn&apos;t always exist. It was built, and it wins through the active choice of customers, restaurants, and drivers. The doom thesis treats it as a static rent-extraction layer sitting on top of human laziness, but DoorDash created its market from scratch and generated new jobs for millions of drivers along the way. What the Citrini analysis lacks, Thompson argued, is any belief in human choice or markets. If your starting assumption is that things are as they are, you can only envision breaking them.</p><p>Citrini predicted AI would collapse real estate commissions by eliminating information asymmetry. But the internet already did that. You can look up every house for sale right now, with full history and photos. Real estate agents still exist, which is one of the better arguments that humans are resourceful at giving themselves work to do even in fields where they arguably shouldn&apos;t need to.</p><p>In a world of AI abundance, the things humans create will become more valuable precisely because they&apos;re human. AI art will make human art more desirable, not less, because provenance matters. AI-generated content will make human-generated content worth more, because the imperfections and idiosyncrasies are features. </p><p>Is this optimistic? Yes. Could it be wrong? Sure it could. But it&apos;s grounded in a real observation about human psychology that the doom models don&apos;t account for. Citrini&apos;s Ghost GDP thesis assumes that when AI replaces human labor, the value simply evaporates from the consumer economy. Thompson&apos;s counterargument is that humans will create new forms of value that are specifically human, and that demand for those forms of value will intensify as machine-generated alternatives become ubiquitous. The history of technological disruption suggests Thompson has the stronger case.</p><h2 id="pessimism-as-a-self-fulfilling-prophecy">Pessimism as a self-fulfilling prophecy</h2><p>What actually worries me is the second-order effects of the doom narrative itself.</p><p>When the smartest, most technically capable people in a field become convinced that the field is heading toward catastrophe, several things happen. Some leave the field entirely, removing exactly the talent you&apos;d want steering the ship. Some stay but adopt a posture of resigned inevitability, which is functionally identical to apathy. Some decide that since disaster is coming, they might as well accelerate and cash out. And a vocal minority become so consumed by existential risk that they advocate for extreme countermeasures that would concentrate power in ways that create entirely new categories of danger.</p><p>Robert Oppenheimer (in the wake of his famous invocation of the Bhagavad Gita) spent the years after the Manhattan Project arguing passionately for international cooperation on nuclear governance. He didn&apos;t say &quot;we should never have done this.&quot; He said, essentially, &quot;this is incredibly powerful, and we need to build institutions that can handle it.&quot; He was an optimist in the meaningful sense: he believed better outcomes were achievable if people worked to achieve them. He was right about that, because we&apos;re still here.</p><p>The most effective people working on AI safety and governance right now are, almost without exception, optimists. They work on alignment because they believe alignment is solvable. They push for better governance becuase they believe governance can work. The ones who&apos;ve concluded that the problem is unsolvable tend to stop doing useful work, for obvious reasons.</p><p>Gramsci wrote about &quot;pessimism of the intellect, optimism of the will.&quot; You look at the world clearly. You see the problems. And then you choose to act as if better outcomes are possible, because that choice is the precondition for achieving them.</p><h2 id="nobody-can-see-the-next-economy">Nobody can see the next economy</h2><p>What both Shumer and Citrini miss is that they&apos;re modeling a future economy using the structure of the present economy. They see AI replacing white-collar workers within the existing economic framework and project the consequences of that replacement within that same framework. But every major technological transformation has changed the framework itself, creating entirely new economic structures that were invisible from the vantage point of the old ones.</p><p>In 1995, if you told someone that one of the largest employers in America would be a company that let strangers sleep in each other&apos;s homes, they would have thought you were insane. If you told them that millions of people would make a living by talking into microphones about their opinions, or recording themselves playing video games, or writing newsletters on the internet, they&apos;d have had you committed. The entire creator economy, the gig economy, the app economy, the SaaS economy that Citrini is now eulogizing: none of it was predictable from the vantage point of 1995. And that&apos;s a 30-year window. The agricultural revolutions played out over centuries.</p><p>What will people do when AI can handle most current white-collar tasks? </p><p>I don&apos;t know. </p><p>And that&apos;s the whole point. </p><p>Nobody knew what displaced agricultural workers would do, either, until they did it. The absence of a visible next chapter isn&apos;t evidence that there won&apos;t be one. It&apos;s evidence that we&apos;re bad at predicting what humans will invent when constraints shift.</p><h2 id="choosing-optimism-with-open-eyes">Choosing optimism with open eyes</h2><p>I&apos;m not saying everything will be fine. I&apos;m not saying the transition will be smooth. I&apos;m not saying that the people displaced by AI won&apos;t suffer, or that we don&apos;t need better policy frameworks to handle the disruption. The distributional concerns at the heart of the Citrini piece are legitimate. If productivity gains accrue primarily to the owners of compute and capital while labor income stagnates, that&apos;s a genuine problem. Labour&apos;s share of GDP has been declining for decades. These are real numbers pointing to real challenges.</p><p>What I am saying is that the leap from &quot;this will be disruptive and we need to manage it carefully&quot; to &quot;this will cause an irreversible economic death spiral&quot; isn&apos;t supported by the evidence, by economic history, or by what we know about how humans respond to technological change. The Citrini scenario requires every adaptive mechanism in the economy to fail simultaneously and completely within roughly two years. That&apos;s a very specific left-tail outcome.</p><p>If you&apos;re building AI systems, if you&apos;re founding companies, if you&apos;re writing code that will shape how people experience the world, your psychological orientation toward the future is a variable that directly shapes // affects outcomes. Pessimistic builders build defensively. They hoard and hedge and make decisions based on fear. Optimistic builders build with ambition. They invest in safety because they believe safety is achievable. They take on hard problems because they believe hard problems have solutions.</p><p>The tech industry is at a hinge point, and the narrative it tells itself will shape what it creates. If the dominant narrative is doom, the best people leave, the remaining people race to extract value before the collapse, and the governance frameworks get built by people who don&apos;t understand the technology. If the dominant narrative is cautious optimism, the best people stay, the work is good, and the institutions get built by people who know what they&apos;re building for.</p><p>Ed Yardeni, the veteran Wall Street strategist, noted in the wake of the Citrini selloff that &quot;the AI story has morphed from a Roaring 2020s productivity booster to an existential threat to our way of life.&quot; He found this striking. I find it absurd. The underlying technology hasn&apos;t changed, and the capabilities haven&apos;t shifted. What changed is the narrative, and narratives are always, <em>always </em>choices.</p><p>I choose optimism. I choose it because the alternative is surrender as sophistication. And because every time I look at the historical record, <em>the full record</em> that includes both the disasters and the averted disasters, both the tragedies and the triumphs, the case for human ingenuity and resilience is stronger than the case against it.</p><p>The doomers may have the best stories.</p><p>I believe the optimists have the best evidence.</p><p>I&apos;ll take the evidence.</p><p>Everything is (going to be) awesome.</p>