Shellsharks Blogroll - BlogFlock2026-04-03T18:01:58.136ZBlogFlockdestructured, fLaMEd, Trail of Bits Blog, Aaron Parecki, gynvael.coldwind//vx.log (pl), James' Coffee Blog, Westenberg, Evan Boehs, joelchrono, Kev Quirk, cool-as-heck, Posts feed, Sophie Koonin, Adepts of 0xCC, <span>Songs</span> on the Security of Networks, cmdr-nova@internet:~$, Werd I/O, Johnny.Decimal, Robb Knight, Molly White, Hey, it's Jason!, Terence Eden’s BlogRead "The machines are fine. I'm worried about us." - Molly White's activity feed69cfb5dc7bbd252405c8a2732026-04-03T12:43:08.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://ergosphere.blog/posts/the-machines-are-fine/" rel="bookmark">“<span class="p-name">The machines are fine. I'm worried about us.</span>”</a></div><div class="byline"><span class="p-author h-card">Minas Karamanis</span> in <i class="p-publication">ergosphere.blog</i>. <span class="read-date"> Published <time class="dt-published published" datetime="2026-03-30">March 30, 2026</time>.</span></div><blockquote class="summary p-summary entry-summary">People call this friction "grunt work." Schwartz uses exactly that phrase, and he's right that LLMs can remove it. What he doesn't say, because he already has decades of hard-won intuition and doesn't need the grunt work anymore, is that for someone who doesn't yet have that intuition, the grunt work is the work. The boring parts and the important parts are tangled together in a way that you can't separate in advance. You don't know which afternoon of debugging was the one that taught you something fundamental about your data until three years later, when you're working on a completely different problem and the insight surfaces. Serendipity doesn't come from efficiency. It comes from spending time in the space where the problem lives, getting your hands dirty, making mistakes that nobody asked you to make and learning things nobody assigned you to learn.</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-04-03T12:43:08+00:00" title="April 3, 2026 at 12:43 PM UTC">April 3, 2026 at 12:43 PM UTC</time>. </div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/artificial_intelligence" title="See all feed posts tagged "artificial intelligence"" rel="category tag">artificial intelligence</a>. </div></div></footer></article>Notable links: April 3, 2026 - Werd I/O69cfa685fc66990001f39a0b2026-04-03T11:58:00.000Z<img src="https://werd.io/content/images/2026/04/ears.jpg" alt="Notable links: April 3, 2026"><p><em>Most Fridays, I share a handful of pieces that caught my eye at the intersection of technology, media, and society.</em></p><p><em>Did I miss something important? </em><a href="mailto:ben@werd.io" rel="noreferrer"><em>Send me an email</em></a><em> to let me know.</em></p><hr><h3 id="the-open-web-isnt-dying-were-killing-it"><a href="https://ouvre-boite.com/the-open-web-isnt-dying-were-killing-it/?ref=werd.io" rel="noreferrer">The open web isn't dying. We're killing it</a></h3><p>Julien Genestoux is right:</p><blockquote>“Why did we keep outsourcing identity, distribution, and monetization to companies whose incentives were obviously misaligned with ours?<br><br>[…] It is because, collectively, we preferred the short-term consumer surplus of convenience over the long-term responsibilities of stewardship.”</blockquote><p>We can raise the alarm about the demise of the open web all we want, but the truth is that other solutions were quicker and easier — even for many of us that held up the open web banner.</p><p>Julien’s proposal is that we should think of ourselves as netizens rather than just consumers. I actually think that this is driving a lot of the innovation in the ATproto ecosystem in particular, but also on the Fediverse. People in those spaces have intentionally moved somewhere new where they <em>can</em> have a credible exit, <em>can</em> export their data cleanly, and <em>can</em> feel like they’re having safer, more productive, less fascistic conversations.</p><p>But the money piece isn’t there. The running joke is that the Fediverse <em>hates</em> money — conversations about revenue or capitalism are very often shut down early, and people who try to fundraise are often criticized — but it’s also been an ongoing issue in ATproto land too. If people are going to build good things, they need to be able to eat and pay rent so they can keep doing it. I’d argue that, yes, you do need netizens, and I’m very excited to see a resurgence in this kind of movement across the open social web in particular. We need <em>more</em> netizens, and the more there are, the more likely it is that people will pay for the right kind of services.</p><p>I work for <a href="https://propublica.org/?ref=werd.io">a newsroom</a> that people often donate to out of a sense of catharsis — a gratitude that something is being done in a world where they feel powerless. I think there’s something to learn from here too. In the past, I’ve argued that highly ideological tech spaces need more product thinking so that we can more sharply identify valuable solutions to people’s problems, and there’s still truth in that — but I've learned that sometimes the product value is agency in the face of powerlessness rather than a set of features. There may well be value in <em>leaning right in</em> to the anti big tech angle on the open web. What might it look like to put people’s distrust of X, Google, Microsoft, <em>et al</em> front and center, and put a fundraising banner up <a href="https://en.wikipedia.org/wiki/Wikipedia:Fundraising/2025_banners?ref=werd.io">like Wikipedia does</a>?</p><p>I think we can take Julien’s point about netizens and connect it directly to the idea of <em>citizens</em>. People see what’s going on in the world and know that tech companies are intertwined with it. Some of them — not most of them, but a reasonable number — may want to do something about that. Not because they believe in an open web as such, or even know what that is, but because they believe in an open society. Using this kind of messaging would be overtly political in a way that tech is sometimes afraid to be, but we’ve seen similar messaging create interest in funding alternatives to US big tech in Europe, for example (and result in actual funding). I think the interest is there to move away from the tech powers-that-be globally, but engaged citizens don't always know what to concretely do about it. We can bring our message to them.</p><p>We need more netizens and citizens both, and we should be talking about this more. Rather than de-emphasizing the ideology of the open web in favor of more proximate product value, which is a thing I’ve sometimes argued for in the past, we should accept that it is a work of engaged citizenry that verges on activism. Embracing that could find us aligned people outside of our existing development circles who might be interested in broadening our impact. I’d like to see us try.</p><hr><h3 id="an-ai-company-set-out-to-fix-news-deserts-instead-it-copied-local-journalists%E2%80%99-work"><a href="https://www.poynter.org/ethics-trust/2026/nota-news-local-outlets-ai-plagiarism/?ref=werd.io" rel="noreferrer">An AI company set out to fix news deserts. Instead, it copied local journalists’ work</a></h3><p>Repeat after me: AI cannot write journalism and should never be used in place of a journalist. I believe it can be a very useful tool — but it is a tool for humans.</p><p>So this whole initiative was misconceived:</p><blockquote>“Artificial intelligence company Nota — whose clients include organizations like The Boston Globe and the Institute for Nonprofit News — is scrapping its network of local news sites after learning that they contained dozens of instances of plagiarism. […] The 11 sites — collectively called Nota News — launched in September as an effort to bring “bilingual local reporting and civic tools to underserved communities.””</blockquote><p>The deal here was that the company would identify news deserts: places that were unserved or underserved by real newsrooms. And then it would try to serve those areas with content created by an LLM-based system.</p><p>This was inevitably going to plagiarize existing journalism, because what other source could it possibly use? An agentic system can’t do the on-the-ground research and reporting work involved in creating a story. It <em>can</em> gather together data points and turn them into something that looks like news, rather than journalism: sports scores, city council votes, and that kind of thing. But it can’t provide context if someone hasn’t already written it.</p><p>As <a href="https://www.poynter.org/ethics-trust/2026/nota-news-local-outlets-ai-plagiarism/?ref=werd.io">the linked Poynter article</a> points out:</p><blockquote>“The articles were supposed to be based on publicly available civic information, such as press releases and videos of city council meetings. In reality, Poynter found more than 70 stories dating back to October that included reporting, writing and photography from local journalists without attribution.”</blockquote><p>Someone <em>had</em> already written it: human journalists whose work was subsequently incorporated without attribution. The eleven human editors who used the LLM tools to generate content apparently didn’t realize that this work had been drawn into the mix. Again: that was inevitably going to happen as the stories began to not just say what had happened but explain <em>why</em>.</p><p>The AI hype cycle has created a bunch of really regrettable case studies that other organizations should learn from. This is one. There are more like it, where good intentions lead to accidental plagiarism (or hallucinations). There are plenty of stories where organizations have prematurely let people go because they incorrectly think they can replace human initiative with software. And all of them come down to believing a science fiction version of what this technology does instead of the actual reality of it.</p><p>That’s understandable: the reality is shifting quickly, and the marketing machine is incredibly strong. But everyone needs to take a breath with AI and get themselves to a more nuanced understanding of what it is — and isn’t.</p><hr><h3 id="linkedin-is-illegally-searching-your-computer"><a href="https://browsergate.eu/?ref=werd.io" rel="noreferrer">LinkedIn Is Illegally Searching Your Computer</a></h3><p>This is quite a serious accusation:</p><blockquote>“Every time any of LinkedIn’s one billion users visits linkedin.com, hidden code searches their computer for installed software, collects the results, and transmits them to LinkedIn’s servers and to third-party companies including an American-Israeli cybersecurity firm.”</blockquote><p>This is an EU-based site, hence the reference to the location of the cybersecurity firm. The authors are quick to point out that they believe this scanning is illegal in the EU.</p><p>The claim is also partially a little bit hyperbolic. “Installed software” makes it sound like LinkedIn is scanning your whole computer. In reality, it’s checking for browser extensions. That’s a fairly common component of modern browser fingerprinting: at this point it’s fairly well-known that, because of the individual mix of extensions, fonts, etc available to a browser, this can be used to track individuals on the web without using cookies.</p><p>That’s not to say that it’s not invasive — it clearly is!</p><p>Browser extensions can cover a ton of identifying activity: they can reveal a person’s religion, sexuality, interests, political orientation, and so on. The implication is that this is specifically bad here because LinkedIn knows the identity of its logged-in users; as a result, this is information it could use to hydrate profiles of the specific, known individuals who use its site for unknown purposes. It’s a little over the top to call this espionage, as the linked site here does, but it’s an abuse of trust that is certainly worth calling out.</p><p>I was mostly interested in how this works; if LinkedIn is doing it, then others surely are too. <a href="https://browsergate.eu/how-it-works/?ref=werd.io">The answer seems to be a set of JS calls that work in most Chromium-based browsers</a> (Chrome, Edge, Arc, Dia, etc). They’re checking for over six thousand extensions that they know and care about, which all have specific “tells” that a website can check for. And then they check to see if the page has been modified by anything to catch any that weren’t on their list. They also check, cheekily, to see if you have “Do Not Track” switched on, but track you regardless (it’s just another part of the fingerprint to them). Finally, they’re gathering everything from your screen size and CPU type to your battery level.</p><p>This all does double duty: the resulting fingerprint is so detailed that they can track you and notice when you’re using a different computer or have changed your settings, but can also be used to profile you for profit.</p><p>The quickest solution is to use Firefox, which blocks these kinds of fingerprinting attacks. <a href="https://zen-browser.app/?ref=werd.io">Zen Browser</a>, which is based on the Firefox core, is my day-to-day browser, and <a href="https://werd.io/why-im-all-in-on-zen-browser/">I love it</a>. But Chromium-based browsers need to do more to stop fingerprinting, and jurisdictions like the EU need to ban the practice outright.</p><hr><h3 id="what-digital-isolation-and-censorship-evasion-look-like-in-wartime-iran"><a href="https://www.techpolicy.press/what-digital-isolation-and-censorship-evasion-look-like-in-wartime-iran/?ref=werd.io" rel="noreferrer">What Digital Isolation and Censorship Evasion Look Like In Wartime Iran</a></h3><p>I’ve worried that the internet will become a casualty of our worsening global politics. The inherent co-operation needed to let global networks talk to each other is aligned with an open world but not so much with an authoritarian one. Walled-off national internets — often called splinternets — may become more common.</p><p>While I worry about this for the US as the authoritarian screws continue to tighten, this is the concrete reality for people in Iran and 20 other countries today. As <a href="https://www.techpolicy.press/what-digital-isolation-and-censorship-evasion-look-like-in-wartime-iran/?ref=werd.io">this piece in Tech Policy Press</a> points out:</p><blockquote>“The cybersecurity company Surfshark recorded 81 new internet restrictions in 2025 <a href="https://surfshark.com/research/study/internet-shutdowns-2025?ref=werd.io">across 21 countries</a>, pointing to evolving patterns of repression. Out of the 81 restrictions Surfshark tracked, 51 of these restrictive measures were taken <a href="https://surfshark.com/research/study/internet-shutdowns-2025?ref=werd.io">in response to</a> political situations.”</blockquote><p>News and information needs to be shared differently in this kind of environment: the digital distribution techniques we’ve spent the last few decades learning simply don’t apply. Last year, in <a href="https://werd.io/building-distributed-media-for-a-democratic-breakdown/"><em>Building distributed media for a democratic breakdown</em></a>, I wrote about how we might learn from Cuba’s <em>‌El Paquete Semanal</em> and take advantage of both sneakernets and peer-to-peer networks to overcome these kinds of blockades. In a restrictive environment, people need news and journalism more than ever.</p><p>I wrote that piece somewhat speculatively, but the reception to it in journalistic circles took me by surprise. It’s an idea and a worry that people are taking seriously. And over the last six months, in a world that has seen more conflict, more restrictions, and more attacks on free speech, there have only been reasons to take it more so.</p><hr><h3 id="the-right-is-using-ai-content-scanners-to-try-to-supercharge-book-banning"><a href="https://www.404media.co/blockade-the-right-is-using-ai-content-scanners-to-try-to-supercharge-book-banning/?ref=werd.io" rel="noreferrer">The Right Is Using AI Content Scanners to Try to Supercharge Book Banning</a></h3><p>This AI-powered effort is intentionally designed to create chilling effects and reduce support for vulnerable communities:</p><blockquote>“Conservative parents’ advocacy groups have been experimenting with using commercially available artificial intelligence tools to help them flag more books they’ve deemed pornographic to be removed from public schools and libraries. Even though LLMs are notoriously error-prone, and the books in question aren’t pornographic, these groups continue to explore use cases for AI anyway.”</blockquote><p>According to 404 Media’s reporting, the script has a list of 300 or so words that form the basis of a heuristic that applies an “appropriateness” score to each one. If the book is deemed inappropriate, the script creates an automated report designed to be attached to book challenges at the school district level.</p><p>This reminds me of DOGE itself, which <a href="https://www.propublica.org/article/ted-cruz-woke-grants-national-science-foundation?ref=werd.io">used a keyword-based system to flag “woke” grants that should be defunded</a> that led to some incredibly dumb decisions about what should go:</p><blockquote>“Among them, for example, was a $470,000 grant to study the evolution of mint plants and how they spread across continents. As best we can tell, the project ran into trouble with Republicans on the Senate Committee on Commerce, Science and Transportation because of two specific words used in its application to the NSF: “diversify,” referring to the biodiversity of plants, and “female,” where the application noted how the project would support a young female scientist on the research team.”</blockquote><p>These techniques are clearly inaccurate, but that’s not the point: it’s enough to cause havoc and make people second guess publishing books on certain topics. It’s the same culture of chaos that led to <a href="https://www.nbcnews.com/news/education/tennessee-librarian-fired-refusing-move-lgbtq-books-childrens-adult-rcna266119?ref=werd.io">a school librarian being fired for (correctly) refusing to remove over a hundred LGBTQ books from the children’s to the adult section of her library</a>. And it’s all designed to harm some of the people who need the most support.</p><hr><h3 id="the-doj-thinks-news-is-contraband"><a href="https://freedom.press/issues/the-doj-thinks-news-is-contraband/?ref=werd.io" rel="noreferrer">The DOJ thinks news is contraband</a></h3><p>This Freedom of the Press piece is highly relevant to how one might think about source materials in any kind of newsroom that accepts tips from others. It might not be obvious to outsiders, but newsrooms don’t <em>facilitate</em> tips directly from sources: material has to be volunteered without participation from the newsroom. Aside from generic instructions, nobody’s helping sources to do it.</p><p>A Biden-era precedent, now leapt on enthusiastically by the Trump administration, has begun to treat those materials as contraband regardless of how they were obtained. It’s also expanded that definition to include interviews with anyone who’s not approved to speak on the record. That line of thinking justified the raid on <a href="https://www.theguardian.com/us-news/2026/jan/14/fbi-raid-washington-post-hannah-natanson?ref=werd.io">Washington Post reporter Hannah Natanson</a>, where they took terabytes of data. Natanson had, just a month prior, <a href="https://www.washingtonpost.com/politics/2025/12/24/trump-federal-government-workers/?ref=werd.io">published her account of being an engagement reporter</a> whose job included receiving tips from the federal government. In more normal times, that account would not have made her a target.</p><p>It was previously found, in the aftermath of Daniel Ellsberg’s Pentagon Papers case, that newsrooms could publish information that was leaked to them. That’s a vital foundation for journalism and a free press, and therefore our ability to make informed democratic decisions. But this new precedent undermines that principle, and therefore our ability to understand the world around us. As the Freedom of the Press Foundation put it:</p><blockquote>“The Pentagon Papers case stands for the proposition that the government cannot suppress the publication of truthful information of public concern, even when it would very much like to. The contraband theory is an attempt to achieve the suppression indirectly — by redefining journalists’ work product as something illicit that the government can confiscate.”</blockquote><p>As they point out in the piece, legislation is in the works to rein these abuses in, and the judge in a pending court case has the opportunity to stand up for the First Amendment and a free press.</p><p>But there’s everything to play for. In the current political environment it’s not a slam dunk that our right to understand the world around us through investigative journalism will be upheld. We need it to be if we want to have any hope of holding people with power accountable.</p><hr><h3 id="the-white-house-has-an-app-now-and-trump-wants-you-to-report-people-to-ice-on-it"><a href="https://www.theverge.com/tech/902703/white-house-app-iphone-android?ref=werd.io" rel="noreferrer">The White House has an app now, and Trump wants you to report people to ICE on it</a></h3><p>A little history lesson from <a href="https://www.theholocaustexplained.org/resistance-responses-collaboration/german-collaboration-and-complicity/informants/?ref=werd.io">the Wiener Holocaust Library</a>:</p><blockquote>“In Nazi Germany, some citizens passed on information about their neighbours, family, and friends to the Gestapo . This was called informing. Nazi propaganda presented the Gestapo as an omnipresent , all-seeing, all-knowing group, but in reality there was just one secret police officer for approximately every 10,000 citizens of Nazi Germany. The Gestapo were therefore reliant on a network of thousands of informants.<br><br>The information passed on by informants typically accused someone of breaking the law or of being a criminal in some way. The information provided was not always based on fact and could often be rumour or suspicion.”</blockquote><p>Meanwhile, in <em>completely unrelated</em> news, <a href="https://www.theverge.com/tech/902703/white-house-app-iphone-android?ref=werd.io">The Verge reports on a new app from the White House</a>:</p><blockquote>“A new official White House app on Android and iOS takes the content from the White House website and copies it into app format. […] A handful of tabs in the app mostly replicate pages that exist on the Trump Administration’s version of the White House website, including news, livestreams, social feeds, and a gallery. A prominent “Get in Touch” button on the social feeds tab includes an option for users to submit a tip to ICE, which takes them to a tip form on the ICE website.”</blockquote><p>Wow, am I glad to be living in a time where <em>everything is normal</em> and the historical precedents are not literally screaming at us.</p>Book Review: Superintelligence - Paths, Dangers, Strategies by Nick Bostrom ★★★★⯪ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=699222026-04-03T11:34:34.000Z<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/03/superintelligence.webp" alt="Book cover featuring an owl." width="200" class="alignleft size-full wp-image-69924"/>
<p>When I finally invent time-travel, the first thing I'll do is go back in time and give everyone a copy of this book. Published in 2014, it clearly sets out the likely problems with <em>true</em> Artificial Intelligence (not the LLM crap we have now) and what measures need to be put in place <em>before</em> it is created.</p>
<p>It opens with The Unfinished Fable of the Sparrows:</p>
<iframe title="The Unfinished Fable of the Sparrows" width="620" height="349" src="https://www.youtube.com/embed/7rRJ9Ep1Wzs?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>
<p>Which, frankly, should be the end of the discussion. Oh Scronkfinkle, why didn't they listen to you?</p>
<p>This book attempts to set out they <em>why</em> and the <em>how</em> of protecting humanity from the (inevitable?) arrival of machines which we would describe as "superintelligent". That is, capable of human-level reasoning and understanding, but unlimited in terms of speed, working memory, and accuracy.</p>
<p>For example, automated trading algorithms caused a "<a href="https://en.wikipedia.org/wiki/2010_flash_crash">Flash Crash</a>" of the stock market in 2010. Unchecked machines very nearly destabilised the financial work. As Bostrom writes:</p>
<blockquote><p>[…] while automation contributed to the incident, it also contributed to its resolution. The pre-preprogrammed stop order logic, which suspended trading when prices moved too far out of whack, was set to execute automatically because it had been correctly anticipated that the triggering events could happen on a timescale too swift for humans to respond. The need for pre-installed and automatically executing safety functionality—as opposed to reliance on runtime human supervision—again foreshadows a theme that will be important in our discussion of machine superintelligence.</p></blockquote>
<p>So where are those safety functions now? Are any of the AI providers building in guardrails to prevent atrocities? We know that <a href="https://shkspr.mobi/blog/2025/03/how-to-dismantle-knowledge-of-an-atomic-bomb/">some LLMs are restricted from sharing details about devastating weapons of mass destruction</a> - but there seems little else put in place.</p>
<p>The book is mostly accessible but veers wildly between casual language, deep philosophical tracts, pointed snark, and the occasional dive into maths and physics. For anyone with even a passing interest in the progression of <em>any</em> technology, it is a worthwhile read.</p>
<p>Many of the predictions are spot on:</p>
<blockquote><p>As of 2012, the Zen series of go-playing programs has reached rank 6 dan in fast games (the level of a very strong amateur player), using Monte Carlo tree search and machine learning techniques. Go-playing programs have been improving at a rate of about 1 dan/year in recent years. If this rate of improvement continues, they might beat the human world champion in about a decade.</p></blockquote>
<p>In fact, <a href="https://en.wikipedia.org/wiki/AlphaGo_versus_Lee_Sedol">AlphaGo achieved mastery at the end of 2016</a>.</p>
<blockquote><p>In the slightly longer term, the cost of acquiring additional hardware may be driven up as a growing portion of the world’s installed capacity is being used to run digital minds […] as investors bid up the price for existing computing infrastructure to match the return they expect from their investment</p></blockquote>
<p>As I wrote about in "<a href="https://shkspr.mobi/blog/2026/02/ai-is-a-nand-maximiser/">AI is a NAND Maximiser</a>" this too has come to pass.</p>
<p>While LLMs weren't yet invented when this was written, there's an excellent prediction about how an AI could become a pernicious psychological adversary:</p>
<blockquote><p>Caution and restraint would be required, however, for us not to ask too many such questions—and not to allow ourselves to partake of too many details of the answers given to the questions we do ask—lest we give the untrustworthy oracle opportunities to work on our psychology (by means of plausible-seeming but subtly manipulative messages). It might not take many bits of communication for an AI with the social manipulation superpower to bend us to its will.</p></blockquote>
<p>Indeed, I think it is clear that this is already happening. While I don't ascribe malice (or any other motivation) to the AIs, it is clear that their makers have a bias towards obsequiousness.</p>
<p>Other predictions are perhaps a little wide of the mark:</p>
<blockquote><p>if somebody were to succeed in creating an AI that could understand natural language as well as a human adult, they would in all likelihood also either already have succeeded in creating an AI that could do everything else that human intelligence can do, or they would be but a very short step from such a general capability.</p></blockquote>
<p>We're a few years in to the LLM revolution and, while we can quibble about what "understand" means, it's clear that natural language can now mostly be interpreted by computers. But that doesn't seem to have made the leap to <em>general</em> intelligence, nor the acceleration of art and science.</p>
<p>Others are hopeful but possibly a bit naïve:</p>
<blockquote><p>A future superintelligence occupies an epistemically superior vantage point: its beliefs are (probably, on most topics) more likely than ours to be true. We should therefore defer to the superintelligence’s opinion whenever feasible.</p></blockquote>
<p>Yes, there probably are modern concepts which have more in common with "phlogiston" than reality. But if a scientist were to time-travel back to the early 1700s, how easy would it be for them to disprove the theory? Perhaps AI ought to exist in the "trust but verify" space?</p>
<p>It is slightly over-footnoted, with no distinction between citation and diverting passage. There's also a tendency to go off in fanciful directions - the stuff on genetically enhancing humans goes on a bit too long for my tastes. Similarly, the philosophy of maximising happiness by emulating brains and virtually doping them seemed unconvincing.</p>
<p>That said, some of the thought experiments are both fun and profound - the seminal "Paperclip Maximiser" was introduced in this book.</p>
<p>There are some downsides. An over-reliance on specific individuals like Eliezer Yudkowsky crowds out some of the other important thinkers.</p>
<p>One of the suggestions made has already fallen:</p>
<blockquote><p>One valuable asset would be a donor network comprising individuals devoted to rational philanthropy, informed about existential risk, and discerning about the means of mitigation. It is especially desirable that the early-day funders be astute and altruistic, because they may have opportunities to shape the field’s culture before the usual venal interests take up position and entrench.</p></blockquote>
<p>The "Effective Altruism" movement is now hopelessly compromised and seemingly in tatters. Similarly, the cult of rationalism has taken an unfortunate turn to the bizarre and dangerous.</p>
<p>Nevertheless, it's hard to argue with the philosophy. Whether or not "superintelligence" is ever achieved, we should have systems in place <em>now</em> to protect us. It's the same as any other technology - the time to set up nuclear non-proliferation agreements and the systems to monitor them was <em>before</em> we invented them.</p>
Simplifying MBA obfuscation with CoBRA - Trail of Bits Bloghttps://blog.trailofbits.com/2026/04/03/simplifying-mba-obfuscation-with-cobra/2026-04-03T11:00:00.000Z<p>Mixed Boolean-Arithmetic (MBA) obfuscation disguises simple operations like <code>x + y</code> behind tangles of arithmetic and bitwise operators. Malware authors and software protectors rely on it because no standard simplification technique covers both domains simultaneously; algebraic simplifiers don’t understand bitwise logic, and Boolean minimizers can’t handle arithmetic.</p>
<p>We’re releasing <a href="https://github.com/trailofbits/CoBRA">CoBRA</a>, an open-source tool that simplifies the full range of MBA expressions used in the wild. Point it at an obfuscated expression and it recovers a simplified equivalent:</p>
<p><code>$ cobra-cli --mba "(x&y)+(x|y)"</code><br>
<code>x + y</code></p>
<p><code>$ cobra-cli --mba "((a^b)|(a^c)) + 65469 * ~((a&(b&c))) + 65470 * (a&(b&c))" --bitwidth 16</code><br>
<code>67 + (a | b | c)</code></p>
<p>CoBRA simplifies 99.86% of the 73,000+ expressions drawn from seven independent datasets. It ships as a CLI tool, a C++ library, and an LLVM pass plugin. If you’ve hit MBA obfuscation during malware analysis, reversing software protection schemes, or tearing apart VM-based obfuscators, CoBRA gives you readable expressions back.</p>
<h2 id="why-existing-approaches-fall-short">Why existing approaches fall short</h2>
<p>The core difficulty is that verifying MBA identities requires reasoning about how bits and arithmetic interact under modular wrapping, where values silently overflow and wrap around at fixed bit-widths. An identity like <code>(x ^ y) + 2 * (x & y) == x + y</code> is true precisely because of this interaction, but algebraic simplifiers only see the arithmetic and Boolean minimizers only see the logic; neither can verify it alone. Obfuscators layer these substitutions to build arbitrarily complex expressions from simpler operations.</p>
<p>Previous MBA simplifiers have tackled parts of this problem. <a href="https://github.com/DenuvoSoftwareSolutions/SiMBA">SiMBA</a> handles linear expressions well. <a href="https://github.com/DenuvoSoftwareSolutions/GAMBA">GAMBA</a> extends support to polynomial cases. Until CoBRA, no single tool achieved high success rates across the full range of MBA expression types that security engineers encounter in the wild.</p>
<h2 id="how-cobra-works">How CoBRA works</h2>
<p>CoBRA uses a worklist-based orchestrator that classifies each input expression and selects the right combination of simplification techniques. The orchestrator manages 36 discrete passes organized across four families—linear, semilinear, polynomial, and mixed—and routes work items based on the expression’s structure.</p>
<p>Most MBA expressions in the wild are <strong>linear</strong>: sums of bitwise terms like <code>(x & y)</code>, <code>(x | y)</code>, and <code>~x</code>, each multiplied by a constant. For these, the orchestrator evaluates the expression on all Boolean inputs to produce a signature, then races multiple recovery techniques against each other and picks the cheapest verified result. Here’s what that looks like for <code>(x ^ y) + 2 * (x & y)</code>:</p>
<table>
<thead>
<tr><th colspan="3" align="center">CoBRA linear simplification flow: (x ^ y) + 2 * (x & y)</th></tr>
</thead>
<tbody>
<tr><td colspan="3" align="center"><em>Step 1: Classification</em><br>Input expression is identified as <strong>Linear MBA</strong></td></tr>
<tr><td colspan="3" align="center">↓</td></tr>
<tr><td colspan="3" align="center"><em>Step 2: Truth Table Generation</em><br>Evaluate on all boolean inputs → <code>[0, 1, 1, 2] truth table</code></td></tr>
<tr><td colspan="3" align="center">↓</td></tr>
<tr>
<td align="center"><em>Step 3a: Pattern Match</em><br>Scan identity database</td>
<td align="center"><em>Step 3b: ANF Conversion</em><br>Bitwise normal form</td>
<td align="center"><em>Step 3c: Interpolation</em><br>Solve basis coefficients</td>
</tr>
<tr><td colspan="3" align="center">↓</td></tr>
<tr><td colspan="3" align="center"><em>Step 4: Competition</em><br>Compare candidate results → <strong>Winner: x + y</strong> (Lowest Cost)</td></tr>
<tr><td colspan="3" align="center">↓</td></tr>
<tr><td colspan="3" align="center"><em>Step 5: Verification</em><br>Spot-check against random 64-bit inputs or prove with Z3 → <strong>Pass</strong></td></tr>
</tbody>
</table>
<p>When constant masks appear (like <code>x & 0xFF</code>), the expression enters CoBRA’s <strong>semi-linear</strong> pipeline, which breaks it down into its smallest bitwise building blocks, recovers structural patterns, and reconstructs a simplified result through bit-partitioned assembly. For expressions involving products of bitwise subexpressions (like <code>(x & y) * (x | y)</code>), a decomposition engine extracts <strong>polynomial</strong> cores and solves residuals.</p>
<p><strong>Mixed</strong> expressions that combine products with bitwise operations often contain repeated subexpressions. A lifting pass replaces these with temporary variables, simplifying the inner pieces first, then solving the expression that connects them. Here’s what that looks like for a product identity <code>(x & y) * (x | y) + (x & ~y) * (~x & y)</code>:</p>
<table>
<thead>
<tr><th colspan="2" align="center">CoBRA mixed simplification flow: (x & y) * (x | y) + (x & ~y) * (~x & y)</th></tr>
</thead>
<tbody>
<tr><td colspan="2" align="center"><em>Step 1: Classification</em><br>Input is identified as <strong>Mixed MBA</strong></td></tr>
<tr><td colspan="2" align="center">↓</td></tr>
<tr><td colspan="2" align="center"><em>Step 2: Decompose</em><br>Decompose into subexpressions<br>↓</td></tr>
<tr>
<td align="center">(x & y) * (x | y)</td>
<td align="center">(x & ~y) * (~x & y)</td>
</tr>
<tr>
<td align="center">↓</td>
<td align="center">↓</td>
</tr>
<tr><td colspan="2" align="center"><em>Step 3: Lift & Solve</em><br>Lift products, solve inner pieces</td></tr>
<tr><td colspan="2" align="center">↓</td></tr>
<tr><td colspan="2" align="center"><em>Step 4: Collapse Identity</em><br>Collapse product identity → <strong>x * y</strong></td></tr>
<tr><td colspan="2" align="center">↓</td></tr>
<tr><td colspan="2" align="center"><em>Step 5: Verification</em><br>Spot-check against random 64-bit inputs or prove with Z3 → <strong>Pass</strong></td></tr>
</tbody>
</table>
<p>Regardless of which pipeline an expression passes through, the final step is the same: CoBRA verifies every result against random inputs or proves equivalence with Z3. No simplification is returned unless it is confirmed correct.</p>
<h2 id="what-you-can-do-with-it">What you can do with it</h2>
<p>CoBRA runs in three modes:</p>
<ul>
<li><strong>CLI tool</strong>: Pass an expression directly and get the simplified form back. Use <code>--bitwidth</code> to set modular arithmetic width (1 to 64 bits) and <code>--verify</code> for Z3 equivalence proofs.</li>
<li><strong>C++ library</strong>: Link against CoBRA’s core library to integrate simplification into your own tools. If you’re building an automated analysis pipeline, the <code>Simplify</code> API takes an expression and returns a simplified result or reports it as unsupported.</li>
<li><strong>LLVM pass plugin</strong>: Load <code>libCobraPass.so</code> into <code>opt</code> to deobfuscate MBA patterns directly in LLVM IR. If you’re building deobfuscation pipelines on top of tools like <a href="https://github.com/lifting-bits/remill">Remill</a>, this integrates directly as a pass. It handles patterns spanning multiple basic blocks and applies a cost gate, only replacing instructions when the simplified form is smaller, and supports LLVM 19 through 22.</li>
</ul>
<h2 id="validated-against-seven-independent-datasets">Validated against seven independent datasets</h2>
<p>We tested CoBRA against 73,066 expressions from <a href="https://github.com/DenuvoSoftwareSolutions/SiMBA">SiMBA</a>, <a href="https://github.com/DenuvoSoftwareSolutions/GAMBA">GAMBA</a>, <a href="https://github.com/fvrmatteo/oracle-synthesis-meets-equality-saturation">OSES</a>, and four other independent sources. These cover the full spectrum of MBA complexity, from two-variable linear expressions to deeply nested mixed-product obfuscations.</p>
<table>
<thead>
<tr>
<th style="text-align: left">Category</th>
<th style="text-align: left">Expressions</th>
<th style="text-align: left">Simplified</th>
<th style="text-align: left">Rate</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left">Linear</td>
<td style="text-align: left">~55,000</td>
<td style="text-align: left">~55,000</td>
<td style="text-align: left">~100%</td>
</tr>
<tr>
<td style="text-align: left">Semilinear</td>
<td style="text-align: left">~1,000</td>
<td style="text-align: left">~1,000</td>
<td style="text-align: left">~100%</td>
</tr>
<tr>
<td style="text-align: left">Polynomial</td>
<td style="text-align: left">~5,000</td>
<td style="text-align: left">~4,950</td>
<td style="text-align: left">~99%</td>
</tr>
<tr>
<td style="text-align: left">Mixed</td>
<td style="text-align: left">~9,000</td>
<td style="text-align: left">~8,900</td>
<td style="text-align: left">~99%</td>
</tr>
<tr>
<td style="text-align: left"><strong>Total</strong></td>
<td style="text-align: left"><strong>73,066</strong></td>
<td style="text-align: left"><strong>72,960</strong></td>
<td style="text-align: left"><strong>99.86%</strong></td>
</tr>
</tbody>
</table>
<p>The 106 unsupported expressions are carry-sensitive mixed-domain cases where bitwise and arithmetic operations interact in ways that current techniques can’t decompose. CoBRA reports these as unsupported rather than guessing wrong. The full benchmark breakdown is in <a href="https://github.com/trailofbits/CoBRA/blob/master/DATASETS.md">DATASETS.md</a>.</p>
<h2 id="whats-next">What’s next</h2>
<p>CoBRA’s remaining failures fall into two categories: expressions with heavy subexpression duplication that exhaust the worklist budget even with lifting, and carry-sensitive residuals where bitwise masks over arithmetic products create bit-level dependencies that no current decomposition technique can recover. We’re also exploring broader integration options beyond just an LLVM pass, like native plugins for IDA Pro and Binary Ninja.</p>
<p>The source is available on GitHub under the Apache 2.0 license. If you run into expressions CoBRA can’t simplify, please open an issue on the repository. We want the hard problems.</p>The "Passive Income" trap ate a generation of entrepreneurs - Westenberg69cf5a54b19a140001e3340f2026-04-03T06:25:28.000Z<img src="https://images.unsplash.com/photo-1604689598793-b8bf1dc445a1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEwfHxwYXNzaXZlJTIwaW5jb21lfGVufDB8fHx8MTc3NTE5NzEzNHww&ixlib=rb-4.1.0&q=80&w=2000" alt="The "Passive Income" trap ate a generation of entrepreneurs"><p>I had coffee last year with a guy - I won't use his real name - who told me he was "building a business." I asked what it did. Dropshipping jade face rollers.</p><p>I made him say it twice.</p><p>Jade face rollers.</p><p>He'd found them on Alibaba for $1.20 each, and started selling them through Shopify for $29.99. Never used one himself. Didn't really know what they were for - something about lymphatic drainage? Reducing puffiness? He said "lymphatic" the way you say a word you've only ever read and never heard out loud.</p><p>Some guy on YouTube said jade rollers were "trending," the margins looked insane on paper, so he'd "built" a website with stock photos of a dewy-skinned woman rolling a green rock across her cheekbone and started running Facebook ads at $50 a day. Customers would email asking where their stuff was - shipping from Guangzhou, three to six weeks, sometimes way longer - and he'd copy-paste a response he found on a dropshipping subreddit. He had a Google Doc full of pre-written customer service replies.</p><p>Never talked to a single customer.</p><p>I swear to god.</p><p>Five months in, he was $800 in the hole.</p><p>He told me all this like he'd invented the wheel. </p><p>I bought him another coffee. I genuinely had no idea what else to do.</p><p>Jade Roller Guy has become my go-to example of something that went drastically, terribly wrong with how a whole generation of would-be entrepreneurs thought about work and money. A specific ideology - I've been calling it Passive Income Brain - grabbed a huge chunk of the people who were, by temperament and ability, most likely to start real businesses, and it gave them a completely fucked set of priorities.</p><p>Somewhere between 2015 and 2022, "passive income" stopped being a boring financial planning term and became, I don't know how else to put this, a salvation narrative. I mean that literally. There was an eschatology if you want to get nerdy about it. The Rapture was the day your "passive income" exceeded your monthly expenses and you could quit your job forever. People talked about it with that exact energy.</p><p>But, of course, the folks making any actual income, of any kind, were the ones selling courses about making passive income. It was an ouroboros. It was an ouroboros that had incorporated in Delaware and was running Facebook ads.</p><p>The pitch went something like: you, a sucker, currently trade your time for money. This is what employees do, and employees are suckers. (I'm paraphrasing, but not by much.) Smart people build SYSTEMS. A system is anything that generates revenue without your ongoing involvement. Write an ebook. Build a dropshipping store. Create an online course. Set up affiliate websites.</p><p>The specific vehicle doesn't matter because the important thing isn't what you build, it's the structure. You want a machine that generates cash while you sleep, and once you have that machine, you are free.</p><p>Free to do what? Sit on a beach, apparently. Every single one of these people wanted to sit on a beach. I've never understood this. Have they been to a beach? There's sand. It gets everywhere. You can sit there for maybe three hours before you want to do literally anything else.</p><figure class="kg-card kg-image-card"><img src="https://media.tenor.com/2oGv7kzJnOkAAAAC/anakin-star.gif" class="kg-image" alt="The "Passive Income" trap ate a generation of entrepreneurs" loading="lazy" width="244" height="244"></figure><p>But I digress.</p><p>The allure is real. Who doesn't want money that shows up while you sleep?</p><p>I'd fucking love that. I'd love it very much indeed. But "passive income" as an organizing philosophy for your entire business life, for how you think about work, is almost perfectly designed to produce garbage.</p><p>When you make "passivity" the thing you're optimizing for, you stop caring about anything a customer might actually want. Caring is active. Caring takes time. Caring is work.</p><p>Giving a shit is, by definition, not passive.</p><p>Between 2019 and 2021, roughly 700,000 new Shopify stores opened. The platform went from about a million merchants to 1.7 million in two years. About 90% of those stores failed within their first year. That's not a business model. That's a meat grinder with a landing page.</p><p>We started drowning in a million businesses nobody was actually running. Dropshipping stores with six-week shipping times and customer service that was just copy-pasted templates. Guys who'd put their "brand name" - usually something like ZENITHPRO or AXELVIBE, always in all caps, always vaguely aggressive - on a garlic press identical to four hundred other garlic presses on the same Amazon page. AXELVIBE! For a garlic press!</p><p>And the affiliate blogs! Hundreds of thousands of them, pumped full of SEO-optimized reviews of products the authors had never touched, never even seen in person. A fractal of bullshit that technically qualifies as commerce but puts zero dollars of actual value into the world.</p><p>Leverage is real; I'm not disputing that. There is a difference between trading hours for dollars and building something that scales. Software does this. Publishing does this. You write a book once, sell it many times, nobody calls that a scam. Fine! That part they got right!</p><p>Where it went wrong is that the whole movement confused "build a good product that scales" with "build any mechanism that extracts money without you being involved." I don't think that confusion was accidental. I think the confusion was the point. Because if you're teaching people to build real businesses, you have to sit with hard, boring questions about whether anyone actually wants what you're selling. But if you're teaching people to build "passive income streams" you can skip all of that and go straight to the fun tactical shit. How to run Facebook ads, how to set up a Shopify store in a weekend, how to write email sequences that manipulate people into buying things they don't need.</p><p>Nobody talks enough about what the passive income movement did to the content quality of the entire internet. If you've tried to google "best [anything]" in the last five years and gotten a wall of nearly identical listicles, all with the same structure ("We tested 47 blenders so you don't have to!"), all making the same recommendations, all linking to the same Amazon products, you've experienced the results.</p><p>Those articles weren't written by people who cared whether you bought a good blender. They were written by people who cared whether you clicked their affiliate link, because that's what generated passive income, and the incentives made honesty actively counterproductive.</p><p>The honest review of blenders is: "most blenders are fine, just get whatever's on sale, the differences below $100 are basically meaningless." That review generates zero affiliate revenue. So nobody wrote it.</p><p>Instead you got "The Vitamix A3500 is our #1 pick!" with a nice affiliate link, written by someone who has never blended anything in their life. Multiply this across every product category and you start to understand the informational desert we've been living in. We broke Google results, at least partly, because an army of passive income seekers had an incentive to flood the internet with plausible-sounding garbage.</p><p>(Someone is going to object that Google should have filtered this stuff out, and yes, sure, but also, "the people creating the pollution aren't at fault because the EPA should have caught it" has never been a great argument.)</p><p>I've met dozens of smart, capable people who had actual energy, and who spent their entire twenties bouncing between passive income schemes instead of building real skills // real businesses // real careers. The pattern was always the same: six months on a dropshipping store, it fails, pivot to Amazon FBA, that fails, pivot to creating a course about dropshipping (because of course), and then the course doesn't sell either because by 2021 there were approximately forty thousand courses about dropshipping and the market had been saturated since before they started.</p><p>And the whole time they were getting further and further from the thing that actually creates economic value, which is: find a real problem, solve it for real people, care enough to stick around and keep improving. The boring thing. The thing that takes years. The thing that is, to be absolutely clear about this, not passive.</p><p>I once saw a guy ask whether he should start a dog walking business and the top response was something like "dog walking isn't scalable, you should build a dog walking platform instead." This person liked dogs! He liked walking! He lived in a neighborhood full of busy professionals with dogs!</p><p>But the Passive Income Brain thing had gotten so deep into how people talked about business online that "do the simple obvious thing that works for you" was considered naive, and "build a technology platform for an activity you've never actually done as a business" was considered smart.</p><p>The dog walking guy could have been profitable in a week.</p><p>The app guy would have burned through his savings in six months and ended up with a landing page and no users.</p><p>By 2020 the passive income world was absolutely crawling with grift: guys posing with rented Lamborghinis in YouTube thumbnails, "digital nomads" whose actual income came entirely from selling the dream of being a digital nomad to other aspiring digital nomads, podcast hosts interviewing each other in an endless circle of mutual promotion where everyone claimed to make $30K/month and nobody could explain what they actually produced. By 2021 or so it started to look like a distributed, socially acceptable MLM. The product was the dream of not working. The customers were people desperate enough to pay for it.</p><p>Not everyone in this world was cynical. I genuinely believe that. A lot of the people selling passive income content believed their own pitch. They'd had some real success with a niche site - pulled $3,000/month for a while, it does happen - read the same books everyone else read, figured okay, I'll teach other people my system. Why not. I would have done the same thing at 24. I'm almost sure of it.</p><p>But zoom out and what you had was just an enormous machine converting human ambition into noise. Affiliate spam // dropshipped junk // ebooks about passive income // courses about courses. An entire layer of the internet that was nothing but confident-sounding bullshit produced by people who had optimized for everything except making something worth buying.</p><p>The people near the top made money. Everyone else spent months or years chasing a mirage and came out with nothing but a Shopify subscription they forgot to cancel. They thought they'd failed. They hadn't failed. The system, every system, failed them.</p><p>What actually makes money hasn't changed. You find something people need. You get good at providing it. You charge a fair price and you keep showing up even when it's tedious and even when you don't want to. You build relationships over years. You build reputation over years. None of it is passive, and none of it has ever been passive! All of it revolves around giving a shit, day after day, about something specific. I don't think anyone has ever found a way around that and I don't think anyone will.</p><p>The passive income thing was a fantasy about not having to give a shit.</p><p>This is a terrible foundation for pretty much anything.</p><p>The affiliate SEO blogs are being slaughtered right now by AI-generated content. The people who spent years producing algorithmically optimized content of no value to humans are getting outcompeted by software that does the exact same thing, faster and cheaper. Facebook ad costs went through the roof and took the dropshipping gold rush with them. The biggest passive income gurus have already pivoted to selling AI courses. The machine keeps running. It just swaps out the brochure.</p><p>But I've noticed more people talking about what I'd call "give a shit" businesses - people who make furniture, run plumbing companies, write software they actually use themselves. Stuff where the answer to "why does your business exist?" isn't "to generate passive income for me." This works a lot better than the laptop-on-the-beach grind.</p><p>Jade Roller Guy, if you're out there: I hope you found something real.</p><p>I hope it keeps you busy.</p>
<div class="kg-card kg-cta-card kg-cta-bg-grey kg-cta-minimal " data-layout="minimal">
<div class="kg-cta-sponsor-label-wrapper">
<div class="kg-cta-sponsor-label">
<span style="white-space: pre-wrap;">SPONSORED</span>
</div>
</div>
<div class="kg-cta-content">
<div class="kg-cta-content-inner">
<div class="kg-cta-text">
<p><span style="white-space: pre-wrap;">Westenberg is designed, built and funded by my solo-powered agency, Studio Self. Reach out and work with me:</span></p>
</div>
<a href="https://www.thisisstudioself.com/?ref=joanwestenberg.com" class="kg-cta-button " style="background-color: #000000; color: #ffffff;">
Work with me
</a>
</div>
</div>
</div>
The open web isn't dying. We're killing it - Werd I/O69cf1eb9fc66990001f399fc2026-04-03T01:58:17.000Z<p>[<a href="https://ouvre-boite.com/the-open-web-isnt-dying-were-killing-it/?ref=werd.io">Julien Genestoux</a>]</p><p>Julien is right:</p><blockquote>“Why did we keep outsourcing identity, distribution, and monetization to companies whose incentives were obviously misaligned with ours?<br><br>[…] It is because, collectively, we preferred the short-term consumer surplus of convenience over the long-term responsibilities of stewardship.”</blockquote><p>We can raise the alarm about the demise of the open web all we want, but you can’t sell or promote a technology based on ideology alone. The truth is that other solutions were quicker and easier — even for many of us that held up the open web banner.</p><p>Julien’s proposal is that we should think of ourselves as netizens rather than just consumers. I actually think that this is driving a lot of the innovation in the ATproto ecosystem in particular, but also on the Fediverse. People in those spaces have intentionally moved somewhere new where they <em>can</em> have a credible exit, <em>can</em> export their data cleanly, and <em>can</em> feel like they’re having safer, more productive, less fascistic conversations.</p><p>But the money piece isn’t there. The running joke is that the Fediverse <em>hates</em> money — conversations about revenue or capitalism are very often shut down early, and people who try to fundraise are often criticized — but it’s also been an ongoing issue in ATproto land too. If people are going to build good things, they need to be able to eat and pay rent so they can keep doing it. I’d argue that, yes, you do need netizens, and I’m very excited to see a resurgence in this kind of movement across the open social web in particular. We need <em>more</em> netizens, and the more there are, the more likely it is that people will pay for the right kind of services.</p><p>I work for <a href="https://propublica.org/?ref=werd.io">a newsroom</a> that people often donate to out of a sense of catharsis — a gratitude that something is being done in a world where they feel powerless. I think there’s something to learn from here too. In the past, I’ve argued that highly ideological tech spaces need more product thinking so that we can more sharply identify valuable solutions to people’s problems, and there’s still truth in that — but I've learned that sometimes the product value is agency in the face of powerlessness rather than a set of features. There may well be value in <em>leaning right in</em> to the anti big tech angle on the open web. What might it look like to put people’s distrust of X, Google, Microsoft, <em>et al</em> front and center, and put a fundraising banner up <a href="https://en.wikipedia.org/wiki/Wikipedia:Fundraising/2025_banners?ref=werd.io">like Wikipedia does</a>?</p><p>I think we can take Julien’s point about netizens and connect it directly to the idea of <em>citizens</em>. People see what’s going on in the world and know that tech companies are intertwined with it. Some of them — not most of them, but a reasonable number — may want to do something about that. Not because they believe in an open web as such, or even know what that is, but because they believe in an open society. Using this kind of messaging would be overtly political in a way that tech is sometimes afraid to be, but we’ve seen similar messaging create interest in funding alternatives to US big tech in Europe, for example (and result in actual funding). I think the interest is there to move away from the tech powers-that-be globally, but engaged citizens don't always know what to concretely do about it. We can bring our message to them.</p><p>We need more netizens and citizens both, and we should be talking about this more. Rather than de-emphasizing the ideology of the open web in favor of more proximate product value, which is a thing I’ve sometimes argued for in the past, we should accept that it is a work of engaged citizenry that verges on activism. Embracing that could find us aligned people outside of our existing development circles who might be interested in broadening our impact. I’d like to see us try.</p><p>[<a href="https://ouvre-boite.com/the-open-web-isnt-dying-were-killing-it/?ref=werd.io">Link</a>]</p>An AI company set out to fix news deserts. Instead, it copied local journalists’ work - Werd I/O69cf174efc66990001f399f02026-04-03T01:26:38.000Z<p>[<a href="https://www.poynter.org/ethics-trust/2026/nota-news-local-outlets-ai-plagiarism/?ref=werd.io">Angela Fu in Poynter</a>]</p><p>Repeat after me: AI cannot write journalism and should never be used in place of a journalist. I believe it can be a very useful tool — but it is a tool for humans.</p><p>So this whole initiative was misconceived:</p><blockquote>“Artificial intelligence company Nota — whose clients include organizations like The Boston Globe and the Institute for Nonprofit News — is scrapping its network of local news sites after learning that they contained dozens of instances of plagiarism. […] The 11 sites — collectively called Nota News — launched in September as an effort to bring “bilingual local reporting and civic tools to underserved communities.””</blockquote><p>The deal here was that the company would identify news deserts: places that were unserved or underserved by real newsrooms. And then it would try to serve those areas with content created by an LLM-based system.</p><p>This was inevitably going to plagiarize existing journalism, because what other source could it possibly use? An agentic system can’t do the on-the-ground research and reporting work involved in creating a story. It <em>can</em> gather together data points and turn them into something that looks like news, rather than journalism: sports scores, city council votes, and that kind of thing. But it can’t provide context if someone hasn’t already written it.</p><p>As <a href="https://www.poynter.org/ethics-trust/2026/nota-news-local-outlets-ai-plagiarism/?ref=werd.io">the linked Poynter article</a> points out:</p><blockquote>“The articles were supposed to be based on publicly available civic information, such as press releases and videos of city council meetings. In reality, Poynter found more than 70 stories dating back to October that included reporting, writing and photography from local journalists without attribution.”</blockquote><p>Someone <em>had</em> already written it: human journalists whose work was subsequently incorporated without attribution. The eleven human editors who used the LLM tools to generate content apparently didn’t realize that this work had been drawn into the mix. Again: that was inevitably going to happen as the stories began to not just say what had happened but explain <em>why</em>.</p><p>The AI hype cycle has created a bunch of really regrettable case studies that other organizations should learn from. This is one. There are more like it, where good intentions lead to accidental plagiarism (or hallucinations). There are plenty of stories where organizations have prematurely let people go because they incorrectly think they can replace human initiative with software. And all of them come down to believing a science fiction version of what this technology does instead of the actual reality of it.</p><p>That’s understandable: the reality is shifting quickly, and the marketing machine is incredibly strong. But everyone needs to take a breath with AI and get themselves to a more nuanced understanding of what it is — and isn’t.</p><p>[<a href="https://www.poynter.org/ethics-trust/2026/nota-news-local-outlets-ai-plagiarism/?ref=werd.io">Link</a>]</p>LinkedIn Is Illegally Searching Your Computer - Werd I/O69cf13affc66990001f399ea2026-04-03T01:11:11.000Z<p>[<a href="https://browsergate.eu/?ref=werd.io">BrowserGate by Fairlinked</a>]</p><p>This is quite a serious accusation:</p><blockquote>“Every time any of LinkedIn’s one billion users visits linkedin.com, hidden code searches their computer for installed software, collects the results, and transmits them to LinkedIn’s servers and to third-party companies including an American-Israeli cybersecurity firm.”</blockquote><p>This is an EU-based site, hence the reference to the location of the cybersecurity firm. The authors are quick to point out that they believe this scanning is illegal in the EU.</p><p>The claim is also partially a little bit hyperbolic. “Installed software” makes it sound like LinkedIn is scanning your whole computer; in reality, it’s checking for browser extensions. That’s a fairly common component of modern browser fingerprinting; at this point it’s fairly well-known that, because of the individual mix of extensions, fonts, etc available to a browser, this can be used to track individuals on the web without using cookies. That’s not to say that it’s not invasive — it clearly is!</p><p>Browser extensions can cover a ton of identifying activity: they can reveal a person’s religion, sexuality, interests, political orientation, and so on. The implication is that this is specifically bad here because LinkedIn knows the identity of its logged-in users; as a result, this is information it could use to hydrate profiles of the specific, known individuals who use its site for unknown purposes. It’s a little over the top to call this espionage, as the linked site here does, but it’s an abuse of trust that is certainly worth calling out.</p><p>I was mostly interested in how this works; if LinkedIn is doing it, then others surely are too. <a href="https://browsergate.eu/how-it-works/?ref=werd.io">The answer seems to be a set of JS calls that work in most Chromium-based browsers</a> (Chrome, Edge, Arc, Dia, etc). They’re checking for over six thousand extensions that they know and care about, which all have specific “tells” that a website can check for. And then they check to see if the page has been modified by anything to catch any that weren’t on their list. They also check, cheekily, to see if you have “Do Not Track” switched on, but track you regardless (it’s just another part of the fingerprint to them). Finally, they’re gathering everything from your screen size and CPU type to your battery level.</p><p>This all does double duty: the resulting fingerprint is so detailed that they can track you and notice when you’re using a different computer or have changed your settings, but can also be used to profile you for profit.</p><p>The quickest solution is to use Firefox, which blocks these kinds of fingerprinting attacks. <a href="https://zen-browser.app/?ref=werd.io">Zen Browser</a>, which is based on the Firefox core, is my day-to-day browser, and <a href="https://werd.io/why-im-all-in-on-zen-browser/">I love it</a>. But Chromium-based browsers need to do more to stop fingerprinting, and jurisdictions like the EU need to ban the practice outright.</p><p>[<a href="https://browsergate.eu/?ref=werd.io">Link</a>]</p>Surf demonstrates the power of the open social web - Werd I/O69cec32ddba908000195cde72026-04-02T19:32:28.000Z<img src="https://werd.io/content/images/2026/04/surf.webp" alt="Surf demonstrates the power of the open social web"><p>My friends at <a href="https://flipboard.com/?ref=werd.io">Flipboard</a> launched <a href="https://surf.social/?ref=werd.io">Surf</a>, its open social web browser, on the web today.</p><p>I’ve been using Surf for a while. It’s a kind of browser for the open social web: a way to bring together all of your social feeds (Bluesky, Mastodon, RSS, YouTube) in one place and read them together. You can get an all-in-one feed, but anyone can create a curated feed for a specific topic.</p><p>For example, <a href="https://speakingtruthtopower.surf.social/?ref=werd.io">here’s my Speaking Truth to Power feed</a>, which I’ve curated to highlight reporting shared by non-profit newsrooms covering the US. I also have a companion <a href="https://technews.surf.social/?ref=werd.io">Speaking Truth to Tech Power</a> feed, which specifically highlights tech stories that go a little bit deeper and explore the power dynamics technology can enforce.</p><p>For media companies, it’s even more interesting. <a href="https://decoder.surf.social/?ref=werd.io">The feed for Decoder</a>, the podcast from The Verge, lets you listen to every Decoder episode. But if you click through to the other tabs, you’ll also find posts from sources and topics that the Verge thinks are interesting, and any discussion about the show that uses the #decoder hashtag. You can also click to see the sources that the Verge used to make the feed, which allows you to remix and make your own.</p><p>Beyond <a href="https://decoder.surf.social/?ref=werd.io">Decoder</a> and <a href="https://verge.surf.social/?ref=werd.io">The Verge</a>, there are a whole host of other publications already creating feeds in Surf. I’m aware of (deep breath): <a href="https://wired.surf.social/?ref=werd.io">WIRED</a>, <a href="https://rollingstonepolitics.surf.social/?ref=werd.io">Rolling Stone Politics</a>, <a href="https://404media.surf.social/?ref=werd.io">404 Media</a>, <a href="https://shutdownfullcast.surf.social/feed/surf%2Fcustom%2F01k319zkysbwq9=vpzbhtnahsgc?ref=werd.io">Shutdown Fullcast</a>, <a href="https://themmqb.surf.social/?ref=werd.io">The MMQB</a>, <a href="https://defectorsports.surf.social/feed/surf%2Fcustom%2F01k7sk3ybz6kstqw=6m0rx70v0z?ref=werd.io">Defector: Sports!</a>, <a href="https://allnet.surf.social/?ref=werd.io">All Net</a>, <a href="https://filmfeed.surf.social/?ref=werd.io">FilmFeed</a>, and <a href="https://oregonian.surf.social/?ref=werd.io">The Oregonian</a>, but more will follow. These are media properties that have chosen to create their own feeds with Surf, but it’s important to understand that they’ve also made the conscious choice to join the open social web.</p><p>This kind of functionality is only possible on an open social web: a place where all content can be brought together using open protocols to create new kinds of community experiences. It’s genuinely exciting to me. Surf is a first-class consumer web service, but it’s also one of the first to show what the unique value of the open social web can truly be for publishers. Any publication can now showcase its own posts across platforms together, with the social proof of conversation from other people who are talking about its work, together with media from other, relevant companies. And they can do it without asking anyone for permission.</p><p>And this openness goes both ways. As well as content from the open social web flowing into Surf, feeds made with Surf integrate with Bluesky, so you can follow the curated posts there, too. For example, here’s <a href="https://bsky.app/profile/did:plc:77tdak46psveqneyegsdyc7l/feed/speaking-trut?ref=werd.io">Speaking Truth to Power</a> and <a href="https://bsky.app/profile/did:plc:77tdak46psveqneyegsdyc7l/feed/speakingtruth?ref=werd.io">its tech equivalent</a> over there. This openness also demonstrates that publishers aren’t locked into Surf itself, and you can easily imagine more developers integrating with these feeds and creating other interesting experiences around them.</p><p>In short, I think this is great: a tool that shows (not tells) what the open social web makes possible, creates new value for publishers in the process, and does it through a first-class experience. More like this, please.</p><p><a href="https://surf.social/?ref=werd.io">You can sign up for Surf at surf.social</a>.</p>Note published on April 2, 2026 at 5:41 PM UTC - Molly White's activity feed69ceaa37dac7d0a8c7e78d182026-04-02T17:41:11.000Z<article><div class="entry h-entry hentry"><header></header><div class="content e-content"><p>One of the government's attorneys in the CFTC's lawsuit against the states who've sued Kalshi was a lawyer for Kalshi in its lawsuit against the CFTC in 2023. He joined the DOJ in February 2025.</p><div class="media-wrapper"><a href="https://storage.mollywhite.net/micro/14b3a2b31e1f71bc04a3_Screenshot-2026-04-02-at-1.36.59---PM.png" data-fslightbox=60a8566c4bdab8b74f7f><img src="https://storage.mollywhite.net/micro/14b3a2b31e1f71bc04a3_Screenshot-2026-04-02-at-1.36.59---PM.png" alt="Dated: April 2, 2026 By: /s/ Alexandra McTague Alexandra McTague Senior Litigation Counsel U.S. Department of Justice Civil Division Enforcement & Affirmative Litigation Branch 450 5th Street, NW, Suite 6400-South Washington, D.C. 20530 Tel. 202-718-0483 Alexandra.mctague2@usdoj.gov Attorneys for the United States of America BRETT A. SHUMATE Assistant Attorney General Civil Division YAAKOV M. ROTH Principal Deputy Assistant Attorney General TIBERIUS DAVIS Counsel to the Assistant Attorney General Attorneys for the Commodity Futures Trading Commission Tyler S. Badgley General Counsel M. Jordan Minot Deputy General Counsel Anne Stukes Senior Assistant General Counsel Carlin Metzger (Ill. ARDC No. 6275516) Assistant General Counsel U.S. Commodity Futures Trading Commission Ralph Metcalfe Federal Building 77 W. Jackson, Suite 800 Chicago, IL 60604 Tel: (202) 209-1087 Fax: (202) 418-5567 tbadgley@cftc.gov jminot@cftc.gov astukes@cftc.gov" /></a></div><div class="media-wrapper"><a href="https://storage.mollywhite.net/micro/7acde80b275679fdc7cd_Screenshot-2026-04-02-at-1.37.11---PM.png" data-fslightbox=355594d84446cecf67d3><img src="https://storage.mollywhite.net/micro/7acde80b275679fdc7cd_Screenshot-2026-04-02-at-1.37.11---PM.png" alt="Dated: November 1, 2023 Respectfully submitted, Amanda K. Rice (D.C. Bar 1019208)* JONES DAY 150 W. Jefferson Avenue, Suite 2100 Detroit, MI 48226 (313) 733-3939 Samuel V. Lioi* JONES DAY 901 Lakeside Avenue Cleveland, Ohio 44114-1190 (216) 586-3939 *pro hac vice forthcoming /s/ Jacob (Yaakov) M. Roth Jacob (Yaakov) M. Roth (D.C. Bar 995090) Joshua B. Sterling (D.C. Bar 479320) John Henry Thompson (D.C. Bar 90013831) JONES DAY 51 Louisiana Avenue N.W. Washington, DC 20001 (202) 879-3939 Counsel for Plaintiff KalshiEx LLC" /></a></div></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp-block"><div class="timestamp">Posted: <a class="u-url" href="https://www.mollywhite.net/micro/entry/202604021337"><time class="dt-published" datetime="2026-04-02T17:41:11+00:00" title="April 2, 2026 at 5:41 PM UTC">April 2, 2026 at 5:41 PM UTC</time>. </a></div></div><div class="social-links"> <span> Also posted to: </span><a class="social-link u-syndication bluesky" href="https://bsky.app/profile/molly.wiki/post/3mijr2h6iuy27" title="Bluesky" rel="syndication">Bluesky</a></div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/micro/tag/kalshi" title="See all micro posts tagged "Kalshi"" rel="category tag">Kalshi</a>, <a class="tag p-category" href="https://www.mollywhite.net/micro/tag/prediction_markets" title="See all micro posts tagged "prediction markets"" rel="category tag">prediction markets</a>, <a class="tag p-category" href="https://www.mollywhite.net/micro/tag/us_politics" title="See all micro posts tagged "US politics"" rel="category tag">US politics</a>. </div></div></footer></div></article>Note published on April 2, 2026 at 5:17 PM UTC - Molly White's activity feed69cea4c7dac7d0a8c7e78c912026-04-02T17:17:59.000Z<article><div class="entry h-entry hentry"><header></header><div class="content e-content"><p>The CFTC (the US commodities regulator) has <a href="https://www.cftc.gov/PressRoom/PressReleases/9206-26">just sued</a> Arizona, Connecticut, and Illinois for their efforts to "outlaw, regulate, or otherwise restrain" prediction markets like Kalshi.</p><p>This is another escalation by newly appointed CFTC chair Mike Selig (and sole Commissioner at the agency), who has taken it upon himself to assert the CFTC's sole regulatory authority over prediction markets. Recently, the CFTC filed a supporting brief in Crypto.com's lawsuit against Nevada.</p><p>As I <a href="https://www.citationneeded.news/issue-101/#cftc">wrote then</a>, "Since the CFTC has filed no enforcement actions against prediction markets after embracing the sector following Trump’s election, Selig’s jurisdictional claim seems designed to shield the sector rather than regulate it."</p><p>Nevertheless, the CFTC's press release accompanying these lawsuits claims that state regulatory intervention could result in "poorer consumer protection and increased risk of fraud and manipulation".</p><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp-block"><div class="timestamp">Posted: <a class="u-url" href="https://www.mollywhite.net/micro/entry/202604021315"><time class="dt-published" datetime="2026-04-02T17:17:59+00:00" title="April 2, 2026 at 5:17 PM UTC">April 2, 2026 at 5:17 PM UTC</time>. </a></div></div><div class="social-links"> <span> Also posted to: </span><a class="social-link u-syndication mastodon" href="https://hachyderm.io/@molly0xfff/116336248771765501" title="Mastodon" rel="syndication">Mastodon, </a><a class="social-link u-syndication bluesky" href="https://bsky.app/profile/molly.wiki/post/3mijp34znv22j" title="Bluesky" rel="syndication">Bluesky</a></div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/micro/tag/prediction_markets" title="See all micro posts tagged "prediction markets"" rel="category tag">prediction markets</a>, <a class="tag p-category" href="https://www.mollywhite.net/micro/tag/us_politics" title="See all micro posts tagged "US politics"" rel="category tag">US politics</a>. </div></div></footer></div></article>Note published on April 2, 2026 at 2:32 PM UTC - Molly White's activity feed69ce7e0ddac7d0a8c7e78c2f2026-04-02T14:32:45.000Z<article><div class="entry h-entry hentry"><header></header><div class="content e-content"><p>misophonia sufferers vindicated as scientists confirm the remaining 3% are also under investigation</p><p>"<a href="https://theonion.com/study-97-of-all-sounds-infuriating/">Study: 97% Of All Sounds Infuriating</a>", <i>The Onion</i></p><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp-block"><div class="timestamp">Posted: <a class="u-url" href="https://www.mollywhite.net/micro/entry/202604021031"><time class="dt-published" datetime="2026-04-02T14:32:45+00:00" title="April 2, 2026 at 2:32 PM UTC">April 2, 2026 at 2:32 PM UTC</time>. </a></div></div><div class="social-links"> <span> Also posted to: </span><a class="social-link u-syndication mastodon" href="https://hachyderm.io/@molly0xfff/116335599030826612" title="Mastodon" rel="syndication">Mastodon, </a><a class="social-link u-syndication bluesky" href="https://bsky.app/profile/molly.wiki/post/3mijge4kyoc2p" title="Bluesky" rel="syndication">Bluesky</a></div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/micro/tag/misophonia" title="See all micro posts tagged "misophonia"" rel="category tag">misophonia</a>. </div></div></footer></div></article>Concert Review: London Philharmonic - Pictures at an Exhibition ★★★★★ - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=699932026-04-02T11:34:07.000Z<p>A delightful and emotional rendition of three rather different works.</p>
<p>Mark-Anthony Turnage's "Three Screaming Popes" was a chaotic cacophony. Wild, bizarre, inventive, and seemingly driven by excess. A fascinating performance, although not one I'll put on in the background. Turnage himself took to the stage to bask in the applause.</p>
<p>Bartók's Violin Concerto No. 1. Reading the story behind the composition made the performance by soloist Alina Ibragimova even more terrifying than it might have otherwise been. The sounds emanating from her violin were somewhere between a tantrum and flirtatious coquette. Stunning to see her tear up the stage.</p>
<p>Mussorgsky's Pictures at an Exhibition. Outstanding. Hearing a 100 piece orchestra power through the score was exhilarating. It is such a vivid piece. There's no other way to describe it - each movement is distinct and full of character. One of those rare pieces where you can feel the music worming its way into your brain.</p>
<p>You can <a href="https://www.bbc.co.uk/sounds/play/m002t01v">listen to the concert on BBC Radio 3</a>.</p>
<h2 id="pre-and-post-show"><a href="https://shkspr.mobi/blog/2026/04/concert-review-london-philharmonic-pictures-at-an-exhibition/#pre-and-post-show">Pre- and Post-Show</a></h2>
<p>I've written before about <a href="https://shkspr.mobi/blog/2024/12/the-art-of-the-pre-show-and-post-show/">The art of the Pre-Show and Post-Show</a>. Venues and shows have multiple ways to make an event special for an audience.</p>
<p>This concert did some things really well. For a start - the programme was free! I wish the West End was a bit more like Broadway with a free "Playbill" at every show. Even better, the programme was actually useful! Some nice blurbs about the performers and the pieces.</p>
<p>I particularly liked this little snippet:</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/04/Classical.webp" alt="Longer classical pieces are often made up of movements, or shorter sections. Applause is usually saved for after the final movement. May an encore! The soloist might play a little extra surprise piece, if the applause is loud enough!" width="1024" height="768" class="aligncenter size-full wp-image-69994"/>
<p>How wonderful! It's always someone's first time at an orchestral concert. More programmes should have these little comfort notes.</p>
<p>Other than that, there wasn't much. There was no interaction between the conductor and audience, which felt a little odd. The programme had a QR code to a 31(!) point questionnaire. I'm not sure how many people would be bothered to complete that.</p>
<p>Royal Festival Hall is a delight - plenty of space, multiple bars, lots of seating areas, and a larger number of spacious & clean toilets. An excellent venue.</p>
Time is a User-Interface - Westenberg69cdb5c3b19a140001e32fde2026-04-02T00:32:14.000ZUsing my edit button shortcut - James' Coffee Bloghttps://jamesg.blog/2026/04/02/using-my-edit-button-shortcut2026-04-02T00:00:00.000Z
<style media="(prefers-color-scheme: dark)">pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #49483e }
.highlight { background: #272822; color: #F8F8F2 }
.highlight .c { color: #959077 } /* Comment */
.highlight .err { color: #ED007E; background-color: #1E0010 } /* Error */
.highlight .esc { color: #F8F8F2 } /* Escape */
.highlight .g { color: #F8F8F2 } /* Generic */
.highlight .k { color: #66D9EF } /* Keyword */
.highlight .l { color: #AE81FF } /* Literal */
.highlight .n { color: #F8F8F2 } /* Name */
.highlight .o { color: #FF4689 } /* Operator */
.highlight .x { color: #F8F8F2 } /* Other */
.highlight .p { color: #F8F8F2 } /* Punctuation */
.highlight .ch { color: #959077 } /* Comment.Hashbang */
.highlight .cm { color: #959077 } /* Comment.Multiline */
.highlight .cp { color: #959077 } /* Comment.Preproc */
.highlight .cpf { color: #959077 } /* Comment.PreprocFile */
.highlight .c1 { color: #959077 } /* Comment.Single */
.highlight .cs { color: #959077 } /* Comment.Special */
.highlight .gd { color: #FF4689 } /* Generic.Deleted */
.highlight .ge { color: #F8F8F2; font-style: italic } /* Generic.Emph */
.highlight .ges { color: #F8F8F2; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #F8F8F2 } /* Generic.Error */
.highlight .gh { color: #F8F8F2 } /* Generic.Heading */
.highlight .gi { color: #A6E22E } /* Generic.Inserted */
.highlight .go { color: #66D9EF } /* Generic.Output */
.highlight .gp { color: #FF4689; font-weight: bold } /* Generic.Prompt */
.highlight .gs { color: #F8F8F2; font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #959077 } /* Generic.Subheading */
.highlight .gt { color: #F8F8F2 } /* Generic.Traceback */
.highlight .kc { color: #66D9EF } /* Keyword.Constant */
.highlight .kd { color: #66D9EF } /* Keyword.Declaration */
.highlight .kn { color: #FF4689 } /* Keyword.Namespace */
.highlight .kp { color: #66D9EF } /* Keyword.Pseudo */
.highlight .kr { color: #66D9EF } /* Keyword.Reserved */
.highlight .kt { color: #66D9EF } /* Keyword.Type */
.highlight .ld { color: #E6DB74 } /* Literal.Date */
.highlight .m { color: #AE81FF } /* Literal.Number */
.highlight .s { color: #E6DB74 } /* Literal.String */
.highlight .na { color: #A6E22E } /* Name.Attribute */
.highlight .nb { color: #F8F8F2 } /* Name.Builtin */
.highlight .nc { color: #A6E22E } /* Name.Class */
.highlight .no { color: #66D9EF } /* Name.Constant */
.highlight .nd { color: #A6E22E } /* Name.Decorator */
.highlight .ni { color: #F8F8F2 } /* Name.Entity */
.highlight .ne { color: #A6E22E } /* Name.Exception */
.highlight .nf { color: #A6E22E } /* Name.Function */
.highlight .nl { color: #F8F8F2 } /* Name.Label */
.highlight .nn { color: #F8F8F2 } /* Name.Namespace */
.highlight .nx { color: #A6E22E } /* Name.Other */
.highlight .py { color: #F8F8F2 } /* Name.Property */
.highlight .nt { color: #FF4689 } /* Name.Tag */
.highlight .nv { color: #F8F8F2 } /* Name.Variable */
.highlight .ow { color: #FF4689 } /* Operator.Word */
.highlight .pm { color: #F8F8F2 } /* Punctuation.Marker */
.highlight .w { color: #F8F8F2 } /* Text.Whitespace */
.highlight .mb { color: #AE81FF } /* Literal.Number.Bin */
.highlight .mf { color: #AE81FF } /* Literal.Number.Float */
.highlight .mh { color: #AE81FF } /* Literal.Number.Hex */
.highlight .mi { color: #AE81FF } /* Literal.Number.Integer */
.highlight .mo { color: #AE81FF } /* Literal.Number.Oct */
.highlight .sa { color: #E6DB74 } /* Literal.String.Affix */
.highlight .sb { color: #E6DB74 } /* Literal.String.Backtick */
.highlight .sc { color: #E6DB74 } /* Literal.String.Char */
.highlight .dl { color: #E6DB74 } /* Literal.String.Delimiter */
.highlight .sd { color: #E6DB74 } /* Literal.String.Doc */
.highlight .s2 { color: #E6DB74 } /* Literal.String.Double */
.highlight .se { color: #AE81FF } /* Literal.String.Escape */
.highlight .sh { color: #E6DB74 } /* Literal.String.Heredoc */
.highlight .si { color: #E6DB74 } /* Literal.String.Interpol */
.highlight .sx { color: #E6DB74 } /* Literal.String.Other */
.highlight .sr { color: #E6DB74 } /* Literal.String.Regex */
.highlight .s1 { color: #E6DB74 } /* Literal.String.Single */
.highlight .ss { color: #E6DB74 } /* Literal.String.Symbol */
.highlight .bp { color: #F8F8F2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #A6E22E } /* Name.Function.Magic */
.highlight .vc { color: #F8F8F2 } /* Name.Variable.Class */
.highlight .vg { color: #F8F8F2 } /* Name.Variable.Global */
.highlight .vi { color: #F8F8F2 } /* Name.Variable.Instance */
.highlight .vm { color: #F8F8F2 } /* Name.Variable.Magic */
.highlight .il { color: #AE81FF } /* Literal.Number.Integer.Long */ .highlight .nn, .highlight .n{color: light-dark(black, var(--dark-foreground-color)) }</style><style media="(prefers-color-scheme: light)">pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #F00 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666 } /* Operator */
.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #9C6500 } /* Comment.Preproc */
.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #E40000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #008400 } /* Generic.Inserted */
.highlight .go { color: #717171 } /* Generic.Output */
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #04D } /* Generic.Traceback */
.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008000 } /* Keyword.Pseudo */
.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #B00040 } /* Keyword.Type */
.highlight .m { color: #666 } /* Literal.Number */
.highlight .s { color: #BA2121 } /* Literal.String */
.highlight .na { color: #687822 } /* Name.Attribute */
.highlight .nb { color: #008000 } /* Name.Builtin */
.highlight .nc { color: #00F; font-weight: bold } /* Name.Class */
.highlight .no { color: #800 } /* Name.Constant */
.highlight .nd { color: #A2F } /* Name.Decorator */
.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #00F } /* Name.Function */
.highlight .nl { color: #767600 } /* Name.Label */
.highlight .nn { color: #00F; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #19177C } /* Name.Variable */
.highlight .ow { color: #A2F; font-weight: bold } /* Operator.Word */
.highlight .w { color: #BBB } /* Text.Whitespace */
.highlight .mb { color: #666 } /* Literal.Number.Bin */
.highlight .mf { color: #666 } /* Literal.Number.Float */
.highlight .mh { color: #666 } /* Literal.Number.Hex */
.highlight .mi { color: #666 } /* Literal.Number.Integer */
.highlight .mo { color: #666 } /* Literal.Number.Oct */
.highlight .sa { color: #BA2121 } /* Literal.String.Affix */
.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
.highlight .sc { color: #BA2121 } /* Literal.String.Char */
.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
.highlight .sx { color: #008000 } /* Literal.String.Other */
.highlight .sr { color: #A45A77 } /* Literal.String.Regex */
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
.highlight .ss { color: #19177C } /* Literal.String.Symbol */
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #00F } /* Name.Function.Magic */
.highlight .vc { color: #19177C } /* Name.Variable.Class */
.highlight .vg { color: #19177C } /* Name.Variable.Global */
.highlight .vi { color: #19177C } /* Name.Variable.Instance */
.highlight .vm { color: #19177C } /* Name.Variable.Magic */
.highlight .il { color: #666 } /* Literal.Number.Integer.Long */</style>
<style>
@font-face {
font-family: 'MonaspaceArgon';
src: url('/assets/fonts/MonaspaceArgon-Regular.woff2') format('woff2');
font-weight: 400;
font-style: normal;
}
pre, code {
font-family: 'MonaspaceArgon', ui-monospace, monospace;
}
</style>
<p>In 2025 I built a <a href="https://jamesg.blog/2025/05/21/building-an-edit-button-browser-extension">browser extension that adds an edit button to your browser</a>. The edit button pages if a page either has:</p><ul><li>A <code>rel=edit</code> link;</li><li>A custom edit link set in the extension preferences, or;</li><li>A link with an anchor like “edit page” (only available if you enable the setting, since this is a heuristic).</li></ul><p>Back when I built the extension, I added in a keyboard shortcut to open the edit link associated with a page. On Mac, the shortcut is Command + Shift + E.</p><p>I forgot all about this shortcut until recently, when I accidentally pressed Command + Shift + E instead of Command + Shift + R, the shortcut to refresh a page. At first, I was surprised, but the mis-press gave me the reminder I needed that this feature exists.</p><p>Since then, I have been using the Command + Shift + E shortcut almost daily to edit pages on my website.</p><p>I like that the shortcut has a similar hand position to refreshing, a shortcut that I find relatively comfortable to use. I also like that the shortcut only requires use of my left hand, so that I can press the edit button while using my mouse to navigate to my next task.</p><p>My flow to edit a page now usually looks something like this:</p><ul><li>Go to a page on my website (i.e. my <a href="https://jamesg.blog/software-notes" rel="noreferrer">software notes page</a>).</li><li>Press Command + Shift + E.</li><li>Ghost opens in my browser.</li><li>I use my mouse to navigate to Apple Notes, where I usually have notes I want to copy onto my website.</li><li>I use my mouse to go back to Ghost where I paste in my notes and organise and develop them a bit where necessary.</li><li>I save my edits.</li></ul><p>While I could also use the mouse to press the edit link button that appears in my browser, the shortcut is so convenient.</p><p>The irony is that I forgot the shortcut existed until I accidentally encountered it. Indeed, overall, I struggle with remembering keyboard shortcuts beyond the basics (copy, paste, quit, refresh), preferring to opt for a menu or another visible affordance. But the edit keyboard shortcut is now becoming one I use regularly so it is increasingly etched into my memory. I think there was a gap to bridge between adding the shortcut as a feature in the development process and making a habit around its use.</p>
<a class="tag" href="https://jamesg.blog/2025/05/21/building-an-edit-button-browser-extension">browser extension that adds an edit button to your browser</a>
<a class="tag" href="https://jamesg.blog/software-notes">software notes page</a>
For The Seiko of It - Hey, it's Jason!https://grepjason.sh/2026/for-the-seiko-of-it2026-04-02T00:00:00.000ZI wasn't going to pick up any new watches on this trip. Then I picked up a new watch. 🤷March 2026 Summary - Joel's Log Fileshttps://joelchrono.xyz/blog/march-2026-summary2026-04-01T15:50:50.000Z<p>The year continues to move at an incredible pace, and I continue to engage with so many forms of media, keeping track is starting to get a bit confusing! Nothing impossible to manage of course, it’s fun to have so many more things going on.</p>
<h2 id="podcasts">Podcasts</h2>
<p>Once again, my podcast listening has been diminishing this year, as music continues to go upwards! I think that now that I fully settled on scrobbling with Listenbrainz, plus going to sleep with music over podcasts, has helped quite a bunch. Another big reason might be that I haven’t listened to <em>Welcome to Night Vale</em> in a while, which was what I listened to before sleep. In any case I listened to 23 horus of podcasts in March!</p>
<figure class="img">
<picture>
<source srcset="/assets/img/blogs/2026-03-31-podcasts.webp" type="image/webp"/>
<source srcset="/assets/img/blogs/2026-03-31-podcasts.png" type="image/png"/>
<img class="mx-auto" src="https://joelchrono.xyz/assets/img/blogs/2026-03-31-podcasts.png" alt="The podcasts I have been listening"/>
</picture>
<figcaption class="caption">The podcasts I have been listening</figcaption></figure>
<ul>
<li><strong>Into The Aether</strong> - The usual run of <a href="https://intothecast.transistor.fm/episodes/wacky-wally-s-big-bassoon-solo-feat-persona-5-royal-soulcalibur-iii-marathon-and-more">current</a> <a href="https://intothecast.transistor.fm/episodes/teddie-is-for-everyone-feat-paranormasight-the-mermaid-s-curse-slay-the-spire-ii-minishoot-adventures-and-more">weekly</a> <a href="https://intothecast.transistor.fm/episodes/scyther-is-my-roommate-feat-pokemon-pokopia-slay-the-spire-2-and-resident-evil-requiem">episodes</a>. The run so far has been amazing, featuring all maner of games like <em>Resident Evil Requiem</em>, <em>Persona 4 Golden</em>, <em>Pokémon Pokopia</em>, <em>Danganronpa</em>, <em>Marathon</em>, <em>Slay The Spire 2</em> and <em>Minishoot Adventures</em>.</li>
<li><strong>99% Invisible</strong> - A couple of great episodes on <a href="https://99percentinvisible.org/episode/658-the-em-dash/">the Em Dash</a>, and the history behind <a href="https://99percentinvisible.org/episode/661-where-the-f-are-we/">knowing where we are.</a></li>
<li><strong>Wolf 359</strong> - Listened up to episode 45 of this show. The story continues to be incredible, some of my favorites episodes that I still remembered from my first listen around 5 years ago. I drama and the stakes are getting real.</li>
<li><strong>Revolutions</strong> - Listened to another four episodes or so of the French Revolution. This historical event has so much to unpack, I have listened to 50 episodes of it so far.</li>
<li><strong>Stuff You Should Know</strong> - Just a random selection of episodes I listened to. Like an episode on <a href="https://stuffyoushouldknow.com/episode/keeping-time/">tracking time</a>, and <a href="https://intothecast.transistor.fm/episodes/scyther-is-my-roommate-feat-pokemon-pokopia-slay-the-spire-2-and-resident-evil-requiem">flood myths</a>.</li>
<li><strong>Dungeons and Daddies</strong> - Listened to one episode and a half of Season 3! It got interested by the end so I expect to keep this up next month a bit more.</li>
<li><strong>They’re Just Movies</strong> - This one is no longer around, but I listened to their overview of the <a href="https://youtu.be/hz0jTJnVZKE">Aliens</a> movie, and want to check some more of their episodes. I kinda miss it.</li>
<li><strong>Trash Taste</strong> - Just picking episodes at random, not much else.</li>
</ul>
<h2 id="gaming">Gaming</h2>
<p>Gaming took over, and despite it all, I didn’t finish a single game! I just started so many at once and I am kind of having fun just jumping around between them without any rhyme or reason. But hey, they’re games, meant to be fun, after all.</p>
<figure class="img">
<picture>
<source srcset="/assets/img/blogs/2026-03-31-games.webp" type="image/webp"/>
<source srcset="/assets/img/blogs/2026-03-31-games.png" type="image/png"/>
<img class="mx-auto" src="https://joelchrono.xyz/assets/img/blogs/2026-03-31-games.png" alt="The games I have been playing"/>
</picture>
<figcaption class="caption">The games I have been playing</figcaption></figure>
<h3 id="started">Started</h3>
<ul>
<li>
<p><strong>Resident Evil</strong> - I decided to venture into the world… of <em>Survival Horror</em>. The game that started it all! After the sequel, I thought I’d visit the original, and I have to say, I have really enjoyed it so far. I am happy to say I’ve managed to figure out all of the puzzles without help, except for the one that uses the <em>chemical</em>. Other than that, it’s been fun.</p>
</li>
<li>
<p><strong>Metroid Fusion</strong> - I have so many Metroidvanias avilable to me, and I haven’t finished <em>Silksong</em> in ages, and yet again, I’ve decided to start another run of <em>Fusion</em> on my Miyoo Mini Flip. This game rules, and I’ve already reached the third boss of the game. I want to finish it as quickly as I can without using save states!</p>
</li>
<li>
<p><strong>Ridge Racer Type 4</strong> - I listened to the soundtrack of this game and I wanted to check it out. There are so many menus and modes and an actual story? I just jumped into a race as quick as I could and enjoyed the soundtrack a bit, but I admit I didn’t do more, I prefer the PSP physics and gameplay.</p>
</li>
<li>
<p><strong>River City Ransom</strong> - This is a game that I tried online with <a href="https://burgeonlab.com">Naty</a> playing via NSO. It is a fairly deep game for its time, and we definitely had a lot of fun with its gameplay and mechanics, we played it for like 40 minutes but ran out of time and we haven’t returned to it.</p>
</li>
<li>
<p><strong>What Did I Do To Deserve This, My Lord!? 2</strong> - This is considered a hidden gem of the PSP. A game where you create an underground dungeon and grow your own army of creatures who grow by themselves and follow basic movement patterns to fight against the heroes. It’s a fun subversion, but not my cup of tea, I think.</p>
</li>
<li>
<p><strong>Pokémon Emerald Legacy</strong> - I played the first 20 minutes of this game and I am tempted to give it a proper go. The Legacy romhack is supposed to be the ultimate way to enjoy the game and I look forward to having the mood to get into it.</p>
</li>
<li>
<p><strong>Caves of Qud</strong> - I played a bit of the tutorial since I’ve heard so many great things, but I didn’t go much deeper than that, it seems huge and I’m definitely interested though.</p>
</li>
</ul>
<h3 id="ongoing">Ongoing</h3>
<ul>
<li>
<p><strong>CrossCode</strong> - A wonderful game that really grew up on me during this month. I made a bunch of progress and since I’m playing it alongside some friends, I’ve really looked forward to what they think or have to say about stuff. I like that I’m ahead too, not gonna lie. In any case, all the dungeons have been awesome, and even if the puzzle design can be a little tiresome, it definitely gets my brain working and I love the feeling of figuring things out. The puzzles can definitely get long though.</p>
</li>
<li>
<p><strong>Super Mario 3D World</strong> - This has been a fun game to play with friends, and even to go through by myself a couple of times. We are trying to get every single star and sticker from this before finishing the story! We made it to the final stage now that it’s kind of like a circus, and I’m looking forward to beating this game at some point in the next couple of months.</p>
</li>
<li>
<p><strong>Ridge Racer</strong> - This masterpiece for the PSP continues to be excellent to play. I have made some progress doing World Tours in the EX class, and I love how this game just hooks me and won’t let me go at all.</p>
</li>
<li>
<p><strong>Into The Breach</strong> - I ended up returning to this gem of a game and finally managed to complete a run on it, even if it was on easy. The tactics and mechanics of this masterpiece are just amazing. I want to keep playing more of it and master all the available mechs too.</p>
</li>
<li>
<p><strong>Balatro</strong> - Ended up playing this game with friends a couple of times, however, I ended up finally caving in and purchasing the title for my phone… It is fun, and I am scared. I am yet to win a game though, despite it all.</p>
</li>
<li>
<p><strong>Gladiator Begins</strong> - This title for the PSP is an arena battler that I’ve played on and off. I touched it for a bit during the PSP season of Into The Aether, but didn’t even bring it up much. I have played some more lately and yeah, it’s very fun! I’m currently stock in a boss fight though, where I simply need to git gud.</p>
</li>
<li>
<p><strong>Vampire Survivors</strong> - This roguelike “bullet heaven” is finally losing its spell among my group of friends, we play it for time to time, but it definitely feels a bit more like homework lately, just to complete the unlockables and achievements. We will keep playing though, just not as crazy as before.</p>
</li>
<li>
<p><strong>Grapple Dog</strong> - I barely touched this game, although I had a lot of fun with it last month, I need to get back to it, I really enjoyed the physics and mechanics of it, but I guess that Switch and handheld gaming took over to compensate for the Laptop-focused gaming of February.</p>
</li>
<li>
<p><strong>Super Smash Bros Ultimate</strong> - Just a couple of matches with friends… I’ve been tempted to play the solo campaign lately though, to unlock more characters and just test myself.</p>
</li>
</ul>
<h2 id="movies">Movies</h2>
<figure class="img">
<picture>
<source srcset="/assets/img/blogs/2026-03-31-movies.webp" type="image/webp"/>
<source srcset="/assets/img/blogs/2026-03-31-movies.png" type="image/png"/>
<img class="mx-auto" src="https://joelchrono.xyz/assets/img/blogs/2026-03-31-movies.png" alt="I just watched this one movie"/>
</picture>
<figcaption class="caption">I just watched this one movie</figcaption></figure>
<p>The only movie I got to watch in March was <strong>David</strong>. An animated, faith-based, musical film about the traditional story of David and his rise to the throne as a King. I already said it on my weeknotes, this film is pretty good for what it is, but and probably among the best when it comes to Christian animation, with a few truly awesome scenes.</p>
<p>However, it falls short in other aspects, it gets preachy at times—although not as bad as others—and the songs, while good in the moment and with an OK message, they just aren’t very memorable, and there’s maybe one or two that weren’t really necessary. I also would have liked to see a bit more action. I don’t expect anything gruesome from a kids movie, but at the very least some swords clashing would have been fun.</p>
<h2 id="manga">Manga</h2>
<p>What a great month this was for manga, other than the fact two of the ones I finished didn’t meet my expectations, the rest of what I read was rather enjoyable!</p>
<figure class="img">
<picture>
<source srcset="/assets/img/blogs/2026-03-31-manga.webp" type="image/webp"/>
<source srcset="/assets/img/blogs/2026-03-31-manga.png" type="image/png"/>
<img class="mx-auto" src="https://joelchrono.xyz/assets/img/blogs/2026-03-31-manga.png" alt="The mange I have been reading"/>
</picture>
<figcaption class="caption">The mange I have been reading</figcaption></figure>
<h3 id="started-1">Started</h3>
<ul>
<li><strong>Kagurabachi</strong> - Up to chapter 115. Speaking of swords clashing, this was a manga that completely hooked me and wouldn’t let me go at all. I read from the start to the latest released chapter as of now, catching up with it. This is a revenge story, and features some amazing characters, excellent action and panelling, simple, yet breath-taking artwork and some actually good writing for once! I’ve enjoyed everything thus far, zero complaints, genuinely surprised.</li>
</ul>
<h3 id="ongoing-1">Ongoing</h3>
<ul>
<li>
<p><strong>Fly Me To The Moon</strong> - Up to chapter 214. This is a manga I started ages ago, and this month I finally decided to return to it. It starts as a fun rom-com manga about a newly wed couple, but it has turned into something much more interesting. There is a mystery to it all, and everything has started to finally unveil, if at a slow pace. However, I don’t mind, even without the mystery, the humor and wholesome moments are plenty. I enjoy it.</p>
</li>
<li>
<p><strong>DanDaDan</strong> - Up to chapter 226. I barely read any of this manga, but at the very least I managed to get to the big bad guy of the current arc, I think, and it’s definitely an interesting premise. I am only a few chapters behind, so I am honestly just waiting for more chapters to release and build up some momentum.</p>
</li>
<li>
<p><strong>Blue Lock</strong> - Up to chapter 340. I catched up and I’m reading week by week. This match against France has definitely been an epic one. I enjoy the challenge that Isagi has been facing. So many questions, doubts and tactics that don’t work. I really love the drama thus far.</p>
</li>
<li>
<p><strong>Love’s in Sight!</strong> - Up to chapter 56. It had been a while since I revisited this one as well, it’s a cute rom-com about a blind girl and a delinquent guy with a soft heart. It’s pretty wholesome, and it actually deals with a lot of the accesibility and life of a blind person. Way more educational than I expected, and some of the narratives focused on that are really well done.</p>
</li>
<li>
<p><strong>Kingdom</strong> - Up to chapter 866. This continues to be an absolutely epic tale. There were a couple of great moments going on during the current arc (The Battle against Zhao), and I am only three or so chapters behind. Some great developments have been made.</p>
</li>
<li>
<p><strong>Spy x Family</strong> - Up to chapter 130. Currently on a very fun arc where Loid, Yor and Yor’s brother are held hostage, and while the three of them could easily get away and stop the whole thing, neither of them wants to blow off their cover. The conflict is solving itself in the most hilarous way, I love this manga.</p>
</li>
</ul>
<h3 id="complete">Complete</h3>
<ul>
<li>
<p><strong>Planetes</strong> - This is <strong>definitely a must read</strong>, a great science fiction manga in space in a nearby future that follows a group of garbage collectors that keep Earth’s space as clean as it can be. We follow multiple characters of this crew, all of them with their own journeys and ideal, forming relationships, dealing with the struggles of life in space. We meet some of their families, we see how technology continues to develop, we see the impact that seeking for the stars can have in life. There are so many topics, there are so many incredible moments, so much conflict, be it in political drama, between characters, and of course, internal dilemmas, depression, trauma, joy, hope, love. This is a true piece of art, up there with <em>Yokohama Kaidashi Kikou</em>, <em>Vagabond</em> and <em>Kingdom</em>. In only 22 chapters, this gave me so much food for thought. Just read it if you can.</p>
</li>
<li>
<p><strong>Chainsaw Man</strong> - I have no words to describe what finishing this feels like. It is such an internal conflict. I absolutely loved Part 1 of this, and early on, I also loved Part 2. But something happened, and things started to look way too dire. Nonsense after nonsense, and chapters kept getting shorter and uglier. In the end, this manga finished with a 6-page long issue. I don’t know what to say. It was definitely a journey, and there’s a way to see this as the only ending Chainsaw Man could have had, but nah, I needed more out of it. I have a sour taste in my mouth. Thankfully I read plenty of masterpieces this month I even forgot to bring it up on my weeknotes—I edited them now, but still. I hope the anime fixes it.</p>
</li>
<li>
<p><strong>Jujutsu Kaisen Modulo</strong> - Another manga that also started with a lot of promise, but didn’t manage to stick the landing at all. Its redeeming grace is that it only really had 25 chapters, and that 15 or so of them are very good. The art itself is awesome though, and even though the final sequences are super rushed, the art is great to see.</p>
</li>
</ul>
<h2 id="anime">Anime</h2>
<figure class="img">
<picture>
<source srcset="/assets/img/blogs/2026-03-31-anime.webp" type="image/webp"/>
<source srcset="/assets/img/blogs/2026-03-31-anime.png" type="image/png"/>
<img class="mx-auto" src="https://joelchrono.xyz/assets/img/blogs/2026-03-31-anime.png" alt="The only anime I watched this month"/>
</picture>
<figcaption class="caption">The only anime I watched this month</figcaption></figure>
<p><strong>Orb: On the Movements of the Earth</strong> was the only anime I started, and I watched up to episode 4. This is an anime that caught me by surprise. A story set in the middle ages about a smart kid with a love for astronomy who eventually learns and the Earth revolves around the Sun, in an era where the Catholic Church considered the heliocentric model to be heresy.</p>
<p>The conflict and the relationship between truth, faith and science is very interesting to see. I definitely need to watch the rest of the season, it loks very promising.</p>
<h2 id="books">Books</h2>
<p>So many books were read, I actually started a couple more than the ones I mention here, but these are the significant ones, to be honest.</p>
<figure class="img">
<picture>
<source srcset="/assets/img/blogs/2026-03-31-books.webp" type="image/webp"/>
<source srcset="/assets/img/blogs/2026-03-31-books.png" type="image/png"/>
<img class="mx-auto" src="https://joelchrono.xyz/assets/img/blogs/2026-03-31-books.png" alt="The books I read this month"/>
</picture>
<figcaption class="caption">The books I read this month</figcaption></figure>
<h3 id="started-2">Started</h3>
<ul>
<li>
<p><strong>Clarkesworld Magazine #211</strong> by Neil Clarke - I finally started going through the Clarkesworld magazines that I subscribed to a couple years back. I went through the first two stories found on this issue—<em>The Lark Ascending</em> and An Intergalactic Smugglers Guide to Homecoming—the third one is the longest thus far, but I’ll hopefully deal with it soon! The second story is my favorite thus far.</p>
</li>
<li>
<p><strong>Strange Dogs</strong> by James S.A. Corey. - A novella that takes place before <em>Persepolis Rising</em>, so far so good! I barely read it though because reading on my XTEINK X4 took over.</p>
</li>
</ul>
<h3 id="completed">Completed</h3>
<ul>
<li>
<p><strong>Chrono Trigger</strong> by Michael P. Williams - A memoir, a critique, and retrospective of my favorite game of all time. It was quite cool! And contained plenty of information I didn’t know at all. It also featured some great interviews with the translators of the game. I enjoyed it, it’s a fun read but you definitely need to play the game before getting to it.</p>
</li>
<li>
<p><a href="https://joelchrono.xyz/blog/non-stop/"><strong>Non-Stop</strong></a> by Brian W. Aldiss - An incredible story that makes great use of the generation ship plot. I loved it from start to finish and flew through it in a matter of days. I already published my review of it so I won’t say much more. It’s worth a read despite its age, in my opinion.</p>
</li>
<li>
<p><a href="https://joelchrono.xyz/blog/persepolis-rising/"><strong>Persepolis Rising</strong></a> by James S.A. Corey - The seventh entry in <em>The Expanse</em> series. This journey does a timeskip and places us in a new status quo, which is about to be challenged by Humanity’s greatest enemy once again, itself. A great start to this last trilogy. I look forward to the rest!</p>
</li>
</ul>
<p>This is day 44 of <a href="https://100daystooffload.com">#100DaysToOffload</a></p>
<h2 id="goals">Goals</h2>
<p>Last month I set some goals that I would pursue during March, but I think I should do some more general goals that I can do during the year, and during the month itself. This is what I came up with. I added those I completed from last month, but I don’t think I want to list everything I completed as the year goes, so, yeah, just ongoing goals and progress updates, I guess.</p>
<p><strong>Completed:</strong></p>
<ul class="task-list">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked"/>Survived my work</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked"/>Finished <em>Persepolis Rising</em></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked"/>Went to the movies once</li>
</ul>
<p><strong>New</strong></p>
<ul class="task-list">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>Fully sorting and labelling everything on my shelves for once</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>Finish a pending commission for a friend</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>Finish a pending commission for my parents</li>
</ul>
<p><strong>In progress</strong></p>
<ul class="task-list">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>A full website redesign (??)</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>Read the whole Bible in a year (9/365)</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>Finish listening to <em>Wolf 359</em> (45/61)</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>Complete 15 books (4/15)</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"/>Complete 15 videogames (2/15)</li>
</ul>
<h2 id="finishing-thoughts">Finishing thoughts</h2>
<p>This month was wild. Work really took over a lot of my life since my coworker went on his long vacation, and yet, despite it all, I managed to surpass expectations when it comes to the amount of media I watched. I am particularly happy about the books and manga I got to read.</p>
<p>It’s getting to a point I may just highlight some specific things instead of mentioning everything.</p>
<p>And all the blogposts I managed to do this month? It’s not my best or the most constant, but I am rather happy about it. Plus all the small changes and additions to my website. A good month all around, even if I could have gone without the extra workload. Can’t complain much though.</p>
<p>Definitely looking forward to what April has in store, I hope things will go alright.</p>
<p>Until next time!</p>
<p>This is day 44 of <a href="https://100daystooffload.com">#100DaysToOffload</a></p>
<p>
<a href="mailto:me@joelchrono.xyz?subject=March 2026 Summary">Reply to this post via email</a> |
<a href="https://fosstodon.org/@joel/116330247160565542">Reply on Fediverse</a>
</p>What Digital Isolation and Censorship Evasion Look Like In Wartime Iran - Werd I/O69cd27e7e82ba400019c86302026-04-01T14:12:55.000Z<p>[<a href="https://www.techpolicy.press/what-digital-isolation-and-censorship-evasion-look-like-in-wartime-iran/?ref=werd.io">Laura Scherling in Tech Policy Press</a>]</p><p>I’ve worried that the internet will become a casualty of our worsening global politics. The inherent co-operation needed to let global networks talk to each other is aligned with an open world but not so much with an authoritarian one. Walled-off national internets — often called splinternets — may become more common.</p><p>While I worry about this for the US as the authoritarian screws continue to tighten, this is the concrete reality for people in Iran and 20 other countries today. As <a href="https://www.techpolicy.press/what-digital-isolation-and-censorship-evasion-look-like-in-wartime-iran/?ref=werd.io">this piece in Tech Policy Press</a> points out:</p><blockquote>“The cybersecurity company Surfshark recorded 81 new internet restrictions in 2025 <a href="https://surfshark.com/research/study/internet-shutdowns-2025?ref=werd.io">across 21 countries</a>, pointing to evolving patterns of repression. Out of the 81 restrictions Surfshark tracked, 51 of these restrictive measures were taken <a href="https://surfshark.com/research/study/internet-shutdowns-2025?ref=werd.io">in response to</a> political situations.”</blockquote><p>News and information needs to be shared differently in this kind of environment: the digital distribution techniques we’ve spent the last few decades learning simply don’t apply. Last year, in <a href="https://werd.io/building-distributed-media-for-a-democratic-breakdown/"><em>Building distributed media for a democratic breakdown</em></a>, I wrote about how we might learn from Cuba’s <em>‌El Paquete Semanal</em> and take advantage of both sneakernets and peer-to-peer networks to overcome these kinds of blockades. In a restrictive environment, people need news and journalism more than ever.</p><p>I wrote that piece somewhat speculatively, but the reception to it in journalistic circles took me by surprise. It’s an idea and a worry that people are taking seriously. And over the last six months, in a world that has seen more conflict, more restrictions, and more attacks on free speech, there have only been reasons to take it more so.</p><p>[<a href="https://www.techpolicy.press/what-digital-isolation-and-censorship-evasion-look-like-in-wartime-iran/?ref=werd.io">Link</a>]</p>The Right Is Using AI Content Scanners to Try to Supercharge Book Banning - Werd I/O69cd20c1e82ba400019c86292026-04-01T13:42:25.000Z<p>[<a href="https://www.404media.co/blockade-the-right-is-using-ai-content-scanners-to-try-to-supercharge-book-banning/?ref=werd.io">Claire Woodcock at 404 Media</a>]</p><p>This AI-powered effort is intentionally designed to create chilling effects and reduce support for vulnerable communities:</p><blockquote>“Conservative parents’ advocacy groups have been experimenting with using commercially available artificial intelligence tools to help them flag more books they’ve deemed pornographic to be removed from public schools and libraries. Even though LLMs are notoriously error-prone, and the books in question aren’t pornographic, these groups continue to explore use cases for AI anyway.”</blockquote><p>According to 404 Media’s reporting, the script has a list of 300 or so words that form the basis of a heuristic that applies an “appropriateness” score to each one. If the book is deemed inappropriate, the script creates an automated report designed to be attached to book challenges at the school district level.</p><p>This reminds me of DOGE itself, which <a href="https://www.propublica.org/article/ted-cruz-woke-grants-national-science-foundation?ref=werd.io">used a keyword-based system to flag “woke” grants that should be defunded</a> that led to some incredibly dumb decisions about what should go:</p><blockquote>“Among them, for example, was a $470,000 grant to study the evolution of mint plants and how they spread across continents. As best we can tell, the project ran into trouble with Republicans on the Senate Committee on Commerce, Science and Transportation because of two specific words used in its application to the NSF: “diversify,” referring to the biodiversity of plants, and “female,” where the application noted how the project would support a young female scientist on the research team.”</blockquote><p>These techniques are clearly inaccurate, but that’s not the point: it’s enough to cause havoc and make people second guess publishing books on certain topics. It’s the same culture of chaos that led to <a href="https://www.nbcnews.com/news/education/tennessee-librarian-fired-refusing-move-lgbtq-books-childrens-adult-rcna266119?ref=werd.io">a school librarian being fired for (correctly) refusing to remove over a hundred LGBTQ books from the children’s to the adult section of her library</a>. And it’s all designed to harm some of the people who need the most support.</p><p>[<a href="https://www.404media.co/blockade-the-right-is-using-ai-content-scanners-to-try-to-supercharge-book-banning/?ref=werd.io">Link</a>]</p>Random File Format - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=650272026-04-01T11:34:57.000Z<p>This was an idea I had back in the days of Naptster.</p>
<p>At the turn of the century, it was common to listen to an "acquired" music file only to find it was missing a few seconds at the end due to a prematurely stopped download. Some video formats would refuse to play at all if the <a href="https://www.cnwrecovery.com/manual/Fragmented3GPMP4Files.html"><code>moov</code> atom at the end of the file was missing</a>.</p>
<p>I wondered if it would be possible to make a file format which was close to impossible to read unless the <em>entire</em> file was intact. I don't mean including a checksum to detect download errors - I mean a layout which was <strong>intrinsically fragile</strong> to corruption.</p>
<p>While digging through an old backup CD, I found my original notes. I'm rather impressed at what neophyte-me had constructed. My outline was:</p>
<ul>
<li>The file ends with a 32 bit pointer. This points to the location of the first information block.</li>
<li>The information block describes the length of the data block which follows it.</li>
<li>At the end of the data block is another 32 bit pointer. This points to the location of the next information block.</li>
<li>The start of the file may be a pointer, or it may be padded with random data.</li>
<li>There may be random data padded between the data blocks.</li>
</ul>
<p>This ensures that a file which has been only partially downloaded - whether truncated at the end or missing pieces elsewhere - cannot be successfully read.</p>
<p>Here's a worked example. Start at the end and follow the thread.</p>
<ol start="0">
<li>Random data.</li>
<li>Data block size is 2.</li>
<li>Data</li>
<li>Data</li>
<li>EOF.</li>
<li>Data block size is 1.</li>
<li>Data.</li>
<li>Go to location 1.</li>
<li>Random data.</li>
<li>Go to location 5.</li>
</ol>
<p>There are, of course, a few downsides to this idea.</p>
<p>Most prominently, it bloats file size. If the data block size was a constant 1MB, that would pad the size a negligible amount. But with variable data block size, it could increase it significantly. Random padding also increases the size.</p>
<p>If the block size is consistent and there's no random padding data, the files can be mostly reconstructed.</p>
<p>Depending on which parts of the file are missing, it may be possible to recover the majority of the file.</p>
<p>A location block size of 32 bits restricts the file-size to less than 4GB. A 64 bit pointer might be excessive or might be future-proof!</p>
<p>Highly structured files with predictable patterns, or text files, may be easy to recover large bits of information.</p>
<p>A malformed file could contain an infinite loop of pointers.</p>
<p>Perhaps a <a href="https://en.wikipedia.org/wiki/File_format#Magic_number">magic number</a> should be at the start (or end) of the file?</p>
<p>While reading the file is as simple as following the pointers, <em>constructing</em> the file is more complex, especially if blocks have variable lengths.</p>
<h2 id="code"><a href="https://shkspr.mobi/blog/2026/04/random-file-format/#code">Code</a></h2>
<p>Here's a trivial encoder. It reads a file in consistently sized chunks of 1,024 bytes. It shuffles them up and writes them to a new file. The last 4 bytes contain a pointer to the first block, which says the data length is 1,024. After that, there is a 4 byte pointer to the next block location.</p>
<pre><code class="language-python">import random
# Size of data, headers, and pointers.
data_length = 1024
header_length = 4
pointer_length = 4
# Read the file into a data structure.
original_blocks = list()
with open( "test.jpg", "rb") as file:
for data in iter( lambda: file.read( data_length ), b"" ):
# Add padding if length is less than the desired length.
padding = data_length - len( data )
data += b"\0" * padding
original_blocks.append( data )
# How many blocks are there?
original_length = len( original_blocks )
# Create a random order of blocks.
order = list( range( 0, original_length ) )
random.shuffle( order )
# Where is the start of the file?
first_block_index = order.index( 0 )
first_block_pointer = first_block_index * ( header_length + data_length + pointer_length )
# Loop through the order and write to a new file.
i = 0
# Open as binary file to add the pointers correctly.
with open( "output.rff", "wb" ) as output:
while i < original_length:
# Where are we?
current_block = i
current_block_value = order[i]
# Write length of data in little-endian 32 bytes.
output.write( data_length.to_bytes( header_length, "little") )
# Write data
output.write( original_blocks[ current_block_value ] )
i = i+1
# Last block. Write an EOF header.
if ( current_block_value + 1 >= original_length ):
eof = 4294967295
output.write( eof.to_bytes( header_length, "little") )
else:
next_block = order.index( current_block_value + 1 )
# Write pointer to next block
next_block_location = next_block * ( header_length + data_length + pointer_length )
output.write( next_block_location.to_bytes( pointer_length, "little" ) )
# At the end of the file, write the pointer to block 0.
output.write( first_block_pointer.to_bytes( pointer_length, "little" ) )
</code></pre>
<p>And here is a similarly trivial decoder. It reads the last 32 bits, moves to that location, reads the block size, reads the data and writes it to a new file, then reads the next pointer.</p>
<pre><code class="language-python">import os
# Size of data, headers, and pointers.
header_length = 4
pointer_length = 4
# File name to write to.
decoded_file = "decoded.bin"
# Create an empty file.
with open( decoded_file, "w") as file:
pass
# Function to loop through the blocks.
def read_block( position, i ):
# Move to the position in the file.
input_file.seek( position, 0 )
# Read the data length header.
data_length = int.from_bytes( input_file.read( header_length ), "little" )
# Move to the data block.
input_file.seek( position + header_length, 0 )
# Read the data.
data = input_file.read( data_length )
# Read the pointer header.
next_position = int.from_bytes( input_file.read( pointer_length ), "little" )
# If this is the final block, it may have null padding. Remove it.
if ( next_position == 4294967295 ) :
data = data.rstrip(b"\0")
# Append the data to the decoded file.
with open( decoded_file, "ab" ) as file:
file.write( data )
# If this is the final block, finish searching.
if ( next_position == 4294967295 ) :
print("File decoded.")
else:
# Move to the next position.
read_block( next_position, i+1 )
# Open the file as binary.
input_file = open( "output.rff", "rb" )
# Read the last 4 bytes.
input_file.seek( -4, 2 )
# Get position of first block
first_block = int.from_bytes( input_file.read(), "little" )
# Start reading the file.
seek_to = first_block
read_block( seek_to, 0 )
</code></pre>
<p>As I said, these are both trivial. They are a bit buggy and contain some hardcoded assumptions.</p>
<p>Here are two files encoded as "RFF" - Random File Format - <a href="https://shkspr.mobi/blog/wp-content/uploads/2026/03/output.jpg.rff">an image</a> by Maria Sibylla Merian, and the <a href="https://shkspr.mobi/blog/wp-content/uploads/2026/03/output.txt.rff">text of Romeo and Juliet</a>.</p>
<p>Have fun decoding them!</p>