How OP Publishes to AT Proto

We made a screencast showing how all this works in detail:



Update: at the moment we’re not able to sync html to Leaflet, so if you’re reading it there here’s the video: https://www.youtube.com/watch?v=UFBXdFAKgWI

1. Index a web page with OP

An Octothorpes server indexes a web page – extracting its title, description, tags, and the URLs it links to. This creates a record in the knowledge graph that OP uses, which can be output as a blobject: a portable bundle of structured data about that page.

2. Harmonize for richer content

OP’s knowledge graph stores lightweight metadata about pages – titles, descriptions, tags, and relationships. Harmonizers let us go back to the source page and extract richer data than what OP typically indexes. For standard.site documents, the standardSite harmonizer pulls the full text content from the page’s <article>, <main>, or <body> elements, plus the canonical URL for site and path information.

3. Prepare with a publisher

A publisher transforms the blobject we get from any query to OP into a other data shapes. In this case, we’re using shapes defined by AT Proto lexicons. This happens in two stages:


The resolver maps OP fields to lexicon fields – title to title, tags to tags, harmonized text to content.
The renderer shapes the data for a specific appview. A Leaflet renderer wraps text into pub.leaflet.content blocks. A generic standard.site renderer keeps it as plaintext. Same source data, different output formats.


4. Publish to a PDS

The prepared record is written to an AT Proto Personal Data Server using createRecord. It gets stored in the site.standard.document collection, linked to a site.standard.publication record that identifies which publication it belongs to.

5. Appview renders it

Leaflet.pub discovers the new record, validates it against the lexicon, and renders it as a post in the publication. The same record is also retrievable by any AT Proto client via its AT URI.

What can I do with this?

Lordy, a lot. The same web page can be published to multiple destinations through different publishers. A blog post indexed by OP can become a Bluesky post (with facets, character limits, and link cards) and a Leaflet document (with structured content blocks) from the same source data. The resolver stays the same; only the renderer changes.

Updates work too. When the source page changes, the system re-harmonizes it, patches the content on the existing record, and writes it back – same URI, fresh content.

This is the core idea: web content indexed once by OP can flow into any system that speaks AT Proto, shaped by publishers that understand each destination’s requirements. And of course we can make publishers for other protocols too.

The Stack


Octothorpes Protocol – indexes and harmonizes web content
AT Protocol – stores records on a PDS, distributes via federation
standard.site – a shared lexicon for documents and publications
Leaflet.pub – an appview that renders site.standard.document records