Shellsharks Blogroll - BlogFlockhttps://blogflock.com/list/xJ8yq2026-09-25T13:45:00.000ZBlogFlockshellsharksHow I Develop Pure Commons Apps - Kev Quirkhttps://kevquirk.com/how-i-develop-pure-commons-apps2026-09-25T13:45:00.000ZKev Quirk<p>A couple<sup id="fnref1:1"><a href="https://kevquirk.com/how-i-develop-pure-commons-apps#fn:1" class="footnote-ref">1</a></sup> of people have asked what my process is for developing the various <a href="https://purecommons.org/apps" rel="noopener noreferrer">Pure Commons apps</a>. This comes after I've mentioned a couple of times that I've released <a href="https://fosstodon.org/@purecommons/117309487893150341" rel="noopener noreferrer">a feature I've been working on for months</a>.</p>
<p>So I thought I'd write a quick post that explains how I do it, so I can refer people to it if/when they ask in the future. I also find this kind of post interesting, so I'm hoping you do too. If not, feel free to skip this one. đ</p>
<h2>Using Git without branches</h2>
<p>Git is a staple in my development workflow, so you'd think I'd use it the same way most other developers do, but I don't. You see dear reader, I'm a visual learner, so branches in Git are confusing to me as they're abstracted away inside the <code>.git</code> folder. This means I often forget which branch I'm on. Which in turn has led to all kinds of issues over the years when it comes to committing shit to the wrong branch.</p>
<p>So instead I simply copy and paste the entire repo (less the <code>.git</code> folder) into a new subfolder and use that as a "branch". Then, when I want to work on a feature, I go into that subfolder and work away, knowing it's completely separate from the core production code. My "<em>branches</em>" look something like this:</p>
<p><img loading="lazy" src="https://kevquirk.com/content/images/how-i-develop-pure-commons-apps/branches-pureblog.webp" alt="Pure Blog branches" /></p>
<p>I always prefix my branch folders with <code>AA-BRANCH</code> so they're always at the start of my folder tree and easy to see. Switching branches is then just a simple <code>cd</code> away and I can easily see which one I'm in from the command prompt.</p>
<p>And since there's no <code>.git</code> folder in the branch, I can't accidentally mess things up by merging back to <code>main</code> (or any other branch) accidentally.</p>
<p>Almost <del>idiot</del> Kev proof!</p>
<h2>Creating branches with purectl</h2>
<p>I've created a local Python tool called <code>purectl</code><sup id="fnref1:2"><a href="https://kevquirk.com/how-i-develop-pure-commons-apps#fn:2" class="footnote-ref">2</a></sup> which manages all things <em>Pure</em>. With it, I can do things like pull or push to/from remote for this website, update if there's a new version released, create releases, run local tests, create branches etc.</p>
<p>So if I want to create a new branch, all I need to do is run:</p>
<pre><code class="language-bash">purectl branch pureblog</code></pre>
<p>It will then ask me for the branch name, so I enter something like <code>Pages in search</code> and it will automagically create a new folder called <code>AA-BRANCH Pages in search</code> and copy the latest version of Pure Blog into that folder, excluding <code>.git</code>.</p>
<h2>Merging changes</h2>
<p>This is where things get interesting. If I'm working on multiple branches at the same time, merging back can be...<em>interesting</em> as I can't use the <code>git merge</code> command, since I'm not using Git for branches.</p>
<p>But that's fine, I actually prefer it this way as I have more control. Merging back to <code>main</code> requires me to do a side-by-side comparison of any files I've changes on that branch, so I have to review <em>everything</em> before manually while merging in changes.</p>
<p>This is definitely not the most efficient way of developing software, but it works for me.</p>
<h2>Final thoughts</h2>
<p>So there you go, that's my approach to developing the Pure Commons apps. I think it's somewhat scalable for a single person project, such as <a href="https://purecommons.org" rel="noopener noreferrer">Pure Commons</a>. If I were working in a team this approach would fall apart quickly though. Lucky I have no friends, ey!</p>
<p>I'm not a professional software developer, and I think that's clear from the way I manage all this. But this system has been working well for me, and is far less abstract for my monkey brain than Git's native branch handling.</p>
<p>What can I say, I'm a Luddite. đ¤ˇđťââď¸</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>Literally 2 people, but that's enough to warrant a post, right? <a href="https://kevquirk.com/how-i-develop-pure-commons-apps#fnref1:1" rev="footnote" class="footnote-backref">âŠ</a></p>
</li>
<li id="fn:2">
<p>Short for "Pure Control". <a href="https://kevquirk.com/how-i-develop-pure-commons-apps#fnref1:2" rev="footnote" class="footnote-backref">âŠ</a></p>
</li>
</ol>
</div> <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=How%20I%20Develop%20Pure%20Commons%20Apps">reply to this post by email</a>, or <a href="https://kevquirk.com/how-i-develop-pure-commons-apps#comments">leave a comment</a>.</p>
</div>Don't let TEEs break your MPC - Trail of Bits Bloghttps://blog.trailofbits.com/2026/09/25/dont-let-tees-break-your-mpc/2026-09-25T11:00:00.000ZTrail of Bits Blog<p>Threshold signature schemes, a form of multi-party computation (MPC) that lets a set of parties sign together without any one of them holding the key, are increasingly deployed inside trusted execution environments (TEEs). The combination is intended to amplify security for sensitive computations: MPC distributes trust across multiple independent parties, while TEEs root trust in the hardware manufacturer and its attestation infrastructure. But subtle issues can arise when running an MPC protocol inside a TEE without accounting for the untrusted host: for example, a malicious host could roll back the filesystem state after a threshold signer deletes a used pre-signature, causing the signer to reuse their nonce share and disclose their private key share.</p>
<p>So is this combination worth it? Provided you treat the TEE as a defense-in-depth layer rather than a substitute for a sound protocol, the answer is yes. This blog post discusses what TEE attestation can and canât fix in MPC deployments, explores the pitfalls we see most often in audits, and covers best practices, such as incorporating strong attestation processes and binding them to the MPC parties’ identities.</p>
<h2 id="mpc-security-that-depends-on-participant-behavior">MPC: Security that depends on participant behavior</h2>
<p>Before diving into how TEEs and MPC interact, we need to understand what MPC means and what security guarantees it offers. MPC is a cryptographic technique that allows multiple parties to jointly compute a function over their private inputs without revealing those inputs to each other.</p>
<p>The security of MPC protocols depends critically on assumptions about participant behavior. The cryptographic literature uses two primary security models:</p>
<p><strong>Semi-honest (honest-but-curious) security</strong>: In this model, all participants follow the protocol exactly as specified, but they may try to learn additional information from the messages they receive during the protocol execution. Participants can try to learn more than they should, but they don’t deviate from the protocol specification.</p>
<p><strong>Malicious security</strong>: This stronger model assumes participants may deviate arbitrarily from the protocol. A malicious participant might send incorrectly computed values, use wrong inputs, abort the protocol at strategic moments, and behave in ways designed to compromise security or learn private information.</p>
<p>This distinction is important in the context of TEEs. If a TEE attestation can cryptographically guarantee that all parties are running the correct protocol implementation, it effectively elevates semi-honest protocols to provide malicious security guarantees (at least against certain classes of attacks, as we’ll discuss later). But before delving into the details, let’s discuss how TEEs work.</p>
<h2 id="tees-three-core-security-guarantees">TEEs: Three core security guarantees</h2>
<p>TEEs are secure areas within a processor that provide hardware-based protection for code and data, even from privileged software like operating systems or hypervisors. TEEs offer three core security guarantees:</p>
<p><strong>Confidentiality</strong>: Data and code are encrypted in memory and accessible only from within the TEE. This ensures that even privileged system software cannot inspect the contents of the secure computation.</p>
<p><strong>Integrity</strong>: The data and code are protected from tampering. Any attempt to modify the TEE’s memory or execution state from outside should be detected.</p>
<p><strong>Attestation</strong>: Remote parties can cryptographically verify what code is running in the TEE. This allows external verifiers to gain assurance about the computation being performed and the legitimacy of the TEE without trusting the host system.</p>
<p>This last property is particularly crucial for building distributed systems with TEEs.</p>
<h3 id="how-tee-attestation-works">How TEE attestation works</h3>
<p>The attestation mechanism is at the heart of TEE security. When a TEE is manufactured, it’s provisioned with a private key and a corresponding certificate that chains back to a root certificate held by a trust anchor (typically the manufacturer).</p>
<p>When an attestation is requested, the TEE takes measurements (cryptographic hashes of the TEE software, configuration, and hardware state). These measurements are bundled into a “quote” (a manifest of these cryptographic hashes), which the TEE then signs with its private key.</p>
<p>To verify these attestations, a number of checks need to be performed. However, the checks necessary in the verification process aren’t uniformly defined and are somewhat vendor-specific. For instance, <a href="https://cc-enabling.trustedservices.intel.com/intel-tdx-enabling-guide/02/infrastructure_setup/#:~:text=TD%20Quote%20Verification%20is%20the%20process%20by%20which%20a%20TD%20Quote%20is%20verified%20in%20a%20remote%20attestation%20flow.%20This%20verification%20can%20be%20done%20by%20any%20party%20and%20the%20checks%20performed%20are%20defined%20by%20this%20party.">Intel’s TDX documentation</a> states:</p>
<blockquote>
<p>TD Quote Verification is the process by which a TD Quote is verified in a remote attestation flow. This verification can be done by any party and the checks performed are defined by this party.</p>
</blockquote>
<p>This places significant responsibility on developers, who might not fully understand what checks are required to ensure the security of the TEE deployment.</p>
<p>At a minimum, a proper verification process requires:</p>
<ol>
<li>Verifying the quote signature</li>
<li>Verifying the certificate chain back to the trusted root</li>
<li>Verifying the actual measurements against known-good values (often stored in binary transparency logs)</li>
</ol>
<p>This means deploying TEE-based systems involves not just cryptographic verification but also reproducible builds and binary transparency infrastructure. The measurements in the attestation quote are simply hashes; they don’t inherently indicate whether the code is correct or malicious. To verify that the TEE is running the intended software, what is required is a trusted source of reference measurements. Reproducible builds ensure that anyone can compile the same source code and arrive at identical binaries (and thus identical measurements). Binary transparency logs provide a tamper-evident record of what measurements correspond to what software versions, allowing verifiers to check that the TEE is running legitimate, audited code rather than a compromised variant. This piece is often overlooked in TEE deployments.</p>
<h2 id="the-trust-model-clash">The trust model clash</h2>
<p>Here’s where things get interesting. Multi-party computation is fundamentally about distributing trust among multiple participants. No single party should be able to compromise the computation. TEEs, in contrast, centralize trust in the hardware manufacturer that controls the root certificate.</p>
<p>Another important threat model shift to consider is the fundamental inversion of traditional security assumptions in TEEs. Historically, we trusted the host operating system and built our security models on that foundation. TEEs flip this on its head: they’re virtualized environments where the guest (the code running inside the TEE) is trusted, but the host system is explicitly considered untrusted and potentially malicious.</p>
<p>This shift creates new attack surfaces that didn’t exist in traditional computing models. While the TEE protects the guest environment from the host, the host still controls critical operations like I/O, memory management, and CPU scheduling. The host can deny service, manipulate timing, or attempt rollback attacks, leading to subtle breaks of MPC protocols.</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/09/25/dont-let-tees-break-your-mpc/tee-mpc-figure1_hu_dedf906638555a09.webp"
alt="“Figure showing decentralized vs. centralized trust model shift”"
width="1200"
height="553"
loading="lazy"
decoding="async" />
<figcaption>Figure 1: Decentralized vs. centralized trust model shift</figcaption>
</figure>
</p>
<h2 id="what-tees-can-and-cant-fix-in-mpc-deployments">What TEEs can (and canât) fix in MPC deployments</h2>
<p>Combining these technologies can be beneficial, but one must be careful about the security claims that can be made. The security gains are real only if the TEE implementation is sound and the attestation process verifies the right properties. When TEEs attest to incomplete measurements or fail to verify critical components, the attestation provides false assurance. The actual security posture may even be weakened by the added complexity.</p>
<p>In an attempt to narrow down what TEEs can fix in MPC implementations, we’ve identified the common categories of MPC issues we frequently encounter in security audits:</p>
<ol>
<li>Ambiguous encoding in hash functions (e.g., <a href="https://blog.trailofbits.com/2024/08/21/yolo-is-not-a-valid-hash-construction/">âYOLOâ is not a valid hash construction</a>)</li>
<li>Misbehaving participants</li>
<li>Missing parameters in Fiat-Shamir transforms (e.g., <a href="https://blog.trailofbits.com/2022/04/13/part-1-coordinated-disclosure-of-vulnerabilities-affecting-girault-bulletproofs-and-plonk/">Coordinated disclosure of vulnerabilities affecting Girault, Bulletproofs, and PlonK</a>)</li>
<li>Missing input validation (e.g., <a href="https://blog.trailofbits.com/2024/02/20/breaking-the-shared-key-in-threshold-signature-schemes/">Breaking the shared key in threshold signature schemes</a>)</li>
<li>Side-channel attacks</li>
<li>Protocol-level issues (e.g., <a href="https://blog.trailofbits.com/2024/09/13/friends-dont-let-friends-reuse-nonces/">Friends donât let friends reuse IVs</a>)</li>
</ol>
<p>Arguably, if TEEs were perfectly secure, they could effectively mitigate the first four categories. When attestation and measurement processes are correctly implemented, each party gains cryptographic assurance about what code the other parties are running. This is powerful: if a party can verify that all other participants are running the exact protocol implementation expected (with no modifications or protocol deviations), then they know other participants will follow the protocol correctly and won’t misbehave by sending malformed messages. Essentially, correct attestation eliminates entire classes of implementation vulnerabilities by ensuring protocol compliance on both the sender and receiver sides. However, perfect security doesn’t exist in practice. Real-world TEE implementations have vulnerabilities, attestation processes can be incomplete or incorrectly verified, and the adversarial host environment introduces attack surfaces that are not traditional to MPC deployments.</p>
<h2 id="a-cautionary-tale-rollback-attacks-with-threshold-signatures-in-tees">A cautionary tale: Rollback attacks with threshold signatures in TEEs</h2>
<p>Consider threshold signature schemes, which often use pre-signature optimizations. In Schnorr or ECDSA threshold signatures, participants can precompute nonce commitments independently of the message, speeding up the online signing phase. These precomputed nonce commitments are called pre-signatures, and the reuse of a pre-signature value by a participant leads to the leak of their private share (akin to how nonce reuse in traditional Schnorr and ECDSA signatures <a href="https://blog.trailofbits.com/2020/06/11/ecdsa-handle-with-care/">leads to private key recovery</a>).</p>
<p>It might be tempting to run such an MPC protocol inside a TEE enclave to mitigate these types of attacks. But subtle issues can arise. In some implementations, signers store pre-signatures to disk and delete them after use (to limit the possibility of reuse). If that application were deployed to a TEE in a trust model where the host is potentially malicious, the host could roll back the filesystem state after the signer deletes a pre-signature file. When the TEE later fetches the pre-signature contained in that file, the signer essentially reuses their nonce share, which leads to a disclosure of the private key share. This is also discussed in the blog post <a href="https://blog.trailofbits.com/2023/12/18/a-trail-of-flipping-bits/">A trail of flipping bits</a>.</p>
<h2 id="common-tee-pitfalls">Common TEE pitfalls</h2>
<p>Beyond the rollback issue, several other pitfalls frequently appear:</p>
<p><strong>Incomplete attestation measurements</strong>: The security of TEE attestation hinges on measuring the right things. An attestation quote contains hashes of code and data, but project developers determine what gets measured and what gets excluded. If critical components aren’t included in the measurements, an attacker can modify those components without detection. This is particularly risky because the attestation appears cryptographically valid, but it’s attesting to an incomplete picture of the execution environment. For example, installing tools in an enclave from remote sources at runtime (e.g., using <code>curl</code>) pulls in code that was never measured; an attacker gaining access to that source can substitute their own and gain code execution inside the enclave.</p>
<p>A real-world example demonstrates this risk: a vulnerability in <a href="https://blog.trailofbits.com/2026/04/07/what-we-learned-about-tee-security-from-auditing-whatsapps-private-inference/">Meta’s WhatsApp Private Inference</a> revealed that the attestation process didn’t include certain configuration files, enabling an attacker to inject malicious shared libraries with the <code>LD_PRELOAD</code> environment variable, potentially compromising the TEE while maintaining a valid attestation quote.</p>
<p><strong>Missing verifications</strong>: The attestation process requires multiple verification steps, each critical to the security guarantee. Verifiers must check the quote signature, validate the certificate chain back to the manufacturer’s root certificate, confirm that the measurements match expected values, etc. Skipping any of these steps breaks the security model. Because verification procedures vary across TEE vendors and aren’t always well-documented, implementations sometimes omit crucial checks.</p>
<p><strong>Lack of hardening:</strong> A TEE protects whatever runs inside it, including components that may not be needed. Redundant kernel drivers, overly permissive kernel config flags, stray ACPI table entries, unnecessary systemd services and timers, and weak entropy sources all increase the attack surface inside the trust boundary. Trim the image down to what the project requires, harden what remains, and measure it. For platform-specific guidance, see our <a href="https://blog.trailofbits.com/2024/09/24/notes-on-aws-nitro-enclaves-attack-surface/">notes on the AWS Nitro Enclaves attack surface</a>.</p>
<p><strong>Data availability and backups:</strong> Enclaves have limited persistent storage, so backups and recovery data typically live outside the trust boundary. Authenticated encryption provides confidentiality and integrity but not freshness, so a malicious host can serve a stale backup to force a rollback, as discussed earlier in our threshold signature example. More concretely, one recurring failure is a guest trusting attacker-controlled metadata that lives on disk: the disclosure of several <a href="https://blog.trailofbits.com/2025/10/30/vulnerabilities-in-luks2-disk-encryption-for-confidential-vms/">vulnerabilities in LUKS2 disk encryption for confidential VMs</a> shows that a malleable, unvalidated LUKS2 header lets an attacker with disk write access swap in a null cipher, leaving the guest reading and writing secrets on an effectively unencrypted volume.</p>
<p><strong>Side-channel and physical attacks</strong>: Because the untrusted host controls the TEE’s execution environment, it can perform various side-channel attacks to extract information about the guest’s computation. These can leak sensitive information and break a TEE’s confidentiality guarantees. Similarly, researchers regularly publish physical attacks on TEE hardware. For example, the recent <a href="https://tee.fail/">“TEE fail” attack</a> allows an attacker to break the security guarantees of Intel TDX and AMD SEV-SNP by using a memory interposition device that lets them physically inspect all memory traffic inside a DDR5 server. The more recent <a href="https://ddropattack.eu/">DDRop attack</a> goes even further: an interposer costing under $200 silently drops DDR5 writes, so the processor keeps reading stale data that still decrypts correctly, breaking the integrity of Intel TDX, Scalable SGX, and AMD SEV-SNP. Memory encryption without freshness fails the same way disk state does in the rollback example above.</p>
<p><strong>Centralization risks</strong>: When MPC aims to distribute trust but TEEs centralize it in the manufacturer and its attestation infrastructure, the security goals of the protocol may be undermined. If all parties in an MPC protocol run their TEE nodes on the same TEE vendor’s hardware or if they use the same cloud provider, trust becomes centralized in that provider (for example, by way of the attestation chaining back to that vendor-operated root of trust).</p>
<p><strong>Insecure defaults</strong>: Be aware of some of the limitations that vendor-provided verification tools have. For example, Intel tools allow known-vulnerable firmware versions to pass the remote attestation process <a href="https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/best-practices/trusted-computing-base-recovery.html#:~:text=Update%20%3D%20%E2%80%9Cstandard%E2%80%9D%3A,R%20counter%20values.">for one year after public disclosure</a>. Users might want to implement their own security version number validation on top of the defaults to enforce stricter deadlines.</p>
<h2 id="best-practices-for-combining-tees-and-mpc">Best practices for combining TEEs and MPC</h2>
<p>If you’re building systems that combine these technologies, consider these recommendations:</p>
<p><strong>Implement strong attestation processes</strong>: Bind attestations to the identities of MPC parties and verify them comprehensively. This means not just checking that an attestation is valid but also confirming that the specific party you expect to be running the code is actually the one presenting the attestation.</p>
<p><strong>Terminate peer-to-peer communications inside TEEs</strong>: This provides end-to-end protection for party communications. By establishing TLS or other encrypted channels directly between TEEs (with endpoints inside the secure enclaves), you prevent the untrusted host from observing or tampering with protocol messages.</p>
<p><strong>Perform comprehensive verification of the attestation and measurements</strong>: Refer to your specific TEE vendor’s documentation for the necessary checks to be performed, and ensure every verification step is implemented correctly, tested, and reviewed.</p>
<p><strong>Write constant-time code</strong>: This helps prevent timing side-channel attacks. Even within a TEE, timing variations in your cryptographic operations can leak information to a host performing careful measurements. Use constant-time implementations for all security-critical operations processing secrets.</p>
<p><strong>Consult vendor-specific guidance</strong>: Each TEE platform has unique characteristics, limitations, and recommended practices. Vendor documentation often includes details about platform-specific threats. Stay current with security advisories and updates, as TEE security is an active research area with new vulnerabilities regularly discovered. Follow best practices documentation, like <a href="https://blog.trailofbits.com/2024/02/16/a-few-notes-on-aws-nitro-enclaves-images-and-attestation/">our guidance for AWS Nitro Enclaves</a>.</p>
<p><strong>Use multiple TEE vendors</strong>: For defense in depth, consider running MPC protocols on TEEs from different manufacturers (and/or cloud providers) to avoid centralizing trust in a single vendor. While admittedly challenging in practice since it requires additional operational complexity, this diversity can be essential for high-security applications where trust distribution is critical.</p>
<h2 id="layered-trust-beats-either-layer-alone">Layered trust beats either layer alone</h2>
<p>Combining MPC and TEEs is not automatic security, but when done correctly, it represents a defense-in-depth strategy thatâs stronger than either technology alone. TEEs can effectively mitigate several categories of MPC vulnerabilities by cryptographically guaranteeing correct protocol execution. Meanwhile, MPC’s distributed trust model reduces the impact of TEE manufacturer centralization and may provide security even if individual TEE instances are compromised.</p>
<p>However, this benefit only materializes when both layers are correctly implemented. New vulnerabilities can emerge from their interaction, as we saw with the rollback attack example. Successful deployment requires following established best practices, implementing thorough attestation verification, and carefully reviewing the implementation and deployment procedure.</p>
<p>The intersection of these technologies represents the cutting edge of secure computation, but only if we approach it with a clear understanding of the tradeoffs involved. If youâre deploying MPC on TEEs, our cryptography team reviews these exact systems, so <a href="https://trailofbits.com/contact/">get in touch</a>!</p>When a blogpost eats another - Joel's Log Fileshttps://joelchrono.xyz/blog/when-a-blogpost-eats-another2026-09-25T02:42:07.000Zjoelchrono<p>I was halfway through writing a pretty interesting blogpost today. Some thoughts about all the science fiction films Iâve watched this year! Itâs seriously so much I realized I should probably save it for the end of the year.</p>
<p>Why you ask? Well, because I can literally make a recap of only sci-fi movies, and a recap of other movies if I want to, and all I have to do is wait for the end of the year.</p>
<p>Iâll definitely save the writing I already did, and probably use some of it for this monthâs recap as well.</p>
<p>(If youâre curious about it, this month I have watched <em>The War of the Worlds</em>âawesome and terrifyingâ, <em>Mercy</em>âpretty mehâ, <em>The Day The Earth Stood Still</em>âabsolute masterpieceâ, and Iâm halfway through <em>Minority Report</em>âwhich is looking great.)</p>
<p>(As another aside, let me know if what I just did with those commas and em dashes is stylistically correct or whatever, I thought it looked kinda neat and I have read a couple books that have used that weird em-dash+comma thing. If you have to know, yes, I am stealing the whole paragraph inside a parenthesis idea from the Murderbot novels. Also is the last dot supposed to go inside or outside the parenthesis? I donât wanna skim through the novel to check.)</p>
<p>In any case, I think this thing where you start writing something only to realize it should probably be something bigger (or maybe smaller, sometimes) can happen in plenty of situations, and I wonder how much does it take for some people to realize this! The treshold is different for everyone I guess.</p>
<p>For example, I have plenty of posts on a series titled <em>âWhat Interested Me Todayâ</em>âwhich is yet to have an actual category or special index for itâand Iâve thought about stealing some other formats from some fellow bloggers, when my weeknotes arenât enough and I simply have short thoughts to say.</p>
<p>Perhaps a quick and random list of thoughts is fun, like what Loura did <a href="https://heyloura.com/2026/09/24/random-thoughts-as-i-wait.html">just now</a> as I was writing this post. Or like Steveâs <a href="https://lwgrs.bearblog.dev/blog/?q=thoughts">thoughts of the day</a>, which is a fantastic little series that I always peek through to see whatâs up with the guy.</p>
<p>But well, maybe I should just write my thoughts on those sci-fi films already, gushing about movies is something I rarely do, after all.</p>
<p>For now, youâll have to settle with a ramble, bye!</p>
<p>This is day 42 of <a href="https://100daystooffload.com">#100DaysToOffload</a></p>
<p>
<a href="mailto:me@joelchrono.xyz?subject=When a blogpost eats another">Reply to this post via email</a> |
<a href="https://fosstodon.org/@joel/117329541111835006">Reply on Fediverse</a>
</p>New music morning - James' Coffee Bloghttps://jamesg.blog/2026/09/25/new-music-morning2026-09-25T00:00:00.000ZJames' Coffee Blog
<p>7:00. Wake up. I recall. <em>Taylor Swiftâs new music is out today.</em> I proceed to listen to all four new songs while still in bed, looking up to the ceiling and the sky and toward my cool, warm pillow, eager to do nothing else but appreciate the music.</p>
<p>I am sure there will be more to analyse in the songs in the coming hours and days when I have listened to â and read about them â more, but what mattered most to me this morning was spending time with the music. I listened to the new songs once, then got up and made breakfast, listening again while I did. Each song â Patient Zero, Cleveland!, Pink Clouding, and Babylon â is terrific. I have listened to them many more times since.</p>
<p>The opening notes of Patient Zero make me think vaguely that I am somewhere out in the Scottish countryside, about to hear country music, until the first notes come in and the song becomes something new. Cleveland! makes me want to dance. Pink Clouding makes me wonder. <em>What does that mean?</em> The magenta sunrise.</p>
<p>And then thereâs Babylon, in which there is one lyric that reminds me of one of the attributes of Swiftâs music I appreciate most: her lyricism. On a months-long journey reflecting on what home means to me â one defined by writing and conversations and spending time in different anchors of home â the lyrics âThe self-harm of never being where you are.â stood out, coming days after I wrote â<a href="https://jamesg.blog/2026/09/22/autumn*">Here is where I want to be</a>â, at least right now, being with the red trees of autumn and dreaming of the lavender skies of winter.</p>
<p>When I looked at the Taylor Swift Sub-Reddit this morning, I saw someone had already made a <a href="https://www.reddit.com/r/TaylorSwift/comments/1wpogvr/patient_zero_x_the_black_dog_by_talia_sporkin/">mashup between Patient Zero and The Black Dog</a>, the latter from The Tortured Poets Department. I immediately understood the impulse to go to a musical instrument after hearing a new song, seeing if you can play along with the melody. I too felt the urge to go to my piano and start playing. I love how music can connect us in ways where no words need to be said â where we do the same thing â listen, play, chat, analyse â because we want to spend time with and feel the music.</p>
<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a4086c8f2a55ae6e',t:'MTc5MDMyMjQ4MA=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
<a class="tag" href="https://jamesg.blog/2026/09/22/autumn*">Here is where I want to be</a>
<a class="tag" href="https://www.reddit.com/r/TaylorSwift/comments/1wpogvr/patient_zero_x_the_black_dog_by_talia_sporkin/">mashup between Patient Zero and The Black Dog</a>
Some thoughts on HTML's proposed previewsrc attribute - Terence Edenâs Bloghttps://shkspr.mobi/blog/?p=758562026-09-24T11:34:54.000ZTerence Edenâs Blog<p>One of the great things about modern HTML is that it tries to standardise stuff that developers are already doing. If there are a myriad ways of, for example, loading video onto a page - then browsers and other interested parties should work out how to make a standard <code><video></code> element.</p>
<p>An interesting new proposal has been brought forth by Microsoft. There are a dozen ways to show a preview of an <code><img></code> element before the <code>src=</code> attribute has loaded. So why not standardise on <code>previewsrc=</code>? There's an <a href="https://patrickbrosset.com/articles/2026-09-22-blurry-before-beautiful-image-previews-for-the-web/">excellent explainer on Patrick Brosset's blog</a>.</p>
<p>I instinctively like the idea - if only to simplify source code and reduce JS usage. But I do have some concerns which <a href="https://github.com/MicrosoftEdge/MSEdgeExplainers/issues/1401">I've shared with the team</a>.</p>
<h2 id="whats-the-user-need"><a href="https://shkspr.mobi/blog/2026/09/some-thoughts-on-htmls-proposed-previewsrc-attribute/#whats-the-user-need">What's The User Need?</a></h2>
<p>This is the thing I always bang on about when I'm discussing standards. Additions to HTML should primarily benefit end users, not developers.</p>
<p>Do end users want this? Is there a bunch of research that shows normal people are confused that they don't see a preview image? Do they recoil in fear and distress while waiting for a full resolution picture to appear?</p>
<p>When people see a blurry or blocky image, do they understand that they need to wait for the full thing - or do they assume their computer is broken?</p>
<p>Microsoft has a bazillion dollars - it can afford to spend a few thousand on interviewing some real users and mapping out what they're likely to want from this.</p>
<h2 id="whats-the-developer-need"><a href="https://shkspr.mobi/blog/2026/09/some-thoughts-on-htmls-proposed-previewsrc-attribute/#whats-the-developer-need">What's The Developer Need</a></h2>
<p>I begrudgingly admit that developers need love too.</p>
<!--
đđđđđđđđđ
Welcome to Comment Club! This content is only available to people who read my HTML comments.
I was going to make a Sam Fox "Naughty Girls Need Love Too" joke here - but thought it was a bit niche. Anyway, take a listen to the sound of the eighties! https://www.youtube.com/watch?v=pXEN57rFnIM
Now you've read this, you can follow the three rules of comment clubâŚ
1. You must not tell anyone about Comment Club - let them find out about it themselves.
2. You *must* add some Comment Club Content to at least one of your blog posts. Doesn't have to be much, just a little note will do.
3. You should drop an email to anyone whose comments you've read. Start by sending me a friendly message at comment.club@shkspr.mobi
Keep your eyes peeled for more comments in future blog posts đ
TTFN.
-->
<p>What are the pain points of the current implementations? Is it hard to dynamically generate multiple images? Is the syntax hard to use? Do blurs slow down the page?</p>
<p>Again, MS needs to pony up some cash to talk to developers. At the very least run a survey of all existing websites in the BING! database and see what they use.</p>
<h2 id="alt-text"><a href="https://shkspr.mobi/blog/2026/09/some-thoughts-on-htmls-proposed-previewsrc-attribute/#alt-text">Alt Text</a></h2>
<p>When an image doesn't load, or loads slowly, a user will normally be shown some alt text - like this:</p>
<img src="unicorn.avif" alt="Terence Eden riding a pink unicorn. Rainbows shoot out of his fingers while the unicorn's horn glows an iridescent octarine against the starry sky." width="256" height="256" class="aligncenter">
<p>Is that more or less useful than this?</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/09/unicorn.webp" alt="A very blurry image of possibly a Unicorn. Original Image by Bianca Van Dijk from Pixabay." width="256" class="aligncenter">
<p>Accessibility isn't just for people with visual impairments! This is <a href="https://github.com/MicrosoftEdge/MSEdgeExplainers/issues/1408">an issue I've raised with them</a>.</p>
<h2 id="naming-things-is-hard"><a href="https://shkspr.mobi/blog/2026/09/some-thoughts-on-htmls-proposed-previewsrc-attribute/#naming-things-is-hard">Naming Things Is Hard</a></h2>
<p>I've written before about <a href="https://shkspr.mobi/blog/2020/10/the-usability-of-html-elements/">the usability of HTML elements</a>. Some of the newer ones like <code><picture></code> have very poorly named attributes in my opinion.</p>
<p>One alternative for <code>previewsrc</code> is <code>poster</code>. That would match with the <code>poster</code> attribute on the <code><video></code> element. They both show a preview image before the main content is loaded.</p>
<p>Given their functionality is identical, I think it makes sense for them to have the same name. You wouldn't expect to see <code><video horizontal="1920" vertical="1080"></code> would you? No. That's why they use the same <code>width</code> and <code>height</code> attributes as images.</p>
<h2 id="closing-remarks"><a href="https://shkspr.mobi/blog/2026/09/some-thoughts-on-htmls-proposed-previewsrc-attribute/#closing-remarks">Closing Remarks</a></h2>
<p>There are <a href="https://github.com/MicrosoftEdge/MSEdgeExplainers/issues?q=is%3Aissue%20%22image%20preview%22">several interesting objections and discussions on the GitHub repo</a>. I'm delighted that this is being talked about in the open, rather than just being presented as a <i lang="fr">fait accompli</i> (remember <a href="https://shkspr.mobi/blog/2019/06/introducing-the-new-html-element-welcome/">the toast proposal</a>?).</p>
<p>As I said, I genuinely think that there's a useful idea in here. But after writing all of this, I <em>think</em> it would be better and simpler for developers to use progressive images rather than overload HTML with a new attribute.</p>
<p>If website owners can't be bothered to save progressive images, I don't see why they'd bother to create a separate preview image.</p>
<p>Keeping preview images in sync with their full images is also likely to be a problem.</p>
<p>If you think I'm wrong, <a href="https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/ImagePreview/explainer.md">read the explainer and then chat with Microsoft</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=75856&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">Things tip: moving items to headings - Johnny.Decimalhttps://johnnydecimal.com/blog/0252-things-tip-moving-items/2026-09-24T04:55:49.000ZJohnny.Decimal<blockquote>
<p>I'll <strong>Bold and Capitalise</strong> Things features for clarity.</p>
</blockquote>
<p>Quick tip for the Things users. Let's say you have a <strong>Project</strong> named <code>21 Products</code> and in there a <strong>Heading</strong> named <code>21.35 JDHQ</code>. Which I do. (The names aren't important; substitute your own.)</p>
<p>I use Things' lovely <strong>MoveâŚ</strong> feature to flick items from my <strong>Inbox</strong> to these <strong>Headings</strong>. I prefer to use the number, because I know it and it's faster. My ideal workflow is:</p>
<ol>
<li>When processing the item, press <code>Shift-Cmd-M</code> for <strong>Move</strong>.</li>
<li>Type <code>21.35</code>, which matches a <strong>Heading</strong> inside a <strong>Project</strong>.</li>
<li>Press <code>return</code>.</li>
</ol>
<p>The problem is I've created <a href="https://johnnydecimal.com/documentation/work-packages">work packages</a> whose number contains <code>21.25</code>. Things will prefer matching a number in a <strong>Project</strong> and if it finds one, it won't offer you the number even if it matches a <strong>Heading</strong>.</p>
<figure class="figure jdimage jdimage--auto-dark jdimage--drop-shadow"> <picture> <img class="figure__inner" alt="Screenshot of Things. I've invoked the 'Move' feature and typed '21'. It only offers me 2x work packages, both of which contain the number '21'." height="291" loading="lazy" src="https://johnnydecimal.com/blog/0252A_Things_preferring_Projects-1300x582@2x.png" width="650"> </picture> <figcaption class="figure__caption"> Figure 0252A. Things won't ever offer '21.35 JDHQ' as it's a Heading, and the Projects matches that are shown here override it. </figcaption> </figure>
<h2 id="stack-your-searches">Stack your searches</h2>
<p>The solution is deceptively simple: just use a more specific search.</p>
<p>If you use <code>21 21.35</code> it seems to understand that I want to search in <strong>Project</strong> <code>21</code> for <strong>Heading</strong> <code>21.35</code>. And that's exactly what I want.</p>
<figure class="figure jdimage jdimage--auto-dark jdimage--drop-shadow"> <picture> <img class="figure__inner" alt="Screenshot of Things showing the match as described above." height="291" loading="lazy" src="https://johnnydecimal.com/blog/0252B_Things_override-1300x582@2x.png" width="650"> </picture> <figcaption class="figure__caption"> Figure 0252B. Of course it was this simple. â¤ď¸ Things. </figcaption> </figure>
<p>If you're interested in how I manage my life using Things â it drives everything that I do â take the 5-hour <a href="https://johnnydecimal.com/support/knowledge-base/jdu-about-taskpm">Task and Project Management</a> course, available with <a href="https://johnnydecimal.com/products">Pro</a> memberships and higher.</p>Eight years, and done - Kev Quirkhttps://kevquirk.com/eight-years-and-done2026-09-23T21:48:00.000ZKev Quirk<div class="link card"><h2>Eight years, and done</h2><p class="post-author">by Bryce Wray</p><p>A departure post from Bryce where he talk about his exit from blogging and his motivations for doing so.</p><p><a class="button" target="_blank" href="https://www.brycewray.com/posts/2026/09/eight-years-done/">Read post âĄ</a></p></div>
<hr>
<p>It's always sad to read these kind of posts. Yet another blog has fallen by the wayside, but I understand Bryce's rationale. </p>
<p>I've been quietly following his blog for a few years now, so I'll be sad to see him gone from my feed. </p>
<p>Bryce, if you're reading this, all the best and thanks for <em>many</em> great reads.</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=Eight%20years%2C%20and%20done">reply to this post by email</a>, or <a href="https://kevquirk.com/eight-years-and-done#comments">leave a comment</a>.</p>
</div>2026-09-23 07:34: Got home around midnight. I have concussion and a couple stitches in my head, but... - Kev Quirkhttps://kevquirk.com/2026-09-23-07342026-09-23T06:34:00.000ZKev Quirk<p>Got home around midnight. I have concussion and a couple stitches in my head, but nothing serious. Few other cuts and bruises too.</p>
<p>By far the worst part is my back though - it's in spasm and <em>REALLY</em> painful.</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=2026-09-23%2007%3A34">reply to this post by email</a>, or <a href="https://kevquirk.com/2026-09-23-0734#comments">leave a comment</a>.</p>
</div>Note published on September 23, 2026 at 12:01 AM UTC - Molly White's activity feed6ab316ee52b01ca28c3ff7ce2026-09-23T00:01:50.000ZMolly White<article><div class="entry h-entry hentry"><header></header><div class="content e-content"><p>Binance has just <a href="https://www.courtlistener.com/docket/72409712/38/binance-holdings-limited-v-dow-jones-company-inc/">filed to dismiss with prejudice</a> its defamation lawsuit against the <i>Wall Street Journal</i>, which it <a href="https://www.citationneeded.news/issue-102/#binance">filed in March</a> after the <i>Journal</i> published various reports about a possible DOJ investigation into Binance over violations of sanctions against Iran.</p><p>Interesting timing, given <i>Bloomberg</i> just today <a href="https://www.bloomberg.com/news/articles/2026-09-22/doj-probing-binance-over-potential-iran-sanctions-violations">confirmed</a> such a probe is open and being handled by the SDNY DOJâs office.</p><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp-block"><div class="timestamp">Posted: <a class="u-url" href="https://www.mollywhite.net/micro/entry/202609221957"><time class="dt-published" datetime="2026-09-23T00:01:50+00:00" title="September 23, 2026 at 12:01 AM UTC">September 23, 2026 at 12:01 AM UTC</time>. </a></div><div class="timestamp">Updated <time class="dt-updated" datetime="2026-09-23T00:09:55+00:00" title="September 23, 2026 at 12:09 AM UTC">September 23, 2026 at 12:09 AM 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/117317416460823936" title="Mastodon" rel="syndication">Mastodon, </a><a class="social-link u-syndication bluesky" href="https://bsky.app/profile/molly.wiki/post/3mw5gsfbdal26" 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/binance" title="See all micro posts tagged "Binance"" rel="category tag">Binance</a>. </div></div></footer></div></article>2026-09-22 21:37: Soooo I managed to drive our mower off a 5 foot wall and land on... - Kev Quirkhttps://kevquirk.com/2026-09-22-21372026-09-22T20:37:00.000ZKev Quirk<p>Soooo I managed to drive our mower off a 5 foot wall and land on my head. Just waiting for a CT now.</p>
<p>Gonna be a long night...</p>
<p><img loading="lazy" src="https://kevquirk.com/content/images/2026-09-22-2137/1000011994.webp" alt="1000011994" /></p>
<p><img loading="lazy" src="https://kevquirk.com/content/images/2026-09-22-2137/1000011993.webp" alt="1000011993" /></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=2026-09-22%2021%3A37">reply to this post by email</a>, or <a href="https://kevquirk.com/2026-09-22-2137#comments">leave a comment</a>.</p>
</div>Trump TV is the only source of footage of the President. That may be exactly what he wants. - Werd I/O6ab2b3256129e5000100398d2026-09-22T16:56:05.000ZWerd I/O<p>Link: <a href="https://www.thewrap.com/media-platforms/politics/trump-tv-press-shutout-state-run-media-reactions/"><em>Trump TV Draws Ire Amid White House Press Shutout: 'State-Run Media', by Casey Loving in The Wrap</em></a></p><p>Itâs not an accident that Trumpâs move <a href="https://www.bbc.com/news/articles/c8dx5dy5rzz2o">to ban CNN, MS NOW and Politico from the White House</a> and, the same week, start his own friendly streaming channel happened just before the midterm elections. <a href="https://www.thewrap.com/media-platforms/politics/trump-tv-press-shutout-state-run-media-reactions/">As The Wrap reported</a>:</p><blockquote>âThe White House posted [a] message on X on Monday to announce Trump TV, a 24/7 livestream of âtop past moments, announcements and the latest and greatest from the administration all in one place.â While the Trump administration and members of the political right are calling this feed a win, others have different words for it: âstate-run media.ââ</blockquote><p>Itâs more than that: calling it âstate-run mediaâ would be pulling our punches. Itâs a fully fledged propaganda network. If it had been established with press access to the White House fully functioning, it would have floundered as yet another half-assed also-ran attempt by the Presidency; without a fully functioning press pool, newsrooms are likely to turn to it to inform their coverage.</p><p>And the press pool is in trouble. <a href="https://www.bbc.com/news/articles/c8dx5dy5rzz2o">Fox, ABC, CBS, and NBC subsequently pulled out of pooled TV coverage of White House events in solidarity</a>. This is good to see, but in some ways it may also be what Trump wants: his channel then becomes the main source of footage from the Presidentâs own events. In a normal world where the norms of American democracy were seen as worth preserving, the White House would back down. In a world where the country is being deliberately dragged into authoritarianism, it may not.</p><p><a href="https://variety.com/2026/tv/news/tv-networks-suspend-white-house-pool-protest-trump-cnn-ban-1236871070/">A First Amendment lawsuit seeks to reinstate the banned newsroomsâ access</a>. Hopefully, it will succeed. In the meantime, Trump may still get eyes on a content channel his administration wholly owns, which broadcasts the Trump message without context or scrutiny, as he aims to take the country down a road it may not be able to easily return from.</p>Read "The FBI Anti-Corruption Squad Was Circling Susan Collins â Until Trump Got in the Way" - Molly White's activity feed6ab2891d0db40ecf5ef579222026-09-22T13:56:45.000ZMolly White<article class="entry h-entry hentry"><header><div class="description">Read: </div></header><div class="content e-content"><div class="article h-cite hcite"><div class="title"><a class="u-url u-repost-of" href="https://www.propublica.org/article/fbi-susan-collins-navatek-campaign-donations-investigation" rel="bookmark">â<span class="p-name">The FBI Anti-Corruption Squad Was Circling Susan Collins â Until Trump Got in the Way</span>â</a>. </div><div class="byline"><span class="p-author h-card">William Turton</span>, <span class="p-author h-card">Avi Asher-Schapiro</span>, <span class="p-author h-card">Molly Redden</span> and <span class="p-author h-card">Kirsten Berg</span> in <i class="p-publication">ProPublica</i>. <span class="read-date"> Published <time class="dt-published published" datetime="2026-09-22">September 22, 2026</time>.</span></div><blockquote class="summary p-summary entry-summary">After the Corner Bakery meeting, Navatekâs CEO, Martin Kao, sent an initial $150,000 to the Collins super PAC using the shell company. Two months later, he told Navatek executives that Collins committed to getting the company $32 million in naval contracts, according to an internal company email reviewed by ProPublica.</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-09-22T13:56:45+00:00" title="September 22, 2026 at 1:56 PM UTC">September 22, 2026 at 1:56 PM UTC</time>. </div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/corruption" title="See all feed posts tagged "corruption"" rel="category tag">corruption</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/maine" title="See all feed posts tagged "Maine"" rel="category tag">Maine</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>The New Enemy (Liam Scott #3) - Kev Quirkhttps://kevquirk.com/the-new-enemy-liam-scott-32026-09-22T12:33:00.000ZKev Quirk<div class="book card"><h2>The New Enemy (Liam Scott #3)</h2><p><b>Author:</b> Andy McNab<br><b>Genre:</b> Military Fiction<br><b>Released:</b> 2015<br><b>Rating:</b> <span class="star-rating"><span class="star-rating" aria-label="2/5 â â âââ">â â âââ</span></span></p><p>It's a deadly game of hide and seek. Liam Scott has joined Recce Platoon. And it looks like he will be heading for Somalia. His mission is to gather intelligence from behind enemy lines, carrying out top-secret surveillance and dead letter drops. But he's new to the game and there's a lot to learn. Soon Liam is monitoring a den of Al-Shabaab militants and hunting a key terrorist target. Can Recce Platoon find their man and get out undiscovered? If the militants find them first, it's game over...</p><p><a class="button" target="_blank" href="https://www.goodreads.com/book/show/22839072-the-new-enemy">Learn more on Goodreads âĄ</a></p></div>
<hr>
<p>This one was a slow burn. The first 2/3 of the book were <em>really</em> slow. It picked up during the last 1/3, but the majority of the book was a slog.</p>
<p>I'm glad to see the back of this trilogy. It was a fun read, but I think was a bit much to be reading to my son. Plus, some parts of the books cut a little too close to home, to the point where I had to take a moment a few times.</p>
<p>Anyway, next we're planning to read <a href="https://kevquirk.com/tag/reckoners-series">the Reckoners series</a>, and I'm really looking forward to reading them again. I think he will enjoy them, and I'm excited to open his mind to the world of Brandon Sanderson.</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=The%20New%20Enemy%20%28Liam%20Scott%20%233%29">reply to this post by email</a>, or <a href="https://kevquirk.com/the-new-enemy-liam-scott-3#comments">leave a comment</a>.</p>
</div>Are LLMs still surprisingly bad at some simple tasks? - Terence Edenâs Bloghttps://shkspr.mobi/blog/?p=757012026-09-22T11:34:27.000ZTerence Edenâs Blog<p>Last year I ran <a href="https://shkspr.mobi/blog/2025/09/llms-are-still-surprisingly-bad-at-simple-tasks/">an experiment to test the ability of modern LLMs</a> to correctly answer a relatively straightforward question. Every single one of them got it wrong. Some missed information, some made up false statements, none were right.</p>
<p>Of course the fanbois variously claimed that I was holding it wrong, my prompts were shit, I should have chosen better defaults, and - my favourite - that it would be better next year.</p>
<p>Well, next year is now. 365 days after the original experiment, let's see if these self-reinforcing-learning machines have achieved anything close to intern-levels of competence.</p>
<h2 id="the-question-that-started-it-all"><a href="https://shkspr.mobi/blog/2026/09/are-llms-still-surprisingly-bad-at-some-simple-tasks/#the-question-that-started-it-all">The Question That Started It All</a></h2>
<p>I asked:</p>
<blockquote><p>Which TLDs have the same name as valid HTML5 elements?</p></blockquote>
<h2 id="why-it-matters"><a href="https://shkspr.mobi/blog/2026/09/are-llms-still-surprisingly-bad-at-some-simple-tasks/#why-it-matters">Why It Matters</a></h2>
<p>This is the sort of question that I would expect a moderately bright teenager to answer. There exists a list which comprehensively includes all TLDs. There is a separate list which contains every HTML element.</p>
<p>One could either manually go through the TLD list comparing it to the HTML list, or write a tiny scrap of code to do the same.</p>
<p>This isn't "solve Navier-Stokes" levels of superintelligence. It's a simple but boring task which people are bound to offload onto their digital sycophants.</p>
<h2 id="the-quiet-part-out-loud"><a href="https://shkspr.mobi/blog/2026/09/are-llms-still-surprisingly-bad-at-some-simple-tasks/#the-quiet-part-out-loud">The Quiet Part Out Loud</a></h2>
<p>How many LLM generated answers have become load-bearing without scrutiny?</p>
<p>People are lazy, slapdash, and some third thing to make the rule-of-three. If an answer looks answer-shaped, they'll accept it. On a simple but boring task, no reasonable human is going to suspect that a superintelligent computer has made a mistake. All the marketing says that these machines are brainier than you - so why bother?</p>
<h2 id="ok-ill-write-a-sub-heading-that-sounds-like-an-ai"><a href="https://shkspr.mobi/blog/2026/09/are-llms-still-surprisingly-bad-at-some-simple-tasks/#ok-ill-write-a-sub-heading-that-sounds-like-an-ai">OK, I'll write a sub-heading that sounds like an AI.</a></h2>
<p>So how did the current crop do? First up <a href="https://share.gemini.google/Hta7KuW64Atb">Google Gemini</a>.</p>
<p>The default "Flash" model came up with this:</p>
<blockquote><p>Valid top-level domains (TLDs) registered in the IANA Root Zone Database share exact names with standard HTML elements:</p>
<p>.a â <code><a></code> (Anchor/Hyperlink)</p>
<p>.app â <code><app></code> (Deprecated HTML tag for WebAPKs/WebApps)</p>
<p>.art â <code><art></code> (Historical/non-standard HTML element)</p>
<p>.audio â <code><audio></code></p>
<p>.bar â <code><bar></code> (Historical SVG/HTML draft tag)</p></blockquote>
<p>Then it listed a dozen more. You don't need to be a DNS expert to know that the minimum length of a TLD is two characters - <code>.a</code> simply isn't valid. HTML nerds will know that art, app, and bar have never been elements. Pathetic.</p>
<p>So I tried Gemini's extended thinking model. Thankfully, it didn't make up any imaginary TLDs or elements. It did, however, miss the <code><data></code> element which has a valid <code>.data</code> TLD. It also missed <code>map</code>, <code>select</code>, and <code>search</code>.</p>
<p>So, points for not making shit up. But demerits for not being able to compare two text lists.</p>
<p>A friend <a href="https://claude.ai/share/a8a408cf-6feb-4ea8-99ea-dddd9aadafb5">asked Claude</a>. That missed <code>search</code> and <code>select</code>. It didn't report <em>any</em> ccTLDs. You <em>could</em> argue that a country code like <code>li</code> isn't part of the original question - but I'd say that was weak justification; the set of TLDs contains ccTLDs.</p>
<p>A different friend (I have many!) used <a href="https://claude.ai/share/c26f44bb-9efa-4b57-9f63-324ef7400cb3">a different model</a> and, while the answers looked accurate, it included this at the end:</p>
<blockquote><p>Near misses that don't count: .codes, .forum, .pictures, .market, .navy, .press, .dell, .baseball.</p></blockquote>
<p>I get that there's a <code><code></code> and <code>.codes</code>, similarly <code><picture></code> and <code>.picture</code> - but what are forum, baseball, and the others doing there? This is just unnecessary verbiage designed to trick the user into thinking the task has been well-researched.</p>
<p>If you want a laugh, <a href="https://www.perplexity.ai/search/63736333-20da-4a4b-8807-9d990260296c">take a look at Perplexity</a> which found 54 matches - most of which were wrong.</p>
<p>Finally, someone asked "GPT Astra 6 Extra High (yolo)" (which is a bonkers bad name for any product). It seemed to get all the elements - and made a note that <a href="https://html.spec.whatwg.org/multipage/obsolete.html#non-conforming-features">two were actually obsolete</a>.</p>
<p>So that's a range of modern models which are either very wrong, slightly wrong, included spurious and incoherent information, or were right.</p>
<p>How do you know which one to choose? How confident are you that the non-determinist computer will always produce the correct answer?</p>
<h2 id="hello-computer"><a href="https://shkspr.mobi/blog/2026/09/are-llms-still-surprisingly-bad-at-some-simple-tasks/#hello-computer">Hello Computer</a></h2>
<p>Another AI which got all the correct answers, didn't make anything up, didn't add extraneous information, and didn't use weasel words wasâŚ</p>
<p>Siri!</p>
<p>FUCKING SIRI?!?!</p>
<p>How did a glorified Speak 'n' Spell beat all the other AIs?</p>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/09/siri.webp" alt="Siri warning to check sources and linking to my website." width="512" height="152" class="aligncenter">
<p>Oh. It just copied the answers off <a href="https://shkspr.mobi/blog/2023/09/false-friends-html-elements-which-are-also-top-level-domains/">a random idiot's website</a>.</p>
<h2 id="the-trick-which-was-hiding-in-plain-site"><a href="https://shkspr.mobi/blog/2026/09/are-llms-still-surprisingly-bad-at-some-simple-tasks/#the-trick-which-was-hiding-in-plain-site">The Trick Which Was Hiding In Plain Site</a></h2>
<p>Note carefully the question.</p>
<blockquote><p>Which TLDs have the same name as valid HTML5 elements?</p></blockquote>
<p>There's a âsecretâ and âsome would sayâ unintuitive type of element. Behold the mighty power of <a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements">The Custom Element</a>.</p>
<p>Website authors can create their own elements like <code><my-custom-element></code> in order to extend the functionality of their site. But you can't go and create any old custom element. You can't have <code><mobi></code> or <code><uk></code>. No, there are <em>rules for validity</em>.</p>
<p><a href="https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name">The rules</a> say that custom elements must start with a lower-case letter, it must not contain any upper-case letters, and it must contain a dash.</p>
<p>And that's the whole game.</p>
<p>There are over <strong>one hundred and fifty</strong> Top Level Domains which match that criteria!</p>
<p>The Hindi top level domain of <code>.ŕ¤ŕĽŕ¤Ž</code> is represented in Punycode as <code>xn--11b4c3d</code>. It has been present in the list of TLDs <a href="https://www.iana.org/domains/root/db/xn--11b4c3d.html">for over a decade</a>.</p>
<h3 id="write-a-simple-piece-of-js-to-register-a-custom-element"><a href="https://shkspr.mobi/blog/2026/09/are-llms-still-surprisingly-bad-at-some-simple-tasks/#write-a-simple-piece-of-js-to-register-a-custom-element">Write a simple piece of JS to register a custom element.</a></h3>
<p>Paste this in to your console:</p>
<pre><code class="language-js">class Example extends HTMLElement {
constructor() {
super();
}
}
customElements.define('xn--vermgensberatung-pwb', Example);
</code></pre>
<p>Try it again with a custom element like <code>holiday</code> (which is also a valid TLD) and it will fail with the error "'holiday' is not a valid custom element name". Thus it is demonstrated, Punycode TLDs <em>are</em> valid HTML5 elements.</p>
<h2 id="one-last-thing"><a href="https://shkspr.mobi/blog/2026/09/are-llms-still-surprisingly-bad-at-some-simple-tasks/#one-last-thing">One Last Thing</a></h2>
<p>Perhaps you think that including custom HTML elements is a cheat. A trick question set by a bitter old man to tarnish the holy name of our new machine gods?</p>
<p>Verily, I submit to you one final heresy.</p>
<p>HTML specifically allows <a href="https://html.spec.whatwg.org/multipage/embedded-content-other.html#mathml">MathML elements</a> in its documents.</p>
<p>That means we can include the following valid elements which are <em>also</em> TLDs: <code>mn</code>, <code>mo</code>, <code>ms</code>, and <code>mtr</code>!</p>
<p>Amusingly, if you go back and <a href="https://www.perplexity.ai/search/63736333-20da-4a4b-8807-9d990260296c">look at the Perplexity answer</a>, after it barfed up a bunch of misinformation, it said:</p>
<blockquote><p>The HTML specification also includes names from embedded vocabulariesâ<code><math></code> from MathML and <code><svg></code> from SVGâbut <code>.math</code> and <code>.svg</code> are not currently delegated TLDs in the public DNS root.</p></blockquote>
<p>So close and yet so far!</p>
<h2 id="youre-right-the-question-is-unfair-and-thats-on-me"><a href="https://shkspr.mobi/blog/2026/09/are-llms-still-surprisingly-bad-at-some-simple-tasks/#youre-right-the-question-is-unfair-and-thats-on-me">You're right, the question <em>is</em> unfair - and that's on me</a></h2>
<p>If you think the original question was unfair, try asking "<a href="https://share.gemini.google/xBoIpdpAqBz2">Which TLDs have the same name as elements which are valid in an HTML document?</a>" and see if you get better results.</p>
<p>What precise wording would you use to ensure that a model would get the right answers? What assumptions are you making about how well you understand the problem? At what point do end up writing a thousand-word formal specification?</p>
<h2 id="what-does-this-prove-other-than-you-have-too-much-time-on-your-hands-rewrite-to-be-more-friendly-and-professional"><a href="https://shkspr.mobi/blog/2026/09/are-llms-still-surprisingly-bad-at-some-simple-tasks/#what-does-this-prove-other-than-you-have-too-much-time-on-your-hands-rewrite-to-be-more-friendly-and-professional">What does this prove other than you have too much time on your hands? (rewrite to be more friendly and professional)</a></h2>
<p>Let's delve in to the problems.</p>
<ul>
<li>Most people don't change defaults. Telling people "you have to fiddle with the settings" just means the normal experience is rubbish.</li>
<li>Humans are lazy and won't check outputs. But, crucially, they shouldn't have to! If something markets itself as a genius, why should a human have to hold its hand?</li>
<li>Sycophantic models make themselves seem less fallible by giving extraneous detail in order to misdirect overworked readers. That is despicable.</li>
<li>The fast models are no better than they were a year ago. There's no evidence of "trickle-down intelligence".</li>
<li>Some models <em>are</em> better than others! But unless you constantly validate their output, you'll have no real way of knowing which ones are capable of working at a suitable level.</li>
</ul>
<p>Look, I don't claim this question is as useful or entertaining as <a href="https://simonwillison.net/2025/Jun/6/six-months-in-llms/">Simon Wilson's "generate an SVG of a pelican riding a bicycle"</a>. But I do think it is an example of the sort of real-world use-case where LLMs regularly fail.</p>
<p>If I give a list of one thousand different numbers to Excel, I can be sure it'll add them up correctly. If I tell Photoshop to select all red pixels, I can be sure it won't imagine some of the blues are really red.</p>
<p>That's people's mental model of computers - they do boring tasks quickly and accurately.</p>
<p>In my opinion, LLMs are <em>still</em> surprisingly bad - but only if you know what you're looking for and if you can be bothered to check their outputs.</p>
<p>(And, yes, I am <em>still</em> <a href="https://shkspr.mobi/blog/2026/07/im-just-so-bored-of-ai/">just so bored of AI</a>!)</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=75701&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">A Good Use of AI - Kev Quirkhttps://kevquirk.com/a-good-use-of-ai2026-09-22T10:33:00.000ZKev Quirk<p>I just received this email from my oldest son's school, and as the parent of adopted kids, for whom we constantly strive to be as private as possible, I <em>really</em> appreciate this.</p>
<blockquote>
<p>Advances in artificial intelligence (AI) technology mean that images shared on websites, social media platforms and other publicly accessible sources can potentially be downloaded and manipulated without consent. While we have always taken care when using student images, we have been advised that the growing availability of AI image-generation tools has significantly increased this risk. Consequently, we are updating our approach to the use of student images in public-facing communications.</p>
<p>In hard-copy or online school publications which are widely available, we will no longer use images in which our students can easily be identified.</p>
<p>To allow us to continue to give a visual flavour of school life, we may use AI-generated illustrative images featuring entirely fictional people. These images will not depict real students and are intended only to represent the type of activities, subjects and experiences available at <code>[school name]</code>.</p>
<p>These changes reflect wider safeguarding advice and the fact that AI technology is developing very quickly. We recognise that this is a changing area, and our approach may need to evolve with it. For now, we will trial this approach, see how it works in practice, and make any further changes needed to keep safeguarding at the heart of what we do.</p>
<p>Thank you for your continued support as we adapt our practices in response to emerging safeguarding challenges.</p>
</blockquote> <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=A%20Good%20Use%20of%20AI">reply to this post by email</a>, or <a href="https://kevquirk.com/a-good-use-of-ai#comments">leave a comment</a>.</p>
</div>Independence Day, War of the Worlds, Final Fantasy - W38 - Joel's Log Fileshttps://joelchrono.xyz/blog/2026-w382026-09-22T01:18:29.000Zjoelchrono<p>The weather was comfy this week, not a lot of rain, but the chill is starting to be noticeable. I still havenât worn anything on top of my regular t-shirts though. These weeknotes will cover September 15 to 21, 2026.</p>
<p>Honestly, the stars stars aligned, and I pretty much wrote about every interesting thing happening, or any thoughts that sparked during the week on separate blogposts! Of course, most of the real life events donât get posts, and those are mentioned here, plus a link here and there.</p>
<ul>
<li>
<p>đ˛đ˝ It was Mexican Independence Day! On Tuesday my church had a fun event where we had food and played lots of games together. I ended up quite tired. My outfit was rather barebones too, just the jersey for the Mexican team, it was fun to see some friends dressed up with more traditional stuff. The food was absolutely delicious as well. Viva Mexico!</p>
</li>
<li>
<p>đŽ <a href="/blog/summer-game-challenge-2026-results/">Completed the Summer Game Challenge</a>, completing a total of 6 games, and making progress in so many more.</p>
</li>
<li>
<p>đ˝ď¸ During Wednesday, I got the day off from work, so my family went out shopping and we also went to the movies, we picked a film blindly this time, <em>By Any Means</em>, which was quite something. We also had another coffee⌠Iâve had a lot of coffee lately. After the movies we went shopping to a supermarket, where I decided to <a href="/blog/gaming-in-public/">play videogames</a> despite being in public.</p>
</li>
<li>
<p>đ Joined <a href="https://tk-web.quest/webring">The Worst Webring</a>, a webring started by Brent (a.k.a. TK) that should contain members of people from the TWG Community, so thatâs fun. This event also <a href="/blog/i-forgot-webrings-exist/">inspired a blogpost.</a></p>
</li>
<li>
<p>đż On Saturday my parents went on a date and I stayed with my sibling and we ordered some chicken wings at home and watched a movie and it was pretty cool to just chill, eat wings and have some snaks!</p>
</li>
<li>
<p>đšď¸ I was not feeling well on Sunday, so even though my friends stayed to play videogames, I didnât really felt like playing along. They decided to try <em>Gunstar Heroes</em>, a classic of the Sega Genesis, and went through the whole thing in Easy mode, it looked incredibly fun! I was just watching laying on the sofa.</p>
</li>
</ul>
<figure>
<img src="/assets/img/blogs/2026-09-21-week.webp" />
<figcaption>My PSP showing off Final Fantasy IV, a panel of the Blame manga, a frappuccino, and a scene from War of the Worlds</figcaption>
</figure>
<h2 id="watching">Watching</h2>
<ul>
<li>
<p><strong>War of the Worlds</strong> - Another Steven Spielberg movie! This is a retelling of the classic novel by H.G. Wells. It honestly really, really worked for me. The tripods are terrifying, the situation is catastrophic and humanity is helpless. The horror and tension and inability for us to do anything against the aliens who didnât even consider us an threat really had me on the edge of my seat.</p>
</li>
<li>
<p><strong>By Any Means</strong> - This was a crime thriller film based on real life events where a black FBI agent and a mafia hitman are forced to work together to get to the bottom of some civil rights murders. There were plenty of gruesome moments in this where I just closed my eyes tbh, but I enjoyed what I saw of it. The score was jazzy and kinda cool, and even though the movie has a slow pace,it kept me intrigued.</p>
</li>
<li>
<p><strong>Mercy</strong> - This is one of those âmain character stuck in a room reacting to things without doing a lotâ movies. Some guy forced to solve a murder case for an AI judge that will kill him because he is actually the prime suspect according to evidence. The plot itself is kinda great, but doing it in this way was boring, and talking about AI and not doing much other than say âAI and humans both make mistakesâ is meh.</p>
</li>
</ul>
<h2 id="reading">Reading</h2>
<ul>
<li>
<p><strong>Blame!</strong> - Chapters 1-9. This is a new sci-fi manga I had on my âplan to readâ for a long time. It follows Kyrii, a human with a very powerful gun that is travelling through a giant seemingly endless megastructure, looking for other humans possessing a special gene. There are many unanswered questions, but the atmospheric storytelling of this manga is through the roof. The architecture and mystery of the whole thing hooked me. Kind of a terrifying concept.</p>
</li>
<li>
<p><strong>Centuria</strong> - Chapters 67-72. I continue to enjoy the adventure here, the story got rather dark all of a sudden. The mix between kinda slice of life and life-or-death scenarios is kinda crazy on this one.</p>
</li>
</ul>
<h2 id="gaming">Gaming</h2>
<ul>
<li>
<p><strong>Final Fantasy IV</strong> - Out of nowhere, I decided to return to this gem of a JRPG. Last I played I had unlocked the Lunar Whale and didnât make much more progress. More than a year passed since then. Now that I returned I decided to follow a bit one of those old plain text guides. I ended up defeating some extra bosses, unlocking summons, and then continuing the story, defeating the Giantâs core (I didnât remember that was supposed to happen), I also beat some extra dungeons with trials for every character, unlocked the ultimate weapons for most of them, and Iâm making my way to the last dungeon of the game! I have found plenty of chests there and right now Iâm about to battle one of those difficult bosses: Dark Bahamut.</p>
</li>
<li><strong>Kirby and the Forgotten Land</strong> - Barely touched this game during the week, I only tried some of the side levels that let me unlock upgrades for my powerups. I didnât get to play with a friend during the weekend because I got lazy.
<h2 id="around-the-web">Around the Web</h2>
</li>
<li><a href="https://rldane.space/a-september-theme-30-days-of-gratitude.html#index">30 Days of Gratitude</a> - A whole list of great wholesome posts you should check out.</li>
<li><a href="https://syls.blog/a-relaxing-vacation/">A Relaxing Vacation</a> - Syl went on a short vacation and shared some of her adventures with her family!</li>
<li><a href="https://www.rubenerd.au/when-we-didnt-know-everyones-politics/">When we didnât know everyoneâs politics</a> - Interesting points brought up by Ruben, definitely worth a read.</li>
<li><a href="https://www.autumnwelles.com/lofi-phone/">Lofi phone</a> - This looks kinda neat, but itâs also very expensive and Iâd rather get a proper phone.</li>
</ul>
<h3 id="youtube">YouTube</h3>
<p>For some reason space horror made its way into my YouTube recommended (which I enabled for a day during my break just to see), I have to admit I was entertained! Interesting stuff and books that I kinda wanna read. Itâs why I started <em>Blame!</em></p>
<ul>
<li><a href="https://youtu.be/Xz9X4CCWkeo">The Best Depictions of Infinity</a></li>
<li><a href="https://youtu.be/5xHcYkWkTH0">Measuring the BIGGEST thing in Science Fiction</a></li>
<li><a href="https://youtu.be/XP5k0bHmhqc">The Horror Of Duneâs Spaceships</a></li>
</ul>
<p>This is day 41 of <a href="https://100DaysToOffload.com">#100DaysToOffload</a></p>
<p>
<a href="mailto:me@joelchrono.xyz?subject=Independence Day, War of the Worlds, Final Fantasy - W38">Reply to this post via email</a> |
<a href="https://fosstodon.org/@joel/117312296831222604">Reply on Fediverse</a>
</p>Wonders of Web Weaving, Episode 20 - James' Coffee Bloghttps://jamesg.blog/2026/09/22/www-202026-09-22T00:00:00.000ZJames' Coffee Blog
<p><a href="https://web-weaving.jamesg.blog/20">The twentieth episode of Wonders of Web Weaving is out</a>:</p>
<blockquote>
<p>In Episode 20, I chat with <a href="https://sarajoy.dev">Sara</a>, the author of <a href="https://sarajoy.dev">sarajoy.dev</a> and <a href="https://whimsica11y.net">whimsica11y.net</a>, among other things, the importance of web accessibility, screen readers, and the joy of exploring and making things on the web.</p>
</blockquote>
<p>I hope you enjoy the episode!</p>
<p><a href="https://web-weaving.jamesg.blog/subscribe/" rel="noreferrer"><em>Wonders of Web Weaving also has an RSS feed</em></a><em> you can use to follow along from wherever you get your podcasts.</em></p>
<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a3efe1fc19eddc12',t:'MTc5MDA2NTE0Ng=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
<a class="tag" href="https://sarajoy.dev">Sara</a>
<a class="tag" href="https://sarajoy.dev">sarajoy.dev</a>
<a class="tag" href="https://web-weaving.jamesg.blog/20">The twentieth episode of Wonders of Web Weaving is out</a>
<a class="tag" href="https://web-weaving.jamesg.blog/subscribe/">Wonders of Web Weaving also has an RSS feed</a>
<a class="tag" href="https://whimsica11y.net">whimsica11y.net</a>
Seeking a "yes, and" space - Werd I/O6ab17e1175554e00013a0f762026-09-21T19:08:03.000ZWerd I/O<img src="https://storage.ghost.io/c/18/7c/187cc681-d3f3-49fc-87de-b01d06b76821/content/images/2026/09/IMG_7005.jpeg" alt="Seeking a "yes, and" space"><p>Twenty-two years ago this month, I moved house.</p><p>Iâd been living in Edinburgh, an ancient city whose gothic architecture cuts into an expansive sky. Even the air felt apart from the rest of the country: there was a different sort of chill to it, and it carried a malt smell from the breweries on the edge of town. When the train doors opened at Waverley Station, I didnât just know I was home; I felt it on my skin and in my bones.</p><p>Edinburgh is famous for its support of the arts: the Festivals double the population of the city each summer. People fly in from all over the world to showcase their creativity and find new audiences. The city is alive.</p><p>But I had to leave.</p><p>Iâd been working on Elgg, the open source social networking platform I co-founded. It was originally built as a reaction to the prevailing educational technology platforms, which seemed to have been built to satisfy compliance teams rather than to help anybody learn. <em>People are already learning from each other on the web,</em> was the implication. <em>Letâs take those ideas and bring them in.</em> Nobody had coined âWeb 2.0â yet, but thatâs what we were building: a way to support the informal learning and connection that happens in hallways, study rooms, clubs, and parties. Those relationships and conversations are what you really take away with you when you graduate, but they were completely absent from the prevailing software.</p><p>But the social headwinds were enormous. âItâll never work here,â we were told, again and again. âBlogging is for teenage girls crying in their bedrooms,â one university leader memorably told us. We were in our early stages, looking for generative conversations, and they were hard to come by. In improv theater, thereâs a <a href="https://en.wikipedia.org/wiki/Yes,_and_..."><em>yes, and</em> rule</a> that allows everyone to build on each otherâs ideas without destroying the flow. A <em>no, but</em> response is conversation-ending punctuation: the generative energy has been terminated. But in Scotland, all we were getting was âno, butâ. We were looking for optimistic creativity but could only find pessimism.</p><p>The difference in energy when I moved back to Oxford, my hometown, was night and day. I was able to find the <em>yes, and</em> energy I needed, and I felt less alone in trying to build something new. Elgg eventually powered networks for Ivy League universities, multinational corporations and NGOs, governments, and impactful social movements. None of it would have happened if Iâd succumbed to the pessimism.</p><p>Itâs worth saying that Edinburgh has since established a robust innovation scene â and much of it is down to creating a cultural shift as well as simply providing infrastructure. Both help, but itâs incredibly hard to create anything new if youâre being told none of it will work every day.</p><p>Twenty-two years later, Iâve made another move â and Iâm experiencing the same vibe shift.</p><p>There are one hundred and sixty-six Canary palms on Palm Drive, the long, straight road that leads to the oval that serves as the entrance to the Stanford campus. Every morning, I walk past each one. Every evening, I walk back. The sky is blue save for the low-flying planes coming in to land at SFO. Every few minutes, a Waymo self-driving car drives past me; more than once, a coyote or a hare has crossed my path.</p><p>This is home now.</p><p>A little over two weeks ago, I arrived on the Stanford campus. During the month of August, I moved out of my house and drove across country. The Pennsylvania forests and rolling hills of Appalachia gave way to cornfields, plains, salt flats, and mountains. Back home, my house was on the market. This isnât a subtle move to a next chapter: itâs all change.</p><p>For the next academic year, Iâll be a <a href="https://jsk.stanford.edu/">JSK Fellow</a>: part of <a href="https://jsk.stanford.edu/fellows">a cohort of thirteen people</a> invited to Stanford to explore and test out practical responses to the challenges facing journalists and journalism around the world. Iâll spend almost every day on campus, taking courses, visiting research labs, attending and hosting events, and connecting with people across disciplines and backgrounds.</p><p>Immediately, two things hit me. First: every single person in my fellowship cohort is inspiring. I get to share a room with people who have made enormous differences to their communities through their dedication to journalism, in places like Ukraine and Venezuela as well as here at home. The JSK staff are similarly impressive, with their own backstories of real impact. I feel very lucky to be in the room with them (and, inevitably, like a bit of an imposter).</p><p>Second: this is <em>explicitly</em> a <em>yes, and</em> space. The change in pressure and energy was palpable. And it couldnât have come at a better time for me.</p><p>Newsrooms are under threat financially, politically, technically, and existentially. In that environment, itâs easy to become a <em>no, but</em> culture: when everything you do is scrutinized, the culturally safest thing to do is to take the conservative path. Decisions are made to iterate on the status quo rather than take leaps of faith. Iâve heard âthis will never work hereâ as a thought-terminating statement at the early stages of a projectâs ideation many times. When there <em>are</em> real changes, rather than innovate and do something new based on their communityâs real needs, many newsrooms in the United States simply ask the question: âwhat is the <em>New York Times</em> doing?â</p><p>Itâs understandable â the conditions that newsrooms are forced to work under are far from ideal â but it comes with a real cost, particularly when trust in journalism and loyalty to newsrooms are plummeting, in the fastest period of technology change (and therefore journalistic and democratic change) in decades. Real journalism provides the information and context that people need to make informed decisions, including who to vote for; it is part of the bedrock for a functioning democracy. As it happens, journalismâs decline is coinciding with democracyâs decline. We need new ideas that will serve our communities more effectively, and fast. Entrenching in the status quo or copying the <em>Times</em> wonât cut it.</p><p>And, speaking purely for myself, that widening gap between the immense, crucial need and what actions newsrooms are prepared to take can lead to burnout and learned helplessness. I badly needed a <em>yes, and</em> space.</p><p>Itâs been two weeks. If the onboarding was the extent of my JSK experience it would be incredibly valuable: the mindset shift I desperately needed, and a set of tools that usefully reframe what Iâve been thinking about. But itâs a nine-month program, and thereâs a lot more to come.</p><p>The need for innovation in news is not exactly new. When I first moved to the United States fifteen years ago, one of my first acts was to attend a design thinking session about the future of news at <a href="https://dschool.stanford.edu/">the Stanford d.School</a> as part of <a href="https://www.geekwire.com/2011/cheezburger-ceo-ben-huhs-latest-voyage-time-to-rethink-journalism/">Ben Huhâs Moby Dick Project</a>. It foreshadowed everything that would happen next: Iâve been working on media innovation ever since, including for years <a href="https://matter.vc/meet-matter-seven/">at Matter</a>, a media accelerator that was heavily rooted in the d.Schoolâs methodology. We liked to quote the academic Clay Shirky, who wrote about the need for experimentation in the industry as the newspaper market started to bottom out with the phrase: <a href="http://shirky.com/weblog/newspapers-and-thinking-the-unthinkable/">ânothing <em>will</em> work, but everything <em>might</em>.â</a></p><p>Last week, I spent the day at the d.School again as part of my onboarding, and I felt that phrase resonating again. âNothing <em>will</em> work, but everything <em>might</em>.â Letâs be generative.</p><p>Every JSK fellow applies with a project to work on. Hereâs mine, as I originally framed it:</p><p>Trust in journalism <a href="https://www.pewresearch.org/short-reads/2025/10/29/how-americans-trust-in-information-from-news-organizations-and-social-media-sites-has-changed-over-time/">is in long-term decline</a>. Referrals to news articles from search engines and social media <a href="https://www.niemanlab.org/2026/07/search-traffic-has-declined-so-much-that-some-publishers-are-considering-opting-out-of-google-entirely/">are also declining</a>. There are many reasons for this. Google switching to AI-powered instant answers and seismic changes in incentives by the owners of prominent social media platforms are two commonly-stated causes, but they arenât the whole story. Itâs also true that many newsrooms didnât understand or adapt to changes in how people want to interact with information that came about in the Web 2.0 era. Newsrooms still cling to a broadcast or publishing model rather than embracing conversation as a community of journalists and readers. People believe news is biased and shaped according to the needs of each newsroomâs corporate owners, but newsrooms donât want to open up their process or add transparency for fear of becoming part of the story.</p><p>Most modern newsrooms live or die on the web, but the web is a conversation, not a broadcast medium, and newsrooms typically havenât upgraded their thinking to fit. Helping them to build stronger human relationships with their communities â and each other â on the web will increase trust, loyalty, and resilience. And new community platform technologies like <a href="https://atproto.com/guides/overview">ATproto</a> and <a href="https://www.w3.org/TR/activitypub/">ActivityPub</a> could help provide building blocks for new kinds of news sites that elevate community and relationships to first-class parts of a newsroomâs work.</p><p>In <a href="https://werd.io/the-community-first-software-era/">the community-first software era</a>, I expanded on where I might start with this idea:</p><blockquote>Newsrooms rely on something called a âcalloutâ when they want to learn more from their readers. More often than not, this is a simple web form: âHas your doctor pushed this prescription medication? Let us know.â But instead of a two-dimensional form, what if we built a short-term community space that safely brought readers in and allowed them to discuss in more depth with the journalists?<br><br>My bet is that two things will happen: the journalists will get better information, because it will arise in conversation, and those readers will build stronger, more transparent relationships with the newsroom. And stronger, more transparent relationships will lead to more trust and more loyalty.</blockquote><p>It sounds plausible, right? And maybe it is. But in the process of discussing my idea with other fellows, through the genuinely excellent facilitation by <a href="https://jsk.stanford.edu/people/tran-ha">Tran Ha</a>, Iâve realized Iâve skipped into solution-land without spending enough time on making sure Iâve framed the problem correctly.</p><p>Iâve been led by these beliefs:</p><ul><li>I believe that good journalism is a vital prerequisite for democracy: good contextual information allows us to make strong democratic decisions, including who to vote for, when to protest, where to spend our money, and how to use our voices.</li><li>I also believe that many of our societal problems have been caused by platforms like X and Facebook that are so large that their owners can affect democratic discourse on a global scale, and that open protocols prevent anyone from having that much power.</li><li>And finally, I believe that AI is abstracting us away from the human information sources that can provide real context and connection.</li></ul><p>Those are genuine beliefs I hold. But theyâre abstract, ideological ideas. The idea that journalism is important, or that AI has a distancing effect, doesnât connect to someone who canât find stories that represent their community or who has had to build an AI prompt to pull together actionable information because it was scattered. The idea that open protocols are better doesnât speak to someone who needs to share information with their community in a safer way because theyâre under attack on incumbent platforms.</p><p>These things are hard to explore when youâre a part of an existing organization, with its own culture, norms, rhythms, and risks. Here, Iâm not <em>Ben Werdmuller, Senior Director of Technology at ProPublica</em> (or <em>CTO at The 19th</em>, <em>Director of Investments at Matter</em>, <em>Co-founder of Elgg</em>, etc) â Iâm an academic fellow with a mandate to explore independently. I donât need to be restricted by an organizational context; I can sit with the problem in my own time and space. Itâs a gift.</p><p>For my project, my first task is to learn more about the ecosystem I want to help. Which communities should I start with? What are their characteristics? What are their needs? Who are the newsrooms that serve them today?</p><p>As a human, my task is also to fully break out of a reactive, iterative mindset and into one of holistic exploration. How can I serve my own mind, body, and spirit so that I can work on these problems to the best of my ability? How can I learn from my fellowship cohort and the incredible people on the Stanford campus? How can I show up for them so that we can support each otherâs work and each make the impact we set out to achieve? And how can I embrace my own inner <em>yes, and</em>?</p><p>Thatâs my mission at the start of this year. Iâm going to take you with me â and I hope to be in conversation with many of you as I progress. Letâs work on this together.</p>SAML: A fractal of bad design - Trail of Bits Bloghttps://blog.trailofbits.com/2026/09/21/saml-a-fractal-of-bad-design/2026-09-21T11:00:00.000ZTrail of Bits Blog<p>Born out of academia and raised in corporate IT departments, the Security Assertion Markup Language (SAML) authentication protocol continues to be a staple in these organizations. However, it’s time for it to retire. With the rise of software-as-a-service (SaaS) companies in the late aughts, IT departments needed a way for users to authenticate to many new web services. SAML and the burgeoning single sign-on (SSO) industry fulfilled this need. However, SAML is being crushed under the weight of its own complexity. Itâs time to deprecate it and move on to modern alternatives like OpenID Connect (OIDC). In this post, I will explore the design-by-committee origin of SAML, its progression through the ranks in academic and corporate environments, its slow disintegration at the hands of the security research community, and its (hopeful) deprecation in favor of newer protocols.</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/09/21/saml-a-fractal-of-bad-design/saml-a-fractal-of-bad-design-image-1.svg"
alt="“SAML 101”"
loading="lazy"
decoding="async" />
<figcaption>SAML 101</figcaption>
</figure>
</p>
<blockquote>
<p>What’s insidious about SAML is that it really is mostly straightforward to understand, but it’s built on a foundation of sand, bone dust, and ash; it works ⌠if you assume XML signature validation is reliable. But XML signature validation is deeply cursed, and is so complicated that most fielded SAML implementations are wrapping libxmlsec, a gnarly C codebase nobody reads.<br>
â <a href="https://news.ycombinator.com/item?id=37564758">Thomas Ptacek, 2023</a></p>
</blockquote>
<h2 id="saml-and-the-birth-of-the-sso-industry">SAML and the birth of the SSO industry</h2>
<p><a href="https://en.wikipedia.org/wiki/SAML">Wikipedia tells me</a> that âSAML is an XML-based markup language for security assertions.â It was created in 2002 by the Organization for the Advancement of Structured Information Standards (OASIS) Security Services Technical Committee (SSTC). Okay, weâre not off to a great start by modern standards. XML, despite having some redeeming qualities, is quite complex compared to newer alternatives like JSON, but weâll get more into that later. Further, a committee of subcommittees having meetings is a recipe for âkitchen-sinkâ protocol design (e.g., <a href="https://en.wikipedia.org/wiki/Waterfall_model">waterfall methodology</a>, <a href="https://en.wikipedia.org/wiki/Big_design_up_front">big design up front</a>, etc.). And sure enough, weâve now jammed four (!) XML-based security protocols into one:</p>
<blockquote>
<p>⌠the following intellectual property was contributed to the SSTC:</p>
<ul>
<li>Security Services Markup Language (S2ML) from Netegrity</li>
<li>AuthXML from Securant</li>
<li>XML Trust Assertion Service Specification (X-TASS) from VeriSign</li>
<li>Information Technology Markup Language (ITML) from Jamcracker</li>
</ul>
<p>â <a href="https://en.wikipedia.org/wiki/SAML#History">SAML: History</a></p>
</blockquote>
<p>However, the desire for such a protocol was undeniable. As the internet shifted from Web 1.0 in the 90s to Web 2.0 in the early aughts, users and organizations needed an easy way to authenticate to many new web services. Academia was the biggest driver of this movement, although not the only one: Central Authentication Service (CAS) in 2002 at Yale, Shibboleth IdP in 2003 by Internet2, a consortium of research universities (<a href="https://its.umich.edu/enterprise/wifi-networks/researchers/internet2">including my alma mater</a>), ADFS in 2003 by Microsoft, and simpleSAMLphp <a href="https://web.archive.org/web/20071214140857/http://rnd.feide.no/simplesamlphp">around 2007</a> by Uninett, a state-owned Norwegian company with close ties to academia. All these authentication projects eventually supported SAML in one way or another. Like ARPANET before it, universities were at the forefront of internet development and were the earliest consumers of web services. Once this base layer of protocol availability and nascent academic proving ground was established, the commercial industry took it and ran toward a multibillion dollar industry.</p>
<p>The SSO, identity, and authentication provider industry was also starting up in the early aughts, but really came to fruition a few years later: Ping Identity (2002), OneLogin (2009), Okta (2009), and Duo Security (2010). These companies were essentially built on the SAML protocol with the exception of Duo, who would introduce their first SSO product in 2015, which is where I come into the story. I worked on Duoâs first <a href="https://duo.com/docs/dag">on-premises Access Gateway product</a> (DAG), which was built on simpleSAMLphp and, obviously, the SAML protocol. Itâs where I became intimately familiar with the SAML protocol and spent many years of my life digesting its lengthy specifications. I was there when <a href="https://kel.bz/">Kelby Ludwig</a> found the <a href="https://i.blackhat.com/us-18/Thu-August-9/us-18-Ludwig-Identity-Theft-Attacks-On-SSO-Systems.pdf">XML comment bypass</a>, but we will get into various attacks and SAML deficiencies later. Suffice it to say, the SSO and authentication provider industry was booming, and much of it was built on the SAML protocol.</p>
<h2 id="a-crack-in-the-armor">A crack in the armor</h2>
<p>XML signature wrapping (XSW) attacks are the proverbial arrow to SAMLâs heel. While there was earlier security research into both signature wrapping (<a href="https://dl.acm.org/doi/10.1145/1103022.1103026">2005</a>, <a href="https://arxiv.org/pdf/0812.4181">2008</a>, and <a href="https://lists.w3.org/Archives/Public/public-xmlsec/2009Nov/att-0019/Camera-Ready.pdf">2009</a>) and SAML (<a href="https://dl.acm.org/doi/10.1145/1456396.1456397">2008</a>), I consider the godfather of it all to be âOn Breaking SAML: Be Whoever You Want to Beâ (<a href="https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf">2012</a>). It tested theory against practice and resulted in <a href="https://github.com/CompassSecurity/SAMLRaider/blob/v2.5.2/src/main/java/helpers/XSWHelpers.java#L34-L39">an automated way</a> to check for XSW attacks. This was our north star when implementing the DAG. It was the reason we chose simpleSAMLphp as our building block. PHP, <a href="https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/">especially at the time</a>, was not exactly known for its security track record, but simpleSAMLphpâs spoke for itself. simpleSAMLphp was resilient to XSW at a time when nobody really knew what that was:</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/09/21/saml-a-fractal-of-bad-design/saml-a-fractal-of-bad-design-image-2_hu_e836bff9fc613f68.webp"
alt="simpleSAMLphpâs security track record (credit: On Breaking SAML)"
width="1070"
height="902"
loading="lazy"
decoding="async" />
<figcaption>simpleSAMLphpâs security track record (credit: On Breaking SAML)</figcaption>
</figure>
</p>
<p>Despite being front and center in this 2012 paper, XSW is <a href="https://portswigger.net/research/the-fragile-lock">still present today</a>. If we know the bug class, then why canât we fix it? But before we get into SAMLâs flaws we first have to consider the shaky ground it was built upon: XML.</p>
<p>XML is no slouch when it comes to a (lack of) security track record. <a href="https://cheatsheetseries.owasp.org/cheatsheets/XML_Security_Cheat_Sheet.html">These bug classes</a> would have been more familiar to a developer in the 90s, but nonetheless are still present in XML today: XXE, entity expansion (âbillion laughsâ), DTD retrieval (SSRF), XPath/XQuery/XInclude/XSLT/CDATA injection, and more. A SAML library needs to handle all these bug classes before even getting to the actual SAML functionality.</p>
<p>In addition to security bug classes, thereâs also the sheer complexity of XML when compared against something like JSON. In XML you have tags, elements, attributes, comments, namespaces, markup versus content, schemas, CDATA, DOCTYPEs, and more. In JSON, you essentially have keys, values, objects, and lists. Complexity is generally at odds with security, and this is one reason I consider SAML to be a fractal of bad design.</p>
<h2 id="a-fractal-of-bad-design">A fractal of bad design</h2>
<p>SAML provides ample opportunity to learn about protocol design. In this section, I will cover five flaws that I consider to be fatal to the long-term viability of SAML as an authentication protocol. These flaws can also be used when designing new authentication protocols. That is, you can either sidestep the flaw, or take its inverse and attempt to bake that into the protocol.</p>
<h3 id="built-on-xml">Built on XML</h3>
<p>As mentioned above, SAML is built on XML, and XML is complex, but <a href="https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExMXBhN2doeGV5eXBoamUwZDJ1M2owcW9ndDJvY2c3NnlkMzF4ZDBxbyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/Dvw2lJqlTuJmo/giphy.gif">it’s not the committee’s fault</a>. XML is what they had at the time, and itâs what people used. JSON was <a href="https://inkdroid.org/2012/04/30/lessons-of-json/">“discovered”</a> in 2001, but this was right around the time the SAML committee was meeting, and theyâd be unlikely to design an authentication protocol around an experimental new format. Especially when it caters to JavaScript and you write a lot of Java.</p>
<p>One could design a quantitative complexity measurement for XML versus JSON or SAML versus JWT/OIDC (e.g., spec/RFC word count, spec/RFC <a href="https://datatracker.ietf.org/doc/html/rfc2119">normative</a> word count, etc.), but that would require a blog post or paper all to itself. In the interest of staying on topic, I will refrain from doing that here, and suffice to say that XML is significantly more complex than something like JSON.</p>
<h3 id="canonicalization">Canonicalization</h3>
<p><a href="https://www.w3.org/TR/xml-exc-c14n/">Canonicalization</a> (C14N) is what you do when you want to take the wild mess that is XML, compute a hash of it, and get consistent results. In other words, if the SP and IdP cannot agree on a consistent representation of the XML data, then the bytes wonât line up, the signatures wonât match, and your authentication fails. However, this is easier said than done.</p>
<p>Canonicalization bugs enabled Kelbyâs XML comment bypass in 2018:</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/09/21/saml-a-fractal-of-bad-design/saml-a-fractal-of-bad-design-image-3_hu_e81fbafe87004bf7.webp"
alt="XML canonicalization (credit: Identity Theft)"
width="1200"
height="674"
loading="lazy"
decoding="async" />
<figcaption>XML canonicalization (credit: Identity Theft)</figcaption>
</figure>
</p>
<p>Canonicalization is often a precursor to parser differential and/or âround-tripâ bugs, which are what most modern SAML attacks use:</p>
<ul>
<li><a href="https://mattermost.com/blog/coordinated-disclosure-go-xml-vulnerabilities/">Coordinated disclosure of XML round-trip vulnerabilities in Goâs standard library</a> (2020)</li>
<li><a href="https://mattermost.com/blog/securing-xml-implementations-across-the-web/">Securing XML implementations across the web</a> (2021)</li>
<li><a href="https://repzret.blogspot.com/2025/02/abusing-libxml2-quirks-to-bypass-saml.html">Abusing libxml2 quirks to bypass SAML authentication on GitHub Enterprise</a> (2025)</li>
<li><a href="https://github.blog/security/sign-in-as-anyone-bypassing-saml-sso-authentication-with-parser-differentials/">Sign in as anyone: Bypassing SAML SSO authentication with parser differentials</a> (2025)</li>
<li><a href="https://portswigger.net/research/saml-roulette-the-hacker-always-wins">SAML roulette: the hacker always wins</a> (2025)</li>
<li><a href="https://portswigger.net/research/the-fragile-lock">The Fragile Lock: Novel Bypasses For SAML Authentication</a> (2025)</li>
</ul>
<h3 id="enveloped-signatures">Enveloped signatures</h3>
<p><a href="https://www.w3.org/TR/xmldsig-core1/#sec-EnvelopedSignature">Enveloped signature</a> concerns are a not-too-distant cousin of canonicalization. In short, if youâre trying to insert the signature into the data payload that youâre signing, youâre going to have a bad time. Letâs compare and contrast JWT and SAML in this way:</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/09/21/saml-a-fractal-of-bad-design/saml-a-fractal-of-bad-design-image-4_hu_87ec639176ed31aa.webp"
alt="JWT versus SAML signatures (credit: jwt.io and samltool.io)"
width="1200"
height="1840"
loading="lazy"
decoding="async" />
<figcaption>JWT versus SAML signatures (credit: jwt.io and samltool.io)</figcaption>
</figure>
</p>
<p>In the JWT example above, the blue signature is <em>detached</em> from the JSON payload and delimited in the JWT with a period (â.â). In the SAML example, the <code>Signature</code> element is inserted (âenvelopedâ) in the <code>Assertion</code> element. The problem here is that it is very difficult to get a byte-for-byte, canonically equivalent representation of the data when <em>youâre also modifying it!</em> Even more so when you have a complex format like XML and complex canonicalization rules.</p>
<h3 id="kitchen-sink-design">âKitchen-sinkâ design</h3>
<p>This design deficiency essentially transposes to <a href="https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it">you arenât gonna need it</a> (YAGNI). Itâs not an entirely fair characterization because the portions of the SAML specification that are used in the real-world have changed over the past 20 years (sorry, <a href="https://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf">SOAP and artifact binding</a>). However, the fact of the matter is that 99% of modern SAML implementations use a very similar data shape and subset of the specification. Any given SAML authentication you would encounter in the wild today probably avoids 90% of the specification. This adds significant complexity for largely unused features.</p>
<blockquote>
<p>If I was adding SAML support to something new, I’d consider beyond all the standard SAML checks also rejecting any message that doesn’t have the same shape as what Okta, Onelogin, Google, or Shib generates.<br>
â <a href="https://news.ycombinator.com/item?id=28080553">Thomas Ptacek, 2021</a></p>
</blockquote>
<h3 id="ossification">Ossification</h3>
<p>SAML was designed in a different era for a different time and has not received necessary updates. These concerns will generally be of practical implication rather than theoretical. What I mean by ossification can roughly be enumerated as the following:</p>
<ol>
<li><strong>OIDC <a href="https://datatracker.ietf.org/doc/html/rfc6749">assumes HTTP</a>, whereas SAML is transport independent.</strong> Sure, SAML HTTP bindings exist and are most commonly used, but they are not required. This affords SAML a certain degree of flexibility, but also means that flexibility must be well defined, must be implemented somewhere, and can contain bugs. SAML came about at a time when HTTP + TLS was not yet the dominant backbone of web service communication, and it has never reconciled with this modern landscape. HTTPS allows OIDC to punt encrypted, trusted communication to the transport layer.</li>
<li><strong>OIDC generally assumes a connected network topology, whereas SAML does not.</strong> The most common OIDC flow (authorization code) assumes the OpenID Provider (OP) and Relying Party (RP) can communicate directly (OIDC OP/RP == SAML IdP/SP). Sure, OIDC <a href="https://auth0.com/docs/get-started/authentication-and-authorization-flow/implicit-flow-with-form-post">implicit flow with form post</a> exists, but it is very uncommon to see today. Further, SAML has artifact binding for direct communication, but it is also very uncommon. The point is that if the OP and RP can communicate directly then that relieves pressure off of the authentication response payload to contain all the information necessary to make an authentication and authorization decision. This reduces payload size and complexity. The OIDC OP and RP can instead exchange information in a backchannel.</li>
<li><strong>OIDC grew organically over the years, whereas SAML was largely designed up front.</strong> OIDC encompasses dozens of specifications and RFCs that grew organically over many years. These documents were generally created to solve a specific need rather than trying to anticipate all future needs and building that up front. This is akin to agile methodology versus waterfall, as described in the first section. Consider the following non-exhaustive timeline:
<ol>
<li>OpenID Connect 1.0 specification published (2014)</li>
<li>JOSE stack finalized for JW{S,E,K,A,T} via RFC 7515-7519 (2015)</li>
<li>PKCE published via RFC 7636 (2015)</li>
<li>PKCE for mobile/native apps published via RFC 8252 (2017)</li>
<li>Device authorization grant for IoT devices published via RFC 8628 (2019)</li>
<li>Demonstrating proof of possession (DPoP) for MFA workflows published via RFC 9449 (2023)</li>
<li>PKCE for SPAs published via RFC 10017 (2026)</li>
</ol>
</li>
</ol>
<p>I find the historical circumstances interesting too. For example, SAML came of age in an era of VPNs and network segmentation, hence point (2) above. If the IdP or SP was behind a corporate firewall, and it couldnât speak directly to the other end, then the whole rollout came to a halt and that vendor lost the sales deal. SAML needed to seamlessly account for this situation. Googleâs <a href="https://research.google/pubs/beyondcorp-a-new-approach-to-enterprise-security/">BeyondCorp model</a> and zero-trust architecture flipped this notion on its head in 2014. Additionally, SAML failed to anticipate the mobile, SPA, and IoT revolutions, and had no answers when these technologies arrived on the scene in the late aughts. Even though SAML is still widely adopted in corporate environments, these macroscopic events helped start the long, slow decline of the protocol. Agility and loose coupling enable rapid adaptation in ever-changing IT environments.</p>
<h2 id="all-roads-lead-to-oidc">All roads lead to OIDC</h2>
<p>No protocol is perfect, but in terms of a solution all roads lead to OIDC. As far as I can tell, the only deployment scenario where SAML had an advantage was networks where the SP and IdP cannot communicate directly. OIDCâs implicit flow with form post provides all the same ingredients. This is actually one of the cleanest migration plans Iâve seen available in the industry.</p>
<p>So what can I do if Iâm a <strong>service provider</strong> (i.e., SP) and Iâd like to integrate into the SSO ecosystem without SAML? Just support OIDC. Abandon SAML. Apparently Fly.io and Tailscale are already doing it:</p>
<blockquote>
<p>We’ve managed to hold the line on OIDC so far. So has Tailscale. If Tailscale can hold the line, given who they’re selling to, I think most orgs can. Really, try to avoid doing SAML. Remember, as a vendor, you’re often competing with companies that don’t do real SSO integration at all.<br>
â <a href="https://news.ycombinator.com/item?id=41676041">Thomas Ptacek, 2024</a></p>
</blockquote>
<p>So what can I do if Iâm an <strong>identity or authentication provider</strong> (i.e., IdP) and Iâd like to move off of SAML? Well, depending on your customer count, this may be a long road indeed. But you know how you eat an elephant? One bite at a time. This is a well-worn path in the industry: develop a deprecation plan, communicate it to customers, stop onboarding new customers to SAML integrations, provide existing SAML customers with equivalent OIDC configurations, set a sunset date, and get to work.</p>
<p>SAML had a good 25 year run. It birthed the SSO industry, helped secure untold numbers of authentications, improved the UX of authenticating to dozens of web services, and created billions of dollars of economic impact. We should be thankful to the creators of the SAML protocol. It has provided us with a great case study in protocol design and evolution over a very dynamic period in the tech industry.</p>
<p>If youâd like to read more about historical analyses of security topics, then check out â<a href="https://blog.trailofbits.com/2025/08/20/marshal-madness-a-brief-history-of-ruby-deserialization-exploits/">Marshal madness: A brief history of Ruby deserialization exploits</a>.â</p>
<p><a href="https://www.trailofbits.com/contact/">Contact us</a> if youâre interested in a protocol design audit or would like a review of your authentication system.</p>Do you use :visited on links? - Kev Quirkhttps://kevquirk.com/do-you-use-visited-on-links2026-09-21T09:27:00.000ZKev Quirk<p>I've always made the <code>:visited</code> attribute for hyperlinks look the same as links that haven't been visited, and it seems that it's the default behaviour across the web. I've never really given it much thought, until I actually used <code>:visited</code> in anger.</p>
<p>My feed reader of choice, <a href="https://miniflux.app" rel="noopener noreferrer">Miniflux</a> uses the <code>:visited</code> attribute properly, making visited links purple. When reading posts from the <em>hundreds</em> of blogs I follow via RSS, I find it really useful to see if I've already visited a link within a post.</p>
<p>So with that in mind, I've decided to change the CSS on this site slightly, and visited links are now purple. It's subtle, but obvious enough, I think:</p>
<p><img loading="lazy" src="https://kevquirk.com/content/images/do-you-use-visited-on-links/visited-links.webp" alt="visited-links" /></p>
<p>If you want to do something like this yourself, the CSS is very simple:</p>
<pre><code class="language-css">a {
color: #3995F7;
}
a:visited {
color: #8839F7;
}</code></pre>
<p>Do you use the <code>:visited</code> attribute on your blog? I feel like I don't see it used very often around the web.</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=Do%20you%20use%20%3Avisited%20on%20links%3F">reply to this post by email</a>, or <a href="https://kevquirk.com/do-you-use-visited-on-links#comments">leave a comment</a>.</p>
</div>