<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Josh Field on Medium]]></title>
        <description><![CDATA[Stories by Josh Field on Medium]]></description>
        <link>https://medium.com/@hexafield?source=rss-cad623f52c8c------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*9bvi9n-MhFRTGHVX5UkeIA.png</url>
            <title>Stories by Josh Field on Medium</title>
            <link>https://medium.com/@hexafield?source=rss-cad623f52c8c------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 06:03:56 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@hexafield/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[The Semantic Web is here, and it’s also sovereign and decentralised]]></title>
            <link>https://medium.com/coasys/the-semantic-web-is-here-and-its-also-sovereign-and-decentralised-0c85041aeeda?source=rss-cad623f52c8c------2</link>
            <guid isPermaLink="false">https://medium.com/p/0c85041aeeda</guid>
            <category><![CDATA[data-governance]]></category>
            <category><![CDATA[decentralized-web]]></category>
            <category><![CDATA[interoperability]]></category>
            <category><![CDATA[holochain]]></category>
            <category><![CDATA[semanticweb]]></category>
            <dc:creator><![CDATA[Josh Field]]></dc:creator>
            <pubDate>Mon, 23 Mar 2026 12:26:33 GMT</pubDate>
            <atom:updated>2026-03-23T21:55:53.606Z</atom:updated>
            <content:encoded><![CDATA[<h2>The Semantic Web is Here, and It’s Also Sovereign, Decentralised &amp; Alive</h2><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JAuTqkbgKLtGQnJ2V_a4IQ.jpeg" /></figure><p>For thirty years, the Semantic Web has been the web’s most promising unfulfilled vision: a web where data has <em>meaning</em>, where machines can reason over relationships, where information flows freely between systems because it’s structured as a universal graph. The W3C delivered the specifications — RDF for data, SPARQL for queries, SHACL for validation — and then not much happened.</p><p>The standards worked, but the adoption didn’t. RDF stayed in academic papers and enterprise knowledge graphs. SPARQL ran inside corporate data warehouses. The average developer never touched a triple store, and the web that actually got built was one of JSON APIs, platform silos, and proprietary databases.</p><p>There have been attempts to course-correct. <strong>Solid</strong> gave users personal data pods backed by Linked Data, but kept the client-server model: your pod lives on a server someone runs, applications request access to it, and the protocol is HTTP with extra semantics on top. It decentralised <em>storage</em> but not <em>infrastructure</em>, and your sovereignty extends exactly as far as your pod provider allows. <strong>Mastodon</strong> and the Fediverse decentralised <em>platforms</em> through ActivityPub federation, but each instance is still a server run by an administrator who sets the rules, controls the data, and can disappear overnight. You don’t own your social graph; your instance admin does. And neither Solid nor the Fediverse made the Semantic Web standards <em>native</em> to their runtime — Solid uses RDF as a serialisation format layered over HTTP resources, and Mastodon uses JSON-LD as an interchange format between servers. In both cases, the semantic layer is a wire protocol, not the foundation the application actually thinks in.</p><p>The real problem was that the Semantic Web had nowhere meaningful to <em>live</em>. It needed a runtime where triples are the native data structure, where SPARQL isn’t a niche query language but the default way to ask questions, where SHACL shapes aren’t theoretical constraints but the actual schema layer that applications depend on. And it needed that runtime to be sovereign by default, not dependent on a server, an instance admin, or a pod provider.</p><p>That runtime now exists. It’s called <a href="https://coasys.org/adam">AD4M</a>, and it isn’t just semantic — it’s decentralised, sovereign, agent-centric, and designed to give it’s users <em>choice</em>.</p><h2>What AD4M Actually Is</h2><p>AD4M (the Agent-centric Distributed Application Meta-ontology) is a personal agent runtime. You run it on your devices. It holds your identity (a did:key backed by Ed25519), your data as a local knowledge graph, and your relationships with others through shared graphs called <em>neighbourhoods</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bj9bntwyRWS4jwWnj2S-tw.jpeg" /></figure><p>The core data structure is the <a href="https://docs.ad4m.dev/perspectives"><strong>perspective</strong></a> — a knowledge graph made of <strong>links</strong>. Each link is an RDF triple: source, predicate, target. Your perspective is yours; you control what’s in it, what you share, and with whom. When you share a perspective with others, it becomes a <a href="https://docs.ad4m.dev/neighbourhoods">neighbourhood</a>, synchronised through a <strong>link language</strong> — a pluggable protocol adapter that handles gossip, conflict resolution, and persistence across peers. The default link language uses <a href="https://www.holochain.org/">Holochain’s</a> DHT, but a link language can be backed by anything: a centralized server, IPFS, a blockchain, a Git repository. The carrier is a choice, not a constraint.</p><p>This is the layer the Semantic Web was always missing — the <em>personal</em> layer. Not a global graph owned by Google or a corporate triplestore in an enterprise data center, but a graph that belongs to you, speaks standard W3C protocols, and federates with others through cryptographic identity and whatever transport suits the context.</p><h2>RDF as the Native Data Structure</h2><p>Every AD4M link is an RDF triple — not metaphorically, but literally. When you add a link to a perspective:</p><pre>source: literal://string:channel-general<br>predicate: flux://has_channel_name<br>target: literal://string:general</pre><p>it’s stored in an embedded SPARQL engine (<a href="https://github.com/oxigraph/oxigraph">Oxigraph</a>) as a direct RDF triple:</p><pre>&lt;literal:string:channel-general&gt; &lt;flux:has_channel_name&gt; &lt;literal:string:general&gt; .</pre><p>Link metadata (who created it, when, their cryptographic signature) is stored as RDF-star annotations:</p><pre>&lt;&lt; &lt;literal:string:channel-general&gt; &lt;flux:has_channel_name&gt; &lt;literal:string:general&gt; &gt;&gt;<br>    &lt;ad4m://ontology/author&gt; &quot;did:key:z6Mkr8wn...&quot; ;<br>    &lt;ad4m://ontology/timestamp&gt; &quot;2026-03-23T04:15:00.000Z&quot; .</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KV16mgoe4ZswfXiLO8Pi7w.jpeg" /></figure><p>This isn’t a compatibility layer or an export format — RDF is the storage model. Oxigraph maintains native SPO/POS/OSP indexes on every triple, and SPARQL queries resolve through direct index probes rather than full-store scans.</p><h2>SHACL as the Schema Layer</h2><p>The Semantic Web’s answer to “how do I define what valid data looks like” is SHACL, the Shapes Constraint Language. In AD4M, SHACL serves as the schema layer that applications use to define their data models.</p><p>Developers write TypeScript with semantic decorators:</p><pre>@Model({ name: &#39;Channel&#39; })<br>export class Channel extends Ad4mModel {<br>    @Flag({ through: &#39;flux://entry_type&#39;, value: &#39;flux://has_channel&#39; })<br>    type: string;<br><br>    @Property({ through: &#39;flux://has_channel_name&#39;, required: true })<br>    name: string;<br><br>    @HasMany(() =&gt; Message, { through: &#39;flux://has_message&#39; })<br>    messages: Message[];<br>}</pre><p>At runtime, this generates a W3C SHACL shape:</p><pre>&lt;flux://ChannelShape&gt;<br>    a sh:NodeShape ;<br>    sh:targetClass &lt;flux://Channel&gt; ;<br>    sh:property [<br>        sh:path &lt;flux://entry_type&gt; ;<br>        sh:hasValue &quot;flux://has_channel&quot;<br>    ] ;<br>    sh:property [<br>        sh:path &lt;flux://has_channel_name&gt; ;<br>        sh:minCount 1 ;<br>        sh:maxCount 1<br>    ] ;<br>    sh:property [<br>        sh:path &lt;flux://has_message&gt; ;<br>        sh:nodeKind sh:IRI ;<br>        sh:class &lt;flux://MessageShape&gt;<br>    ] .</pre><p>The SHACL shape is stored <em>in the graph itself</em> as AD4M links — the shapes are data. They’re shareable, forkable, versionable. A community can adopt a set of shapes, extend them, or compose them differently. The schema becomes part of the social fabric rather than something an administrator imposes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pKtNbaGKc8-eNrRYEHeqVA.jpeg" /></figure><p>This is what SHACL was designed for but rarely gets to do: defining constraints on a graph, validated by the participants, without requiring a central authority to enforce them.</p><h2>Subject-Oriented Programming and Object-Graph Mapping</h2><p>Traditional application development starts with a database schema. You define tables, columns, foreign keys, and then write an ORM (Object-Relational Mapping) layer to bridge the gap between your relational data and the objects your application actually works with. The schema is fixed, lives on a server, and every application that touches that database must conform to it.</p><p>AD4M inverts this. There is no fixed schema and no central database. There’s a graph of links, and <strong>subject classes</strong> that define how to <em>view</em> that graph as structured objects. A subject class is a lens — it declares “a Channel is any entity in the graph that has a flux://entry_type link pointing to flux://has_channel and a flux://has_channel_name property.&quot; If those links exist, the entity conforms. If they don&#39;t, it doesn&#39;t. The graph itself is schema-free; the structure emerges from how you look at it.</p><p>This is what AD4M calls <strong>Object-Graph Mapping</strong> — OGM rather than ORM. Where an ORM maps objects to rows in relational tables, an OGM maps objects to patterns in a semantic graph. The distinction matters:</p><ul><li><strong>ORMs are tightly coupled to a schema.</strong> Change the table, break the mapping. Migrations are painful, versioning is manual, and two applications can’t easily impose different structures on the same data.</li><li><strong>OGMs are loosely coupled to a graph.</strong> The same set of links can conform to multiple subject classes simultaneously. A Channel subject class and a ForumSection subject class might match the same entity if its links satisfy both shapes. Applications don&#39;t fight over the schema because there isn&#39;t one to fight over — each brings its own lens.</li></ul><p>This is what makes AD4M’s approach <strong>subject-oriented</strong> rather than object-oriented. In traditional OOP, the class defines what the object <em>is</em>. In subject-oriented programming, the subject class defines how an <em>observer</em> sees the data. The same underlying links can be a Channel in one application, a ForumSection in another, and a TaskBoard in a third — depending on which subject classes each application loads. The data doesn’t change; the perspective does.</p><p><a href="https://docs.ad4m.dev/social-dna"><strong>Social DNA</strong></a> takes this further by making the subject classes themselves programmable social artefacts. The shapes that define your data model are stored as links in the graph, which means they can be shared across neighbourhoods, forked by communities, and evolved over time. A community doesn’t install a schema update from a vendor — they modify their own shapes, and those modifications propagate through the same peer-to-peer infrastructure as any other data. The rules for how data is structured are governed by the same social processes as the data itself.</p><p>For developers, the surface area feels familiar — decorators, findAll, where, include — but what&#39;s happening underneath is fundamentally different from an ORM. You&#39;re not mapping objects to rows. You&#39;re pattern-matching over a semantic graph, and the patterns are as fluid and composable as the data they describe.</p><h2>SPARQL as the Query Engine</h2><p>AD4M uses SPARQL 1.1 as its primary query engine, with full support for:</p><ul><li><strong>Triple patterns</strong> — the basic building blocks of graph queries</li><li><strong>OPTIONAL</strong> — left-join semantics for nullable properties</li><li><strong>FILTER</strong> — comparison operators, string matching, date ranges</li><li><strong>UNION</strong> — combine multiple query branches in a single request</li><li><strong>RDF-star</strong> — annotate triples with metadata (who created them, when, their signature)</li></ul><p>The query builder generates SPARQL from the same decorator metadata that generates SHACL shapes. When a developer calls:</p><pre>const channels = await Channel.findAll(perspective, {<br>    include: { messages: true }<br>});</pre><p>The runtime produces a UNION query that fetches both channels and their messages in a <strong>single round-trip</strong>:</p><pre>SELECT ?depth ?parentBase ?relationName ?source ?predicate ?target WHERE {<br>    {<br>        ?source &lt;flux://entry_type&gt; &lt;flux://has_channel&gt; .<br>        ?source ?predicate ?target .<br>        BIND(&quot;0&quot; AS ?depth)<br>    }<br>    UNION<br>    {<br>        ?parentBase &lt;flux://has_message&gt; ?source .<br>        ?source &lt;flux://entry_type&gt; &lt;flux://has_message&gt; .<br>        ?source ?predicate ?target .<br>        BIND(&quot;1&quot; AS ?depth)<br>        BIND(&quot;messages&quot; AS ?relationName)<br>    }<br>}</pre><p>Results are hydrated into typed objects by depth and relation name. The developer never sees SPARQL — they write findAll, findOne, where, include, a familiar ORM-style interface. Underneath, every query is a standard W3C SPARQL query running against a proper triple store with proper indexes.</p><p>The Semantic Web’s original pitch was structured, meaningful data with a standard query language. In AD4M, that pitch is finally delivered as the query engine for a real application platform.</p><h2>DIDs as the Identity Layer</h2><p>Every AD4M agent has a decentralised identifier, a did:key backed by Ed25519 cryptography. This isn&#39;t bolted on after the fact — it&#39;s the foundation everything else is built on.</p><p>Every link you create is signed with your DID’s Ed25519 key. When another agent receives your link through a shared neighbourhood, they can verify who created it (the did:key in the proof), when (the RFC 3339 timestamp), and that it hasn&#39;t been tampered with (the Ed25519 signature over the SHA-256 hash of the canonical JSON).</p><p>This means every triple in the graph has provenance — not just “this data exists” but “this data was asserted by this specific cryptographic identity at this specific time, and here’s the proof.” The DID isn’t issued by a platform; it’s derived from a keypair that the agent generates and stores locally. You don’t need permission to have an identity and you don’t need a server to verify one. The identity layer is as decentralised as the data layer.</p><h2>Decentralised the Right Way</h2><p>There are many ways to “decentralise,” and most of them end up recentralising something else. Put data on a blockchain and you’ve centralised consensus. Use a federated protocol and you’ve centralised servers.</p><p>AD4M’s decentralisation is <strong>agent-centric</strong>. The organising principle isn’t a global ledger, a federation of servers, or a content-addressed filesystem — it’s the <em>agent</em>, a person (or AI) with a cryptographic identity, running software they control, on devices they own.</p><p>Your knowledge graph lives on your devices. No server has a copy unless you choose to sync it there. When you share a perspective, agents sync through a link language — the default uses Holochain’s DHT, where every participating agent validates and stores a portion of the shared data, but a link language can wrap any transport: a centralised relay, IPFS, ActivityPub, a home server, a custom protocol, smoke signals… The point isn’t that every neighbourhood <em>must</em> use a DHT, it’s that every neighbourhood <em>can choose </em>what to use.</p><p>AD4M doesn’t mandate a single storage or networking protocol. A “<a href="https://docs.ad4m.dev/languages">language</a>” is a pluggable adapter that uses whatever the context requires. And the meta-ontology itself is neutral: AD4M doesn’t prescribe what your data looks like. It provides the grammar — links, perspectives, neighbourhoods — and lets communities define their own vocabulary through subject classes and SHACL shapes. The same underlying graph can be viewed through different lenses by different applications.</p><p>This is what decentralising “the right way” means. The architecture doesn’t just move data off a server, it moves <em>authority</em> to the edges. Each agent decides what to share, with whom, under what rules. The rules themselves (encoded as SHACL shapes) are data in the graph — visible, auditable, forkable, <em>evolvable</em>.</p><h2>The Road Ahead: Verifiable Credentials and ZCAPs</h2><p>AD4M’s identity layer is currently DID + Ed25519 signatures. The next steps extend this into the full W3C Verifiable Credentials ecosystem.</p><p><strong>Verifiable Credentials</strong> will allow agents to make and verify claims about each other without a central authority. “Alice is a member of this community” or “Bob has permission to moderate this channel” become cryptographic assertions, issued by one agent, held by another, verified by anyone, and revocable by the issuer. VCs turn social relationships into portable, privacy-preserving credentials.</p><p><strong>ZCAPs (Authorisation Capabilities)</strong> will replace the current permission model with fine-grained, delegatable capabilities. Instead of “this app can access everything,” it becomes “this app can read channels in this community, add messages, but not delete anything, and this permission expires in 24 hours.” Capabilities can be attenuated and delegated — Alice can give Bob a subset of her own permissions, and Bob can pass an even smaller subset to an AI assistant. This is object-capability security applied to a decentralised social graph.</p><p>Together, VCs and ZCAPs complete the picture: identity, data, schemas, queries, permissions, and credentials, all standards-based, all decentralised, all under the control of the people who use them.</p><h2>The Semantic Web We Were Promised</h2><p>The Semantic Web vision was always compelling: a web of meaning, where data is structured, queryable, and interoperable. It didn’t fail because the standards were wrong, but because they were designed for a web that didn’t exist yet — one where individuals controlled their own data, where identity was portable, where schemas were social agreements rather than corporate decisions.</p><p>It also needed something the W3C couldn’t specify: an <strong>unenclosable carrier</strong>. A network layer that can’t be captured, shut down, or toll-gated by any single entity. HTTP doesn’t qualify, since it depends on servers someone controls. Blockchains don’t qualify either — they centralise consensus and charge rent for every transaction. What the semantic web needed was a peer-to-peer substrate where participation <em>is</em> infrastructure, where the more agents that join, the more resilient and available the network becomes, with no chokepoint in between.</p><p><a href="https://www.holochain.org/">Holochain</a> paved the way for this. Its agent-centric architecture — where each participant runs their own node, validates their own data, and contributes to a shared DHT — provided the first credible unenclosable carrier for structured data. But Holochain alone is a networking layer. It doesn’t speak RDF, doesn’t understand SPARQL, and doesn’t validate SHACL shapes. It needed a semantic layer on top, and the semantic web needed a carrier underneath.</p><p>AD4M is what happens when those two halves meet. It inherits Holochain’s agent-centric philosophy — <em>you</em> are the centre of your digital world, not a platform, not a ledger, not a server — and brings in the W3C’s semantic standards as first-class citizens:</p><ul><li><strong>RDF</strong> works when triples are your native data structure, not an export format</li><li><strong>SPARQL</strong> works when it’s backed by proper indexes and real query planning</li><li><strong>SHACL</strong> works when shapes are social agreements stored in the same graph they constrain</li><li><strong>DIDs</strong> work when identity is the foundation, not an afterthought</li></ul><p>The Semantic Web is here. It’s just not on the web you’re used to — it’s running on personal agents, backed by peer-to-peer networks, secured by cryptographic identity, and governed by the communities that use it.</p><p><em>AD4M is open source at </em><a href="https://github.com/coasys/ad4m"><em>github.com/coasys/ad4m</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0c85041aeeda" width="1" height="1" alt=""><hr><p><a href="https://medium.com/coasys/the-semantic-web-is-here-and-its-also-sovereign-and-decentralised-0c85041aeeda">The Semantic Web is here, and it’s also sovereign and decentralised</a> was originally published in <a href="https://medium.com/coasys">Coasys</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>