Shellsharks Blogroll - BlogFlock2025-12-05T16:40:28.990ZBlogFlockWerd I/O, cool-as-heck, Evan Boehs, destructured, Aaron Parecki, <span>Songs</span> on the Security of Networks, Adepts of 0xCC, cmdr-nova@internet:~$, Sophie Koonin, Westenberg, fLaMEd, Hey, it's Jason!, gynvael.coldwind//vx.log (pl), Johnny.Decimal, Terence Eden’s Blog, James' Coffee Blog, Molly White, joelchrono, Robb Knight, Trail of Bits Blog, Posts feed, Kev QuirkEvery ongoing game I have in 2025 - Joel's Log Fileshttps://joelchrono.xyz/blog/every-ongoing-game-20252025-12-05T15:50:00.000Z<p>During November, the <a href="https://joelchrono.xyz/blog/november-2025-summary/">gaming section</a> was filled with ongoing games for some reason. There were so many that my friend <a href="https://brainbaking.net">Wouter</a> pointed it out to me, surely his backlog is less than mine right?</p>
<p>Anyway, I decided to share an updated list of every game I played, even if only for a day, during 2025, and that I am yet to complete.</p>
<p>I will eventually list a proper section on my website with all the games I have completed, as they are not present on this post.</p>
<p><a href="https://backloggd.com/u/joelchrono">Backloggd</a> has been a fantastic resource for this! You can follow my profile there if you wish. I am kinda obsessed with filling my whole gaming life on it, and posts like this wouldn’t exist without it—I could just do a normal spreadsheet but whatever.</p>
<h2 id="partymultiplayer-games">Party/Multiplayer games</h2>
<p>Here we have online or party games, that I just return to based on mood and the people I’m with, so they are constantly present in my gaming log.</p>
<ul>
<li>Nintendo Switch Sports</li>
<li>Mario Kart 8 Deluxe</li>
<li>Runbow</li>
<li>Mario Party 3</li>
<li>Worms W.M.D</li>
<li>Super Smash Bros Ultimate</li>
<li>Fortnite</li>
<li>Ultimate Chicken Horse</li>
<li>TMNT: Shredder’s Revenge</li>
<li>Ember Knights</li>
</ul>
<h2 id="i-dont-care">I don’t care</h2>
<p>These were games I tested or played for a bit, but ultimately decided I can abandon them for a while or simply don’t care enough about going back to them.</p>
<ul>
<li><strong>Ridge Racer 64</strong> - I already have the PSP Ridge Racers and they are better in every way.</li>
<li><strong>LocoRoco</strong> - Fun levels but there’s plenty of platformers for me to progress over this one.</li>
<li><strong>One Step from Eden</strong> - Pure gameplay, almost no story, I don’t know what is the point of what I’m doing at all.</li>
<li><strong>Batman: Arkham Asylum</strong> - Excellent game but my Laptop doesn’t have the power to play it how I wish I could.</li>
<li><strong>Brave Story: New Traveler</strong> - I could return to this, it had some charm, but I also have four Dragon Quest games and a dozen Final Fantasy games waiting for me.</li>
</ul>
<h2 id="might-finish-at-some-point">Might finish at some point</h2>
<ul>
<li><strong>Axiom Verge</strong> - I have played the starting hour a couple times and then I just get lost and I’m too proud to look up at a guide and see what I missed, once I do that or just find the path myself, I hope I can finish this.</li>
<li><strong>UFO 50</strong> - I’m just waiting for my physical collector’s edition to show up so I play it there!</li>
<li><strong>The Legend of Heroes: Trails in the Sky FC</strong> - The only reason I might not is because I already have the new remake for Nintendo Switch and there’s a high chance I just stick to that, still can’t put this one off the list though.</li>
<li><strong>Minecraft</strong> - Umm, believe it or not I have never beaten Minecraft properly, but it’s something I’ll always be willing to play anyway so it’s fine.</li>
<li><strong>Ridge Racer 2</strong> - I am currently stuck in 1 vs 1 races against some difficult adversaries, but I’ll get around to it someday, gotta get better at drifting!</li>
<li><strong>Slice & Dice</strong> - I am not sure if there is any such thing as finishing this game, but I’ll definitely play more.</li>
<li><strong>Balatro</strong> - Same as the above.</li>
<li><strong>Faster Than Light</strong> - Same as the above.</li>
<li><strong>Dicey Dungeons</strong> - Same as the above.</li>
</ul>
<h2 id="must-finish-at-some-point">Must finish at some point</h2>
<ul>
<li><strong>Full Metal Furies</strong> - Since this game is one of my favorites in multiplayer, it has an actual campaign and level progression and the like, I think I’ll definitely finish it, as long as my friends are up for the challenge.</li>
<li><strong>Portal 2</strong> - It’s Portal, I obviosly have to complete it. I should play the first one first though.</li>
<li><strong>Advance Wars</strong> - If I finished <em>Fire Emblem: The Blazing Blade</em> I can deal with this one too right? Not sure in a year, but yes.</li>
<li><strong>Streets of Rage 1 & 2</strong> - I could beat both of these in one sitting I’m sure, I just need to get to it with a friend, but the 2-player limit isn’t ideal.</li>
<li><strong>Triangle Strategy</strong> - I have loved the actual gameplay of this even if the story has felt a little meh to me, so I want to see how the tactics evolve!</li>
<li><strong>Spelunky</strong> - I just have to do a full run at some point, the game has everything to be beaten in one sitting after all!</li>
<li><strong>Monster Hunter Rise</strong> - I want hundreds of hours on this, I want to reach the DLC and G-Rank content!</li>
<li><strong>Dungeon Antiqua</strong> - This has been fun and simple even if I haven’t reached that far yet, but it can’t be that difficult to beat right?</li>
</ul>
<h2 id="might-finish-next-year">Might finish next year</h2>
<ul>
<li><strong>The Hundred Line: Last Defense Academy</strong> - The stories of this game have been amazing, but they also feel like something to experience in medium doses over different periods of time! I will chug along as much as I can though.</li>
<li><strong>Final Fantasy VII</strong> - This is another one where it’s just ridiculous, I have a lot of progress and I know where to go next, I just need to actually go there and progress the story for once! Let’s goooo.</li>
<li><strong>Ys I & II Chronicles</strong> - I must admit the fact I need to talk to everyone to know what’s going on turned me off a bit, but it’s also charming! I just keep choosing <em>Ridge Racer 2</em> whenever I turn on my PSP.</li>
<li><strong>Super Mario 3D World</strong> - The only thing holding me from beating this game is that I only play it with friends and that I want all the stickers and stars! Proper completion with other people is a little tough, but we are dealing with it!</li>
<li><strong>Xenoblade Chronicles: Definitive Edition</strong> - I played like 6 hours in one sitting and I was so into it, but all the other games made me fall in despair and I decided to let it go for now.</li>
<li><strong>Solomon’s Club</strong> - This little puzzle game is similar to Mario vs Donkey Kong in style. Single screen levels that I shouldn’t have a hard time beating! They have been fun so it’d be nice to check out in short spans.</li>
<li><strong>Dredge</strong> - I started this on a whim when I kinda got into laptop gaming, but things changed a bit and kinda left it behind, there’s nothing I disliked really so I might give it a go again, maybe get it on Switch.</li>
</ul>
<h2 id="must-finish-next-year">Must finish next year</h2>
<ul>
<li><strong>Hades</strong> - Only a few more successful runs to reach credits, although I may end up playing it way more as well, simply because it’s that good. The story here has been amazing, and the voice acting as well, I love it everytime I open it.</li>
<li><strong>Dragon Quest XI S: Echoes of an Elusive Age - Definitive Edition for Nintendo Switch</strong> - This is probably the most long term game I have other than <em>The Hundred Line</em>, but it has always managed to hold my attention and fuel my enthusiasm for gaming as a whole whenever I return to it. It’s just a masterpiece!</li>
<li><strong>CrossCode</strong> - I wish I could complete it in 2025, but I find it harder to believe given its length, great game so far though. Playing along other friends too.</li>
<li><strong>Final Fantasy VI</strong> - I am on the second half now, I know I can do this! I really must try my best! The future looks grim, the characters are at their lowest, the world is in pain, but we keep moving forward!</li>
<li><strong>The Legend of Zelda: Breath of the Wild</strong> - And this, this has been such a joy, I am pretty much in the late game now. I really need to get a grip to finish the story, but I also genuinely want to explore every single secret this game has to offer! I even got the DLC for it and I am yet to experience it all.</li>
<li><strong>Final Fantasy IV: The Complete Collection</strong> - I really just need to grind and level up for the final dungeon, and then I’ll be happy.</li>
</ul>
<h2 id="might-finish-before-the-year-ends">Might finish before the year ends</h2>
<ul>
<li><strong>Astro Boy: Omega Factor</strong> - As a platformer/beat’em up, this game is just impossible not to complete, especially with save states and the like! It’s just a matter of how often I play it so I reach credits on it!</li>
<li><strong>Mario vs Donkey Kong</strong> - Since I’m past the halfway point, I think I have a decent shot if I commit to this during my commutes and dead times. We will see how it goes.</li>
</ul>
<h2 id="must-finish-before-the-year-ends">Must finish before the year ends</h2>
<ul>
<li><strong>Hollow Knight: Silksong</strong> - The one and only, the clear objective, my main target. I want to beat the boss, I want to uncover the mysteries of Pharloom! I want to do everything it has to offer in the following Act. I am going to try my best, if a fellow workmate managed to do it, so can I!</li>
</ul>
<h2 id="finishing-thoughts">Finishing thoughts</h2>
<p>Wow, that’s almost 50 games I’ve played but didn’t complete this year…</p>
<p>And well, there you have it. There are some other games that I have not played since 2024 that I still consider to be ongoing, but we will leave those out for the sake of brevity.</p>
<p>I think this makes it clear though, I have a bit of a problem, yes. However, by listing all my ongoing games I can at least point at something and know what I should focus on next. Categorising them the way I did was rather helpful too! I will try to not get to new games until I can at least complete some of the ones I got here.</p>
<p>
<a href="mailto:me@joelchrono.xyz?subject=Every ongoing game I have in 2025">Reply to this post via email</a> |
<a href="https://fosstodon.org/@joel/115667783300930937">Reply on Fediverse</a>
</p>A new home page - James' Coffee Bloghttps://jamesg.blog/2025/12/05/a-new-home-page/2025-12-05T15:10:47.000Z
<p>I have been thinking about redesigning my website for a while. I wrote a bit about <a href="https://jamesg.blog/2025/11/29/experimenting-with-web-design">one of the design directions I explored</a> recently. I loved doing the design part of the project, but knew there would be several hours of work to integrate the new style into my website.</p><p>Today I came back to the metaphorical drawing board – aka, browser developer tools – and started tinkering around with designing only a new home page. This gave me room to play while also not committing myself to redesigning my whole website. <em>I wonder what I can make!</em></p><p>After lots of exploration, <a href="https://jamesg.blog" rel="noreferrer">I have a new home page</a>!</p><p>My motivation was especially piqued today as I am reading “The Non-Designer’s Design Book,” the IndieWeb Book Club choice for this month. I have learned a lot from the book so far; the more I read, the more I wanted to start designing something. </p><p>The source code behind my new home page is a bit messy: I designed the page in developer tools, copied the changed CSS, and pasted it onto a new page. With that said, maybe this in itself tells a story – that this is a project fuelled by experimentation and play and the immediate feedback that the browser gives you as you write and arrange and re-arrange HTML and CSS within the developer tools. I had so much fun making the new design!</p><p>For posterity – for I am cognisant that over the years my home page is likely to change more, and I like to have an archive of some of my designs – here is a screenshot of my home page as it is now:</p><img alt="" class="kg-image" loading="lazy" sizes="(min-width: 720px) 720px" src="https://editor.jamesg.blog/content/images/2025/12/home.png" srcset="https://editor.jamesg.blog/content/images/size/w600/2025/12/home.png 600w, https://editor.jamesg.blog/content/images/size/w1000/2025/12/home.png 1000w, https://editor.jamesg.blog/content/images/size/w1600/2025/12/home.png 1600w, https://editor.jamesg.blog/content/images/2025/12/home.png 2368w"/><p>I may end up designing other pages on my website in a similar theme, but for now I'm happy with the work I did on the home page!</p>
Friday links: December 5, 2025 - Werd I/O693254372868ec0001ffe5212025-12-05T10:00:25.000Z<img src="https://images.unsplash.com/photo-1461088945293-0c17689e48ac?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDl8fGNvbW11bml0eXxlbnwwfHx8fDE3NjQ4MTQyNDB8MA&ixlib=rb-4.1.0&q=80&w=2000" alt="Friday links: December 5, 2025"><p><em>This week I'm re-launching my links digest. Every Friday, I'll share a handful of pieces that caught my eye, usually somewhere in the messy, fascinating overlap of technology, media, and society. Occasionally, I'll stray further afield.</em></p><p><em>This week: what might come after the AI hype cycle, how new community platforms are trying to rethink participation, why our urban spaces may be pushing kids online, and how the Trump administration is using immigration enforcement to pressure online communities.</em></p><p><em>These pieces share a familiar tension: the friction between communities we build for ourselves and systems imposed from above. It's a question that runs through all my work: how do we design technology that strengthens communities rather than extracts from them?</em></p><hr><h3 id="what-happens-after-the-hype-lessons-from-mobile-internet%E2%80%99s-long-road-to-success"><a href="https://shomila.medium.com/what-happens-after-the-hype-lessons-from-mobile-internets-long-road-to-success-22d0b15e0625?ref=werd.io" rel="noreferrer">What Happens After the Hype? Lessons from Mobile Internet’s Long Road to Success</a></h3><p>We’re beginning to see the light at the end of the AI hype cycle. That doesn’t mean that there aren’t uses for aspects of the technology, but it does mean that some of the hyperbole will diminish as investors and speculators move on to the next thing.</p><p>As <a href="https://ecruecard.com/?ref=werd.io">Ecrue</a> founder Shomila Malik points out here:</p><blockquote>“The question isn’t whether the current AI investment cycle will face a reckoning. It’s what form that reckoning takes — and what comes after.”</blockquote><p>The lessons she draws from the mobile industry’s hype and decline also parallel what happened during the dotcom crash, when a lot of companies went away but a lot of underlying useful infrastructure was left for the next generation of innovations. But a facet of how those two events were different is exactly <em>how</em> they imploded:</p><blockquote>“The difference between a pop and a deflation often comes down to how adaptable the infrastructure is. 3G networks built for one vision of mobile internet ended up powering something completely different — but they still got used. The investment wasn’t wasted, just redirected. Time will tell if AI will be a deflation like mobile internet or a ear deafening explosion like the dot com crash.”</blockquote><p>Either way, investment is way ahead of proven capabilities or even business models. Companies like OpenAI are losing money hand over fist. At some point, these endeavors have to touch oxygen, and either they’ll find their way to stunning profitability, or they’ll fizzle into acquisitions at best and leave some interesting ideas behind.</p><p>My bet? Ten years from now we’ll be looking at a series of smaller, more focused models that perform well-scoped tasks really well, and we’ll look back at the hype around generalized megamodels — and particularly AGI — with rolled eyes and a slight shudder when we remember the environmental and human impacts.</p><hr><h3 id="introducing-roundabout"><a href="https://newpublic.substack.com/p/introducing-roundabout-built-for?ref=werd.io" rel="noreferrer">Introducing Roundabout</a></h3><p>Really interesting to see <a href="https://newpublic.org/?ref=werd.io">New_ Public</a> announce its first community product from its <a href="https://newpublic.org/local?ref=werd.io">Local Lab</a>:</p><blockquote>“The main thing to know, maybe the most important thing, is that this is not just another social media app. Roundabout is a community space, built from the ground up with community leaders and neighbors.<br><br>[…] As a project incubated within New_ Public, a nonprofit, Roundabout will grow incrementally, sustained by a diverse and balanced set of revenue sources. With business incentives aligned towards utility and everyday value, instead of engagement and relentless scale, we’re designing Roundabout to be shielded from the cycle of enshittification. The ultimate goal is to build for social trust — every decision, every design, optimized to build bonds and increase belonging.”</blockquote><p>There’s a lot to comment on here.</p><p>It’s <em>amazing</em> to see a social product co-designed with communities. For the safety and equity of all involved, this is how it should be done. I really hope New_ Public shows off more of its methodology in the future. I’d love to dive into the meta-conversation about what they’ve learned about this kind of co-design. The descriptions of participating communities — in Burlington, NC; Richmond, VA; Lincoln County, WI; North Chattanooga, TN; and Lancaster, PA — are already really promising.</p><p>The technical lead is <a href="https://bsky.app/profile/blaine.bsky.social?ref=werd.io">Blaine Cook</a>, who you might remember as Twitter’s first employee and first CTO. Since then he’s been a strong, sharp advocate for decentralized social.</p><p>On Mastodon, New_ Public <a href="https://mastodon.social/@wearenew_public/115645643962877064?ref=werd.io">mentioned that it’s building the platform in a way that’s compatible with AT Protocol</a>, although it’s not the main focus for now.</p><p>Over on Bluesky, <a href="https://bsky.app/profile/blaine.bsky.social/post/3m6vbrdgvn22a?ref=werd.io">Blaine said they’re</a> “building on atproto primitives but off-network because it's currently not possible to push private/scoped data around the wider atproto network.” He also made the important point that it’s not worth building for interop until you know what the user behaviors are actually going to be — so it’s too early to focus on decentralization.</p><p>That community co-design is key, and it makes sense that this is the first step. Communities are human; they can’t be defined by protocols. The protocols should describe real human behavior, not the other way around.</p><p>I’m excited to see how the platform develops, and how New_ Public seeds the ecosystem conversations around it. And: this is only one of its community initiatives. There’s more to come.</p><hr><h3 id="where-do-the-children-play"><a href="https://unpublishablepapers.substack.com/p/where-do-the-children-play?ref=werd.io" rel="noreferrer">Where Do the Children Play?</a></h3><p>This meaningful discussion touches on the role — and dangers — of online spaces in the lives of children, but has a lot more to say about how our lives and environments are designed overall.</p><blockquote>“[…] Digital space is the only place left where children can grow up without us. For most of our evolutionary history, childhood wasn’t an adult affair. Independent worlds and peer cultures were the crux of development, as they still are among the BaYaka; kids spent their time together, largely beyond the prying eyes of grown-ups.<br><br>But in the West, the grown-ups have paved over the forests and creeks where children would have once hidden. They have exposed the secret places. So the children seek out a world of their own, as they have for millennia, if not longer. They find a proverbial forest to wander. They don’t know what we know: this forest has eyes and teeth.”</blockquote><p>There are some really striking statistics here. 45% of American children aged 8-12 have not walked in a different aisle than their parents at a store; 61% have not made plans with friends without adults helping them. That’s so far away from my own childhood to be unrecognizable. It’s also wildly oppressive. Of <em>course</em> kids are looking for spaces where their helicopter parents aren’t constantly hovering overhead.</p><p>The biggest source of underlying fears from parents, as well as feelings of isolation from children themselves? A car-centric culture. Parents are worried about their children being hit by a car, which unfortunately isn’t unreasonable. Children, on the other hand, can’t drive, and often find themselves fully unable to visit friends or have their own lives without the participation of someone with a license.</p><p>So, yes, online spaces need to be safer for children — but our lived-in spaces also need to be more human. American infrastructure in particular is architected for control; it’s rare to live in a walkable, safe environment. <a href="https://en.wikipedia.org/wiki/Jane_Jacobs?ref=werd.io">Jane Jacobs</a> would have had a lot to say about this analysis, and her own solutions still hold up. We need to stop dividing communities, break the influence of the car, and create spaces that allow humans to roam, live, eat, and play — permissionlessly.</p><hr><h3 id="trump-administration-orders-enhanced-vetting-for-applicants-of-h-1b-visa"><a href="https://www.reuters.com/world/us/trump-administration-orders-enhanced-vetting-applicants-h-1b-visa-2025-12-04/?ref=werd.io" rel="noreferrer">Trump administration orders enhanced vetting for applicants of H-1B visa</a></h3><p>The US has taken the extraordinary move of blocking H-1B visa recipients who work to keep online spaces safe from abuse:</p><blockquote>“The cable, sent to all U.S. missions on December 2, orders U.S. consular officers to review resumes or LinkedIn profiles of H-1B applicants - and family members who would be traveling with them - to see if they have worked in areas that include activities such as misinformation, disinformation, content moderation, fact-checking, compliance and online safety, among others.<br><br>If you uncover evidence an applicant was responsible for, or complicit in, censorship or attempted censorship of protected expression in the United States, you should pursue a finding that the applicant is ineligible," under a specific article of the Immigration and Nationality Act, the cable said.”</blockquote><p>The message here is very clear: the people who make online communities safe are not welcome in the United States. Trust and safety is a very wide field, which encompasses the policies, processes, and technologies online platforms use to protect users from harm, ensure a secure environment, and maintain user trust. Compliance ensures that safety rules are adhered to. None of these activities constitute censorship.</p><p>These capabilities are required to make online communities livable. Without them, online spaces become toxic very quickly. The ultimate effect of this policy — if spread beyond H-1B visa holders — would be to make US-run online spaces unusable, and drive users elsewhere. If you want the future of social to be defined in other countries, it’s a great path to take. Otherwise, it’s stunningly short-sighted.</p><hr><h3 id="my-life-is-a-lie-how-a-broken-benchmark-quietly-broke-america"><a href="https://www.yesigiveafig.com/p/part-1-my-life-is-a-lie?ref=werd.io" rel="noreferrer">My Life is a Lie: How a Broken Benchmark Quietly Broke America</a></h3><p>Simplify Asset Management’s Chief Strategist and Portfolio Manager <a href="https://www.yesigiveafig.com/?ref=werd.io">Michael W Green</a> examined how the US poverty line is determined, and discovered that it has been wildly miscalculated for years. In fact:</p><blockquote>“[…] if you measured income inadequacy today the way Orshansky measured it in 1963, the threshold for a family of four wouldn’t be $31,200.<br><br>It would be somewhere between $130,000 and $150,000.”</blockquote><p>The big differentiator is childcare, which in the US averages out at $32,773 a year, but it’s not the <em>only</em> differentiator. Our costs are enormous, and a poverty line at $31,200 only really helps legislators avoid having to provide (and therefore pay for) real support.</p><p>A family of four that genuinely earns $32,773 will receive all kinds of state help. A family that earns $80,000 does not. As Green points out, the difference largely comes from costs that went away during the pandemic:</p><blockquote>Childcare ($32k): Suspended. Kids were home.<br><br>Commuting ($15k): Suspended.<br><br>Work Lunches/Clothes ($5k): Suspended.</blockquote><p>Of course, many incomes <em>also</em> went away, depending on the jobs that were keeping these families afloat. Knowledge workers were relatively sitting pretty, while people who worked in retail, etc, were in trouble. There’s a lot more help that we can provide <em>everyone</em>. But this is one reason why I cannot stand return to office mandates, particularly when peoples’ salaries are under the $140,000 threshold that Green identifies. (Hint: outside high earning categories like big tech, it’s almost all of them, and inside those categories there are plenty of people who are earning lower.)</p><p>In future posts, it sounds like Green is moving to show that 401(k)s and similar instruments are also a scam for most ordinary earners — something I tend to agree with (at least compared to more pro-social alternatives). If society is an operating system that allows people to live well, start businesses, be healthy, etc, it’s failing us on every level. I say it’s time for an upgrade.</p><hr><h3 id="disagree-and-lets-see"><a href="https://mollyg.substack.com/p/disagree-and-lets-see?ref=werd.io" rel="noreferrer">"Disagree and Let's See"</a></h3><p>This feels emotionally honest and an idea I can get behind, as an alternative to the popular “disagree and commit”:</p><blockquote>““Disagree and let’s see” allows you to stay aligned with the team without forcing you to pretend you had conviction you didn’t have. It lets you walk into a room with your team and be honest:<br><br>“Here’s the path that was chosen. It wasn’t my first pick, but here’s the experiment we’re running, and here’s what we’re trying to learn.””</blockquote><p>Committing to something you disagree with is an emotional contortion that is hard to do in practice. But the work of every team is a series of experiments at its heart, and by changing the onus from “let’s commit to this thing we don’t all agree with” to “let’s try it and see what happens”, we move from steamrollering dissent to mutually agreeing on an experimental hypothesis and testing it. You’re learning based on agreed criteria.</p><p>That’s much harder to argue with — and at the end, there’s no “I told you so” or winners and losers. There’s just a “here’s what we learned” and an implied set of next steps. Bliss.</p><p>It's worth saying that this was the original intention when Jeff Bezos coined the phrase <a href="https://www.aboutamazon.com/news/company-news/2016-letter-to-shareholders?ref=werd.io" rel="noreferrer">in his 2016 letter to Amazon shareholders</a>:</p><blockquote>Third, use the phrase “disagree and commit.” This phrase will save a lot of time. If you have conviction on a particular direction even though there’s no consensus, it’s helpful to say, “Look, I know we disagree on this but will you gamble with me on it? Disagree and commit?” By the time you’re at this point, no one can know the answer for sure, and you’ll probably get a quick yes.<br><br>This isn’t one way. If you’re the boss, you should do this too. I disagree and commit all the time. We recently greenlit a particular Amazon Studios original. I told the team my view: debatable whether it would be interesting enough, complicated to produce, the business terms aren’t that good, and we have lots of other opportunities. They had a completely different opinion and wanted to go ahead. I wrote back right away with “I disagree and commit and hope it becomes the most watched thing we’ve ever made.” Consider how much slower this decision cycle would have been if the team had actually had to convince me rather than simply get my commitment.</blockquote><p>The perception among many people is that it's morphed into a kind of corporate authoritarianism. So in some ways, "disagree and let's see" is just a course correction back to its original intent.</p><hr><h3 id="imperfect-notes-my-second-subconscious"><a href="https://winnielim.org/journal/imperfect-notes-my-second-subconscious/?ref=werd.io" rel="noreferrer">imperfect notes & my second subconscious</a></h3><p>I’ve never been a successful notetaker. <a href="https://winnielim.org/?ref=werd.io">Winnie Lim</a> enumerates the many reasons why not, which seem to be very close to her thinking too:</p><blockquote>“Because of my personality I tend to solve for the whole before wanting to do something. For years I wanted to figure out how I could retrieve the notes in a meaningful manner before I committed to making them. If I cannot remember I had made the note, did the note really exist?”</blockquote><p>The problem is that you end up trying to come up with a smart taxonomy of notes ahead of time — and that’s always bound to fail, at least for me. I’ve lost count of the number of times I’ve wiped my Obsidian vault clean because I didn’t like the structure or the maintenance of it all threatened to overtake any utility. Instead, as Winnie points out, the best thing to do is just <em>write the note</em>. It’s a bit like throwing the text into a big bucket, and that’s okay.</p><p>I hate to say it, but this might be a decent use case for some kind of personal LLM (ideally on-device so I’m not sharing my private notes with a third party I don’t trust). If you’re constantly just making notes without structure, being able to ask something about their content feels like it would have a lot of utility — again, at least for me. I’d love to be able to have my notes about a certain topic summarized when I need them. Or even have the summary proactively come up for me depending on my context.</p><p>Then again, maybe that doesn’t matter at all:</p><blockquote>“My brain is constantly holding scattered bits of information so it is just better to offload them somewhere in one place. I think the main difference is I don’t see obsidian as my second brain, I see it as my second subconscious.”</blockquote><p>I like that. Blogging is a little bit that for me, but blogging has an audience. There’s something useful in being the Harriet the Spy of your own life and putting words to things that otherwise might go unsaid. There’s poetry in it, too, which is very obvious from Winnie’s post.</p><p>I’ll give notetaking another try.</p><hr>Turning my reading list into podcasts - Posts feedhttps://www.coryd.dev/posts/2025/turning-my-reading-list-into-podcasts2025-12-05T00:23:00.000Z<p><a href="https://linkding.link">linkding</a> is one of my favorite applications that I self-host and the place where I save everything I want to read later. The catch being that what little time I can dedicate to <em>actually</em> reading is spent on books. What I <em>do</em> have is time where I can listen to things while doing chores around the house, out on walks or otherwise engaged in an activity that doesn't demand my full, undivided attention.</p>
<p>I typically consume short form writing by listening to it. In the past, I've used <a href="https://en.wikipedia.org/wiki/Pocket_(service)">Pocket</a><sup id="fnref:1"><span>1</span></sup>, <a href="https://www.instapaper.com">Instapaper</a>, <a href="https://readwise.io/read">Readwise's Reader</a> and Safari's listen to page feature for this. Safari had become something of a default choice for this as I didn't have a compelling, self-hosted option available. So I built one.</p>
<p>I use <a href="https://www.audiobookshelf.org">Audiobookshelf</a> to listen to audiobooks and podcasts, making it a natural fit to listen to the articles I save. Neither Safari nor <a href="https://readwise.io/read">Readwise's Reader</a> support queueing articles to listen to<sup id="fnref:2"><span>2</span></sup>, which meant starting playback manually for each article listened to. <a href="https://www.audiobookshelf.org">Audiobookshelf</a> and the clients I've used all support queueing, which solves that particular usability pain point.</p>
<p>I have text, I have a solution for playing audio which left me needing to coerce the former into the latter. Rather than dump my entire bespoke project repo into a blog post, the high level flow looks like this:</p>
<ol>
<li>Deploy the project to my <a href="https://www.audiobookshelf.org">Audiobookshelf</a> server using <a href="https://coolify.io">Coolify</a>.
<ul>
<li>The deploy clones the project, installs dependencies, downloads a <a href="https://github.com/OHF-Voice/piper1-gpl">Piper</a> voice model from <a href="https://huggingface.co">Hugging Face</a><sup id="fnref:3"><span>3</span></sup>, and configures a cron job to run every 5 minutes.</li>
</ul>
</li>
<li>Every 5 minutes the deployed application will check <a href="https://linkding.link">linkding</a> for new items.</li>
<li>If an item has not been converted to audio, is unread and is not tagged with <code>video</code> or <code>podcast</code>, the article text is fetched and parsed using Mozilla's <a href="https://github.com/mozilla/readability">Readability.js</a>.<sup id="fnref:4"><span>4</span></sup></li>
<li>Once parsed, the article is processed further into a string that will be converted to speech. This string is simply the following concatenated together: article title, author and content. Pauses are added after periods that don't otherwise have one, URLs are cleaned up and email addresses are removed.</li>
<li>The processed text is written to a temporary text file and passed to <a href="https://github.com/OHF-Voice/piper1-gpl">Piper</a> to generate a WAV file using the voice model downloaded when the application is deployed. <a href="https://www.ffmpeg.org">ffmpeg</a> is used to convert the WAV file to an mp3 and <a href="https://www.npmjs.com/package/node-id3">node-id3</a> is used to tag the resulting file.
<ul>
<li>The tag data is fairly simple — the article title is the episode title, a consistent, static podcast title (<code>Linkding Articles</code>) and artist (<code>Linkding TTS Bot</code>) and the article author and description are saved to the episode description. Year and date correspond to when the item was saved, the show art is the <a href="https://linkding.link">linkding</a> logo/icon and the rest is generic podcast metadata expected by <a href="https://www.audiobookshelf.org">Audiobookshelf</a>.</li>
</ul>
</li>
<li>Once the audio is generated and tagged, the app triggers a scan of my podcast library using the <a href="https://www.audiobookshelf.org">Audiobookshelf</a> API.</li>
</ol>
<p>With all of this in place, I can save things to <a href="https://linkding.link">linkding</a> and there will be an automatically generated queue waiting when I open my preferred <a href="https://www.audiobookshelf.org">Audiobookshelf</a> client.<sup id="fnref:5"><span>5</span></sup><sup id="fnref:6"><span>6</span></sup></p>
<div class="footnotes" role="doc-endnotes"><hr><ol><li class="footnote" id="fn:1" role="doc-endnote"><p>RIP. <span>↩</span></p></li>
<li class="footnote" id="fn:2" role="doc-endnote"><p>Or didn't when I last used them. <span>↩</span></p></li>
<li class="footnote" id="fn:3" role="doc-endnote"><p>Gross! I know. <span>↩</span></p></li>
<li class="footnote" id="fn:4" role="doc-endnote"><p>To avoid generating duplicate audio files, the ID for each processed article is stored in an array in a JSON file available to the application. The current episode number is also stored in this file. <span>↩</span></p></li>
<li class="footnote" id="fn:5" role="doc-endnote"><p>At the moment, this is <a href="https://github.com/rasmuslos/ShelfPlayer">ShelfPlayer</a>. <span>↩</span></p></li>
<li class="footnote" id="fn:6" role="doc-endnote"><p>If a site happens to disallow access when I try and fetch the article text, I'll stop trying to fetch it. If I encounter an error (e.g. a <code>5XX</code> response), I'll retry periodically using an exponential backoff mechanism. <span>↩</span></p></li></ol></div>
Trump administration orders enhanced vetting for applicants of H-1B visa - Werd I/O693225092868ec0001ffe51b2025-12-05T00:19:21.000Z<p>[<a href="https://www.reuters.com/world/us/trump-administration-orders-enhanced-vetting-applicants-h-1b-visa-2025-12-04/?ref=werd.io">Humeyra Pamuk for Reuters</a>]</p><p>The US has taken the extraordinary move of blocking H-1B visa recipients who work to keep online spaces safe from abuse:</p><blockquote>“The cable, sent to all U.S. missions on December 2, orders U.S. consular officers to review resumes or LinkedIn profiles of H-1B applicants - and family members who would be traveling with them - to see if they have worked in areas that include activities such as misinformation, disinformation, content moderation, fact-checking, compliance and online safety, among others.<br><br>If you uncover evidence an applicant was responsible for, or complicit in, censorship or attempted censorship of protected expression in the United States, you should pursue a finding that the applicant is ineligible," under a specific article of the Immigration and Nationality Act, the cable said.”</blockquote><p>The message here is very clear: the people who make online communities safe are not welcome in the United States. Trust and safety is a very wide field, which encompasses the policies, processes, and technologies online platforms use to protect users from harm, ensure a secure environment, and maintain user trust. Compliance ensures that safety rules are adhered to. None of these activities constitute censorship.</p><p>These capabilities are required to make online communities livable. Without them, online spaces become toxic very quickly. The ultimate effect of this policy — if spread beyond H-1B visa holders — would be to make US-run online spaces unusable, and drive users elsewhere. If you want the future of social to be defined in other countries, it’s a great path to take. Otherwise, it’s stunningly short-sighted.</p><p><a href="https://bsky.app/profile/klonick.bsky.social/post/3m76jfbuwcc2c?ref=werd.io">Via Kate Klonick, who highlighted it over on Bluesky.</a></p><p>[<a href="https://www.reuters.com/world/us/trump-administration-orders-enhanced-vetting-applicants-h-1b-visa-2025-12-04/?ref=werd.io">Link</a>]</p>Hunting for the Hottest Pink Ink - Robb Knight • Posts • Atom Feedhttps://rknight.me/blog/hunting-for-the-hottest-pink-ink/2025-12-04T21:09:14.000Z<p>When I was <a href="https://rknight.me/blog/i-was-a-guest-on-the-pen-addict-689/">on The Pen Addict</a> a few weeks ago, I mentioned I was looking for the hottest pink ink the world has to offer to go with my <a href="https://www.esterbrookpens.com/products/funky-town-estie?variant=47785259434234">Estie Funky Town</a>. I got loads of suggestions and I eventually stumbled on an ink that I think is perfect for what I wanted - <a href="https://www.octopus-office.de/shop/en/creative-inks/fountain-pen-ink-writing-ink/highlighter-neon-inks/7759/highlighter-ink-for-fountain-pens-fluorescent-neon-pink-30-ml?c=4679">Octopus Fluids Neon Pink</a>.</p>
<p>I ordered a bunch of inks during Black Friday day/week/month and Ben sent me a sample of <a href="https://mountainofink.com/blog/robert-oster-hot-pink">Robert Oster Hot Pink</a>. It wasn't until after I got all these inks that I <em>then</em> realised I already owned a very similar ink that was also what I was looking for, <a href="https://mountainofink.com/blog/diamine-hope-pink">Diamine Hope Pink</a>, but I had misremembered and didn't think it was as bright as it was. Some of these I knew wouldn't be the winner but I wanted anyway because they're nice colours - Wearingeul Cheshire Cat for example. Nevertheless, here's the samples:</p>
<figure><img src="https://cdn.rknight.me/site/2025/hot-pink-ink-samples.jpg" alt="A notepad showing nine different ink samples all of various shades of pink and purple. Below is a bright pink fountain pen." /></figure>
<p>There are more than I don't have from the suggestions including:</p>
<ul>
<li><a href="https://mountainofink.com/blog/pilot-iroshizuku-tsutsuji">Pilot Iroshizuku Tsutsuji</a> which Brad is sending me a sample of</li>
<li><a href="https://mountainofink.com/blog/diamine-pink-glitz">Diamine Pink Glitz</a></li>
<li><a href="https://mountainofink.com/blog/lamy-rhodonite">Lamy Rhodonite</a></li>
<li><a href="https://mountainofink.com/blog/sailor-ink-studio-set3">Sailor Ink Studio 431 and 731</a></li>
<li><a href="https://vanness1938.com/en-gb/products/colorverse-usa-special-series-ink-nevada-fabulous-las-vegas?srsltid=AfmBOortJ1E78ZumSw4kqER06LvjcIs_Z9IrsFER9IYpCtq7LYaETOe1">Colorverse Las Vegas</a></li>
</ul>
<p>There are a shedload of lovely pinks and purples here (and in general, <a href="https://mountainofink.com/blog/pink-ink">look at this list on Mountain of Ink</a>) and I can see myself using all of the ones I bought at different times. Although Hope Pink and Neon Pink look similar in the sample, Neon Pink definitely has a slight edge over the Diamine for me but I suspect if they weren't next to each other I wouldn't be able to tell the difference.</p>The Web Runs On Tolerance - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=639242025-12-04T12:34:34.000Z<p>If you've ever tried to write a computer program, you'll know the dread of a syntax error. An errant space and your code won't compile. Miss a semi-colon and the world collapses. Don't close your brackets and watch how the computer recoils in distress.</p>
<p>The modern web isn't like that.</p>
<p>You can make your HTML as malformed as you like and the web-browser will do its best to display the page for you. I love the <a href="https://www.todepond.com/">todepond</a> website, but the source-code makes me break out in a cold sweat. Yet it renders just fine.</p>
<p>Sure, <a href="https://news.ycombinator.com/item?id=28052190">occasionally there are weird artefacts</a>. But the web works because browsers are tolerant.</p>
<p>You can be <em>crap</em> at coding and the web still works. Yes, it takes an awful lot of effort from browser manufacturers to make "do what I mean, not what I say" a reality. But the world is better for it.</p>
<p>That's the crucial mistake that XHTML made. It was an attempt to bring pure syntactic rigour to the web. It had an intolerant ideology. Every document had to precisely conform to the specification. If it didn't, the page was irrevocably broken. I don't mean broken like a weird layout glitch, I mean broken like this:</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/xml-parsing-error.webp" alt="XML Parsing Error: mismatched tag. Expected: </h1>.
Location: https://example.com/test.xhtml Line Number 9, Column 5:" width="1800" height="600" class="aligncenter size-full wp-image-63925"/>
<p>The user experience of XHTML was rubbish. The disrespect shown to anyone for deviating from the One True Path made it an unwelcoming and unfriendly place. Understandably, XHTML is now a mere footnote on the web. Sure, people are free to use it if they want, but its unforgiving nature makes it nobody's first choice.</p>
<p>The beauty of the web as a platform is that it isn't a monoculture.</p>
<p>That's why it baffles me that some prominent technologists embrace hateful ideologies. I'm not going to give them any SEO-juice by linking to them, but I cannot fathom how someone can look at the beautiful diversity of the web and then declare that only pure-blooded people should live in a particular city.</p>
<p>How do you acknowledge that the father of the computer was a homosexual, brutally bullied by the state into suicide, and then fund groups that want to deny gay people fundamental human rights?</p>
<p>The ARM processor which powers the modern world was co-designed by a trans woman. When you throw slurs and denigrate people's pronouns, your ignorance and hatred does a disservice to history and drives away the next generation of talent.</p>
<p>History shows us that <em>all</em> progress comes from the meeting of diverse people, with different ideas, and different backgrounds. The notion that only a pure ethnostate can prosper is simply historically illiterate.</p>
<p>This isn't an academic argument over big-endian or little-endian. It isn't an ideological battle about the superiority of your favourite text editor. There's no good-natured ribbing about which desktop environment has the better design philosophy.</p>
<p>Denying rights to others is poison. Wishing violence on people because of their heritage is harmful to all of us.</p>
<p>Do we want all computing to go through the snow-white purity of Apple Computer? Have them as the one and only arbiters of what is and isn't allowed? No. That's obviously terrible for our ecosystem.</p>
<p>Do we want to segregate computer users so that an Android user can never connect their phone to a Windows machine, or make it impossible for Linux laptops to talk to Kodak cameras? That sort of isolation should be an anathema to us.</p>
<p>Why then align with people who espouse isolationism? Why gleefully cheer the violent racists who terrorise our communities? Why demean people who merely wish to exist?</p>
<p>The web runs on tolerance. Anyone who preaches the ideology of hate has no business here.</p>
An Early Look At My 2025 Music Recap - Cool As Heckhttps://cool-as-heck.blog/my-2025-music-recap2025-12-03T20:21:00.000Z<div>While my LastFM 2025 yearly report likely won't come in until after the new year, I've grabbed some screenshots from a few tools that work with the LastFM API.<br><br>None of this is really surprising. Sleep Token and Bilmuri have been my favorite bands for the last couple of years. Spiritbox is always in there, and Eidola has moved up the ranks lately. Architects, Novelists, Dayseeker, and Poppy were big ones for me this year as well.<br><br><figure class="attachment attachment--preview attachment--png">
<img alt="Uploaded image" data-lightbox-full-url="https://pagecord.com/cdn-cgi/image/width=1600,height=1200,format=webp,quality=90/https://storage.pagecord.com/nowxzqbo4bqfhffije4n3d5ola9i" src="https://pagecord.com/cdn-cgi/image/width=1600,height=1200,format=webp,quality=90/https://storage.pagecord.com/nowxzqbo4bqfhffije4n3d5ola9i">
<figcaption class="attachment__caption">
Listening Timeline
</figcaption>
</figure><br><figure class="attachment attachment--preview attachment--png">
<img alt="Uploaded image" data-lightbox-full-url="https://pagecord.com/cdn-cgi/image/width=1600,height=1200,format=webp,quality=90/https://storage.pagecord.com/ikfpbp4cbrayh0wa7fnb5k7hui26" src="https://pagecord.com/cdn-cgi/image/width=1600,height=1200,format=webp,quality=90/https://storage.pagecord.com/ikfpbp4cbrayh0wa7fnb5k7hui26">
<figcaption class="attachment__caption">
Listening Activity
</figcaption>
</figure><br><figure class="attachment attachment--preview attachment--png">
<img alt="Uploaded image" data-lightbox-full-url="https://pagecord.com/cdn-cgi/image/width=1600,height=1200,format=webp,quality=90/https://storage.pagecord.com/x63aibc7jmyb8er65qf76iul9fev" src="https://pagecord.com/cdn-cgi/image/width=1600,height=1200,format=webp,quality=90/https://storage.pagecord.com/x63aibc7jmyb8er65qf76iul9fev">
<figcaption class="attachment__caption">
Mainstream Factor
</figcaption>
</figure>
</div>
The Fisherman and The Businessman - Kev Quirkhttps://kevquirk.com/blog/the-fisherman-and-the-businessman/2025-12-03T14:17:00.000Z
<p style="font-size: 1.2em;">I didn’t expect a parable about a fisherman to smack me in the face with such clarity, but here we are.</p>
<p>While reading <a href="https://herman.bearblog.dev/grow-slowly-stay-small/">Grow slowly, stay small</a> on Herman’s blog, I learned about <em>The Fisherman and The Businessman</em>, which goes like this:</p>
<blockquote>
<p>A businessman meets a fisherman who is selling fish at his stall one morning. The businessman enquires of the fisherman what he does after he finishes selling his fish for the day. The fisherman responds that he spends time with his friends and family, cooks good food, and watches the sunset with his wife. Then in the morning he wakes up early, takes his boat out on the ocean, and catches some fish.</p>
<p>The businessman, shocked that the fisherman was wasting so much time encourages him fish for longer in the morning, increasing his yield and maximising the utility of his boat. Then he should sell those extra fish in the afternoon and save up until he has enough money to buy a second fishing boat and potentially employ some other fishermen. Focus on the selling side of the business, set up a permanent store, and possibly, if he does everything correctly, get a loan to expand the operation even further.</p>
<p>In 10 to 20 years he could own an entire fishing fleet, make a lot of money, and finally retire. The fisherman then asks the businessman what he would do with his days once retired, to which the businessman responds: “Well, you could spend more time with your friends and family, cook good food, watch the sunset with your wife, and wake up early in the morning and go fishing, if you want.”</p>
<p><cite>– Herman Martinus</cite></p>
</blockquote>
<p>Ah man, preach! This resonated so much because <a href="https://kevquirk.com/blog/career-snakes-ladders/">I recently realised that I’m The Fisherman</a>. Well, to be more accurate, I <em>was</em> The Fisherman posing as <em>The Businessman</em>. Now I’m just The Fisherman, and it’s lovely.</p>
<p>Since stepping down as an executive I’ve become happier, got far more job satisfaction, and I spend more time with my family. I’ve also realised that a lot of what was driving me was ego. I wanted to be important. I wanted the fancy title, the corner office, the <em>prestige</em>.</p>
<p>I wanted the job for all the wrong reasons.</p>
<p class="notice">I’m not saying all execs are egomaniacs. I’m saying <em>my</em> reasons for chasing that level were mostly ego. That’s on me.</p>
<p>At this point I have what I think is the perfect balance between pay, free time, and job satisfaction. I love my job again and I’m <em>really</em> fucking happy.</p>
<p>What’s the point of this post? Honestly, I have no idea. I just wanted to share this great little parable and say thanks to Herman for sharing it originally. If you’re not happy with your job, maybe it’s worth asking which one you’re being right now.</p>
<div class="email-hidden">
<hr>
<p>Thanks for reading this post via RSS. RSS is great, and you're great for using it. ❤️</p>
<p>
<a href="mailto:72ja@qrk.one?subject=The Fisherman and The Businessman">Reply to this post by email</a>
</p>
</div>
You can't legislate serendipity - Werd I/O692f23b02868ec0001ffe13b2025-12-02T17:40:35.000Z<img src="https://images.unsplash.com/photo-1559589688-6ba6beafe1e5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEyfHxldXJvcGV8ZW58MHx8fHwxNzY0Njk3MTQyfDA&ixlib=rb-4.1.0&q=80&w=2000" alt="You can't legislate serendipity"><p>A decade and change ago, I used to tell a story about three startups I was involved with, as a way of explaining why the Bay Area startup ecosystem was special. It went like this:</p><p>I founded my first startup in Edinburgh, Scotland. Everyone told me to get a real job and that it would never work. There were no investors.</p><p>The second startup I was involved with was founded in Austin. Everyone was super-enthusiastic, but the investors didn’t understand how technology was built, and had mismatched expectations about how their money would be spent.</p><p>The third was founded in San Francisco. Everyone was super-enthusiastic and the investors provided a ton of value because they knew the industry better than we did.</p><p>It’s Goldilocks and the Three Bears, of course: the San Francisco porridge was just right. But it’s also true — or, at least, it was at the time. Since I founded that first startup in 2004, Edinburgh has developed a small startup scene. The Austin tech scene is significantly more sophisticated than it was. San Francisco, though, is still going strong, and the Bay Area ecosystem continues to dominate the tech industry.</p><p>But <em>should</em> it?</p><p>This year, the answer is not obviously yes. Major tech companies have made efforts to curry favor with the second Trump administration. Elon Musk held an official government position — and threw a Hitler salute on Inauguration Day — while figures like Larry Ellison have openly celebrated increasingly authoritarian governance models. AI vendors have positioned their services to be surveillance machines at their heart, ingesting huge amounts of sensitive data and training their products on copyrighted work without permission or compensation. </p><p>Silicon Valley’s embrace of authoritarianism is concerning, but for governments and communities outside America's borders, the risk goes beyond ideology: using American software means submitting to American legal jurisdiction. Legislation like the <a href="https://www.justice.gov/criminal/cloud-act-resources?ref=werd.io">CLOUD Act</a> allows data processed by US companies to be accessed by US law enforcement, even if it is gathered in countries with strong privacy rules. Using American software means importing American values and subjecting yourself to American rules.</p><p>It’s no wonder, then, that jurisdictions like the EU have accelerated their efforts to create alternatives. If Silicon Valley’s values are becoming misaligned with democratic societies, it makes sense for those societies to look for alternatives.</p><p>The <a href="https://eurostack.eu/?ref=werd.io">EuroStack</a> might be the most prominent: a 300 Billion Euro plan for instigating a new European technology ecosystem that reduces dependence on US providers while promoting core values like privacy and transparency. The idea is that the initiative will establish standards, invest in technologies that meet those standards, and then encourage EU governments to default to buying those products.</p><p><a href="https://www.reuters.com/business/media-telecom/european-project-eurosky-aims-reduce-reliance-us-tech-giants-2025-07-15/?ref=werd.io">Eurosky</a>, meanwhile, is an effort to create a European alternative to social media, largely on top of Bluesky’s AT Protocol stack. It’s a potential candidate for funding by the EuroStack initiative, although it’s already got support from a range of non-profits. Interestingly, some of those are actually based in the US — most notably New_ Public and Free Our Feeds. That’s because establishing data sovereignty in one jurisdiction benefits users everywhere: the standards, software, and models for collaboration are portable. If European users have genuine alternatives to US platforms, it creates competitive pressure that could improve privacy protections globally; more concretely, open protocols developed under European privacy standards become tools that users anywhere can deploy.</p><p>These efforts strike me as being fundamentally top-down. The EuroStack seeks to create a framework of interoperability and support that startups and projects need to compete to be supported by. Eurosky dictates the protocols and methods through which a social media alternative can be built.</p><p>Power in tech comes from two things at once: infrastructure and community. Europe is trying to rebuild the first, but it won’t succeed without the second. And I’m not seeing a ton of that in any of these new initiatives.</p><p>In San Francisco, I once had coffee with a founder I’d only recently connected with online. By the afternoon, they’d pointed me in the direction of an expert advisor and an angel investor and talked me through their own failed company so I could learn from it. I was speaking with both of those new contacts within a day or two. That kind of generosity is the Valley’s real competitive advantage.</p><p>Silicon Valley works because it’s a decentralized ecosystem: participants in the network receive backing from funds that are often powered by founders of previous ventures or other figures from successful tech companies. When they’re successful, they then pay it forward. The biggest defining feature of my own interactions there is that everyone is happy to meet and share their thoughts, advice, and connections. That doesn’t necessarily mean that you’ll find funding, but you’ll certainly find a community of support.</p><p>Venture capitalist <a href="https://feld.com/?ref=werd.io">Brad Feld</a>, studying how Boulder, Colorado built a thriving startup community despite being far from Silicon Valley, <a href="https://feld.com/book/the-startup-community-way-evolving-an-entrepreneurial-ecosystem/?ref=werd.io">identified what he calls the Boulder Thesis</a>: entrepreneurs must lead the community (not government or universities), leaders must commit long-term, the community must be radically inclusive, and there must be continual engagement. At its heart is the idea of offering help without defining what you’ll get in return: once again, a culture of paying it forward.</p><p>That's the key. The real opportunity for Europe isn’t just to build an alternative tech stack: it’s to build an alternative tech <em>culture</em>.</p><p>It’s far easier to establish a culture at the beginning of something than trying to graft it on to an existing process or community. There are existing tech communities in Europe, of course: lots of open tech in Berlin, e-commerce in Amsterdam, and so on. But these are archipelagos that, while producing interesting projects and successful companies, haven’t yet coalesced into an integrated ecosystem with Silicon Valley’s density and network effects.</p><p>But culture is not the same as capital, and Europe keeps trying to buy with money and regulatory frameworks what Silicon Valley built with relationships. You can mandate standards, fund research programs, or require governments to prefer domestic vendors. What you can’t do is legislate serendipity: the hallway conversations, the shared failures, the informal mentorship networks, the introductions made because someone believes in someone else’s wild idea. That’s the real infrastructure of an ecosystem, and it’s still largely missing.</p><p>That's not to say EuroStack's approach is wrong: it’s just missing a crucial piece. The funding and procurement frameworks will provide vital support for the right projects. But they’re means, not ends. Without relational infrastructure, they’re like building highways before anyone owns a car.</p><p>So how do you establish that infrastructure? I look to <a href="https://pointc.co/coreyford/?ref=werd.io">what Corey Ford calls <em>intentional serendipity</em></a>: cultivating a culture of curiosity, embracing uncertainty, acting on unexpected opportunities, failing fast, and understanding that the path to success is fundamentally nonlinear. </p><p>For Europe, intentional serendipity would mean cultivating spaces where openness, privacy, and democratic governance aren’t just compliance requirements but shared values. A place where researchers, policymakers, and startup founders can be in the same room without hierarchy; where civic technologists and commercial technologists cross-pollinate; where people from different nations can build shared norms; where founders are backed for their mindsets, values, and capabilities rather than specific projects. Silicon Valley has social gravity; Europe needs social cohesion. That starts with intentionally connecting the people who want to build a different kind of internet.</p><p>It also means not just forgiving failure but understanding that it’s part of the process. Silicon Valley’s culture of rapid iteration emerged because people could take risks without being exiled if things didn’t work out; their peers knew that failure was information. Europe’s emerging ecosystem, burdened by a more risk-averse, less failure-friendly culture, will need to intentionally build that same muscle of iteration. The goal isn’t to mimic the Valley, but to create an environment that encourages principled risk-taking, recognizing that failure is a core part of learning. This means creating a safe-to-fail environment where founders are encouraged to share their setbacks as an essential part of learning and community-building.</p><p>To do so, it needs to build those spaces and invest in those communities. Yes, procurement and funding scenarios are important, but they’re scaffolding that help a cultivated community grow in the right direction. What’s most important is the <em>relational</em> infrastructure: non-hierarchical hubs and opportunities for informal mentorship that let relationships form, building trust and allowing ideas to spread at speed. All of these spaces need to be built and supported — ideally in a way that’s accessible to everyone, rather than being the kinds of closed-off members-only spaces that dominate ecosystems like London. These accessible <a href="https://en.wikipedia.org/wiki/Third_place?ref=werd.io">third places</a> form the sort of community infrastructure that government is uniquely positioned to provide.</p><p>It’s not <em>all</em> about community. In a world where tech is strongly linked with authoritarianism, the values frameworks those European projects are talking about are vital. In this era of history, we <em>need</em> those values to succeed. My point is not that we should copy the Silicon Valley playbook; it’s that those values and frameworks <em>won’t</em> succeed without the community culture work.</p><p>Europe can and should cultivate an ethos of intentional serendipity, but with its own values and identity, supported by the kinds of frameworks, procurement policies, and standards it’s proposing. Instead of importing Silicon Valley’s assumptions, it can build an ecosystem that reflects its political and cultural commitments: openness, privacy, pluralism, and democratic accountability. That would be a fourth kind of story: not Edinburgh’s discouragement, or Austin’s enthusiasm without alignment, or San Francisco’s density of expertise, but something genuinely new. And that, I think, is the one the world needs next.</p>Where Do the Children Play? - Werd I/O692f1092b96d5b0001117aac2025-12-02T16:15:14.000Z<p>[<a href="https://unpublishablepapers.substack.com/p/where-do-the-children-play?ref=werd.io">Eli Stark-Elster in Unpublishable Papers</a>]</p><p>This meaningful discussion touches on the role — and dangers — of online spaces in the lives of children, but has a lot more to say about how our lives and environments are designed overall.</p><blockquote>“[…] Digital space is the only place left where children can grow up without us. For most of our evolutionary history, childhood wasn’t an adult affair. Independent worlds and peer cultures were the crux of development, as they still are among the BaYaka; kids spent their time together, largely beyond the prying eyes of grown-ups.<br><br>But in the West, the grown-ups have paved over the forests and creeks where children would have once hidden. They have exposed the secret places. So the children seek out a world of their own, as they have for millennia, if not longer. They find a proverbial forest to wander. They don’t know what we know: this forest has eyes and teeth.”</blockquote><p>There are some really striking statistics here. 45% of American children aged 8-12 have not walked in a different aisle than their parents at a store; 61% have not made plans with friends without adults helping them. That’s so far away from my own childhood to be unrecognizable. It’s also wildly oppressive. Of <em>course</em> kids are looking for spaces where their helicopter parents aren’t constantly hovering overhead.</p><p>The biggest source of underlying fears from parents, as well as feelings of isolation from children themselves? A car-centric culture. Parents are worried about their children being hit by a car, which unfortunately isn’t unreasonable. Children, on the other hand, can’t drive, and often find themselves fully unable to visit friends or have their own lives without the participation of someone with a license.</p><p>So, yes, online spaces need to be safer for children — but our lived-in spaces also need to be more human. American infrastructure in particular is architected for control; it’s rare to live in a walkable, safe environment. <a href="https://en.wikipedia.org/wiki/Jane_Jacobs?ref=werd.io">Jane Jacobs</a> would have had a lot to say about this analysis, and her own solutions still hold up. We need to stop dividing communities, break the influence of the car, and create spaces that allow humans to roam, live, eat, and play — permissionlessly.</p><p>[<a href="https://unpublishablepapers.substack.com/p/where-do-the-children-play?ref=werd.io">Link</a>]</p>Responsible Disclosure: Joiners, Movers, and Leavers in NHS BSA - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=642362025-12-02T12:34:08.000Z<p>Many many years ago, I did some work for the NHS. As part of that, I was given access to certain GitHub organisations so that I could contribute to various projects. Once <a href="https://shkspr.mobi/blog/2020/07/all-good-things/">I left that job</a> my access was revoked.</p>
<p>Mostly.</p>
<p>A few weeks ago, I received this email from GitHub.</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/NHS-BSA-Github.webp" alt="Your organization, NHS Business Services Authority that you are a member of, now requires all users to only have secure two-factor authentication (2FA) methods. You currently have SMS/Text message configured as a 2FA method, which is not considered secure. To access NHS Business Services Authority resources, remove SMS/Text message as a 2FA method. " width="512" height="464" class="aligncenter size-full wp-image-64237"/>
<p>On the surface, this is a sensible email. They want all their members to only have strong 2FA and I still had SMS configured as a fallback method. Except, of course, I should <em>not</em> be a member. I should have been kicked out when I handed back my laptop and lanyard. There was still a bit of pandemic pandemonium about - but surely in the last few years someone should have audited the organisation's membership?</p>
<p>The <abbr title="Joiners, Movers, Leavers">JML</abbr> process is critical to cybersecurity. There's no point having fancy controls if you don't revoke the permissions of people who are no longer entitled to access. On a fully integrated system this is (usually) easy - untick a box on Active Directory or whatever and <em>*poof*</em> the user is banned.</p>
<p>But with <em>external</em> systems the problem is harder. You now need to keep track of external usernames, synchronise them with internal names, periodically check them for updates, integrate with an API, and - in some cases - take manual action. It's clear that this particular bit of the NHS had slipped up. Looking through the private list of collaborators, there were <em>many</em> old accounts.</p>
<p>I was able to see all private collaborators:</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/view_private_members.webp" alt="Screenshot showing a redacted list of members." width="1920" height="1080" class="aligncenter size-full wp-image-64239"/>
<p>I could see all private repositories:</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/Private-Repos.webp" alt="Screenshot showing a redacted list of private repositories." width="1920" height="1080" class="aligncenter size-full wp-image-64240"/>
<p>I even had access to create new repositories - including special ones:</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/Create-New-Repo.webp" alt="Screenshot showing the ability to create new special repositories." width="1920" height="1080" class="aligncenter size-full wp-image-64241"/>
<p>To be abundantly clear, there was no medical data on GitHub. There was no patient data available for me to view. Absolutely nothing medically sensitive was stored there. This isn't a GDPR or medical privacy issue. If I had made any changes to the code stored on there, it would never have made it to production. There were no API keys or sensitive data or passwords for me to exfiltrate. The <a href="https://www.nhsbsa.nhs.uk/">NHS BSA</a> is a business unit - not a medical unit.</p>
<p>Nevertheless, it is important that <em>all</em> parts of a large organisation are able to quickly and competently remove users once they have left.</p>
<h2 id="timeline"><a href="https://shkspr.mobi/blog/2025/12/responsible-disclosure-joiners-movers-and-leavers-in-nhs-bsa/#timeline">Timeline</a></h2>
<ul>
<li>2025-10-17
<ul>
<li>Received GitHub email.</li>
<li>Visited <a href="https://www.nhs.uk/.well-known/security.txt">https://www.nhs.uk/.well-known/security.txt</a> to get details of how to raise security issues.</li>
<li>Raised the issue on <a href="https://hackerone.com/edent?type=user">HackerOne</a></li>
</ul></li>
<li>2025-10-21
<ul>
<li>After triage, the issue was assigned directly to the BSA.</li>
</ul></li>
<li>2025-10-31
<ul>
<li>I was removed from the organisation.</li>
<li><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/removed.webp" alt="You’ve been removed from the "NHS Business Services Authority" organization. " width="1024" height="490" class="aligncenter size-full wp-image-64238"/></li>
<li>Requested permission to publish this post. No objection received.</li>
</ul></li>
<li>2025-12-02
<ul>
<li>Published</li>
</ul></li>
</ul>
Introducing constant-time support for LLVM to protect cryptographic code - Trail of Bits Bloghttps://blog.trailofbits.com/2025/12/02/introducing-constant-time-support-for-llvm-to-protect-cryptographic-code/2025-12-02T12:00:00.000Z<p>Trail of Bits has developed <a href="https://github.com/llvm/llvm-project/pull/166702">constant-time coding support for LLVM</a>, providing developers with compiler-level guarantees that their cryptographic implementations remain secure against branching-related timing attacks. These changes are being reviewed and will be added in an upcoming release, LLVM 22. This work introduces the <code>__builtin_ct_select</code> family of intrinsics and supporting infrastructure that prevents the Clang compiler, and potentially other compilers built with LLVM, from inadvertently breaking carefully crafted constant-time code. This post will walk you through what we built, how it works, and what it supports. We’ll also discuss some of our future plans for extending this work.</p>
<h2 id="the-compiler-optimization-problem">The compiler optimization problem</h2>
<p>Modern compilers excel at making code run faster. They eliminate redundant operations, vectorize loops, and cleverly restructure algorithms to squeeze out every bit of performance. But this optimization zeal becomes a liability when dealing with cryptographic code.</p>
<p>Consider this seemingly innocent constant-time lookup from <a href="https://electricdusk.com/cmov-conversion.html">Sprenkels (2019)</a>:</p>
<figure class="highlight">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">uint64_t</span> <span class="nf">constant_time_lookup</span><span class="p">(</span><span class="k">const</span> <span class="kt">size_t</span> <span class="n">secret_idx</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="k">const</span> <span class="kt">uint64_t</span> <span class="n">table</span><span class="p">[</span><span class="mi">16</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kt">uint64_t</span> <span class="n">result</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="mi">8</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">const</span> <span class="kt">bool</span> <span class="n">cond</span> <span class="o">=</span> <span class="n">i</span> <span class="o">==</span> <span class="n">secret_idx</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="k">const</span> <span class="kt">uint64_t</span> <span class="n">mask</span> <span class="o">=</span> <span class="p">(</span><span class="o">-</span><span class="p">(</span><span class="kt">int64_t</span><span class="p">)</span><span class="n">cond</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span> <span class="o">|=</span> <span class="n">table</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&</span> <span class="n">mask</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">result</span><span class="p">;}</span></span></span></code></pre>
</figure>
<p>This code carefully avoids branching on the secret index. Every iteration executes the same operations regardless of the secret value. However, as compilers are built to make your code go faster, they would see an opportunity to improve this carefully crafted code by optimizing it into a version that includes branching.</p>
<p>The problem is that any data-dependent behavior in the compiled code would create a timing side channel. If the compiler introduces a branch like <code>if (i == secret_idx)</code>, the CPU will take different amounts of time depending on whether the branch is taken. Modern CPUs have branch predictors that learn patterns, making correctly predicted branches faster than mispredicted ones. An attacker who can measure these timing differences across many executions can statistically determine which index is being accessed, effectively recovering the secret. Even small timing variations of a few CPU cycles can be exploited with sufficient measurements.</p>
<h2 id="what-we-built">What we built</h2>
<p>Our solution provides cryptographic developers with explicit compiler intrinsics that preserve constant-time properties through the entire compilation pipeline. The core addition is the <code>__builtin_ct_select</code> family of intrinsics:</p>
<figure class="highlight">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="c1">// Constant-time conditional selection
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">result</span> <span class="o">=</span> <span class="nf">__builtin_ct_select</span><span class="p">(</span><span class="n">condition</span><span class="p">,</span> <span class="n">value_if_true</span><span class="p">,</span> <span class="n">value_if_false</span><span class="p">);</span></span></span></code></pre>
</figure>
<p>This intrinsic guarantees that the selection operation above will compile to constant-time machine code, regardless of optimization level. When you write this in your C/C++ code, the compiler translates it into a special LLVM intermediate representation intrinsic (llvm.ct.select.*) that carries semantic meaning: “this operation must remain constant-time.”</p>
<p>Unlike regular code that the optimizer freely rearranges and transforms, this intrinsic acts as a barrier. The optimizer recognizes it as a security-critical operation and preserves its constant-time properties through every compilation stage, from source code to assembly.</p>
<h2 id="real-world-impact">Real-world impact</h2>
<p>In their recent study “<a href="https://arxiv.org/pdf/2410.13489.pdf">Breaking Bad: How Compilers Break Constant-Time Implementations</a>,” Srdjan Čapkun and his graduate students Moritz Schneider and Nicolas Dutly found that compilers break constant-time guarantees in numerous production cryptographic libraries. Their analysis of 19 libraries across five compilers revealed systematic vulnerabilities introduced during compilation.</p>
<p>With our intrinsics, the problematic lookup function becomes this constant-time version:</p>
<figure class="highlight">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">uint64_t</span>
</span></span><span class="line"><span class="cl"><span class="nf">constant_time_lookup</span><span class="p">(</span><span class="k">const</span> <span class="kt">size_t</span> <span class="n">secret_idx</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="k">const</span> <span class="kt">uint64_t</span> <span class="n">table</span><span class="p">[</span><span class="mi">16</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kt">uint64_t</span> <span class="n">result</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="mi">8</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">const</span> <span class="kt">bool</span> <span class="n">cond</span> <span class="o">=</span> <span class="n">i</span> <span class="o">==</span> <span class="n">secret_idx</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span> <span class="o">|=</span> <span class="nf">__builtin_ct_select</span><span class="p">(</span><span class="n">cond</span><span class="p">,</span> <span class="n">table</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="mi">0u</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre>
</figure>
<p>The use of an intrinsic function prevents the compiler from making any modifications to it, which ensures the selection remains constant time. No optimization pass will transform it into a vulnerable memory access pattern.</p>
<h2 id="community-engagement-and-adoption">Community engagement and adoption</h2>
<p>Getting these changes upstream required extensive community engagement. We published our <a href="https://discourse.llvm.org/t/rfc-constant-time-coding-support/87781">RFC on the LLVM Discourse</a> forum in August 2025.</p>
<p>The RFC received significant feedback from both the compiler and cryptography communities. Open-source maintainers from Rust Crypto, BearSSL, and PuTTY expressed strong interest in adopting these intrinsics to replace their current inline assembly workarounds, while providing valuable feedback on implementation approaches and future primitives. LLVM developers helped ensure the intrinsics work correctly with auto-vectorization and other optimization passes, along with architecture-specific implementation guidance.</p>
<h3 id="building-on-existing-work">Building on existing work</h3>
<p>Our approach synthesizes lessons from multiple previous efforts:</p>
<ul>
<li><a href="https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=8406587"><strong>Simon and Chisnall <code>__builtin_ct_choose</code></strong> (2018)</a>: This work provided the conceptual foundation for compiler intrinsics that preserve constant-time properties, but was never upstreamed.</li>
<li><a href="https://acmccs.github.io/papers/p1807-almeidaA.pdf"><strong>Jasmin</strong> (2017)</a>: This work showed the value of compiler-aware constant-time primitives but would have required a new language.</li>
<li><strong>Rust’s <code>#[optimize(never)]</code></strong> experiments: These experiments highlighted the need for fine-grained optimization control.</li>
</ul>
<h2 id="how-it-works-across-architectures">How it works across architectures</h2>
<p>Our implementation ensures <code>__builtin_ct_select</code> compiles to constant-time code on every platform:</p>
<p><strong>x86-64:</strong> The intrinsic compiles directly to the <strong><code>cmov</code></strong> (conditional move) instruction, which always executes in constant time regardless of the condition value.</p>
<p><strong>i386:</strong> Since i386 lacks <code>cmov</code>, we use a masked arithmetic pattern with bitwise operations to achieve constant-time selection.</p>
<p><strong>ARM and AArch64:</strong> For AArch64, the intrinsic is lowered to the CSEL instruction, which provides constant-time execution. For ARM, since ARMv7 doesn’t have a constant-time instruction like AAarch64, the implementation generates a masked arithmetic pattern using bitwise operations instead.</p>
<p><strong>Other architectures:</strong> A generic fallback implementation uses bitwise arithmetic to ensure constant-time execution, even on platforms we haven’t natively added support for.</p>
<p>Each architecture needs different instructions to achieve constant-time behavior. Our implementation handles these differences transparently, so developers can write portable constant-time code without worrying about platform-specific details.</p>
<h2 id="benchmarking-results">Benchmarking results</h2>
<p>Our partners at ETH Zürich are conducting comprehensive benchmarking using their test suite from the “Breaking Bad” study. Initial results show the following:</p>
<ul>
<li><strong>Minimal performance overhead</strong> for most cryptographic operations</li>
<li><strong>100% preservation</strong> of constant-time properties across all tested optimization levels</li>
<li><strong>Successful integration</strong> with major cryptographic libraries including HACL*, Fiat-Crypto, and BoringSSL</li>
</ul>
<h2 id="whats-next">What’s next</h2>
<p>While <code>__builtin_ct_select</code> addresses the most critical need, our RFC outlines a roadmap for additional intrinsics:</p>
<h3 id="constant-time-operations">Constant-time operations</h3>
<p>We have future plans for extending the constant-time implementation, specifically for targeting arithmetic or string operations and evaluating expressions to be constant time.</p>
<figure class="highlight">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="n">_builtin_ct</span><span class="o"><</span><span class="n">op</span><span class="o">></span> <span class="c1">// for constant-time arithmetic or string operation
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">__builtin_ct_expr</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span> <span class="c1">// Force entire expression to evaluate without branches
</span></span></span></code></pre>
</figure>
<h3 id="adoption-path-for-other-languages">Adoption path for other languages</h3>
<p>The modular nature of our LLVM implementation means any language targeting LLVM can leverage this work:</p>
<p><strong>Rust:</strong> The Rust compiler team is exploring how to expose these intrinsics through its <code>core::intrinsics</code> module, potentially providing safe wrappers in the standard library.</p>
<p><strong>Swift:</strong> Apple’s security team has expressed interest in adopting these primitives for its cryptographic frameworks.</p>
<p><strong>WebAssembly:</strong> These intrinsics would be particularly useful for browser-based cryptography, where timing attacks remain a concern despite sandboxing.</p>
<h2 id="acknowledgments">Acknowledgments</h2>
<p>This work was done in collaboration with the <a href="https://syssec.ethz.ch/">System Security Group</a> at ETH Zürich. Special thanks to Laurent Simon and David Chisnall for their pioneering work on constant-time compiler support, and to the LLVM community for their constructive feedback during the RFC process.</p>
<p>We’re particularly grateful to our Trail of Bits cryptography team for its technical review.</p>
<h2 id="resources">Resources</h2>
<ul>
<li><a href="https://discourse.llvm.org/t/rfc-constant-time-coding-support/87781">RFC: Constant-Time Coding Support</a></li>
<li><a href="https://www.youtube.com/watch?v=zLBEXGTdd6o&t=3s">LLVM Developers’ Meeting 2025: Constant-Time Intrinsics Presentation Talk</a></li>
<li><a href="https://arxiv.org/pdf/2410.13489.pdf">ETH Zürich’s “Breaking Bad” Study</a></li>
<li><a href="https://blog.trailofbits.com/2022/01/26/part-1-the-life-of-an-optimization-barrier/">Part 1: The life of an optimization barrier (Trail of Bits blog)</a></li>
<li><a href="https://blog.trailofbits.com/2022/02/01/part-2-rusty-crypto/">Part 2: Improving crypto code in Rust using LLVM’s optnone (Trail of Bits blog)</a></li>
</ul>
<hr>
<p>The work to which this blog post refers was conducted by Trail of Bits based upon work supported by DARPA under Contract No. N66001-21-C-4027 (Distribution Statement A, Approved for Public Release: Distribution Unlimited). Any opinions, findings and conclusions or recommendations expressed in this material are those of the author(s) and do not necessarily reflect the views of the United States Government or DARPA.</p>Introducing Roundabout - Werd I/O692e3cb4b96d5b0001117aa52025-12-02T01:11:16.000Z<p>[<a href="https://newpublic.substack.com/p/introducing-roundabout-built-for?ref=werd.io">Hays Witt and Josh Kramer at New_ Public</a>]</p><p>Really interesting to see <a href="https://newpublic.org/?ref=werd.io">New_ Public</a> announce its first community product from its <a href="https://newpublic.org/local?ref=werd.io">Local Lab</a>:</p><blockquote>“The main thing to know, maybe the most important thing, is that this is not just another social media app. Roundabout is a community space, built from the ground up with community leaders and neighbors.<br><br>[…] As a project incubated within New_ Public, a nonprofit, Roundabout will grow incrementally, sustained by a diverse and balanced set of revenue sources. With business incentives aligned towards utility and everyday value, instead of engagement and relentless scale, we’re designing Roundabout to be shielded from the cycle of enshittification. The ultimate goal is to build for social trust — every decision, every design, optimized to build bonds and increase belonging.”</blockquote><p>There’s a lot to comment on here.</p><p>It’s <em>amazing</em> to see a social product co-designed with communities. For the safety and equity of all involved, this is how it should be done. I really hope New_ Public shows off more of its methodology in the future. I’d love to dive into the meta-conversation about what they’ve learned about this kind of co-design. The descriptions of participating communities — in Burlington, NC; Richmond, VA; Lincoln County, WI; North Chattanooga, TN; and Lancaster, PA — are already really promising.</p><p>The technical lead is <a href="https://bsky.app/profile/blaine.bsky.social?ref=werd.io">Blaine Cook</a>, who you might remember as Twitter’s first employee and first CTO. Since then he’s been a strong, sharp advocate for decentralized social.</p><p>On Mastodon, New_ Public <a href="https://mastodon.social/@wearenew_public/115645643962877064?ref=werd.io">mentioned that it’s building the platform in a way that’s compatible with AT Protocol</a>, although it’s not the main focus for now.</p><p>Over on Bluesky, <a href="https://bsky.app/profile/blaine.bsky.social/post/3m6vbrdgvn22a?ref=werd.io">Blaine said they’re</a> “building on atproto primitives but off-network because it's currently not possible to push private/scoped data around the wider atproto network.” He also made the important point that it’s not worth building for interop until you know what the user behaviors are actually going to be — so it’s too early to focus on decentralization.</p><p>That community co-design is key, and it makes sense that this is the first step. Communities are human; they can’t be defined by protocols. The protocols should describe real human behavior, not the other way around.</p><p>I’m excited to see how the platform develops, and how New_ Public seeds the ecosystem conversations around it. And: this is only one of its community initiatives. There’s more to come.</p><p>[<a href="https://newpublic.substack.com/p/introducing-roundabout-built-for?ref=werd.io">Link</a>]</p>What Happens After the Hype? Lessons from Mobile Internet’s Long Road to Success - Werd I/O692da766b96d5b0001117a922025-12-01T14:34:14.000Z<p>[<a href="https://shomila.medium.com/what-happens-after-the-hype-lessons-from-mobile-internets-long-road-to-success-22d0b15e0625?ref=werd.io">Shomila Malik</a>]</p><p>We’re beginning to see the end of the AI hype cycle, and thank goodness. That doesn’t mean that there aren’t uses for aspects of the technology, but it does mean that some of the hyperbole will diminish as investors and speculators move on to the next thing.</p><p>As <a href="https://ecruecard.com/?ref=werd.io">Ecrue</a> founder Shomila Malik points out here:</p><blockquote>“The question isn’t whether the current AI investment cycle will face a reckoning. It’s what form that reckoning takes — and what comes after.”</blockquote><p>The lessons she draws from the mobile industry’s hype and decline also parallel what happened during the dotcom crash, when a lot of companies went away but a lot of underlying useful infrastructure was left for the next generation of innovations. But a facet of how those two events were different is exactly <em>how</em> they imploded:</p><blockquote>“The difference between a pop and a deflation often comes down to how adaptable the infrastructure is. 3G networks built for one vision of mobile internet ended up powering something completely different — but they still got used. The investment wasn’t wasted, just redirected. Time will tell if AI will be a deflation like mobile internet or a ear deafening explosion like the dot com crash.”</blockquote><p>Either way, investment is way ahead of proven capabilities or even business models. Companies like OpenAI are losing money hand over fist. At some point, these endeavors have to touch oxygen, and either they’ll find their way to stunning profitability, or they’ll fizzle into acquisitions at best and leave some interesting ideas behind.</p><p>My bet? Ten years from now we’ll be looking at a series of smaller, more focused models that perform well-scoped tasks really well, and we’ll look back at the hype around generalized megamodels — and particularly AGI — with rolled eyes and a slight shudder when we remember the environmental and human impacts.</p><p>[<a href="https://shomila.medium.com/what-happens-after-the-hype-lessons-from-mobile-internets-long-road-to-success-22d0b15e0625?ref=werd.io">Link</a>]</p>Year 3 at the Smallholding - Kev Quirkhttps://kevquirk.com/blog/year-3-at-the-smallholding/2025-12-01T12:00:00.000Z
<p style="font-size: 1.2em;">We're been living on our smallholding in Wales for 3 years now. Here's how things have been going this year.</p>
<p>I’m a little late with my update this year because I’ve had a few things going on at home. This has accidentally become an annual tradition at this point, so I’m gonna roll with it.</p>
<p>I re-read <a href="https://kevquirk.com/blog/year-2-at-the-smallholding/">last year’s update</a> to see what I did and, more importantly, what I’d listed in the closing <em>what’s next?</em> section. It included:</p>
<ul>
<li>Renovating the brick shed on the drive into an annex for guests.</li>
<li>Continuing to work on the garden.</li>
<li>Insulating the roof in the conservatory.</li>
<li>Two more bathrooms, a downstairs loo, and the kitchen.</li>
</ul>
<p>Well, dear reader, most of that plan went to utter rat shit this year. Aside from continuing to work on the garden, we got absolutely nothing on the list done. That’s mainly because we ended up having to replace the entire roof on the house, which is still ongoing as I write this.</p>
<p><img src="https://kevquirk.com/assets/images/blog/2025-12-01-year-3-at-the-smallholding/roof.webp" alt="Our roof, half stripped" /></p>
<p>Worse still, because the new roof is heading into winter, we’ve had lots of rain. That in turn means leaks in the house, the worst of which has been in my oldest son’s bedroom. If you read last year’s post, you’ll recall we only renovated that room last year. 😡</p>
<p><img src="https://kevquirk.com/assets/images/blog/2025-12-01-year-3-at-the-smallholding/leak.webp" alt="Bedroom leak" /></p>
<p>If you’ve never had to put a new roof on your house, firstly you’re very lucky. But secondly, they’re <em>really</em> expensive. So that has meant we haven’t had any disposable income for other projects.</p>
<h2 id="making-progress-in-the-garden">Making progress in the garden</h2>
<p>We managed to plant some wildflowers in the far field, which one of our neighbours who keeps bees is very appreciative of.</p>
<p><img src="https://kevquirk.com/assets/images/blog/2025-12-01-year-3-at-the-smallholding/wild-flowers-in-field.webp" alt="Wild flowers in field" />
<em>Wild flowers starting to come through in field</em></p>
<p>We also had a load of groundwork done at the back to flatten some of it off. They ended up moving 50 tonnes of soil from the area to make it level. Our hope is that this summer we’ll be able to enjoy drinks and barbecues on the new flat piece of land.</p>
<p><img src="https://kevquirk.com/assets/images/blog/2025-12-01-year-3-at-the-smallholding/groundworks.webp" alt="Groundworks" /></p>
<p>We’re also continuing to improve the chicken coop. We now have a fairly large enclosed outdoor space for them, mainly because of bird flu in the and the council applying restrictions on where they can roam. We’ve also grown the flock to 17 hens and a rooster.</p>
<h2 id="looking-to-year-4">Looking to year 4</h2>
<p>The list for this year is going to be similar to last year’s. I just hope there will be fewer expensive surprises.</p>
<p>We’re hoping to add a polytunnel so we can grow more of our own vegetables. I’d also like to insulate the roof in the conservatory as it’ll effectively give us another room we can use all year round.</p>
<p>The bathrooms, toilet and kitchen will have to wait. We’ll just have to see how the cashflow looks. If next year I can get the polytunnel and conservatory done, I’ll class that as a win. I’d love to get a quad bike for towing <a href="https://kevquirk.com/blog/flailing-about-with-my-mower/">the flail</a> too, but again…money.</p>
<p>All in all it’s been a difficult year at the smallholding, but we have a new roof, so that’s good. I suppose…</p>
<div class="email-hidden">
<hr>
<p>Thanks for reading this post via RSS. RSS is great, and you're great for using it. ❤️</p>
<p>
<a href="mailto:72ja@qrk.one?subject=Year 3 at the Smallholding">Reply to this post by email</a>
</p>
</div>
Knowing when to leave - Werd I/O684a32f170b0d5000143b9362025-11-30T17:12:19.000Z<p><em>I wrote this in my blog drafts well over a decade ago (exact date unclear). I thought I'd publish it as-is as an aside. I'm sure it was going to be an excellent full post, but clearly this is just the intro. I still agree though: knowing when to go is important!</em></p><p>Some years ago, someone I worked with closely on a project that was failing had a mini-meltdown. He unfriended the rest of the team across social media, including the official accounts, which he took over unilaterally; he refused to even sit at the same table as the rest of the team on company trips, and at events.</p><p>To this day, I still don't exactly know what triggered the episode. But it was a moment that made me realize the project we were working on together could never succeed. Four months later, I had extracted myself.</p><p>Years later, I believe this was the wrong decision.</p><p>Knowing when to leave is an important skill. You've got to balance your loyalty, and your long-term career, against the objective facts in any situation. Leaving a project early is not a good idea: it sends a message that you're ready to flake out when times get tough. (In a startup situation, times <em>will</em> get tough.) However, if a project:</p><ul><li>genuinely has no long-term prospects, either for you personally or as a whole</li><li>and there's absolutely nothing you can do about it</li><li>and the situation is not directly of your own making</li></ul><p>You need to think about going. Anything else is running on a treadmill for no reason.</p>imperfect notes & my second subconscious - Werd I/O692c5320b96d5b0001117a5a2025-11-30T14:22:24.000Z<p>[<a href="https://winnielim.org/journal/imperfect-notes-my-second-subconscious/?ref=werd.io">Winnie Lim</a>]</p><p>I’ve never been a successful notetaker. <a href="https://winnielim.org/?ref=werd.io">Winnie Lim</a> enumerates the many reasons why not, which seem to be very close to her thinking too:</p><blockquote>“Because of my personality I tend to solve for the whole before wanting to do something. For years I wanted to figure out how I could retrieve the notes in a meaningful manner before I committed to making them. If I cannot remember I had made the note, did the note really exist?”</blockquote><p>The problem is that you end up trying to come up with a smart taxonomy of notes ahead of time — and that’s always bound to fail, at least for me. I’ve lost count of the number of times I’ve wiped my Obsidian vault clean because I didn’t like the structure or the maintenance of it all threatened to overtake any utility. Instead, as Winnie points out, the best thing to do is just <em>write the note</em>. It’s a bit like throwing the text into a big bucket, and that’s okay.</p><p>I hate to say it, but this might be a decent use case for some kind of personal LLM (ideally on-device so I’m not sharing my private notes with a third party I don’t trust). If you’re constantly just making notes without structure, being able to ask something about their content feels like it would have a lot of utility — again, at least for me. I’d love to be able to have my notes about a certain topic summarized when I need them. Or even have the summary proactively come up for me depending on my context.</p><p>Then again, maybe that doesn’t matter at all:</p><blockquote>“My brain is constantly holding scattered bits of information so it is just better to offload them somewhere in one place. I think the main difference is I don’t see obsidian as my second brain, I see it as my second subconscious.”</blockquote><p>I like that. Blogging is a little bit that for me, but blogging has an audience. There’s something useful in being the Harriet the Spy of your own life and putting words to things that otherwise might go unsaid. There’s poetry in it, too, which is very obvious from Winnie’s post.</p><p>I’ll give notetaking another try.</p><p>[<a href="https://winnielim.org/journal/imperfect-notes-my-second-subconscious/?ref=werd.io">Link</a>]</p>A big list of things I disable in WordPress - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=633442025-11-30T12:34:23.000Z<p>There are many things I like about the WordPress blogging software, and many things I find irritating. The most annoying aspect is that WordPress insists that its way is the best and there shall be no deviance. That means a <em>lot</em> of forced cruft being injected into my site. Headers that bloat my page size, Gutenberg stuff I've no use for, and <a href="https://developer.wordpress.org/reference/functions/capital_p_dangit/">ridiculous editorial decisions</a>.</p>
<p>To double-down on the annoyance, there's no simple way to turn them off. In part, that is due to the "<a href="https://wordpress.org/about/philosophy/">WordPress Philosophy</a>":</p>
<blockquote><p><strong>Decisions, not options</strong></p>
<p>[…] Every time you give a user an option, you are asking them to make a decision. When a user doesn’t care or understand the option this ultimately leads to frustration.</p></blockquote>
<p>I broadly agree with that. Having hundreds of options is a burden for users and a nightmare for maintainers. Do please read this <a href="https://tommcfarlin.com/wordpress-philosophy-decisions-not-options/">excellent discussion from Tom McFarlin for a more detailed analysis</a>.</p>
<p>But I <em>want</em> to turn things off. Luckily, there is a way. If you're a developer, you can remove a fair number of these "enforced" decisions. Add the following to your theme's <code>functions.php</code> file and watch the mandatory WordPress bloat whither away. I've commented each removal and, where possible, given a source for more information. Feel free to leave a comment suggesting how this script can be improved and simplified.</p>
<pre><code class="language-php">// Remove mandatory classic theme.
function disable_classic_theme_styles() {
wp_deregister_style( "classic-theme-styles" );
wp_dequeue_style( "classic-theme-styles" );
}
add_action( "wp_enqueue_scripts", "disable_classic_theme_styles" );
// Remove WP Emoji.
// http://www.denisbouquet.com/remove-wordpress-emoji-code/
remove_action( "wp_head", "print_emoji_detection_script", 7 );
remove_action( "wp_print_styles", "print_emoji_styles" );
remove_action( "admin_print_scripts", "print_emoji_detection_script" );
remove_action( "admin_print_styles", "print_emoji_styles" );
// https://wordpress.org/support/topic/remove-the-new-dns-prefetch-code/
add_filter( "emoji_svg_url", "__return_false" );
// Stop emoji replacement with images in RSS / Atom Feeds
// https://danq.me/2023/09/04/wordpress-stop-emoji-images/
remove_filter( "the_content_feed", "wp_staticize_emoji" );
remove_filter( "comment_text_rss", "wp_staticize_emoji" );
// Remove automatic formatting.
// https://css-tricks.com/snippets/wordpress/disable-automatic-formatting/
remove_filter( "the_content", "wptexturize" );
remove_filter( "the_excerpt", "wptexturize" );
remove_filter( "comment_text", "wptexturize" );
remove_filter( "the_title", "wptexturize" );
// More formatting crap.
add_action("init", function() {
remove_filter( "the_content", "convert_smilies", 20 );
foreach ( array( "the_content", "the_title", "wp_title", "document_title" ) as $filter ) {
remove_filter( $filter, "capital_P_dangit", 11 );
}
remove_filter( "comment_text", "capital_P_dangit", 31 ); // No idea why this is separate
remove_filter( "the_content", "do_blocks", 9 );
}, 11);
// Remove Gutenberg Styles.
// https://wordpress.org/support/topic/how-to-disable-inline-styling-style-idglobal-styles-inline-css/
remove_action( "wp_enqueue_scripts", "wp_enqueue_global_styles" );
// Remove Gutenberg editing widgets.
// From https://wordpress.org/plugins/classic-widgets/
// Disables the block editor from managing widgets in the Gutenberg plugin.
add_filter( "gutenberg_use_widgets_block_editor", "__return_false" );
// Disables the block editor from managing widgets.
add_filter( "use_widgets_block_editor", "__return_false" );
// Remove Gutenberg Block Library CSS from loading on the frontend.
// https://smartwp.com/remove-gutenberg-css/
function remove_wp_block_library_css() {
wp_dequeue_style( "wp-block-library" );
wp_dequeue_style( "wp-block-library-theme" );
wp_dequeue_style( "wp-components" );
}
add_action( "wp_enqueue_scripts", "remove_wp_block_library_css", 100 );
// Remove hovercards on comment links in admin area.
// https://wordpress.org/support/topic/how-to-disable-mshots-service/#post-12946617
add_filter( "akismet_enable_mshots", "__return_false" );
// Remove Unused Plugin code.
function remove_plugin_css_js() {
wp_dequeue_style( "image-sizes" );
}
add_action( "wp_enqueue_scripts", "remove_plugin_css_js", 100 );
// Remove WordPress forced image size
// https://core.trac.wordpress.org/ticket/62413#comment:40
add_filter( "wp_img_tag_add_auto_sizes", "__return_false" );
// Remove <img> enhancements
// https://developer.wordpress.org/reference/functions/wp_filter_content_tags/
remove_filter( "the_content", "wp_filter_content_tags", 12 );
// Stop rewriting http:// URls for the main domain.
// https://developer.wordpress.org/reference/hooks/wp_should_replace_insecure_home_url/
remove_filter( "the_content", "wp_replace_insecure_home_url", 10 );
// Remove the attachment stuff
// https://developer.wordpress.org/news/2024/01/building-dynamic-block-based-attachment-templates-in-themes/
remove_filter( "the_content", "prepend_attachment" );
// Remove the block filter
remove_filter( "the_content", "apply_block_hooks_to_content_from_post_object", 8 );
// Remove browser check from Admin dashboard.
// https://core.trac.wordpress.org/attachment/ticket/27626/disable-wp-check-browser-version.0.2.php
if ( !empty( $_SERVER["HTTP_USER_AGENT"] ) ) {
add_filter( "pre_site_transient_browser_" . md5( $_SERVER["HTTP_USER_AGENT"] ), "__return_null" );
}
// Remove shortlink.
// https://stackoverflow.com/questions/42444063/disable-wordpress-short-links
remove_action( "wp_head", "wp_shortlink_wp_head" );
// Remove RSD.
// https://wpengineer.com/1438/wordpress-header/
remove_action( "wp_head", "rsd_link" );
// Remove extra feed links.
// https://developer.wordpress.org/reference/functions/feed_links/
add_filter( "feed_links_show_comments_feed", "__return_false" );
add_filter( "feed_links_show_posts_feed", "__return_false" );
// Remove api.w.org link.
// https://wordpress.stackexchange.com/questions/211467/remove-json-api-links-in-header-html
remove_action( "wp_head", "rest_output_link_wp_head" );
// https://wordpress.stackexchange.com/questions/211817/how-to-remove-rest-api-link-in-http-headers
// https://developer.wordpress.org/reference/functions/rest_output_link_header/
remove_action( "template_redirect", "rest_output_link_header", 11, 0 );
</code></pre>
<p>You can find the latest version of <a href="https://gitlab.com/edent/blog-theme/-/blob/master/includes/remove.php">my debloat script</a> in my theme's repo.</p>
<p>If there are other things you find helpful to remove, or a better way to organise this file, please drop a comment in the box.</p>
"Disagree and Let’s See" - Werd I/O692b9c6eb96d5b0001117a482025-11-30T01:22:54.000Z<p>[<a href="https://mollyg.substack.com/p/disagree-and-lets-see?ref=werd.io">Molly Graham</a>]</p><p>This feels emotionally honest and an idea I can get behind, as an alternative to the popular “disagree and commit”:</p><blockquote>““Disagree and let’s see” allows you to stay aligned with the team without forcing you to pretend you had conviction you didn’t have. It lets you walk into a room with your team and be honest:<br><br>“Here’s the path that was chosen. It wasn’t my first pick, but here’s the experiment we’re running, and here’s what we’re trying to learn.””</blockquote><p>Committing to something you disagree with is an emotional contortion that is hard to do in practice. But the work of every team is a series of experiments at its heart, and by changing the onus from “let’s commit to this thing we don’t all agree with” to “let’s try it and see what happens”, we move from steamrollering dissent to mutually agreeing on an experimental hypothesis and testing it. You’re learning based on agreed criteria.</p><p>That’s much harder to argue with — and at the end, there’s no “I told you so” or winners and losers. There’s just a “here’s what we learned” and an implied set of next steps. Bliss.</p><p>[<a href="https://mollyg.substack.com/p/disagree-and-lets-see?ref=werd.io">Link</a>]</p>