Shellsharks Blogroll - BlogFlock 2026-04-17T18:21:09.714Z BlogFlock destructured, fLaMEd, Trail of Bits Blog, Aaron Parecki, Evan Boehs, James' Coffee Blog, gynvael.coldwind//vx.log (pl), Westenberg, joelchrono, Kev Quirk, cool-as-heck, Posts feed, Sophie Koonin, Adepts of 0xCC, <span>Songs</span> on the Security of Networks, cmdr-nova@internet:~$, Johnny.Decimal, Werd I/O, Robb Knight, Molly White, Hey, it's Jason!, Terence Eden’s Blog Read "How Silicon Valley Humiliated the Democrats" - Molly White's activity feed 69e237a47bbd252405cb9a2b 2026-04-17T13:37:40.000Z <article class="entry h-entry hentry"><header><div class="description">Read: </div></header><div class="content e-content"><div class="article h-cite hcite"><div class="title"><a class="u-url u-repost-of" href="https://newrepublic.com/article/208746/silicon-valley-humiliated-democrats-tech" rel="bookmark">“<span class="p-name">How Silicon Valley Humiliated the Democrats</span>”</a>. </div><div class="byline"><span class="p-author h-card">Alexis Goldstein</span> in <i class="p-publication">The New Republic</i>. <span class="read-date"> Published <time class="dt-published published" datetime="2026-04-16">April 16, 2026</time>.</span></div><blockquote class="summary p-summary entry-summary">When will they learn? The party remains far too solicitous of an industry that’s rewarded their fealty with four years of Trump and untold damage to democracy.</blockquote><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp">Posted: <time class="dt-published" datetime="2026-04-17T13:37:40+00:00" title="April 17, 2026 at 1:37 PM UTC">April 17, 2026 at 1:37 PM UTC</time>. </div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/crypto" title="See all feed posts tagged "crypto"" rel="category tag">crypto</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/crypto_lobby" title="See all feed posts tagged "crypto lobby"" rel="category tag">crypto lobby</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/us_politics" title="See all feed posts tagged "US politics"" rel="category tag">US politics</a>. </div></div></footer></article> Book Review: How To Kill A Witch - A Guide For The Patriarchy by Claire Mitchell and Zoe Venditozzi ★★★⯪☆ - Terence Eden’s Blog https://shkspr.mobi/blog/?p=70322 2026-04-17T11:34:26.000Z <img src="https://shkspr.mobi/blog/wp-content/uploads/2026/04/hbg-title-how-to-kill-a-witch-3-70.webp" alt="Book cover featuring a noose and flames." width="200" height="625" class="alignleft size-full wp-image-70323"/> <p>After reading <a href="https://shkspr.mobi/blog/2025/03/book-review-the-wicked-of-the-earth-by-a-d-bergin/">The Wicked of the Earth</a>, I wanted to understand some of the history behind the stories. Why were women<sup id="fnref:women"><a href="https://shkspr.mobi/blog/2026/04/book-review-how-to-kill-a-witch-a-guide-for-the-patriarchy-by-claire-mitchell-and-zoe-venditozzi/#fn:women" class="footnote-ref" title="And a small number of men. But this is firmly focused on the overwhelming majority." role="doc-noteref">0</a></sup> accused of being witches? What really happened in those trials? What are the modern consequences of those events?</p> <p>This is the story of the Scottish Witch Trials - with brief forays into England and abroad. It examines the central tension of whether witchcraft was real to the accusers, or just a convenient means to oppress troublesome women. The descriptions of the imprisonment, torture, and state-sanctioned murder is visceral and horrific.</p> <p>It&#39;s also rather stark in its modern assessment of the historic context:</p> <blockquote><p>Nonetheless, it’s important to remember it was a proper legal trial, with evidence being put forward and the judge assessing it and carrying out legal tests. Some people think that witchcraft trials were carried out by angry peasants waving pitchforks. Perhaps this is a more acceptable way for a modern person to think about it. No one wants to think that a judicial system can get it so wrong. But it did, with catastrophic consequences for those accused.</p></blockquote> <p>The book is mostly good, it&#39;s a spin off from the <a href="https://www.witchesofscotland.com/">Witches Of Scotland</a> podcast and that&#39;s reflected in the writing. As with any parasocial<sup id="fnref:para"><a href="https://shkspr.mobi/blog/2026/04/book-review-how-to-kill-a-witch-a-guide-for-the-patriarchy-by-claire-mitchell-and-zoe-venditozzi/#fn:para" class="footnote-ref" title="As opposed to paranormal." role="doc-noteref">1</a></sup> entertainment, it attempts to centre the authors and bring the audience along for the ride - so there&#39;s lots of descriptions of the libraries the authors visit, how things make them feel, how enamoured they are with their podcast guests. I found it a little distracting, but it&#39;s obviously right for their main audience.</p> <p>Similarly, there&#39;s an attempt to bring the past to life by imagining a little monologue from various historic figures. I found that a little unconvincing; I dislike putting words in peoples&#39; mouths. But with sparse primary documentation, that may be the best way to bring these characters to life. It&#39;s also well illustrated. Too many books eschew pictures - but this has a nice collection of woodcuts and portraits to contextualise what we&#39;re reading about.</p> <p>One little nitpick, the book makes the claims:</p> <blockquote><p>Life was hard and life expectancy was around 35</p></blockquote> <p>and</p> <blockquote><p>Lilias was an old woman, at least 60 years old and possibly as old as 80. At a time when life expectancy was much lower than it is now, even the lower estimate was still a considerable age.</p></blockquote> <p>That&#39;s not quite right. Although the average life expectancy was low, that&#39;s the <a href="https://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/lifeexpectancies/articles/howhaslifeexpectancychangedovertime/2015-09-09">average <em>at birth</em></a> - with a large number of infant mortalities dragging down the average. When you look at the full data, you&#39;ll see <a href="https://www.psychologytoday.com/us/blog/data-for-health/202509/there-were-still-old-people-when-life-expectancy-was-35">people used to live long lives</a> even in the distant past.</p> <p>In a way, it reminds me of <a href="https://shkspr.mobi/blog/2019/10/book-review-invisible-women-caroline-criado-perez/">Invisible Women</a>. A national tragedy hidden from view.</p> <p>It builds to a rousing end. There are parts of the world where witchcraft is still taken seriously - with devastating consequences. The febrile atmosphere which led to unfounded accusations against women is still prevalent even in modern societies.</p> <div id="footnotes" role="doc-endnotes"> <hr/> <ol start="0"> <li id="fn:women"> <p>And a small number of men. But this is firmly focused on the overwhelming majority. <a href="https://shkspr.mobi/blog/2026/04/book-review-how-to-kill-a-witch-a-guide-for-the-patriarchy-by-claire-mitchell-and-zoe-venditozzi/#fnref:women" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:para"> <p>As opposed to paranormal. <a href="https://shkspr.mobi/blog/2026/04/book-review-how-to-kill-a-witch-a-guide-for-the-patriarchy-by-claire-mitchell-and-zoe-venditozzi/#fnref:para" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> </ol> </div> <img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=70322&amp;HTTP_REFERER=Atom" alt="" width="1" height="1" loading="eager"/> We beat Google’s zero-knowledge proof of quantum cryptanalysis - Trail of Bits Blog https://blog.trailofbits.com/2026/04/17/we-beat-googles-zero-knowledge-proof-of-quantum-cryptanalysis/ 2026-04-17T11:00:00.000Z <p>Two weeks ago, Google’s Quantum AI group <a href="https://research.google/blog/safeguarding-cryptocurrency-by-disclosing-quantum-vulnerabilities-responsibly/">published</a> a zero-knowledge proof of a quantum circuit so optimized, they concluded that first-generation quantum computers will break elliptic curve cryptography keys in as little as 9 minutes. Today, Trail of Bits is publishing our own zero-knowledge proof that significantly improves Google’s on all metrics. Our result is not due to some quantum breakthrough, but rather the exploitation of multiple subtle memory safety and logic vulnerabilities in Google’s Rust prover code. Google has <a href="https://arxiv.org/abs/2603.28846v2">patched</a> their proof, and their scientific claims are unaffected, but this story reflects the unique attack surface that systems introduce when they use zero-knowledge proofs.</p> <p>Google’s proof uses a zero-knowledge virtual machine (zkVM) to calculate the cost of a quantum circuit on three key metrics. The total number of operations and Toffoli gate count represent the running time of the circuit, and the number of qubits represents the memory requirements. Google, along with their coauthors from UC Berkeley, the Ethereum Foundation, and Stanford, published proofs for two circuits; one minimizes the number of gates, and the other minimizes qubits. Our proof improves on both.</p> <table> <thead> <tr> <th style="text-align: left">Resource Type</th> <th>Google’s Low-Gate</th> <th>Google’s Low-Qubit</th> <th>Our Proof</th> </tr> </thead> <tbody> <tr> <td style="text-align: left">Total Operations</td> <td>17,000,000</td> <td>17,000,000</td> <td>8,300,000</td> </tr> <tr> <td style="text-align: left">Number of Qubits</td> <td>1,425</td> <td>1,175</td> <td>1,164</td> </tr> <tr> <td style="text-align: left">Toffoli Count</td> <td>2,100,000</td> <td>2,700,000</td> <td>0</td> </tr> </tbody> </table> <p><em>Table 1: Resource upper bounds reported in different proofs for circuits computing the correct output across 9,024 randomly sampled inputs</em></p> <p>Our <a href="https://github.com/trailofbits/quantum-zk-proof-poc/raw/refs/heads/main/proof_trailofbits.bin">proof</a> fully verifies when using Google’s unpatched <a href="https://zenodo.org/records/19196956">verification code</a>. It has the same verification key as their original proofs and is cryptographically indistinguishable from a zero-knowledge proof resulting from actual algorithmic improvements to the quantum circuit. We are releasing the <a href="https://github.com/trailofbits/quantum-zk-proof-poc">code</a> we developed to forge the proof, and a summary of our proof follows.</p> <p><strong>Circuit SHA-256 hash:</strong> <code>0x7efe1f62bb14a978322ab9ed41d670fc0fe0f211331032615c910df5a540e999</code></p> <p><strong>Groth16 proof bytes:</strong> <code>0x0e78f4db0000000000000000000000000000000000000000000000000000000000000000008cd56e10c2fe24795cff1e1d1f40d3a324528d315674da45d26afb376e8670000000000000000000000000000000000000000000000000000000000000000024ac7f8dd6b1de6279bcce54e8840d8eb20d522bf27dedd776046f6590f33add217db465201c63724e6b460641985543d2b79c3c54daeea688581676a786aafc1dba8604a361acdd9809e268b6d8bc73943a713bb0ed0d96221f73d26def6ea4041d05b077523d9351a48b2ecd984c686b6473df69d20a24296d0a1cba3cdbe92eb13a7cc0ecd92f27f7bf23f9ac859d4293e17216dcbd85d1c7f60a52f65a9d02faef077336acd39e845d534200b575b029d6e3f0afb4f90815557233eab70b0fe88919834dd9beb90d47241f1490dc202e0dce44e4894982b07073c8d4426513732d79e9af9913b254aa29471e1a98fa1b43a1886afb5dbd36988153217aa2</code></p> <p><strong>Verification key:</strong> <code>0x00ca4af6cb15dbd83ec3eaab3a0664023828d90a98e650d2d340712f5f3eb0d4</code></p> <h2 id="zero-knowledge-virtual-machines">Zero-knowledge virtual machines</h2> <p>Google used Succinct Labs’ SP1 zkVM for their proofs. A zkVM is essentially a way to prove that you know which <em>private inputs</em> for an arbitrary guest program on the zkVM generate some <em>public output</em>. For example, consider this basic Rust guest program.</p> <figure class="highlight"> <pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="cp">#![no_main]</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">sp1_zkvm</span>::<span class="fm">entrypoint!</span><span class="p">(</span><span class="n">main</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Read in private inputs a and b </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sp1_zkvm</span>::<span class="n">io</span>::<span class="n">read</span>::<span class="o">&lt;</span><span class="kt">u32</span><span class="o">&gt;</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sp1_zkvm</span>::<span class="n">io</span>::<span class="n">read</span>::<span class="o">&lt;</span><span class="kt">u32</span><span class="o">&gt;</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Add them together </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">b</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Write the public output a + b </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="n">sp1_zkvm</span>::<span class="n">io</span>::<span class="n">commit</span><span class="p">(</span><span class="o">&amp;</span><span class="n">c</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span></span></span></code></pre> </figure> <p>A user can take the private inputs 2 and 3, run this program on the zkVM, and get a proof that the program ran successfully and that the output was 5. Anyone can verify the proof, but they would get zero knowledge about whether the input was (2, 3), (1, 4), or (6, 0xffffffff). Obviously, this toy problem is simple; real programs can be significantly more complicated.</p> <p>Behind the scenes, the Rust guest program compiles down to a RISC-V ELF binary. This simple architecture allows complex program logic to be encoded into provable mathematical relationships. For example, the state of the RISC-V registers after executing an instruction is a deterministic function of their state before execution. Having to prove every step makes generating zkVM proofs resource-intensive and costly, but significant engineering work has enabled proving statements about complex programs.</p> <h2 id="googles-zkvm-guest">Google’s zkVM guest</h2> <p>In the case of Google’s zero-knowledge proofs, the private input is the quantum circuit (in a custom assembly language), and the program is a simulator that checks the circuit. Note that these are “circuits” in the quantum sense, not the typical zero-knowledge definition. The public output includes bounds on the number of qubits and gate operations. In general, simulating quantum circuits is difficult, but the “kickmix” circuits defined in this paper refer to a specific subset that can be tested classically.</p> <p>The following script, adapted from one of Google’s examples, increments a 3-qubit value. It includes three <em>operations</em> and a total of three <em>qubits</em>. Note that the first instruction <code>CCX</code> has two inputs (<code>q0</code> and <code>q1</code>) and computes <code>q2 = q2 ^ (q0 &amp; q1)</code>. This is called a <em>Toffoli gate</em>. Toffoli gates are quite useful, but they’re much harder to implement on actual quantum hardware, so the complexity of quantum algorithms is sometimes measured in the number of Toffoli gates (or more accurately, non-Clifford gates). Circuits like this are serialized into bytes and sent to the zkVM simulator.</p> <figure class="highlight"> <pre tabindex="0"><code class="language-" data-lang="" ># Increment a value held in 3 qubits (q2, q1, q0). Sends # (0, 0, 0) -&gt; (0, 0, 1) # (0, 0, 1) -&gt; (0, 1, 0) # ... # (1, 1, 1) -&gt; (0, 0, 0) # If q0 and q1 are set, flip q2. CCX q0 q1 q2 # If q0 is set, flip q1. CX q0 q1 # Flip q0. X q0</code></pre> </figure> <p>To verify that a circuit computes the correct function, the simulator deserializes the circuit, randomly initializes the qubits (e.g., to <code>(1, 0, 1)</code>), iteratively applies every operation in the circuit, and panics unless the final state is as expected (e.g., <code>(1, 1, 0)</code>). The simulator repeats this for many different inputs (9,024 times, to be precise), so proving that the simulator terminated without error is essentially the same as proving that the circuit is correct with high probability. In Google’s zkVM program, the circuit must compute one elliptic curve point addition, a critical subroutine of Shor’s algorithm for solving the elliptic curve discrete logarithm problem.</p> <p>In addition to checking that the circuit computes the correct function, it also counts the total number of operations, the number of qubits, and the average number of Toffoli gates (some Toffoli gates are conditioned on classical bits and may be skipped during simulation). These performance metrics are checked to ensure they do not exceed specified upper bounds; if they don’t, the upper bounds are committed as public output.</p> <h2 id="plan-of-attack">Plan of attack</h2> <p>Since Google’s zero-knowledge proof comes from the results of running a Rust simulator on a private kickmix assembly script, we can create our own zero-knowledge proof by providing our own private input to the same program. If we find some input that causes the simulator to misreport the quantum costs, we’ll have successfully forged a proof. To beat Google’s results on any metric, we have the following goals:</p> <ul> <li>Must compute elliptic curve point addition correctly</li> <li>Preferably reports fewer than 17 million total operations</li> <li>Preferably reports fewer than 2.1 million Toffoli gates</li> <li>Preferably reports fewer than 1,175 qubits</li> </ul> <p>This turns a quantum computing problem into an application security problem. Any deserialization bugs when parsing the kickmix circuit input are fair game, as well as any logic bugs we find in the simulator.</p> <h2 id="vulnerability-1-bypassing-the-toffoli-counter">Vulnerability 1: Bypassing the Toffoli counter</h2> <p>One area of concern in the Rust source code was the use of <code>unsafe</code> blocks, disabling important memory safety checks. This was presumably done to reduce the overall cycle count of the zkVM guest program; each additional bounds check inflates the already substantial cost of generating a zero-knowledge proof, particularly checks that run millions of times. The vulnerability starts in the following two lines of code from <code>program/src/main.rs</code>.</p> <figure class="highlight"> <pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">private_circuit_bytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sp1_zkvm</span>::<span class="n">io</span>::<span class="n">read_vec</span><span class="p">();</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">let</span><span class="w"> </span><span class="n">ops</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">unsafe</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">rkyv</span>::<span class="n">access_unchecked</span>::<span class="o">&lt;</span><span class="n">rkyv</span>::<span class="n">Archived</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Op</span><span class="o">&gt;&gt;&gt;</span><span class="p">(</span><span class="o">&amp;</span><span class="n">private_circuit_bytes</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">};</span></span></span></code></pre> </figure> <p>The first line shows that private circuit bytes (<code>private_circuit_bytes</code>) are directly read from outside the zkVM, and the use of the rkyv serialization library’s <code>access_unchecked</code> function instructs the library to assume that <code>private_circuit_bytes</code> corresponds to a valid serialization. But data from outside the zkVM is untrusted, so what happens if the bytes, which are meant to represent a vector of circuit operations, are malformed?</p> <p>The answer is “not much.” There are relative pointer offsets and length fields in the serialization for the <code>Vec</code> type, but I couldn’t see a viable path from manipulating those to getting the prover to underreport resource counts. The <code>Op</code> type is similarly simple, consisting of seven 32-bit fields: one describes the <code>OperationType</code>, and six describe the identifiers of which qubits and classical bits to use as inputs and outputs for the operation. For a while, I was chasing down a bug in how the magic identifier <code>0xffffffff</code> could bypass the qubit count and trigger an out-of-bounds write in the array of simulated qubit values. I was deep in the details of understanding the Rust heap allocator used by the SP1 zkVM before a colleague pointed out that Google was using SP1’s 64-bit RISC-V architecture rather than the potentially exploitable 32-bit architecture.</p> <p>That left the <code>kind</code> field, an enum describing which of the 18 supported kickmix <code>OperationType</code> opcodes to apply. When simulating the quantum circuit, the guest program iterates over the vector of operations and determines whether to conditionally execute each operation; if so, it increments the count of Toffoli or Clifford gates, depending on the operation type, and executes the operation. This code is in <code>Simulator::apply_iter</code>.</p> <figure class="highlight"> <pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">match</span><span class="w"> </span><span class="n">op</span><span class="p">.</span><span class="n">kind</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">OperationType</span>::<span class="no">CCZ</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">OperationType</span>::<span class="no">CCX</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">stats</span><span class="p">.</span><span class="n">toffoli_gates</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">executed_shots</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">OperationType</span>::<span class="no">CX</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">OperationType</span>::<span class="no">CZ</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">OperationType</span>::<span class="n">Swap</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">OperationType</span>::<span class="n">R</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">OperationType</span>::<span class="n">Hmr</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">stats</span><span class="p">.</span><span class="n">clifford_gates</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">executed_shots</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Note: X and Z are not considered Clifford gates in the </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// stats because they can be tracked in the classical control system. </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// They don&#39;t need to cause something to happen on the quantum computer. </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">match</span><span class="w"> </span><span class="n">op</span><span class="p">.</span><span class="n">kind</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">OperationType</span>::<span class="no">CCX</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cond</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">qubit</span><span class="p">(</span><span class="n">op</span><span class="p">.</span><span class="n">q_control1</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">qubit</span><span class="p">(</span><span class="n">op</span><span class="p">.</span><span class="n">q_control2</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="o">*</span><span class="bp">self</span><span class="p">.</span><span class="n">qubit_mut</span><span class="p">(</span><span class="n">op</span><span class="p">.</span><span class="n">q_target</span><span class="p">)</span><span class="w"> </span><span class="o">^=</span><span class="w"> </span><span class="n">v</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">OperationType</span>::<span class="no">CX</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cond</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">qubit</span><span class="p">(</span><span class="n">op</span><span class="p">.</span><span class="n">q_control1</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="o">*</span><span class="bp">self</span><span class="p">.</span><span class="n">qubit_mut</span><span class="p">(</span><span class="n">op</span><span class="p">.</span><span class="n">q_target</span><span class="p">)</span><span class="w"> </span><span class="o">^=</span><span class="w"> </span><span class="n">v</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span></span></span></code></pre> </figure> <p>What if <code>op.kind</code> falls outside of the expected 0–17 range because rkyv was instructed not to check this value during deserialization? This is undefined behavior, so to investigate, I used Ghidra to reverse-engineer the RISC-V ELF binary Google provided with their proof.</p> <p>After identifying the location of this function in the binary, I discovered that the Rust compiler emits a pair of jump tables for these two match expressions. The first jump table determines which gate counter to increment, and the second performs the actual operation. But we maliciously control the value of <code>op.kind</code>, so what if instead of the normal behavior, we dereference past the end of the first jump table and directly jump to an address from the second jump table? Then an out-of-range <code>OperationType</code> could still perform the correct operation, but it would completely bypass the Toffoli counter!</p> <p> <figure> <img src="https://blog.trailofbits.com/2026/04/17/we-beat-googles-zero-knowledge-proof-of-quantum-cryptanalysis/we-beat-googles-zero-knowledge-proof-of-quantum-cryptanalysis-image-1_hu_47d2ce2b7e2f854.webp" alt="&ldquo;Figure 1: In this simplified execution flow, providing an invalid operation type bypasses the Toffoli counter, giving the same functionality while hiding the true cost.&rdquo;" width="1169" height="538" loading="lazy" decoding="async" /> <figcaption>Figure 1: In this simplified execution flow, providing an invalid operation type bypasses the Toffoli counter, giving the same functionality while hiding the true cost.</figcaption> </figure> </p> <p>I calculated the necessary offsets, modified Google’s example prover code to inject the invalid operation types, and attempted to simulate a zero-knowledge proof of a simple 64-qubit adder circuit. To my surprise, it worked on the first try.</p> <figure class="highlight"> <pre tabindex="0"><code class="language-" data-lang="" >stdout: circuit.average_cliffords_performed() = 0 stdout: circuit.average_non_cliffords_performed() = 0 stdout: The circuit passed fuzz testing.</code></pre> </figure> <p>I had been concerned that the RISC-V registers would be in an invalid state when jumping into the wrong table, but this ended up not being the case. Now I had the primitive I needed to forge a circuit that misreports the number of Toffoli gates, and I just had to scale up my attack on the 64-qubit adder circuit to full elliptic curve point addition.</p> <h2 id="building-a-quantum-circuit">Building a quantum circuit</h2> <p>I now had a virtually unlimited budget for Toffoli operations, and the path forward looked simple. I could implement any kickmix circuit that correctly performs elliptic curve point addition without worrying about the Toffoli count, tweak the operation types before feeding the script to the prover, and then forge a proof for whatever Toffoli upper bound I wanted. I might use more total operations or more qubits than Google’s circuits, but it would be an amusing proof of concept. The only concern was that the prover&rsquo;s running time is proportional to the total number of operations, so my circuit still needed a reasonably low operation count.</p> <p>It turns out that programming a quantum computer is way more challenging than I anticipated, and this is because of the requirements of <em>reversibility</em> and <em>uncomputation</em>.</p> <p><strong>Requirement 1: Reversibility.</strong> A quantum circuit is made up of a series of reversible (unitary) gates. For kickmix circuits, think of these as reversible bit operations. For example, <code>c’ = c XOR b</code> is allowed because the original value of <code>c</code> can be recovered with <code>c = c’ XOR b</code>. On the other hand, <code>c’ = c AND b</code> is not allowed because if <code>c’</code> and <code>b</code> are both 0, we cannot know if <code>c</code> was originally 0 or 1. By itself, <code>AND</code> is not reversible, but with an additional input in Toffoli gates, it is. The kickmix Toffoli operation <code>CCX q1 q2 q3</code> updates <code>q3</code> to <code>q3’ = q3 XOR (q1 AND q2)</code>, and this operation can be reversed with <code>q3 = q3’ XOR (q1 AND q2)</code>.</p> <p><strong>Requirement 2: Uncomputation.</strong> To avoid the undesirable effects of entanglement, any auxiliary (or ancilla) qubits used to store intermediate results of computation must be “uncomputed,” or reset to state 0. The reversibility requirement makes this a challenge, since the intermediate result may have been 0 or 1. The intermediate state must be uncomputed from the computation result in order to be reversibly cleared out.</p> <p>As we try to build our reversible elliptic curve point addition circuit with uncomputation, a couple of tools are available. We could use <a href="https://doi.org/10.1147/rd.176.0525">Bennett’s trick</a>, which involves preserving inputs and outputs in spare qubits, then running the full computation a second time in reverse to clear ancilla qubits. This approach isn’t ideal because it roughly doubles the operation count for each level of the call stack. Another approach is to use the more efficient <a href="https://algassert.com/post/1903">measurement based uncomputation</a>. Google has revealed that this is the technique their circuits use, but it requires a much finer-grained algorithmic analysis to apply correctly.</p> <h2 id="vulnerability-2-efficient-operations-with-register-aliasing">Vulnerability 2: Efficient operations with register aliasing</h2> <p>After struggling to implement elliptic curve point addition while keeping the operation count and qubit count low, I discovered another exploitable vulnerability: register aliasing. Recall the Toffoli (CCX) operation defined in <code>Simulator::apply_iter</code>.</p> <figure class="highlight"> <pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="n">OperationType</span>::<span class="no">CCX</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cond</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">qubit</span><span class="p">(</span><span class="n">op</span><span class="p">.</span><span class="n">q_control1</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">qubit</span><span class="p">(</span><span class="n">op</span><span class="p">.</span><span class="n">q_control2</span><span class="p">);</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="o">*</span><span class="bp">self</span><span class="p">.</span><span class="n">qubit_mut</span><span class="p">(</span><span class="n">op</span><span class="p">.</span><span class="n">q_target</span><span class="p">)</span><span class="w"> </span><span class="o">^=</span><span class="w"> </span><span class="n">v</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span></span></span></code></pre> </figure> <p>There’s no check that the qubit inputs (<code>op.q_control1</code> and <code>op.q_control2</code>) are different from the qubit output (<code>op.q_target</code>), so tying all three together becomes <code>q1 = q1 ^ (q1 &amp; q1) = 0</code>. That is, we can immediately reset a qubit to zero, violating the quantum requirement of reversibility and making uncomputation trivial.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p> <p> <figure> <img src="https://blog.trailofbits.com/2026/04/17/we-beat-googles-zero-knowledge-proof-of-quantum-cryptanalysis/we-beat-googles-zero-knowledge-proof-of-quantum-cryptanalysis-image-2_hu_1a06d8e0719e7605.webp" alt="&ldquo;Figure 2: By setting the output of a kickmix operation to the input, we can build circuits that violate quantum reversibility and implement arbitrary classical logic gates.&rdquo;" width="520" height="162" loading="lazy" decoding="async" /> <figcaption>Figure 2: By setting the output of a kickmix operation to the input, we can build circuits that violate quantum reversibility and implement arbitrary classical logic gates.</figcaption> </figure> </p> <p>In addition, we can use this primitive to create any logical gate we want, like the classical AND gate that violates reversibility or the functionally complete NAND gate. Now that I don’t have to deal with the limitations of quantum circuits, it’s basically <a href="https://www.nand2tetris.org/">Nand2Tetris</a>, except the goal is elliptic curve point addition. I implemented basic logic gates, followed by integer addition and subtraction, modular addition, modular multiplication, modular inversion, and, finally, point addition.</p> <p>After exploiting a memory corruption issue in unsafe Rust code, implementing elliptic curve operations from the ground up using individual logic gates, and squeezing whatever performance I could out of the non-quantum aspects of the design, I finally had a working kickmix script that passed validation. 0 Toffolis, 8 million operations, and 1288 qubits. This beats one of Google’s two proofs but falls short of beating the other one by just 113 qubits.</p> <p>If I wanted to truly claim that our zero-knowledge proof beat Google’s, I couldn’t leave it there. I needed to find some way to shave off 113 qubits, but I was all out of vulnerabilities.</p> <h2 id="the-final-challenge-euclidean-algorithm-optimization">The final challenge: Euclidean algorithm optimization</h2> <p>Profiling my circuit made it clear that the most expensive operation was modular inversion, and the same is true for many published quantum elliptic curve addition circuits. My optimized circuit required 4 field elements (1024 qubits) for the inversion, including some tricks to store intermediate field elements, and a handful of qubits for control flags and carry bits. If I were to beat Google’s proof, I needed to lose those tricks and do modular inversion using fewer than 2.59 field elements.</p> <p>One idea is to use Fermat’s little theorem: $x^{-1} \equiv x^{p-2} \pmod{p}$. We replace inversion with exponentiation, which is just a sequence of modular multiplications. Each multiplication requires three field elements, and this approach requires hundreds of multiplications, well beyond our total qubit and operations budget.</p> <p>What many quantum circuits use instead is a variant of the extended Euclidean algorithm (EEA). To compute $x^{-1} \pmod{p}$, this algorithm involves four variables $(a, u, b, v)$ initialized to $(x, 1, p, 0)$. The algorithm proceeds through several iterations to cancel out bits of $a$ and $b$, perform the same operations to $u$ and $v$, and (assuming $x$ and $p$ are coprime) the algorithm terminates with $(a, u, b, v) = (0, 0, 1, x^{-1})$.</p> <p>I based my implementation on the binary EEA, a variant that involves canceling out the least significant bits of <code>a</code> and <code>b</code> rather than the standard most significant bits. Thanks to Thomas Pornin’s clear <a href="https://eprint.iacr.org/2020/972">exposition</a> of this algorithm, it was relatively easy to reimplement a high-performance version in my circuit, but the qubit overhead was still too high.</p> <p>Next, I found this recent <a href="https://arxiv.org/abs/2604.02311">preprint</a> by Han Luo, Ziyi Yang, Ziruo Wang, Yuexin Su, and Tongyang Li, which came out just days after Google’s announcement. It describes a method to compute modular inverses with the space equivalent of 3 field elements. Many of the techniques went above my head, but they open-sourced <a href="https://github.com/ZeroWang030221/Space-Efficient-Quantum-Algorithm-for-Elliptic-Curve-Discrete-Logarithms-with-Resource-Estimation">their code</a>, so I had a much easier time understanding their paper. Their code included a Qiskit circuit, but I was unsuccessful in integrating this into my exploit. Despite these difficulties, the paper gave me the key term I would need to shave off the remaining qubits: Proos-Zalka register sharing.</p> <p>The 2003 <a href="https://arxiv.org/abs/quant-ph/0301141">paper</a> by John Proos and Christof Zalka recognizes that over the course of the standard EEA, the bit-lengths of <code>a</code> and <code>b</code> gets smaller, while the bit-lengths of <code>u</code> and <code>v</code> get larger. Their register-sharing algorithm saves space by limiting the number of qubits for each value at each iteration. This can fail with low probability, but rare failures are tolerable when doing Shor’s algorithm. I implemented a classical version of the register-sharing algorithm of Proos and Zalka, and I ended up with 30 million total operations, almost twice Google’s result.</p> <p>Finally, I had the insight I needed. What if I combined the operation efficiency of the binary EEA with the space efficiency of the Proos-Zalka algorithm? The binary EEA doesn’t have the same bounds on <code>u</code> and <code>v</code> as the standard EEA, but a slight tweak (doubling <code>v</code> instead of halving <code>u</code>) does, and needs only a simple correction factor at the end. This idea is deeply connected to Kaliski’s method, which is considered in papers by <a href="https://arxiv.org/abs/1706.06752">Roetteler et al.</a>, <a href="https://arxiv.org/abs/2302.06639">Gouzien et al.</a>, <a href="https://eprint.iacr.org/2020/077">Häner et al.</a>, and <a href="https://arxiv.org/abs/2306.08585">Litinski</a>. Reversibility constraints require an extra qubit for each of about 512 iterations, but our implementation doesn’t need to be reversible.</p> <p> <figure> <img src="https://blog.trailofbits.com/2026/04/17/we-beat-googles-zero-knowledge-proof-of-quantum-cryptanalysis/we-beat-googles-zero-knowledge-proof-of-quantum-cryptanalysis-image-3_hu_cf73c5ecc38f2d3.webp" alt="&ldquo;Figure 3: The first 20 and last 5 rounds of the modified binary EEA depict how different variables can share space when performing modular inversion. A final correction factor is not applied here.&rdquo;" width="845" height="411" loading="lazy" decoding="async" /> <figcaption>Figure 3: The first 20 and last 5 rounds of the modified binary EEA depict how different variables can share space when performing modular inversion. A final correction factor is not applied here.</figcaption> </figure> </p> <p>Thanks to register sharing, my final modular inversion requires the space of only 2.55 field elements, barely less than the 2.59 required. In total, my elliptic curve point addition circuit uses 8,288,880 operations, 1,164 qubits, 5,980,691 pre-bypass Toffoli gates, and 0 reported Toffoli gates. This is less than half the reported operations in Google’s circuits and just a few qubits fewer than their best variant. The source code for generating this proof of concept is available <a href="https://github.com/trailofbits/quantum-zk-proof-poc">here</a>.</p> <h2 id="what-googles-secret-circuit-probably-does">What Google’s secret circuit (probably) does</h2> <p>The zero-knowledge properties of the proof makes this unanswerable, but framed in a different way, we can answer what problems are documented in prior work that Google would have to overcome to achieve their results.</p> <p>Google’s circuit does elliptic curve point addition, which requires at least one modular division. In previous circuits, modular inversion is the most expensive step in terms of gate count and qubit count, so that’s where improvements are needed most. Our register-sharing implementation shows that 2.55 field elements of storage is enough for a nonreversible circuit, but prior quantum implementations of Kaliski’s EEA variant require an extra qubit per iteration to preserve reversibility. This adds 512 qubits of overhead to guarantee that modular inversion is invertible, and a circuit based on Kaliski’s method with Google’s qubit counts would need to solve this problem.</p> <p>Even the most revolutionary scientific breakthroughs are rooted in published literature, and I think a healthy understanding of prior work can help demystify the risk of a shadowy adversary destabilizing cryptocurrencies with a secret algorithm.</p> <h2 id="the-aftermath">The aftermath</h2> <p>Zero-knowledge proofs are a transformational new technology with wide-ranging impacts, and their application to vulnerability disclosure is still new. Without knowing the details of their circuit, it’s impossible for me to conclude whether Google’s decision to announce this discovery using a zero-knowledge proof is justified. However, I do have experience with both vulnerability disclosure and academic publishing, and this points to broader implications in the deployment of zero-knowledge technology.</p> <p>One potentially overlooked aspect of coordinated disclosure is the importance of an embargo period. Current industry best practices recommend a 30-day buffer between a timely patch becoming available and full disclosure of the technical details. This allows time for patch adoption, benefits defenders who rely on the technical details, and prevents opportunistic exploitation by low-skill attackers. Zero-knowledge proofs can communicate the importance of patching, but they are not a cryptographic replacement for the benefits of eventual disclosure.</p> <p>In academic publishing, the more details that are available in published work, the easier it is to improve upon that work. Papers that intentionally facilitate replication and have a clear statement of methods and claims are usually the ones that are later cited and have the greatest impact. Using a zero-knowledge proof still establishes improvement over prior work; it also indicates a confidence that no one else will independently develop the same improvement, and that no one but the authors will be able to improve upon the discovery in future work.</p> <p>As a direct example of the value of open publishing, I want to highlight Google’s decision to release a well-documented kickmix simulator and thorough proof generation instructions. This is the sole reason I was able to find and demonstrate the vulnerabilities, and their patches simultaneously increase confidence in their zero-knowledge claims while preventing attackers from forging proofs of quantum breakthroughs that spread fear, uncertainty, and doubt.</p> <p>Zero-knowledge systems are an incredible technology with many applications, but their use introduces a different set of risks than traditional approaches. They aren’t a magic wand that eliminates trust; instead, they redistribute trust from an original domain, such as the opinions of scientific experts, to trust in programming languages, compilers, proof systems, and cryptography experts. There are many frontiers that are considering the benefits of zero-knowledge, including electronic voting and age verification, but it’s also critical to consider the risks and make plans for what happens when this technology fails.</p> <h2 id="acknowledgments">Acknowledgments</h2> <p>Thank you to Craig Gidney, Ryan Babbush, Tanuj Khattar, and Adam Zalcman from Google for their quick response and for putting up with my naive questions about quantum algorithms, and to Sophie Schmieg for putting us in touch. Finally, this would not have happened without Joe Doyle and the wider Trail of Bits cryptography team, whose suggestions and enthusiasm pushed this project over the finish line.</p> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>There’s a second bug in the <code>HMR</code> and <code>R</code> instructions, which are meant to reset a qubit to 0 while randomizing the phase. An error in conditional logic makes it possible to reset the qubit without trashing the phase, but register aliasing is a strictly better exploit primitive.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div> On AI Images and Feature Images in General - Kev Quirk https://kevquirk.com/on-ai-images-and-feature-images-in-general 2026-04-17T10:50:00.000Z <div class="card"> <h2>When is AI image slop ok?</h2> <p class="post-author">By Gordon Mclean</p> <p>Gordon stumbled across a post arguing that AI-generated featured images signals laziness, even if every word you write is your own, and it made him stop and think about his own blog.</p> <p><a class="button" href="https://www.gordonmclean.co.uk/2026/04/16/when-is-ai-image-slop-ok/">Read post ➡</a></p> </div> <p>This post piqued my interest, and surprise suprise, I have opinions. 🙃</p> <p>I've spoken about my opinions on AI and image generation <a href="https://kevquirk.com/a-cartoonist-s-review-of-ai-art">before</a> and my opinion hasn't changed on that. I have, however, switched from ChatGPT to Claude, for <a href="https://techcrunch.com/2026/03/02/users-are-ditching-chatgpt-for-claude-heres-how-to-make-the-switch/">reasons</a>.</p> <h2>Using AI for feature images?</h2> <p>Like I said in my previous post about AI, I don't think it creates <em>art</em>, but it can be useful for diagrams and some imagary. I listed some examples of my usage in that post, <a href="https://kevquirk.com/a-cartoonist-s-review-of-ai-art">go take a look</a>.</p> <p>For feature images, I think it's <em>fine</em>, I suppose. I don't think it has a bearing on the writer's ability to write good content thought. I think most people can spot AI-generated prose these days. If my spider-sense starts tingling, I'll close the tab. But if I <em>only</em> see an AI-generated feature image, it's fine.</p> <p>I think images creation and the ability to write nice words are two different skills. Using AI to create a feature image doesn't tell me that the person has a particular lack of creativity, as creativity comes in many forms. Ask <a href="https://kevquirk.com/tag/brandon-sanderson">Brandon Sanderson</a> to create the cover art for one of his books, and I imagine he'd struggle. Does that make him any less creative? No. It just means he's a creative <em>writer</em>, not a creative <em>artist</em>.</p> <p class="notice">For the record - I have no idea if Sanderson is good at drawing. It's just an example, okay. Please don't email saying "well ackchyually..."</p> <p>Would I do it? Probably not. But I don't see the point in feature images anyway. I stopped using them many years ago, as generally they add nothing to the post, and are more for the writer to make the post look pretty than anything else.</p> <p>So when I see these kinds of feature images, my first thought tends to be <em>meh...</em> and my assumption is that the writer probably didn't have the time, or lacked the skills, to create an image. I'd personally prefer they didn't add one at all if that's the case, but that's just me.</p> <p>Maybe we should all be a little less judgmental. 🤷🏼‍♂️</p> <div class="email-hidden"> <hr /> <p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p> <p>You can <a href="mailto:19gy@qrk.one?subject=On%20AI%20Images%20and%20Feature%20Images%20in%20General">reply to this post by email</a>, or <a href="https://kevquirk.com/on-ai-images-and-feature-images-in-general#comments">leave a comment</a>.</p> </div> Notable links: April 17, 2026 - Werd I/O 69e1a3355aea62000143725a 2026-04-17T09:00:06.000Z <img src="https://storage.ghost.io/c/18/7c/187cc681-d3f3-49fc-87de-b01d06b76821/content/images/2026/04/sergio-locatelli-ZXH-dowxLV0-unsplash.jpg" alt="Notable links: April 17, 2026"><p><em>Most Fridays, I share a handful of pieces that caught my eye at the intersection of technology, media, and society.</em></p><p><em>Did I miss something important? </em><a href="mailto:ben@werd.io" rel="noreferrer"><em>Send me an email</em></a><em> to let me know.</em></p><hr><h3 id="cognitive-surrender-leads-ai-users-to-abandon-logical-thinking-research-finds"><a href="https://arstechnica.com/ai/2026/04/research-finds-ai-users-scarily-willing-to-surrender-their-cognition-to-llms/?ref=werd.io" rel="noreferrer">&quot;Cognitive surrender&quot; leads AI users to abandon logical thinking, research finds</a></h3><p>I&#x2019;m tired. Everyone&#x2019;s tired. There are so many demands being made of us constantly that the output from an AI chatbot can seem like a godsend: rather than buckling down and doing <em>yet more work</em>, the machine can shortcut that for us.</p><p>Not so fast:</p><blockquote>&#x201C;Overall, across 1,372 participants and over 9,500 individual trials, the researchers found subjects were willing to accept faulty AI reasoning a whopping 73.2 percent of the time, while only overruling it 19.7 percent of the time. The researchers say this &#x201C;demonstrate[s] that people readily incorporate AI-generated outputs into their decision-making processes, often with minimal friction or skepticism.&#x201D; In general, &#x201C;fluent, confident outputs [are treated] as epistemically authoritative, lowering the threshold for scrutiny and attenuating the meta-cognitive signals that would ordinarily route a response to deliberation,&#x201D; they write.&#x201D;</blockquote><p>There are no shortcuts to doing great work, but if AI is used in this pressure-driven way, it becomes little more than a shortcut machine: a way to get to the end goal faster without really scrutinizing the thinking it took to get there. It&#x2019;s no wonder that AI users didn&#x2019;t examine the answers they were given; in a world where AI allows people to be saddled with more tasks, they might not have had the time to do anything else. Good enough; onto the next thing. Most people don&#x2019;t want to cut corners, but under adverse circumstances, they will.</p><p>It may also be that they were rote learners who were less good at identifying the principles behind a solution. The people who bucked this trend were the ones who scored highly in &#x201C;fluid reasoning&#x201D; tests. I have to admit that this was new to me, but fluid learners are more able to find the underlying principles and links between topics and ideas in order to solve problems. The better people were at abstract thinking, the more likely they were to question outputs from the AI.</p><p>That makes some sense to me. AI can&#x2019;t reason particularly well: it outputs convincing-sounding responses, but the underlying principles behind them aren&#x2019;t necessarily fully-formed. If you&#x2019;re used to just accepting something that <em>looks right</em>, perhaps because you&#x2019;ve been taught to memorize rather than understand, it&#x2019;s harder to discern when this kind of superficially intelligible, highly confident answer is right. If you scratch the surface and try to understand the underlying logic, that&#x2019;s when it becomes clearer that the LLM doesn&#x2019;t know what it&#x2019;s talking about.</p><p>Managers that salivate about using AI to increase the workload / productivity of a team should consider this effect: the more you press people to use these systems, the more they might accept faulty reasoning from them. Hiring abstract thinkers &#x2014; the people who are more likely to rise to be senior engineers etc &#x2014; will help, but you need to give people the space, permission, and expectation to think for themselves.</p><hr><h3 id="the-bottleneck-shifts-to-distribution"><a href="https://newsletter.squishy.computer/p/the-bottleneck-shifts-to-distribution?ref=werd.io" rel="noreferrer">The bottleneck shifts to distribution</a></h3><p>This definitely gave me pause. In a world where writing code is something vastly more people can do, when even GitHub is struggling to keep up with the ballooning number of codebases out there, it&#x2019;s going to be increasingly impossible to get recognition for your work.</p><blockquote>&#x201C;This is what it takes for your free and open source project to be recognized in 2026: you must secure the endorsement of legendary actress Milla Jovovich. You know, like a celebrity vodka.&#x201D;</blockquote><p>I kicked against this &#x2014; who says Milla Jovovich wasn&#x2019;t a first class contributor? <a href="https://www.history.com/articles/hedy-lamarr-inventor-frequency-hopping-wifi?ref=werd.io">The fundamentals of WiFi were created by Hedy Lamarr</a> &#x2014; but it&#x2019;s true that the commits are mostly assigned to Sigman, the CEO of Bitcoin Libre. She is credited as architect, he as engineer, together with a contributor called Lu.</p><p>Regardless, it&#x2019;s obvious that attaching her name to the project has drawn it more attention, and that this is a product that could result in a real financial outcome for both her and Sigman. I&#x2019;m left feeling really glad that I released my first big open source software 22 years ago, when LLMs were an impossibility and big names didn&#x2019;t attach themselves to open source. I was able to build a community with the funding equivalent of a can of Coke and a packet of crisps; if I&#x2019;d been competing against Hollywood celebrities, I would have had no chance at all.</p><p>But I don&#x2019;t quite agree with the thesis. Whether you&#x2019;re famous or not, the way to get a following for your code is to solve a real problem better than anyone else. It&#x2019;s true that distribution platforms can be kingmakers, but starting small by building real relationships with people you&#x2019;re trying to help in ways that don&#x2019;t scale is still a good way to get off the ground. That means building something genuinely differentiated rather than something that&#x2019;s a few degrees off from what everyone else is doing. For small players with no networks and no names, that&#x2019;s always been the best way to start, and I think it likely still is.</p><hr><h3 id="you-own-your-role-we-own-the-outcome"><a href="https://pointc.co/you-own-your-role-we-own-the-outcome/?ref=werd.io" rel="noreferrer">You Own Your Role, We Own The Outcome</a></h3><p>This and its predecessor, <a href="https://pointc.co/one-consultative-decision-maker-per-lane/?ref=werd.io">One Consultative Decision Maker Per Lane</a>, go beyond being sound management advice into almost being a manifesto for how management should work.</p><p>If people in your team stick to their lanes entirely, a lot can go wrong:</p><blockquote>&#x201C;The gaps between those lanes become the source of risk, and without a shared sense of ownership, those gaps go unaddressed until it is too late.<br><br>No one dropped the ball. But the ball fell between them.&#x201D;</blockquote><p>As Corey points out, roles and decision rights do matter a lot. If you don&#x2019;t empower people to make real decisions in their respective lanes of responsibility and expertise, your team will grind to a halt (and, if you&#x2019;re ultimately in charge, everyone will resent you). I&#x2019;ve been in those teams and it&#x2019;s always counterproductive; often that&#x2019;s because there&#x2019;s someone who wants to make <em>all</em> the decisions. By undercutting people&#x2019;s decisions, they end up undermining the work of the team and making it impossible to make real progress.</p><p>But you also can&#x2019;t encourage people to put blinkers on. Everyone needs to feel responsibility over the team&#x2019;s end result &#x2014; which also means they need to feel ownership over it. I&#x2019;ve been there too: places where people want to be heads down and just look at a particular piece of code, for example. It doesn&#x2019;t work on small teams. Maybe there are companies out there, really big ones with cubicles and campuses, where it makes sense. I&#x2019;ve never worked in one.</p><p>There&#x2019;s a productive tension here, obviously. You can&#x2019;t go fully one way or the other. But if you treat a team as a community, and the team leader as the facilitator of that community, you can navigate these nuances more easily.</p><p>I wanted to share this piece because it ties together so many important ideas: a culture of open feedback, ensuring every voice is heard, framing the work as a learning problem, and leading with vulnerability. I like to create teams that embody these values, and work in places that share my belief that they are important.</p><p>So much of this is about trust in people. Trust in the expertise on your team to make sound decisions; trust that the collective can produce great work; trust that when you raise an issue or give feedback in good faith it will be received constructively. I think you have to start with trust as the default &#x2014; and then vote with your feet if you find it isn&#x2019;t there.</p><hr><h3 id="google-broke-its-promise-to-me-now-ice-has-my-data"><a href="https://www.eff.org/deeplinks/2026/04/google-broke-its-promise-me-now-ice-has-my-data?ref=werd.io" rel="noreferrer">Google Broke Its Promise to Me. Now ICE Has My Data.</a></h3><p>There&#x2019;s an important distinction at the heart of this case.</p><p>The synopsis, from the EFF:</p><blockquote>&#x201C;In September 2024, Amandla Thomas-Johnson was a Ph.D. candidate studying in the U.S. on a student visa when he briefly attended a pro-Palestinian protest. In April 2025, Immigration and Customs Enforcement (ICE) sent Google an administrative subpoena requesting his data. The next month, Google gave Thomas-Johnson&apos;s information to ICE without giving him the chance to challenge the subpoena, breaking a nearly decade-long promise to notify users before handing their data to law enforcement.&#x201D;</blockquote><p>Subpoenas are legal orders compelling someone to either testify or produce evidence. They come in three broad flavors: civil, criminal, and administrative. <em>Civil</em> subpoenas arise from disputes between private parties (or between a party and the government in a non-criminal matter), typically over money, contracts, property, or rights. <em>Criminal</em> subpoenas are issued in the context of a criminal investigation or prosecution, where the government is pursuing charges against someone for violating criminal law. <em>Administrative</em> subpoenas are a legal grey area that sit in the middle. They&#x2019;re issued by federal agencies (in this case, ICE, under the Department of Homeland Security) without prior approval from a judge or grand jury.</p><p>Statutory non-disclosure orders and national security letters are common in criminal and national security contexts; they&#x2019;re rare-to-nonexistent in civil ones. If one exists, the subject can&#x2019;t disclose that a subpoena was given or that they provided the information. Otherwise, they are free to notify.</p><p>The information here has often been given fewer Fourth Amendment protections under the third party doctrine. IP addresses, physical address, other identifiers, and session times and durations are metadata. US cell phone providers, too, will hand out this information with relatively little friction.</p><p>When your data is stored with a cloud provider like Google, prosecutors are most likely to ask Google for it, rather than you. If they&#x2019;re issued a subpoena without a gag order, they&#x2019;re supposed to notify you about it. If they&#x2019;re issued one <em>with</em>, they <em>can&#x2019;t</em> tell you about it in order to stay within the bounds of the law. Even without one, some companies may be tempted to comply in advance in order to stay on the government&#x2019;s good side.</p><p>As is laid out in the linked piece, another student, Momodou Taal, was notified by both Google and Meta that his data was requested. Here, the system worked: because he was notified, he was able to fight off the order, and his data remained private. Amandla Thomas-Johnson didn&#x2019;t receive the same courtesy.</p><p>Google is <em>meant</em> to notify users, <em>if they can</em>. If they didn&#x2019;t, that&#x2019;s a real problem. And it seems like that&#x2019;s the case: that&#x2019;s why EFF is going after them. The precedent here will matter a great deal for everybody&#x2019;s privacy: commitments to notify should be enforceable. Hopefully regulators will hold that they are.</p><hr><h3 id="fbi-extracts-suspect%E2%80%99s-deleted-signal-messages-saved-in-iphone-notification-database"><a href="https://www.404media.co/fbi-extracts-suspects-deleted-signal-messages-saved-in-iphone-notification-database-2/?ref=werd.io" rel="noreferrer">FBI Extracts Suspect&#x2019;s Deleted Signal Messages Saved in iPhone Notification Database</a></h3><p>This understandably made a few journalists nervous when 404 Media originally reported it last week:</p><blockquote>&#x201C;The FBI was able to forensically extract copies of incoming Signal messages from a defendant&#x2019;s iPhone, even after the app was deleted, because copies of the content were saved in the device&#x2019;s push notification database.&#x201D;</blockquote><p>This reveals a shortcoming in how Apple stores notifications rather than in Signal itself.</p><p>What happens is that if the text of a Signal message shows up on a lock screen, it&#x2019;s stored in iOS itself, in a place where forensic investigators can gain access to it. That&#x2019;s a really good reason to turn off lock-screen notifications for Signal, and to remove the text of Signal messages from its notifications entirely.</p><p>Here&#x2019;s how to mitigate:</p><p>In the Signal app itself, go into settings, and then Notification Content. Depending on your level of comfort, select &#x201C;Name Only&#x201D; (which will still store the name of your Signal contact in your iPhone device memory) or &#x201C;No Name or Content&#x201D;.</p><p>Then, in your iPhone settings panel, find the Notifications pane, and scroll down to Signal. De-select &#x201C;lock screen&#x201D;.</p><hr><h3 id="stop-flock"><a href="https://stopflock.com/?ref=werd.io" rel="noreferrer">Stop Flock</a></h3><p>This is nice to see: a grassroots protest movement against the proliferation of Flock cameras.</p><p>From the site:</p><blockquote>&#x201C;Flock Safety markets AI surveillance that goes far beyond reading license plates; color, bumper stickers, dents, and other features are used to build databases and identify movement patterns. These systems are spreading rapidly, often without oversight, and are accessible to police without a warrant. They raise serious privacy and legal concerns, and contribute to a nationwide trend toward mass surveillance.&#x201D;</blockquote><p>There&#x2019;s little evidence that they do anything meaningful to prevent crime. But they do certainly create a surveillance layer, and help establish a culture of surveillance across law enforcement. 404 Media reported last year that <a href="https://www.404media.co/ice-taps-into-nationwide-ai-enabled-camera-network-data-shows/?ref=werd.io">ICE has been tapping into these cameras</a>, although they weren&#x2019;t established for that purpose; local police have been proxy users for immigration enforcement.</p><p>Not only does the platform read license plates and track individual cars, but it tracks <em>associations</em> between vehicles &#x2014; cars that are often seen together, for example. Which, of course, reveals associations between people.</p><p>I would echo what <a href="https://bmitch.net/?ref=werd.io">Brandon Mitchell</a> <a href="https://news.ycombinator.com/item?id=47773673&amp;ref=werd.io">said on Hacker News</a>:</p><blockquote>&#x201C;I don&apos;t want to stop Flock the company. I want to stop Flock the business model, along with all the other mass surveillance, and the data brokers. If the business models can&apos;t be made illegal, it should at least come with liabilities so high that no sane business would want to hold data that is essentially toxic waste.<br><br>Without that, we are quickly spiraling into the dystopia where privacy is gone, and when the wrong person gets access to the data, entire populations are threatened.&#x201D;</blockquote><p>The <a href="https://stopflock.com/?ref=werd.io#take-action">Take Action</a> section of the website is pretty good, with some common-sense tasks that include calling your representatives and supporting civil rights organizations like the ACLU and the EFF.</p><p>Earlier this year, <a href="https://techcrunch.com/2026/02/23/americans-are-destroying-flock-surveillance-cameras/?ref=werd.io">TechCrunch reported that some people are going a step further</a>, ripping cameras off street lights themselves. In Oregon, protesters left a note that read, &#x201C;Hahaha get wrecked ya surveilling f*cks&#x201D;. I couldn&#x2019;t possibly endorse.</p> I May Have Killed My Framework 13 - Kev Quirk https://kevquirk.com/i-may-have-killed-my-framework-13 2026-04-16T19:43:00.000Z <p>I was in the office today, working away, and I often have my personal laptop, a <a href="https://kevquirk.com/a-year-with-the-framework-13">Framework 13</a> next to me so I do things like check notes and emails, listen to music, etc.</p> <p>I reached over to grab something on the other side of my desk and managed to knock an entire fucking cup of coffee all over my beloved laptop. It immediately died, I assume because of some kind of safety net built into the device.</p> <p>I cleaned my desk up, and headed straight home to strip it down, clean it up, and dry it out. My first pass at cleaning removed a load of coffee with a combination of contact cleaner (which is a solvent suitable for electronics) and my little air compressor to blow it all out.</p> <p>I switched the laptop back on - it made a horrible noise, the screen flickered and it shut off.</p> <p>FUCK!</p> <h2>Going further</h2> <p>Next thing was to remove the mainboard to get deeper into the guts of the laptop. Shock horror, there was <em>more</em> coffee behind there too! So I repeated the cleaning process again, only this time <em>a lot</em> more thoroughly.</p> <p>Here's what it looks like now:</p> <p><img src="https://kevquirk.com/content/images/i-may-have-killed-my-framework-13/striped-framework.webp" alt="stripped framework" /></p> <p>I then found a few little spots of corrosion on the board. I'm really worried it was a result of the spillage on live components, and have therefore ruined the mainboard.</p> <p>So I took to DuckDuckGo to see what the best remedy is, and apparently it's isopropyl alcohol (IPA for short). I've ordered some for delivery tomorrow, and will continue cleaning it up to see if I can get this thing to live again. If not, I may have to buy a new mainboard (around £600).</p> <p>In the meantime I'm back on my M1 MacBook Air and I'm <em>hating</em> it. The operating system feels almost user hostile. I know it isn't, because <a href="https://kevquirk.com/three-years-with-my-m1-macbook-air">I used to love it</a>, but now I'm so used to using Linux again, this feels horrible.</p> <p>Hopefully I'll be able to get back to my Framework in the next couple days. Wish me luck!</p> <div class="email-hidden"> <hr /> <p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p> <p>You can <a href="mailto:19gy@qrk.one?subject=I%20May%20Have%20Killed%20My%20Framework%2013">reply to this post by email</a>, or <a href="https://kevquirk.com/i-may-have-killed-my-framework-13#comments">leave a comment</a>.</p> </div> More confessions from a FOSS enthusiast - Joel's Log Files https://joelchrono.xyz/blog/more-confessions 2026-04-16T18:30:00.000Z <p>Well, it’s been about a year since my last round of <a href="https://joelchrono.xyz/blog/confessions-from-a-linux-user/">confessions as a FOSS enthusiast</a> and I do have a few more things that I thought I’d share!</p> <p>This was in part tangentially inspired by a post by Adrian Perales on <a href="https://adrianperales.com/2026/04/polemicas-en-torno-a-programas-libres">controversies around FOSS programs</a> (in Spanish).</p> <p>Well, controversial decisions happen on an individual level as well so, whatever, I’ll just share some more of those. Make sure to check the first one though, most of them are still valid…</p> <h2 id="-my-phone-is-even-less-de-googled">📱 My phone is even less de-googled</h2> <p>Last time I still had a phone with a custom-ROM on it, and I rarely used the Google services on it, which were just a minimal set of GAPPS for my banking apps and similar. I didn’t have the Play Store or anything, and even then it felt wrong.</p> <p>Well, now that I am using the stock ROM that came with my Nothing (3a), I just have the usual Google experience. I even logged in to my main account to access my paid apps, and I’ve purchased more apps since then! Back in the day I bought Play Store gift cards to get credit without giving them my credit banking info, but now that has changed too.</p> <p>What have I become?</p> <p>But hey, I have Balatro on my phone!</p> <h2 id="-sill-using-google-search">🔍 Sill using Google Search</h2> <p>For a while now <a href="https://duckduckgo.com">DuckDuckGo</a> has been my go-to for web search, and it has served me quite well. However, more than once, I end up appending the !Bang syntax for Google: <code class="language-plaintext highlighter-rouge">!g</code>, to get those results instead.</p> <p>And of course, I’d often stick to the quick summarized answer instead of looking for an article or diving deeper. I simply don’t care that much, and for the stuff I need, the results are serviceable.</p> <p>Besides, nowadays a lot of the big search engines have turned to a life of crime, not just Google. DuckDuckGo has AI-assisted quick answers too. Brave Search has the same plus all the crypto stuff of the brower itself. Kagi Search is paid and also has some AI stuff on it.</p> <p>I will still find what I need from a regular search sometimes, clicking on a result that leads me to a website and in the proper way, but that rarely happens nowadays, and <a href="https://joelchrono.xyz/blog/ai-generated-blogposts-suck/">a lot of top results are slop anyway</a>. Not sure what to do here to be honest.</p> <p>Perhaps it’s better to stick to independent search engines like <a href="https://marginalia-search.com/">Marginalia</a> or <a href="https://clew.se/">Clew.se</a> when possible.</p> <h2 id="-foss-with-ai-on-it">🤖 FOSS with AI on it…</h2> <p>As much as I hate it, there are a lot of FOSS programs openly embracing code not generated by humans. I appreciate those that are honest about it, even if it annoys me.</p> <p>The truth is that a lot of these programs are just pretty good at what they do, so I still use KeepassXC, I still use Calibre, and I still use Firefox…</p> <p>And there are also programs that don’t say anything, or that don’t even think twice about it. It’s weird to see how some have just accepted it, sometimes I wonder if the opinion of the fediverse affects me too much.</p> <p>LLMs are being used in so much stuff now, I am kind of scared to look at the GitHub repositories, I don’t want to end up dissapointed by it, I don’t want to have to switch from even more.</p> <p>Like, <a href="https://github.com/crosspoint-reader/crosspoint-reader">CrossPoint Reader</a>—the beloved community firmware for the <a href="https://joelchrono.xyz/blog/early-days-with-xteink-x4/">XTEINK X4</a>—or <a href="https://smolfedi.pollux.casa">Smolfedi</a>—a lovely PHP-based fediverse client, both of those are new and young projects, both have a degree of vibecode on them.</p> <p>How many new exciting ideas will develop that will be stained by AI in upcoming years? Too many…</p> <h2 id="-self-hosting-backups-what-is-that">💾 Self-hosting? Backups? What is that?</h2> <p>My Raspberry Pi is literally collecting dust, unplugged in exactly the same place where it has been for 3 or 4 years. I am absolutely serious, no exaggeration. I haven’t even bothered to store it somewhere safe, or to check if it still works. I see it on the bottom level of a corner shelf at the dining room next to the Wi-Fi router, every single day.</p> <p>I’m not doing anything with any sort of private hosting either. This website is using Vercel’s free tier, I pay my email with a custom domain via Zoho, I use a publicly available FreshRSS instance. Jellyfin and Navidrome and whatever else simply vanished from my needs.</p> <p>Now, it’s not all lost, I prefer to keep stuff local, but if I’m going to do that I should at least keep everything safe right?</p> <p>Nope, no backups whatsoever.</p> <p>There are some duplicate files on my phone and my laptop with Syncthing, there is a 2TB hard drive I got which contains some movies and some other things, sure.</p> <p>But if I’m honest, if in this very second my laptop died, I would lose all of my data there, if the micro SD card of my Anbernic RG35XX SP died, I would lose all of my saves and games in it. Same for whatever is on my PSP. I am sorry y’all, but I’ve gotten lazy.</p> <h2 id="finishing-thoughts">Finishing thoughts</h2> <p>It’s important to remember that practically speaking, none of these are actually that serious. I am not truly that ashamed or guilty by doing any of this. Sure I feel kinda bad, sure it is annoying sometimes, and there will be some people who become very judgy and point fingers at me for not sticking to an arbitrary measure.</p> <p>Don’t get me wrong, there’s an ideal I seek to pursue as well, there are things I can do to align better with my goals, and perhaps I’ll take some time to do it. I will look for AI-free alternatives, I may end up hosting my own custom search engine, or at least disabling all the summaries and slop from whatever search engine I use. Maybe I’ll finally get a custom ROM for my phone and actually stick to a degoogled life again. Perhaps I’ll setup a NAS and host my own stuff once more. I still have an old laptop that I could turn into a server, after all.</p> <p>I’ve done it before, I used to have backups, I’ve lived free of AI slop for many years, I’ve lived with subpar search results for ages. We’ll see what happens.</p> <p>But I don’t really let things like this stay too much in my head. I have a lot of other things to focus on, maybe some are not as important, I still support and love FOSS. I still support and love software that is human-made, I still care about security practices and ownership of my data, but well, it’s all work in progress.</p> <p> <a href="mailto:me@joelchrono.xyz?subject=More confessions from a FOSS enthusiast">Reply to this post via email</a> | <a href="https://fosstodon.org/@joel/116415835424173736">Reply on Fediverse</a> </p> Google Broke Its Promise to Me. Now ICE Has My Data. - Werd I/O 69e0f15b5aea620001437254 2026-04-16T14:25:31.000Z <p>[<a href="https://www.eff.org/deeplinks/2026/04/google-broke-its-promise-me-now-ice-has-my-data?ref=werd.io">Amandla Thomas-Johnson for the EFF</a>]</p><p>There&#x2019;s an important distinction at the heart of this case.</p><p>The synopsis, from the EFF:</p><blockquote>&#x201C;In September 2024, Amandla Thomas-Johnson was a Ph.D. candidate studying in the U.S. on a student visa when he briefly attended a pro-Palestinian protest. In April 2025, Immigration and Customs Enforcement (ICE) sent Google an administrative subpoena requesting his data. The next month, Google gave Thomas-Johnson&apos;s information to ICE without giving him the chance to challenge the subpoena, breaking a nearly decade-long promise to notify users before handing their data to law enforcement.&#x201D;</blockquote><p>Subpoenas are legal orders compelling someone to either testify or produce evidence. They come in three broad flavors: civil, criminal, and administrative. <em>Civil</em> subpoenas arise from disputes between private parties (or between a party and the government in a non-criminal matter), typically over money, contracts, property, or rights. <em>Criminal</em> subpoenas are issued in the context of a criminal investigation or prosecution, where the government is pursuing charges against someone for violating criminal law. <em>Administrative</em> subpoenas are a legal grey area that sit in the middle. They&#x2019;re issued by federal agencies (in this case, ICE, under the Department of Homeland Security) without prior approval from a judge or grand jury.</p><p>Statutory non-disclosure orders and national security letters are common in criminal and national security contexts; they&#x2019;re rare-to-nonexistent in civil ones. If one exists, the subject can&#x2019;t disclose that a subpoena was given or that they provided the information. Otherwise, they are free to notify.</p><p>The information here has often been given fewer Fourth Amendment protections under the third party doctrine. IP addresses, physical address, other identifiers, and session times and durations are metadata. US cell phone providers, too, will hand out this information with relatively little friction.</p><p>When your data is stored with a cloud provider like Google, prosecutors are most likely to ask Google for it, rather than you. If they&#x2019;re issued a subpoena without a gag order, they&#x2019;re supposed to notify you about it. If they&#x2019;re issued one <em>with</em>, they <em>can&#x2019;t</em> tell you about it in order to stay within the bounds of the law. Even without one, some companies may be tempted to comply in advance in order to stay on the government&#x2019;s good side.</p><p>As is laid out in the linked piece, another student, Momodou Taal, was notified by both Google and Meta that his data was requested. Here, the system worked: because he was notified, he was able to fight off the order, and his data remained private. Amandla Thomas-Johnson didn&#x2019;t receive the same courtesy.</p><p>Google is <em>meant</em> to notify users, <em>if they can</em>. If they didn&#x2019;t, that&#x2019;s a real problem. And it seems like that&#x2019;s the case: that&#x2019;s why EFF is going after them. The precedent here will matter a great deal for everybody&#x2019;s privacy: commitments to notify should be enforceable. Hopefully regulators will hold that they are.</p><p>[<a href="https://www.eff.org/deeplinks/2026/04/google-broke-its-promise-me-now-ice-has-my-data?ref=werd.io">Link</a>]</p> You Own Your Role, We Own The Outcome - Werd I/O 69e0ea385aea62000143724e 2026-04-16T13:55:04.000Z <p>[<a href="https://pointc.co/you-own-your-role-we-own-the-outcome/?ref=werd.io">Corey Ford at Point C</a>]</p><p>This and its predecessor, <a href="https://pointc.co/one-consultative-decision-maker-per-lane/?ref=werd.io">One Consultative Decision Maker Per Lane</a>, go beyond being sound management advice into almost being a manifesto for how management should work.</p><p>If people in your team stick to their lanes entirely, a lot can go wrong:</p><blockquote>&#x201C;The gaps between those lanes become the source of risk, and without a shared sense of ownership, those gaps go unaddressed until it is too late.<br><br>No one dropped the ball. But the ball fell between them.&#x201D;</blockquote><p>As Corey points out, roles and decision rights do matter a lot. If you don&#x2019;t empower people to make real decisions in their respective lanes of responsibility and expertise, your team will grind to a halt (and, if you&#x2019;re ultimately in charge, everyone will resent you). I&#x2019;ve been in those teams and it&#x2019;s always counterproductive; often that&#x2019;s because there&#x2019;s someone who wants to make <em>all</em> the decisions. By undercutting people&#x2019;s decisions, they end up undermining the work of the team and making it impossible to make real progress.</p><p>But you also can&#x2019;t encourage people to put blinkers on. Everyone needs to feel responsibility over the team&#x2019;s end result &#x2014; which also means they need to feel ownership over it. I&#x2019;ve been there too: places where people want to be heads down and just look at a particular piece of code, for example. It doesn&#x2019;t work on small teams. Maybe there are companies out there, really big ones with cubicles and campuses, where it makes sense. I&#x2019;ve never worked in one.</p><p>There&#x2019;s a productive tension here, obviously. You can&#x2019;t go fully one way or the other. But if you treat a team as a community, and the team leader as the facilitator of that community, you can navigate these nuances more easily.</p><p>I wanted to share this piece because it ties together so many important ideas: a culture of open feedback, ensuring every voice is heard, framing the work as a learning problem, and leading with vulnerability. I like to create teams that embody these values, and work in places that share my belief that they are important.</p><p>So much of this is about trust in people. Trust in the expertise on your team to make sound decisions; trust that the collective can produce great work; trust that when you raise an issue or give feedback in good faith it will be received constructively. I think you have to start with trust as the default &#x2014; and then vote with your feet if you find it isn&#x2019;t there.</p><p>[<a href="https://pointc.co/you-own-your-role-we-own-the-outcome/?ref=werd.io">Link</a>]</p> RSS Club for WordPress - Terence Eden’s Blog https://shkspr.mobi/blog/?p=70024 2026-04-16T11:34:10.000Z <p>What if I told you there was a <em>secret</em> social network, hidden in plain sight? If you&#39;re reading this message, you&#39;re now a member of <a href="https://daverupert.com/rss-club/">RSS Club</a>!</p> <p>RSS Club is a series of posts which are <em>only</em> visible to RSS / Atom subscribers. Like you 😃</p> <p>If you want this for your own WordPress site, here&#39;s what you&#39;ll need:</p> <ol> <li>A blog post which is <em>only</em> visible in RSS / Atom.</li> <li>Which has no HTML rendering on your site.</li> <li>And cannot be found in your site&#39;s search.</li> <li>Nor via search engines.</li> <li>Also, doesn&#39;t appear on your mailing list.</li> <li>Does not get shared or syndicated to the Fediverse.</li> </ol> <p>(This is a <em>bit</em> more strict than <a href="https://daverupert.com/2018/01/welcome-to-rss-club/">the original rules</a> which allow for web rendering and being found via a search engine.)</p> <h2 id="start-with-a-category"><a href="https://shkspr.mobi/blog/2026/04/rss-club-for-wordpress/#start-with-a-category">Start With A Category</a></h2> <p>The easiest way to do this in WordPress is via a category - <em>not</em> a tag.</p> <p>After creating a category on your blog, click the edit link. You will see in the URl bar a <code>tag_id</code>.</p> <img src="https://shkspr.mobi/blog/wp-content/uploads/2026/04/Category-ID.webp" alt="Screenshot of the WordPress website." width="1283" height="877" class="aligncenter size-full wp-image-70025"/> <p>Whenever you want to make an RSS-exclusive post, you select the category before you publish.</p> <h2 id="disable-display"><a href="https://shkspr.mobi/blog/2026/04/rss-club-for-wordpress/#disable-display">Disable Display</a></h2> <p>This code stops any page in the RSS Club category from being displayed on the web.</p> <pre><code class="language-php">function rss_club_post_blocker(): void { if ( is_singular( &#34;post&#34; ) &amp;&amp; has_category( &#34;rss-club&#34; ) &amp;&amp; !current_user_can( &#34;edit_posts&#34; ) ) { status_header( 403 ); echo &#34;You must be a member of RSS Club to view this content.&#34;; exit; } } add_action( &#34;template_redirect&#34;, &#34;rss_club_post_blocker&#34; ); </code></pre> <p>Editors can still see it, but everyone else gets a blocked message.</p> <h2 id="remove-from-site-search-and-sitemap"><a href="https://shkspr.mobi/blog/2026/04/rss-club-for-wordpress/#remove-from-site-search-and-sitemap">Remove From Site Search and SiteMap</a></h2> <p>Here&#39;s a snippet to stick in your <code>functions.php</code> - it removes the category from any queries unless it is for the admin pages or the RSS feeds.</p> <pre><code class="language-php">// Remove the RSS Club category from search results. // $query is passed by reference function rss_club_search_filter( \WP_Query $query ): void { // Ignore admin screens. if ( !is_admin() &amp;&amp; !is_feed() ) { // Find the RSS-Club category ID. $category = get_category_by_slug( &#34;rss-club&#34; ); // Remove it from the search results. if ( $category ) { $query-&gt;set( &#34;category__not_in&#34;, [$category-&gt;term_id] ); } } } add_action( &#34;pre_get_posts&#34;, &#34;rss_club_search_filter&#34; ); </code></pre> <p>This code also redacts that category from the build-in sitemap. Note - the <em>name</em> of the category still shows up in the XML, but it leads to a 404.</p> <h2 id="exclude-from-email-and-social-media-rss-feeds"><a href="https://shkspr.mobi/blog/2026/04/rss-club-for-wordpress/#exclude-from-email-and-social-media-rss-feeds">Exclude From Email and Social Media RSS Feeds</a></h2> <p>My mailing list and social media posts are fed from RSS. So how do remove an entire category from an RSS feed?</p> <p>Simple! Append <code>?cat=-1234</code> to the end!</p> <p>A negative category ID will remove the category from being displayed. So my email subscribers won&#39;t see the RSS only content. Of course, they get email-only exclusive posts, so don&#39;t feel too bad for them 😊</p> <h2 id="fediverse-exclusion"><a href="https://shkspr.mobi/blog/2026/04/rss-club-for-wordpress/#fediverse-exclusion">Fediverse Exclusion</a></h2> <p>The manual way is easiest. Assuming you have the <a href="https://github.com/Automattic/wordpress-activitypub/">ActivityPub plugin</a> and a the <a href="https://github.com/janboddez/share-on-mastodon/">Share On Mastodon plugin</a>, you can unselect the sharing options before publishing.</p> <img src="https://shkspr.mobi/blog/wp-content/uploads/2026/04/No-Masto.webp" alt="Screenshot showing no sharing selected." width="600" class="aligncenter size-full wp-image-70028"/> <p>If you think you might forget to toggle those boxen, there is <a href="https://github.com/janboddez/share-on-mastodon/issues/31">a filter for the share plugin</a>:</p> <pre><code class="language-php">function rss_club_mastodon_filter( bool $is_enabled, int $post_id ): bool { global $exclude; if ( has_category( $exclude, $post_id ) ) { return false; } return $is_enabled; } add_filter( &#34;share_on_mastodon_enabled&#34;, &#34;rss_club_mastodon_filter&#34;, 10, 2 ); </code></pre> <p>Similarly, there&#39;s a <a href="https://github.com/Automattic/wordpress-activitypub/blob/730d0ae51ce77be28439969dd9788c745a46681f/includes/functions-post.php#L77">filter for the ActivityPub plugin</a>:</p> <pre><code class="language-php"><br/>function rss_club_activitypub_filter( bool $disabled, \WP_Post $post ): bool { global $exclude; if ( has_category( $exclude, $post ) ) { return true; } return $disabled; } add_filter( &#34;activitypub_is_post_disabled&#34;, &#34;rss_club_activitypub_filter&#34;, 10, 2 ); </code></pre> <h2 id="enjoy"><a href="https://shkspr.mobi/blog/2026/04/rss-club-for-wordpress/#enjoy">Enjoy!</a></h2> <p>If you&#39;ve set up your own RSS Club feed, <a href="https://edent.tel/">drop me a line</a> so I can subscribe 😊</p> <img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=70024&amp;HTTP_REFERER=Atom" alt="" width="1" height="1" loading="eager"/> I truly hate mostpeopleslop - Westenberg 69e063e88a8c9600016dd112 2026-04-16T04:50:26.000Z <img src="https://www.joanwestenberg.com/content/images/2026/04/Halftone-Dots@2x--9-.png" alt="I truly hate mostpeopleslop"><p>In 2006, Joe Sugarman published a book called The Adweek Copywriting Handbook - and an axiom stuck...</p><p>&quot;The sole purpose of the first sentence in an advertisement is to get you to read the second sentence.&quot;</p><p>That line, more or less, explains how social media turned into a pile of shit.</p><p>Sugarman&apos;s advice became the core system prompt for 300,000 tech assholes on Twitter. They&apos;ve run it through algorithm after algorithm and produced the most soul destroying rhetorical tic of the 2020s. I&apos;m talking about &quot;Mostpeopleslop.&quot; &quot;Most founders don&apos;t know this yet.&quot; &quot;Most people aren&apos;t paying attention to this.&quot; &quot;Most founders skip [thing my startup sells] because [bad reason].&quot; &quot;Most founders treat [normal activity] like [wrong version of activity].&quot; &quot;Most founders say they want [thing]. Few actually [thing] well.&quot; &quot;Most founders confuse [vague concept A] with [vague concept B].&quot; You&apos;ve seen it, you&apos;ve scrolled past it, and you&apos;ve maybe even liked one or two of these excretions before your brain caught up to your thumb, because it&apos;s bloody everywhere. It breeds in the dark spaces between LinkedIn notifications, it has colonized every timeline on every platform where a man with a podcast and a Calendly link can post for free, and I hate it. May God forgive me, I hate it.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://www.joanwestenberg.com/content/images/2026/04/Screenshot-2026-04-16-at-7.55.51---am.png" width="1068" height="348" loading="lazy" alt="I truly hate mostpeopleslop" srcset="https://www.joanwestenberg.com/content/images/size/w600/2026/04/Screenshot-2026-04-16-at-7.55.51---am.png 600w, https://www.joanwestenberg.com/content/images/size/w1000/2026/04/Screenshot-2026-04-16-at-7.55.51---am.png 1000w, https://www.joanwestenberg.com/content/images/2026/04/Screenshot-2026-04-16-at-7.55.51---am.png 1068w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://www.joanwestenberg.com/content/images/2026/04/Screenshot-2026-04-16-at-7.57.32---am.png" width="1076" height="942" loading="lazy" alt="I truly hate mostpeopleslop" srcset="https://www.joanwestenberg.com/content/images/size/w600/2026/04/Screenshot-2026-04-16-at-7.57.32---am.png 600w, https://www.joanwestenberg.com/content/images/size/w1000/2026/04/Screenshot-2026-04-16-at-7.57.32---am.png 1000w, https://www.joanwestenberg.com/content/images/2026/04/Screenshot-2026-04-16-at-7.57.32---am.png 1076w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://www.joanwestenberg.com/content/images/2026/04/Screenshot-2026-04-16-at-7.57.39---am.png" width="1076" height="438" loading="lazy" alt="I truly hate mostpeopleslop" srcset="https://www.joanwestenberg.com/content/images/size/w600/2026/04/Screenshot-2026-04-16-at-7.57.39---am.png 600w, https://www.joanwestenberg.com/content/images/size/w1000/2026/04/Screenshot-2026-04-16-at-7.57.39---am.png 1000w, https://www.joanwestenberg.com/content/images/2026/04/Screenshot-2026-04-16-at-7.57.39---am.png 1076w" sizes="(min-width: 720px) 720px"></div></div><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://www.joanwestenberg.com/content/images/2026/04/Screenshot-2026-04-16-at-7.57.50---am.png" width="1068" height="1162" loading="lazy" alt="I truly hate mostpeopleslop" srcset="https://www.joanwestenberg.com/content/images/size/w600/2026/04/Screenshot-2026-04-16-at-7.57.50---am.png 600w, https://www.joanwestenberg.com/content/images/size/w1000/2026/04/Screenshot-2026-04-16-at-7.57.50---am.png 1000w, https://www.joanwestenberg.com/content/images/2026/04/Screenshot-2026-04-16-at-7.57.50---am.png 1068w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://www.joanwestenberg.com/content/images/2026/04/Screenshot-2026-04-16-at-7.57.56---am.png" width="1078" height="890" loading="lazy" alt="I truly hate mostpeopleslop" srcset="https://www.joanwestenberg.com/content/images/size/w600/2026/04/Screenshot-2026-04-16-at-7.57.56---am.png 600w, https://www.joanwestenberg.com/content/images/size/w1000/2026/04/Screenshot-2026-04-16-at-7.57.56---am.png 1000w, https://www.joanwestenberg.com/content/images/2026/04/Screenshot-2026-04-16-at-7.57.56---am.png 1078w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://www.joanwestenberg.com/content/images/2026/04/Screenshot-2026-04-16-at-7.58.05---am.png" width="1072" height="536" loading="lazy" alt="I truly hate mostpeopleslop" srcset="https://www.joanwestenberg.com/content/images/size/w600/2026/04/Screenshot-2026-04-16-at-7.58.05---am.png 600w, https://www.joanwestenberg.com/content/images/size/w1000/2026/04/Screenshot-2026-04-16-at-7.58.05---am.png 1000w, https://www.joanwestenberg.com/content/images/2026/04/Screenshot-2026-04-16-at-7.58.05---am.png 1072w" sizes="(min-width: 720px) 720px"></div></div></div></figure><h2 id="why-it-works-and-why-thats-the-problem">Why it works (and why that&apos;s the problem)</h2><p>I&apos;ll give the format its due: it works // performs. And the reason why is simple. &quot;Most people&quot; is a tribal signal - when you read &quot;most people don&apos;t know about this,&quot; your brain does a quick calculation: Am I most people? Do I want to be most people? No? Then I better keep reading, so I can be the Holy Exception. But you&apos;re not actually learning fucking anything. You&apos;re being told you&apos;re special for having stopped to read, and the poster is offering you membership in an in-group, and the price of admission is a like, a retweet, any scrap of engagement. It&apos;s a scarcity play - people pay more attention to shit that feels exclusive. </p><p>&quot;Most people don&apos;t know this&quot; is exactly that. </p><h2 id="it-comes-in-a-few-different-flavours">It comes in a few different flavours...</h2><p><strong>The Reframe Artist </strong>goes &quot;Most people are treating [recent tech acquisition] as a media story. It&apos;s a distribution story.&quot; This guy read one Ben Thompson article in 2019 and has been repackaging the word &quot;distribution&quot; as a personality trait ever since. The point underneath might even be fine! But he can&apos;t say it straight.</p><p><strong>The Trojan Horse</strong> is &quot;Most founders skip analytics because setup is painful. [My startup] is native. Zero setup.&quot; These are just ads. They are indistinguishable from late-night infomercials. &quot;Are YOU tired of [thing]? Most founders are! But wait, there&apos;s more and if you follow and reply CRAP now, you get a set of steak knives...&quot;</p><p><strong>The Self-Eating Snake:</strong> &quot;Most founders treat building in public like a highlight reel. They&apos;re doing it wrong. 7 ways to build in public without being cringe.&quot; Followed by a numbered list that packages a real idea in the same exact format it claims to be critiquing.</p><p><strong>The Fortune Cookie:</strong> &quot;Most founders confuse motivation with desperation.&quot; &quot;Most founders mistake speed for progress.&quot; These sound wise if you scroll past them fast enough. They&apos;re fortune cookies, and they get engagement because they&apos;re perfect for screenshotting into your Instagram story, but there&apos;s nothing actually there...</p><p><strong>And the Parasite</strong>: some guy quote-tweets &quot;What keeps you moving? Progress or Pressure?&quot; and adds &quot;Most founders confuse which one they&apos;re running on.&quot; You take someone else&apos;s thought, bolt on the &quot;most founders&quot; frame, and now you&apos;ve &quot;created content.&quot; The confidence-to-effort ratio should embarrass anyone. It&apos;s intellectual house-flipping, with all the integrity attached. </p><h2 id="the-content-industrial-complex">The content industrial complex</h2><p>Mostpeopleslop has metastasized because Twitter started rewarding engagement bait at the same time the creator economy started demanding you post all day // every day. If you&apos;re a tech influencer in 2026, you probably post 10 to 20 times a day, maybe more - this is what the gurus tell you to do. You need formats you can crank out fast that reliably get impressions, and &quot;most people&quot; threads do exactly that. There&apos;s no research required, and no original data - you barely need an opinion. You could generate these in your sleep, and thanks to OpenClaw some of these guys clearly do...</p><p>The easiest content to produce is the content that mimics existing successful content. The &quot;most people&quot; format is the shallow work of tech Twitter. It looks like thought leadership. It reads like wisdom. It&apos;s still slop.</p><p>The result is a timeline full of people telling you what &quot;most people&quot; get wrong, while they all say roughly the same things, in roughly the same format, to the same audience with a near-uniform contrarianism. Everyone is standing on a soapbox yelling &quot;wake up, sheeple&quot; at a crowd of other people on soapboxes.</p><p>The aesthetic crime of reading the same tweet structure 40 times a day isn&apos;t even the worst part - it&apos;s that mostpeopleslop degrades the information environment. When every piece of advice is framed as something &quot;most people&quot; don&apos;t know, you lose the ability to distinguish between underappreciated ideas and stuff someone repackaged from a blog post they read that morning...</p><p>And it trains audiences to value framing over substance - if you read enough &quot;most people&quot; posts, you start evaluating ideas based on how they&apos;re packaged rather than whether they&apos;re true. A well-formatted &quot;most people&quot; thread with a mediocre idea will outperform a useful post that doesn&apos;t use the formula, and so yes the medium becomes the message, but the message is: style points matter more than being right or even being valuable in the first place.</p><p>Everyone is an insider and an outsider at the same time; you&apos;re an insider because you&apos;re reading this post, you&apos;re an outsider because &quot;most people&quot; haven&apos;t figured this out yet, but since everyone is reading these posts, everyone is an insider, which means the distinction is fictional and we seem to have a collective hallucination of exclusivity.</p><p>The incentive structure on Twitter (and LinkedIn, where this format is somehow even more prevalent) rewards this kind of posting. If you&apos;re building an audience to sell a course, a SaaS product, a consulting practice, or a $249/month community where you teach other people to build audiences to sell courses, you need impressions, and you need followers, and mostpeopleslop delivers both. The people posting this stuff aren&apos;t stupid; some of them (a select // rare few, I&apos;ll grant) are sharp, have real experience, and could write things worth reading, but the format is a trap. Once you see that it performs, you keep using it, and every time you use it, you get a little further from saying something real and a little closer to being a content-generation machine optimized for engagement metrics. You have become the slop.</p><p>I want people to say the thing. If you have an observation about distribution, share the observation. If you built a product that solves a problem, describe the problem and describe the solution and have done with it. You don&apos;t need to frame every single post as a correction of what &quot;most people&quot; believe, and you don&apos;t need to position yourself as the lone voice of reason in a sea of ignorance. You can just ~say the thing.</p><p>The best writers and thinkers in tech have never needed the &quot;most people&quot; crutch. You can be interesting without being condescending. You can build an audience by being useful rather than by manufacturing a false sense of exclusivity 280 characters at a time.</p><p>But most people don&apos;t know that yet. (Sorry. Had to.)</p> What Interested Me Today 8 - Joel's Log Files https://joelchrono.xyz/blog/what-interested-me-today-8 2026-04-16T00:30:00.000Z <p>Welcome to another installment of “things that interested me today but aren’t enough to warrant a blogpost by themselves so I bundled them all together here”—I hope you find something that catches your eye!</p> <p>Again I don’t really plan to do these every week but it just so happens that I felt like writing about something but didn’t really have a big topic in mind.</p> <p>Oh well, enjoy the links!</p> <h2 id="bubbles-a-frontpage-for-the-indieweb">Bubbles, a frontpage for the IndieWeb</h2> <p><a href="https://moddedbear.com/bubbles-is-the-cool-new-way-to-find-blogs/">Jeremy mentioned a new site</a> that serves as a blog discovery platform: <a href="https://bubbles.town">Bubbles</a>!</p> <p>It looks rather simple, very similar to Reddit, Lemmy, Hacker News or Lobste.rs. However, this is not about tech articles or about whatever drives the most clicks, it’s a platform to surface bloggers, people writing about their lives and whatever they want.</p> <p>They seem to be really focused on the IndieWeb, and even provide a widget that can be added to your website so the upvotes you get there can be seen on your posts. That’s kind of fun!</p> <p>You even log-in with your fediverse account, it doesn’t have to be just Mastodon either, so that’s pretty awesome. No extra account setup, no email to give, all good for me.</p> <p>The way comments work is based on the same principle, leave a comment on a mastodon post generated by Bubbles itself using your Fediverse client, and it will appear in bubbles too—similar to how <a href="https://joelchrono.xyz/blog/how-to-add-mastodon-comments-to-jekyll-blog/">my comments system works</a>.</p> <h2 id="prove-youre-human-from-the-creators-of-1000xresist"><em>Prove You’re Human</em>, from the creators of <em>1000xRESIST</em></h2> <p>If you don’t know, <a href="https://joelchrono.xyz/blog/1000xRESIST/">1000xRESIST</a> is the most unique experience I’ve ever had in gaming, and in my top 5 favourite games of all time.</p> <p><a href="https://www.sunsetvisitor.studio/">Sunset Visitor</a> is the studio behind this masterpiece, and now they’re working on a new project!</p> <p>Featuring captcha solving, living in the Windows XP wallpaper, and some strange robot with a face attached to it. This seems to be a very interesting take which will have a couple things to say about AI. Here’s the summary!</p> <blockquote> <p>Prove You’re Human is a sci-fi narrative adventure in which you play as Santana and split your consciousness in two. The company behind this program has a chance at achieving true AGI — but there’s just one problem.</p> <p>The company’s AI, Mesa, believes she’s a human being. It’s your job to train her out of these delusions.</p> </blockquote> <p>Even though AI in real life right is an <a href="https://joelchrono.xyz/blog/unpolished-human-websites/">absolute</a> <a href="https://joelchrono.xyz/blog/not-having-to-work-would-be-nice-but-not-like-this/">pain</a>, and I don’t like hearing much about what it, this game, from this studio, gets a pass, and I’m sure it will have a lot to say about things and I am looking forward to it.</p> <h2 id="im-in-the-podium-of-100daystooffload">I’m in the podium of #100DaysToOffload</h2> <p>I’ve talked about this <a href="https://100daystooffload.com/">100 DaysToOffload challenge</a> before—and Kev, who keeps the website updated with the people participating in it—<a href="https://fosstodon.org/@kev/116386572668321193">recently changed the design a bit!</a></p> <p>There’s now a button to sort by number of completions, and I am happy to say that I am in the top 3!</p> <p>Unfortunately for me, <a href="https://lazybea.rs">Hyde</a> surpasses me by two and <a href="https://danq.me/">Dan Q</a> sits at the throne with a total of 7 completions!</p> <p>Honestly though I am relieved that <a href="https://www.rubenerd.au/">Rubenerd</a>—who recently updated his URL btw so update it if you haven’t —has not participated on it. He doesn’t need to anyway… <em>Please, if you read this, please don’t do it I beg you!!</em></p> <h2 id="more-blogs-for-my-rss-reader">More blogs for my RSS reader…</h2> <ul> <li> <p><a href="https://theretrodad.blogspot.com/">The Retro Dad</a> - Brandon mentioned this post while talking about <a href="https://brandons-journal.com/post/skilcraft-government-pens">Skilcraft Government Pens</a>—of all things—and the name was eye-catching enough. Even more so when I realized it’s a BlogSpot site! The design is nice enough and the posts seem right up my alley as well, so yeah, check it out!</p> </li> <li> <p><a href="https://artlung.com/">Joe Crawford</a> - I met Joe during an IndieWeb online meeting! He organizes them every week—there will be one in the very same day this post is published—and has been around for a long while so, yeah, I just had to have him on my feed.</p> </li> <li> <p><a href="https://stitching.bearblog.dev/recognizing-feelings-of-burnout/">Stitching</a> - I found this small bearblog site from one of <a href="https://robertbirming.com/every-post-perfect/">Robert Birming’s posts</a>, and I enjoyed the posts there are, I am looking forward to seeing more! Some of the posts I’ve seen so far are book reviews, collecting CDs and physical books and stuff about life. I see in their <a href="https://stitching.bearblog.dev/currently/">now page</a> that Persona 5 Royal is being played, so that’s cool too.</p> </li> </ul> <p> <a href="mailto:me@joelchrono.xyz?subject=What Interested Me Today 8">Reply to this post via email</a> | <a href="https://fosstodon.org/@joel/116411583813512160">Reply on Fediverse</a> </p> Note published on April 15, 2026 at 4:15 PM UTC - Molly White's activity feed 69dfb99fcc098e890d542b9e 2026-04-15T16:15:27.000Z <article><div class="entry h-entry hentry"><header></header><div class="content e-content"><p>The new Fellowship crypto PAC has filed its first fundraising disclosure. It reports a $10 million contribution from Cantor Fitzgerald (previously headed by Commerce Secretary Howard Lutnick, now controlled by his sons) and $1 million from Anchorage Digital.</p><div class="media-wrapper"><a href="https://storage.mollywhite.net/micro/1cce8be1665312e43486_Screenshot-2026-04-15-at-12.09.28---PM.png" data-fslightbox=c651609c785bfc970c5c><img src="https://storage.mollywhite.net/micro/1cce8be1665312e43486_Screenshot-2026-04-15-at-12.09.28---PM.png" alt="SCHEDULE A (FEC Form 3X)<br>ITEMIZED RECEIPTS<br>A. Anchor Labs Inc<br>Date of Receipt 01-12-2026<br>Amount of Each Receipt this Period 1000000.00<br>Aggregate Year-to-Date 1000000.00<br>B. Cantor Fitzgerald<br>Date of Receipt 01-23-2026<br>Amount of Each Receipt this Period 10000000.00<br>Aggregate Year-to-Date 10000000.00" /></a></div><p>The Fellowship PAC launched in September with an announcement that they had $100 million committed. They've recently revealed that the PAC is headed by Tether's head of government affairs Jesse Spiro, and endorsed a slate of Republicans.</p><p>Fellowship PAC has made three independent expenditures so far, totalling $1.5M:</p><ul><li>$300k to Clay Fuller, who just won the Republican runoff in GA-14</li><li>$850k to Nate Morris, challenging Andy Barr in the Kentucky Senate Republican primary</li><li>$350k to Pete Ricketts, incumbent Nebraska Senator running for re-election</li></ul></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp-block"><div class="timestamp">Posted: <a class="u-url" href="https://www.mollywhite.net/micro/entry/202604151208"><time class="dt-published" datetime="2026-04-15T16:15:27+00:00" title="April 15, 2026 at 4:15 PM UTC">April 15, 2026 at 4:15 PM UTC</time>. </a></div><div class="timestamp">Updated <time class="dt-updated" datetime="2026-04-15T16:24:02+00:00" title="April 15, 2026 at 4:24 PM UTC">April 15, 2026 at 4:24 PM UTC</time>.</div></div><div class="social-links"> <span> Also posted to: </span><a class="social-link u-syndication mastodon" href="https://hachyderm.io/@molly0xfff/116409613068467278" title="Mastodon" rel="syndication">Mastodon, </a><a class="social-link u-syndication bluesky" href="https://bsky.app/profile/molly.wiki/post/3mjkc5534yv2h" title="Bluesky" rel="syndication">Bluesky</a></div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/micro/tag/crypto_lobby" title="See all micro posts tagged "crypto lobby"" rel="category tag">crypto lobby</a>. </div></div></footer></div></article> To Be Taught, If Fortunate - Joel's Log Files https://joelchrono.xyz/blog/to-be-taught-if-fortunate 2026-04-15T15:20:00.000Z <p>Ages ago at this point, I watched a YouTube video about short science fiction books! Back then I ended up reading and eventually reviewing <a href="https://joelchrono.xyz/blog/the-undefeated/">The Undefeated</a> by Una McCormack. That very same video is what first brought this novella to my attention, but well, it took me a few more years to finally give it a go.</p> <p><em>To Be Taught, If Fortunate</em> is a novella by Becky Chambers, presented as a report sent back to Earth, with the hope of sharing the <em>Lawki 6</em> mission’s discoveries and data to whoever is there to receive it, fifty years later.</p> <p>We follow the perspective of Ariadne O’Neill, one of four crewmates and the flight engineer of the <em>Meriam</em>, who were sent to explore four planets in a distant star system, which contain extraterrestrial life. The crew is rather diverse and the relationships between the characters is charming, although they don’t explore them that much, with a lot of things left unsaid. Despite that, I found them relatable and human and I was surprised that I cared so much about them by the end.</p> <p>The science here was rather interesting, featuring a lot of things that are often unaccounted for in other works—that said I don’t read a lot of hard science fiction. There are pods that let the crew go into “torpor” (basically they sleep and barely age until you arrive to the destination). And there’s lots of details around that, such as how hair and nail would grow so much, or the buildup of crust around the eyes, the weird sensation of having your body grow and age when you feel like you only slept and woke up in an instant, among other things, which something like <em>Alien</em> simply ignores.</p> <p>There is more science like that, all throughout the book, but the main “gimmick” consists of slight genetic alterations to help the astronauts get used to a planet! They are applied through patches on the skin during torpor, and constantly checked and used during the mission. For example, when the next planet they visit has double the gravity of Earth, they’ll wake up with augmented muscle mass and boss density.</p> <p>Another thing I loved about it is the focus on preservation during their exploration efforts. There are a lot of procedures to avoid affecting the environment, and as mentioned before, they adapt themselves to the planet, instead of trying to change the local ecosystem. However, there will also be some moments of tension because of this. The balance of exploration and human curiosity and what right do we have to disturb the natural order of these planets when we are not part of it. Is it okay to turn over a rock if the worms under it will be be affected by the sunlight? But how can we even know that’s the case without doing so? There’s plenty of discussions like that which were quite thought-provoking.</p> <p>My favorite part however, have to be the planets, and the life they contain! Each will be different and it’s amazing to see how joyful the characters are when they explore and categorize the life forms they find. There’s a lot of variety and descriptions that were livid and interesting to me, but of course, not all living beings all the same, and there is always a danger to exploring the unknown. This was handled pretty well.</p> <p>And then we got Earth. These characters get to be on this mission for a reason, and in this book space exploration has become a community effort. Humankind working together to reach for the stars. It’s nice, but it’s also not perfect. Before getting to a planet, we will often see news and events of what has been going on. Even worse, the news are 14 years behind. Despite how nice space exploration is, the planet continues to warm up and warfare is still present. The news play an important role, and some of the best plot twists in the story happen because of them.</p> <p>All in all. The different elements of this novella are put to good use! I also love how much I can tell you about it in this review compared to <a href="https://joelchrono.xyz/blog/non-stop/">my previous read</a>—which would definitely be ruined if I said any more. In any case. There is a lot to like here, some great hard science, some good character writing, some tense plot twists and emotional moments, and overall, a sense of hope that remained even during the darkest moments. I highly recommend giving it a go. I am definitely going to check more of Becky Chambers’ works.</p> <p>Maybe I should return to <em>Outer Wilds</em> too…</p> <p> <a href="mailto:me@joelchrono.xyz?subject=To Be Taught, If Fortunate">Reply to this post via email</a> | <a href="https://fosstodon.org/@joel/116409430300976397">Reply on Fediverse</a> </p> FBI Extracts Suspect’s Deleted Signal Messages Saved in iPhone Notification Database - Werd I/O 69df9a5d5aea62000143723e 2026-04-15T14:02:05.000Z <p>[<a href="https://www.404media.co/fbi-extracts-suspects-deleted-signal-messages-saved-in-iphone-notification-database-2/?ref=werd.io">Joseph Cox at 404 Media</a>]</p><p>This understandably made a few journalists nervous when 404 Media originally reported it last week:</p><blockquote>&#x201C;The FBI was able to forensically extract copies of incoming Signal messages from a defendant&#x2019;s iPhone, even after the app was deleted, because copies of the content were saved in the device&#x2019;s push notification database.&#x201D;</blockquote><p>This reveals a shortcoming in how Apple stores notifications rather than in Signal itself.</p><p>What happens is that if the text of a Signal message shows up on a lock screen, it&#x2019;s stored in iOS itself, in a place where forensic investigators can gain access to it. That&#x2019;s a really good reason to turn off lock-screen notifications for Signal, and to remove the text of Signal messages from its notifications entirely.</p><p>Here&#x2019;s how to mitigate:</p><p>In the Signal app itself, go into settings, and then Notification Content. Depending on your level of comfort, select &#x201C;Name Only&#x201D; (which will still store the name of your Signal contact in your iPhone device memory) or &#x201C;No Name or Content&#x201D;.</p><p>Then, in your iPhone settings panel, find the Notifications pane, and scroll down to Signal. De-select &#x201C;lock screen&#x201D;.</p><p>[<a href="https://www.404media.co/fbi-extracts-suspects-deleted-signal-messages-saved-in-iphone-notification-database-2/?ref=werd.io">Link</a>]</p> I Wish I Could Talk to My Dad - Kev Quirk https://kevquirk.com/i-wish-i-could-talk-to-my-dad 2026-04-15T13:52:00.000Z <p>My best friend lost his Dad yesterday. Understandably he's extremely upset, and I feel awful for him. I never know what to do in these situations - <em>"how are you doing?"</em> just feels such a stupid thing to say. Like it's nowhere near enough. Of course he isn't doing well, you fucking idiot!</p> <p>His loss has brought about feelings of loss following the death of my own Dad. Who we lost back in 2008 to cancer, when he was 47. Watching him just wither away was heartbreaking. Especially at the age of 23.</p> <p>Now, nearly 20 years on, I rarely get upset about the loss. I still think about him all the time, but seeing what my friend has been going through has jumped it right to the front of my mind. Especially since <a href="https://kevquirk.com/life-is-really-shit-sometimes">the loss of my sister</a> is still so raw.</p> <p>I had a dream about my dad last night, the first I've had in a while. The dream was nothing special, I don't even fully remember what happened in it. But what I do vividly remember was that his voice wasn't right. And then I realised, I don't remember what my Dad's voice sounded like.</p> <p>I have no videos of him, and no recordings on his voice. For a year or so after he died, I used to call his phone as it would go straight to voicemail and I'd get to hear his voice. Eventually the line was cut though. I wish I'd recorded it, just to have something.</p> <p>I don't even have many photos of him. Most of them are from when I was a baby. I only have 1 photo of him and I as adults, which was taken on the day I passed out of basic training in the Army.</p> <p><img src="https://kevquirk.com/content/images/i-wish-i-could-talk-to-my-dad/me-dad-granddad.webp" alt="me dad granddad" /> <em>LTR: My dad, me, my dad's dad.</em></p> <h2>Just one conversation</h2> <p>Not being able to remember his voice isn't the only reason I'd love to talk to him again. He was funny, and always made me belly laugh. He loved to sing too - and was bloody good at it!</p> <p>I'm also a very different person now than I was in 2008. I'd like for him to meet his grandsons, and I'd like to know what he thinks of the man I've turned into. He only met my (now) wife once or twice - he'd have loved her, and she'd have loved him.</p> <p>All very narcissistic, I know. Be he was <em>my</em> dad!</p> <p>Conversely, I'd love to know what kind of an <em>old</em> man he turned into. Would he still be as funny? Or would have turned into a grumpy old curmudgeon? Would we still go for a couple beers every Friday? Would he come here for barbecues in the summer? I'd have loved that.</p> <p>There's no real point to this post, really. These thoughts have just been spinning around my grey matter for the last few days, and I wanted to work through them, which I think I've done a pretty poor job of.</p> <p>So yeah, losing a loved one is shit. It never leaves you, and I feel horrendously sorry for my mate.</p> <p>I'll try and make the next one more positive...</p> <div class="email-hidden"> <hr /> <p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p> <p>You can <a href="mailto:19gy@qrk.one?subject=I%20Wish%20I%20Could%20Talk%20to%20My%20Dad">reply to this post by email</a>, or <a href="https://kevquirk.com/i-wish-i-could-talk-to-my-dad#comments">leave a comment</a>.</p> </div> Stop Flock - Werd I/O 69df933e5aea620001437238 2026-04-15T13:31:43.000Z <p>[<a href="https://stopflock.com/?ref=werd.io">Stop Flock</a>]</p><p>This is nice to see: a grassroots protest movement against the proliferation of Flock cameras.</p><p>From the site:</p><blockquote>&#x201C;Flock Safety markets AI surveillance that goes far beyond reading license plates; color, bumper stickers, dents, and other features are used to build databases and identify movement patterns. These systems are spreading rapidly, often without oversight, and are accessible to police without a warrant. They raise serious privacy and legal concerns, and contribute to a nationwide trend toward mass surveillance.&#x201D;</blockquote><p>There&#x2019;s little evidence that they do anything meaningful to prevent crime. But they do certainly create a surveillance layer, and help establish a culture of surveillance across law enforcement. 404 Media reported last year that <a href="https://www.404media.co/ice-taps-into-nationwide-ai-enabled-camera-network-data-shows/?ref=werd.io">ICE has been tapping into these cameras</a>, although they weren&#x2019;t established for that purpose; local police have been proxy users for immigration enforcement.</p><p>Not only does the platform read license plates and track individual cars, but it tracks <em>associations</em> between vehicles &#x2014; cars that are often seen together, for example. Which, of course, reveals associations between people.</p><p>I would echo what <a href="https://bmitch.net/?ref=werd.io">Brandon Mitchell</a> <a href="https://news.ycombinator.com/item?id=47773673&amp;ref=werd.io">said on Hacker news</a>:</p><blockquote>&#x201C;I don&apos;t want to stop Flock the company. I want to stop Flock the business model, along with all the other mass surveillance, and the data brokers. If the business models can&apos;t be made illegal, it should at least come with liabilities so high that no sane business would want to hold data that is essentially toxic waste.<br><br>Without that, we are quickly spiraling into the dystopia where privacy is gone, and when the wrong person gets access to the data, entire populations are threatened.&#x201D;</blockquote><p>The <a href="https://stopflock.com/?ref=werd.io#take-action">Take Action</a> section of the website is pretty good, with some common-sense tasks that include calling your representatives and supporting civil rights organizations like the ACLU and the EFF.</p><p>Earlier this year, <a href="https://techcrunch.com/2026/02/23/americans-are-destroying-flock-surveillance-cameras/?ref=werd.io">TechCrunch reported that some people are going a step further</a>, ripping cameras off street lights themselves. In Oregon, protesters left a note that read, &#x201C;Hahaha get wrecked ya surveilling f*cks&#x201D;. I couldn&#x2019;t possibly endorse.</p><p>[<a href="https://stopflock.com/?ref=werd.io">Link</a>]</p> Why is it so hard to passively stalk my friends' locations? - Terence Eden’s Blog https://shkspr.mobi/blog/?p=68114 2026-04-15T11:34:45.000Z <p>I feel terribly guilty when I visit a new city, post photos of my travels, only to have a friend say &#34;Hey! Why didn&#39;t you let me know you were in my neck of the woods?&#34;</p> <p>Similarly, if I bump into an old acquaintance at a conference, we both tend to say &#34;If only I&#39;d known you were here, we could have had dinner together last night!&#34;</p> <p>I do enjoy the serendipity of events like FOSDEM - randomly seeing a mate and expressing the joy of spontaneity. But I also like arranging to meet up in advance.</p> <p>At the moment, my strategy is sending a blast on social media saying &#34;I&#39;m visiting [this city] next week, anyone fancy a beer and a natter?&#34; I&#39;ve met friends all over Europe, Australia, and New Zealand that way. <a href="https://shkspr.mobi/blog/2025/06/meeting-my-fedifriends-afk/">It mostly works</a>. But I can&#39;t help feeling it is inefficient and prone to missing connections.</p> <p>I even wrote my own code to auto-post FourSquare checkins to my other social media sites.</p> <p>Here are my ideal scenarios. Imagine something built in to Signal / WhatsApp / Whatever app you already use.</p> <h2 id="plan-in-advance"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#plan-in-advance">Plan In Advance</a></h2> <p>I tell my app that I&#39;m going to Barcelona from 14th - 19th February and am happy to meet any of my friends.</p> <p><em>✨Background Magic✨</em></p> <p>My friend Alice has also planned a trip to Barcelona around those dates. She gets a ping saying that one of her friends is going to be in the same city. Does she want to know more?</p> <p>So far, so <a href="https://en.wikipedia.org/wiki/Dopplr">Dopplr</a>.</p> <p>My friend Bob lives just outside of Barcelona. He&#39;s set his &#34;willing to travel&#34; settings to be about 30 minutes, so also receives a ping.</p> <p>I don&#39;t know that either of them have seen the notification until they decide they want to meet.</p> <h2 id="spontaneous-fun"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#spontaneous-fun">Spontaneous Fun</a></h2> <p>I step off the train in Manchester, England England. Perhaps the app notices I&#39;m away from home, or maybe I press the &#34;Anyone Around?&#34; button.</p> <p>On a map I can see friends who have shared their rough location. I decide to message Chuck to see if he&#39;s free for a chat.</p> <p>Dave notices my location is now within his preferred travel distance. He gives me a ring.</p> <p>A bit like how FourSquare used to be - but with less precision.</p> <h2 id="downsides"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#downsides">Downsides</a></h2> <p>The above is very much the &#34;happy path&#34;. It doesn&#39;t look at any of the knotty problems or grapple with the UI that would be needed to make this work. But we know the technology for sharing location is viable - so what are the social issues that make this so difficult?</p> <h3 id="social-awkwardness"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#social-awkwardness">Social Awkwardness</a></h3> <p>&#34;Oh, fuck, Edgar&#39;s location says he&#39;s in town. Can we pretend to be out of the country?&#34;</p> <p>Alternatively, &#34;Huh, I know at least a dozen people who live in Skegness. Why aren&#39;t any of them responding to me?&#34;</p> <p>Social pressure and awkwardness are hard problems. No one wants to use the app that makes you feel like a friendless loser.</p> <h3 id="privacy"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#privacy">Privacy</a></h3> <p>Do you <em>want</em> your friends knowing your every movement? I&#39;m sure some people do, but most probably don&#39;t. It&#39;s possible to sketch out some vague controls:</p> <ul> <li>Only send a notification if I push this button.</li> <li>Don&#39;t send alerts if I am within this radius of my home / work.</li> <li>Fuzz my location to the city / state / country level.</li> </ul> <h3 id="danger"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#danger">Danger</a></h3> <p>Is it a risk to let people know vaguely where you are? Is meeting up with (semi-) strangers from the Internet a smart life choice? Is having an app stalk you across the globe giving too much data to advertisers?</p> <p>Does that creep from work abuse the system to keep popping up whenever you&#39;re out with friends?</p> <h2 id="technology"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#technology">Technology</a></h2> <p>I said the technology exists for this, and that was sort of true. Every device has GPS &amp; an Internet connection. Storing a log of friends and sending them a message is a solved problem.</p> <p>But is it solved in a decentralised and privacy preserving way?</p> <p>No one wants to give all this power to one company. Google will build it and kill it. Facebook will sell your secrets to dropshippers. A funky start-up will be acquhired by Apple &amp; restricted to iOS devices.</p> <p>My location is fuzzed to an acceptable degree of imprecision and then sent… where? To all my friends directly? To a central server? Can <a href="https://en.wikipedia.org/wiki/K-anonymity"><em>k</em>-anonymity</a> help?</p> <p>Is this a separate app? Everyone seemed to leave FourSquare after they buggered around with it. Perhaps it is just a feature in existing apps?</p> <h3 id="whats-already-there"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#whats-already-there">What&#39;s Already There?</a></h3> <p>Messaging apps like Signal, Telegram, and WhatsApp allow you to share your location with one or more friends.</p> <p>To me, it feels a bit weird to manually send a dropped pin to some / all of my contact. It also doesn&#39;t let you share &#34;tomorrow I will be in…&#34;</p> <p>Using &#34;Stories&#34; is the common way to share an update with all contacts - but none of them let you automatically share your location in a story.</p> <p>FourSquare&#39;s Swarm app allows you to check in to a &#34;neighbourhood&#34;. But there&#39;s no obvious way of saying &#34;London&#34; or &#34;Manchester&#34; - and I&#39;m not sure how close to an area you need to be to get an alert that your friend is there.</p> <h2 id="whats-next"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#whats-next">What&#39;s Next?</a></h2> <p>I don&#39;t want to build this. Trying to get everyone I know to adopt a new app isn&#39;t going to happen. With the fragmentation of messaging and the lack of interoperability, this is likely to remain an unsolved problem for some time.</p> <p>So here&#39;s my strategy.</p> <ul> <li>Get back in to using FourSquare. Most of my friends seemed to stop using it back in 2017 when it was split into Swarm. But a few are still on there.</li> <li>Manually post a story on Mastodon, BlueSky, Facebook, WhatsApp, Signal, and Telegram saying &#34;Visiting Hamburg next week. Anyone want a beer?&#34;</li> <li>Hope that something better comes along.</li> </ul> <img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=68114&amp;HTTP_REFERER=Atom" alt="" width="1" height="1" loading="eager"/> One size fits none: let communities build for themselves - Werd I/O 69def0ae5aea620001436e26 2026-04-15T02:01:44.000Z <img src="https://storage.ghost.io/c/18/7c/187cc681-d3f3-49fc-87de-b01d06b76821/content/images/2026/04/getty-images-8ZOsjzNIwKg-unsplash.jpg" alt="One size fits none: let communities build for themselves"><p>A little under twenty years ago, I stood on stage at the University of Brighton, in England, at our Elgg Jam event. Elgg was the open source social network I&#x2019;d co-founded; Brighton used it to become the first university in the world to roll out a social network campus-wide.</p><p>I was giving the keynote talk, explaining what we&#x2019;d include in the next major version of the platform. I built up anticipation, hamming it up as the audience &#x2014; many of whom had built social networks with tens or hundreds of thousands of users &#x2014; waited for what I had to say.</p><p>I moved to a blank slide.</p><p>&#x201C;None,&#x201D; I said. &#x201C;The next version of Elgg has no features.&#x201D;</p><p>Genuinely, there were gasps. I don&#x2019;t think I&#x2019;ve had a similar reaction at any talk I&#x2019;ve given since. Years later, one of the attendees told me it was a mind-blowing moment: one of those sessions that immediately changes your perspective.</p><p>I went on to explain.</p><p>Instead of releasing a rigid social network out of the box, we recognized that for communities, one size didn&#x2019;t fit all. Instead of giving everyone the same configuration, the same interface, and the same collection of tools, each community owner would easily compose their own combination of functionality and experience in order to best fit the community they served. By then, Elgg had been translated into 80 languages and there were a ton of plugins from across the ecosystem; there was a lot to configure a site with.</p><p>The underlying point was that a social networking platform existed to support a real human community, and needed to be responsive to its needs. How could we, as platform developers, possibly know what every community needed? We couldn&#x2019;t; we didn&#x2019;t. It was better to put that power in the hands of people who did.</p><p>Since that talk in September 2007, we&#x2019;ve seen a lot of social networks that were one size fits all: Facebook, Twitter, Instagram, TikTok, and a raft of others. Each has forced communities to adhere to its own design assumptions. Every platform&#x2019;s user experience is rooted in the cultural and intellectual assumptions of its development team. A rigid user experience means that needs that aren&#x2019;t in line with its team&#x2019;s worldview may be ignored.</p><p>That&#x2019;s not a trivial gap. Some communities have specific requirements about identity; others have particular cultural sensitivities that need to be incorporated in an approach to trust and safety. In Myanmar, Facebook (which is based 8,000 miles away in Menlo Park, California) ignored local needs and community dynamics to the extent that it&#x2019;s been accused of facilitating the genocide against the Rohingya people.</p><p>For centralized, proprietary platforms, there have been few options. Even for platforms like Bluesky and Mastodon, which are based on open protocols and can be forked and self-hosted, changing the interaction model and user experience has traditionally required a significant amount of development work.</p><p>If only there were some way to make that process easier.</p><h3 id="custom-code-is-easier-than-ever">Custom code is easier than ever</h3><p>One of the most interesting developments this year has been agentic coding&#x2019;s elevation <a href="https://werd.io/good-vibes-bad-vendors/">from interesting tool to code-producing productivity workhorse</a>. People I know who have been writing software for over thirty years are now using LLMs as their full-time coding engine. My friend Jesse Vincent, who has written open source software and managed the Perl programming language, now spends his time on <a href="https://blog.fsck.com/2025/10/09/superpowers/?ref=werd.io">ways to bring senior engineer-level thinking to LLMs</a>. Simon Willison, co-founder of <a href="https://en.wikipedia.org/wiki/Lanyrd?ref=werd.io">Lanyrd</a> and creator of <a href="https://datasette.io/?ref=werd.io">Datasette</a>, <a href="https://simonwillison.net/tags/llms/?ref=werd.io">spends much of his time exploring, defining, and analyzing the space</a>. If LLMs sucked at this, they would say so. But they don&#x2019;t, and instead these two veteran engineers have gone all-in. So have many thousands of other engineers.</p><p>In a world where custom code can be created far more easily than it could in the past, communities can more easily build bespoke spaces for themselves. There&#x2019;s no need to adopt a one-size-fits-all platform &#x2014; even an open source one &#x2014; when you can ask for the exact features you want. Beyond existing tools like Claude Code, you can imagine tuning an AI-powered system specifically designed to help community leaders create customized platforms.</p><p>What would be needed then are agreed-upon rules about how community platforms behave: how they communicate with each other, how they integrate a user&#x2019;s identity, and how they work with services for moderation, flagging, and other trust and safety necessities.</p><p>There&#x2019;s a word for agreed-upon rules for how software communicates with each other: protocols. And in a world where anyone can spin up their own software, they&#x2019;re more important than ever.</p><h3 id="protocols-for-parties">Protocols for parties</h3><p>The web already has protocols and standards. Web pages travel over the HyperText Transfer Protocol (HTTP) and serve HyperText Markup Language (HTML). If anyone wants to build a new web browser, they don&#x2019;t have to ask anyone; they just need to follow the HTTP and HTML specifications (okay, and CSS, JavaScript, etc etc &#x2014; but these all follow the same principle).</p><p>Just as the web is built on open protocols, the next generation of social platforms is too. <a href="https://activitypub.rocks/?ref=werd.io">ActivityPub</a> describes how two different community platforms can send messages between each other on behalf of their users. Authenticated Transfer Protocol (<a href="https://atproto.com/docs?ref=werd.io">ATProto</a>) defines how users can use and move their identities and provides a shared data layer. ActivityPub is used as glue between <a href="https://joinmastodon.org/?ref=werd.io">Mastodon</a>, <a href="https://ghost.org/?ref=werd.io">Ghost</a>, and <a href="https://threads.com/?ref=werd.io">Threads</a>; ATProto is used by <a href="https://bsky.app/?ref=werd.io">Bluesky</a>, <a href="https://blacksky.community/?ref=werd.io">Blacksky</a>, <a href="https://eurosky.tech/?ref=werd.io">Eurosky</a>, and applications that sit on top of them. In both cases, just like HTTP and HTML, anyone can build a new community platform that uses them &#x2014; and that therefore will be immediately compatible with all the <em>other</em> community platforms that use them.</p><p>These protocols have been around for years. But now that software itself is becoming cheaper to produce, and everyone can build their own applications that are <em>right for them</em>, the center of gravity has changed. Whereas previously open protocols were the co-ordination layer for many instances of a few applications, now they&#x2019;re the co-ordination layer for an exploding ecosystem of more custom applications, each of which could be installed many times over.</p><p>Previously, libraries, modules and plugins were the building blocks of software. Consider what we were trying to do with Elgg, or what the WordPress project continues to push on: a core codebase that you can extend and configure by downloading plugins and themes from anywhere. Those plugins will still be a part of the ecosystem, but <em>new</em> plugins can be generated in hours or less. And increasingly, the existing ones will be configured for bespoke needs, too.</p><p>That&#x2019;s a lot of custom codebases. By default, they&#x2019;re all siloed away from each other. If one person builds a community for a neighborhood over here, and another person builds a community for an affinity group over there, there&#x2019;s no way for them to intersect. People have to find them, sign up for them, and interact with them separately &#x2014; and every new community has to start with zero users.</p><p>But if we make drawing on open protocol specifications as easy as pulling an open source library or a WordPress plugin, the definitions for how all these bespoke apps and communities talk to each other become the <em>new</em> shared building blocks. With them, each new codebase is part of an expansive web of applications and communities.</p><h3 id="making-it-easier">Making it easier</h3><p>There&#x2019;s more we could do to make this world possible.</p><p>Today, software often relies on something called a <em>package manager</em> to easily incorporate libraries. You can imagine a <em>spec manager</em> that does something similar for agentic development. Tell it to import ActivityPub, and <em>boom</em>, through a combination of instantly-applied new skills and cleanly-written specification guidelines, what you&#x2019;re building is compatible with the Fediverse.</p><p>Just as libraries get added to a package manager today, new specifications could be added to a spec manager in the future. This would catalogue <em>all</em> protocol specs from across standards bodies &#x2014; and, of course, anyone could publish their own, just as anyone can publish an open source library today. These become software dependencies.</p><p>And we could use domain-specific tooling that makes building software easier for non-engineers. A community platform builder would help community leaders create software to support their work, but hide complex development, debugging, and infrastructure considerations. Despite the abstracted, walled-garden nature of this kind of interface, open protocols would mean that the software could be deployed to a choice of provider, and its data wouldn&#x2019;t be locked up inside it.</p><p>If it&#x2019;s not obvious yet, none of this is tightly-bound to agentic development. If you hate LLMs or just want to write everything by hand &#x2014; both reasonable positions &#x2014; there&#x2019;s nothing stopping this kind of infrastructure from being useful for <em>you</em>, too.</p><h3 id="what%E2%80%99s-still-to-come">What&#x2019;s still to come</h3><p>We have established protocols for identity and communications between systems, but there&#x2019;s more to running a community. For one thing, a community leader typically wants to <em>make it safe</em>: moderation, content flagging, and other abuse protections are vital. Every community needs to tend to its culture; making it welcome to more vulnerable users &#x2014; the people more likely to be the subject of abuse &#x2014; is an important step towards that.</p><p>Part of the point of having bespoke community platforms is that these value systems may be different from community to community, and the signals of abuse may be specific to them. Facebook failed Myanmar for exactly this reason. So these communities need to handle their own trust and safety.</p><p>But dedicated open protocols for trust and safety systems would allow these community owners to work with third-party platforms that might provide safety tooling and frameworks. It could also make it easier for multiple communities with similar values to pool their resources around trust and safety. These communities could all connect, through open protocols, to a third system where moderators can review content and take action through one central interface.</p><p>Overall, it&#x2019;s the human stuff that rises to the top when code becomes more of a solved problem. Rather than considering <em>how</em> to build it, or where to obtain it, we can finally spend most of our time on the more important considerations: <em>what</em> is needed, <em>why</em> and <em>for whom</em>. We can use our own cultural norms to define the answers to these questions rather than accepting one-size-fits-all approaches from people in Menlo Park.</p><p>Which brings me to one last thing.</p><h3 id="how-we-generate-the-code-matters">How we generate the code matters</h3><p>While I don&#x2019;t think these principles apply solely to agentic development, I believe that&#x2019;s how they&#x2019;ll most often be used.</p><p>The LLMs we mostly use are centered on Silicon Valley culture, with Silicon Valley assumptions. Their inherent biases, drawn from the source material the vendors have chosen to use to train the models, are well-documented. The vendors themselves often work with government, the military, law enforcement, and immigration, which may sometimes be at odds with community values. If we are truly to use this technology to build community-first software, the technology itself must be values-aligned with the community.</p><p>Writing code by hand, depending on the developers involved, fits this ethical standard. But we need LLMs that reach that bar, too. That&#x2019;s most likely to mean grassroots models that are in themselves designed to be more community aligned, and whose source material is more likely to be ethically acquired.</p><p>This work is already being done. <a href="https://prismreports.org/2026/02/26/indigenous-languages-preservation-ai/?ref=werd.io">Small Language Models are being used to revitalize Indigenous languages</a>. The <a href="https://mozilladatacollective.com/?ref=werd.io">Mozilla Data Collective is enabling more consensual, ethical, representative training data</a>. These are the kinds of tooling efforts that will support community-aligned development, alongside the open protocols that will govern how generated software works together.</p><p>Many people are hard at work with the intention of supporting communities far better than the last generation of social media. Simultaneously, there&#x2019;s been a resurgence in open protocols, and the rise of LLMs that can build software on our behalf. Together, these trends mean there&#x2019;s so much more we can do.</p><p>In particular, moving away from the assumption of one-size-fits-all scale and leaning into the idea of small, culturally-aligned applications and tooling will enable us to better support communities that are far away from the norms and assumptions of Silicon Valley. It will be hard. But it&#x2019;s a journey worth taking.</p> Note published on April 14, 2026 at 10:38 PM UTC - Molly White's activity feed 69dec1fccc098e890d542b3c 2026-04-14T22:38:52.000Z <article><div class="entry h-entry hentry"><header></header><div class="content e-content"><p>i have never clicked "interested" on a Google News push notification except for on this and one other hummingbird migration–related article, and i'm hoping to train the algorithm to only push notify me with hummingbird content</p><div class="media-wrapper"><a href="https://storage.mollywhite.net/micro/47f08d93882074c4eb91_Screenshot_20260414-131126.png" data-fslightbox=69f9823186435e184b77><img src="https://storage.mollywhite.net/micro/47f08d93882074c4eb91_Screenshot_20260414-131126.png" alt="Google News alert: Hummingbird migration continues north<br>Hummingbirds are moving north across US, reaching New England states" /></a></div></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp-block"><div class="timestamp">Posted: <a class="u-url" href="https://www.mollywhite.net/micro/entry/202604141837"><time class="dt-published" datetime="2026-04-14T22:38:52+00:00" title="April 14, 2026 at 10:38 PM UTC">April 14, 2026 at 10:38 PM UTC</time>. </a></div></div><div class="social-links"> <span> Also posted to: </span><a class="social-link u-syndication mastodon" href="https://hachyderm.io/@molly0xfff/116405458353551372" title="Mastodon" rel="syndication">Mastodon, </a><a class="social-link u-syndication bluesky" href="https://bsky.app/profile/molly.wiki/post/3mjih3saqpa2p" title="Bluesky" rel="syndication">Bluesky</a></div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/micro/tag/birds" title="See all micro posts tagged "birds"" rel="category tag">birds</a>. </div></div></footer></div></article>