{
"$type": "site.standard.document",
"bskyPostRef": {
"cid": "bafyreia4n7pfrpad54bugx35od25lkpjngahstsyqu5vwydhwqkxmcjhxi",
"uri": "at://did:plc:xs2vgih3wx5mnyiuqvbzar5h/app.bsky.feed.post/3mnztifdtdqb2"
},
"coverImage": {
"$type": "blob",
"ref": {
"$link": "bafkreidvfidzhiz775e5kdj2hixg62ybcopm7257hphve72blct7z3kjiy"
},
"mimeType": "image/png",
"size": 26123
},
"description": "What if your ATProto content was a WordPress block tree? I built a long-form editor where the standard.site \"content\" field is just Gutenberg blocks, no PHP anywhere. I'm playing with ATProto, even though I'm still not fully sold on it as a web old-timer. š",
"path": "/wordpress-block-editor-at-protocol/",
"publishedAt": "2026-06-11T18:14:50.000Z",
"site": "https://herve.bzh",
"tags": [
"ATProto",
"Bluesky",
"development",
"WordPress",
"SkyPress",
"proper launch post over here",
"Leaflet",
"Pckt.blog",
"work @pfefferle and I did bringing Bluesky, Mastodon, and the fediverse into the WordPress.com Reader",
"standard.site",
"isolated-block-editor",
"@wordpress/blocks",
"@wordpress/block-library",
"the SkyPress content lexicon",
"Gutenberg posts arenāt HTMLā¦",
"a Ship of Theseus",
"@jimray.bsky.team",
"https://bsky.app/profile/jeremy.herve.bzh/post/3mnxmilp55k2h",
"Editor Technical Overview",
"ATmosphere plugin",
"the web was always social",
"SkyPress.blog",
"launch post"
],
"textContent": "Iāve had my own home on the web, one I fully control, for about 20 years now. It started on a cheap shared hosting plan where PHP was all I needed and knew. I taught myself to build WordPress themes by asking questions in the .org support forums, and Iāve been taking care of my little home ever since. Iāve renovated more than a few times, Iāve experimented with different CMSes, Iāve tweaked things, ā¦\n\nI say that up front because itās the lens I brought to a small experiment I launched today: SkyPress, a long-form editor for the AT Protocol that happens to run the WordPress block editor. Thereās a proper launch post over here, but I wanted to expand a bit on the why, as well as a few of my ongoing thoughts and conflicts about ATProto.\n\n## Where it started\n\nIāve been spending some time looking at how the long-form editors in the atmosphere structure their content. Leaflet has its multi-page document blocks; Pckt.blog has its own block format; both write something structured into the `content` field of a `site.standard.document` record. Poking at those got me thinking again about something I was more familiar with: how a WordPress post is put together under the hood.\n\nSome of this came out of work @pfefferle and I did bringing Bluesky, Mastodon, and the fediverse into the WordPress.com Reader. That meant looking closely at standard.site, and at how each platform decides what to drop into that `content` field. The more I looked, the more I wanted to try it myself.\n\nI had three questions I wanted to answer for myself:\n\n 1. How hard is it, really, to build an ATProto editor without taking on a pile of overhead?\n 2. Could I rely only on data saved to the PDS, with nothing of my own to store on the side?\n 3. How easy would it be to re-create some of the WordPress block editor experience outside of WordPress?\n\n\n\n## A lexicon that came together on its own\n\nHereās the thing that made it click. WordPress knows all about turning post content into structured data, and that structure happened to map neatly onto what an ATProto `content` field could be. Thatās a happy accident for my experiment.\n\nAutomattic maintains isolated-block-editor, which is the Gutenberg editor repackaged to run with no WordPress behind it. It hands you an `onSaveBlocks` callback, and instead of a string of HTML you get the raw block tree: an array of `{ name, attributes, innerBlocks }` objects. Add `@wordpress/blocks` and `@wordpress/block-library` for parsing and rendering, and you have a full editor _and_ a renderer, no PHP anywhere.\n\nSo the SkyPress content lexicon, `blog.skypress.content.gutenberg`, ended up almost embarrassingly thin: a `version` and a `blocks` array, dropped straight into the documentās open content union. The canonical content is the block tree exactly as the editor produced it, not rendered HTML. Any reader that doesnāt understand the `$type` falls back to `textContent`, same as every other custom content format in the atmosphere.\n\nThe reason this works is older than ATProto. When Dennis Snell explained the Gutenberg block format back in 2017, he put it plainly:\n\n> Thus, a Gutenberg post isnāt HTML, but a tree of objects and associated attributes.\n>\n> Gutenberg posts arenāt HTMLā¦\n\nThat tree is exactly the shape ATProto wants. MatĆas Ventura framed the bigger move as a Ship of Theseus, rebuilding the materials while the ship keeps sailing, and the block, as a discrete unit of structured data, is the plank we swapped in. So for me the hard part, designing that content model, was already done. I mostly got to borrow it. š\n\n## Why hasnāt the atmosphere settled on structured content?\n\nThis is where the experiment bumped into something I still donāt quite understand yet. `standard.site` made a deliberate choice to standardize the metadata around a document and leave content open; bring your own format. I get the reasoning and the flexibility it brings. But that `content` field is a _singular_ union, so someone building an editor still has to pick one `$type` and accept that every other reader degrades to plain `textContent`.\n\nI got into this a bit with @jimray.bsky.team on Bluesky:\n\n> In my ideal world, an editor would be able to serve Leaflet readers, Pckt readers, and markdown readers well from the same record, so you read a nicely formatted post regardless of the reader you use.\n>\n> https://bsky.app/profile/jeremy.herve.bzh/post/3mnxmilp55k2h\n\nThatās not how it works today, and different editors keep building different content formats that only their own readers fully understand. And ATproto seems to be growing a lot right now, so new formats will keep popping up. Hey, I just added one to the pile! š
\n\nIt reminded me of a choice WordPress made years ago. I offer as a data point and nothing more, I donāt mean to offer any advice or recommendation to anyone, I know very little about ATProto!\n\nWhen Gutenberg moved to blocks, it kept storing that structured data _as HTML too_ , tucked inside comments, so a legacy system that knows nothing about blocks can still render the post. The technical overview from 2017 put it this way:\n\n> the source of truth for the content should remain in `post_content`, where the bulk of the post data needs to be present in a way that is accessible and portable, while still providing additional structure on top of HTML semantics.\n>\n> Editor Technical Overview\n\nIām not holding that up as the answer. The block editor itself is divisive enough that Iād never claim WordPress has this figured out; itās one take on one narrow corner of the problem, a structured format that still degrades into something every reader can show. Whether thatās a good fit for the atmosphere, I honestly donāt know. I just keep poking at it.\n\n## Am I sold on ATProto? Not quite\n\nIām still trying to get on board with the whole idea of ATProto, and this little experiment is a great way to learn more, and poke at those questions.\n\nPart of me still thinks I may not be the person itās for.\n\nRemember that cheap shared hosting plan. I already own my content, Iāve moved between platforms, built my own themes, broken things and put them back together. Owning my words isnāt anything new to me. And Iām comfortable digging around in my own data inside WordPress, because I know that process inside and out.\n\nSo the core ATProto idea, separating where your data lives (the PDS) from where people read it (the AppView), feels a little foreign to me. Having to run, pay, and maintain two systems to control one set of content seems like a lot. And itās usually not just two systems; itās two domains as well, one for the PDS and one for the AppView. The PDS gives you portability and the AppView gives you a web address people can actually reach, which makes sense to some extent, but itās also two of everything to keep an eye on, and potentially two points of failure. Itās hard to go from āI run my little blog and it mostly just worksā to that without asking myself some questions. š\n\nDonāt get me wrong though. None of that is a knock on the protocol. I think itās a fair description of the bet ATProto asks you to make, and for plenty of people, especially folks who never had a home of their own on the web, that bet may make complete sense.\n\n## Where do you publish a post about your own publishing tool?\n\nSo I built a long-form publishing tool. Cool. Yet, Iām posting about it on my WordPress site. š
\n\nI spent quite a bit of time deciding where to actually publish this very post.\n\nI wanted to use SkyPress. I mean, I just released it, I probably should! But I already have this home, 20 years deep, with my readers, my RSS subscribers, my Fediverse friends. Why would I switch now? Especially considering that this site runs the ATmosphere plugin: it already publishes my posts to ATProto as `site.standard.document` records anyway.\n\nBy the way, weāre asking ourselves the same questions for the plugin. What exactly should go in that `content` field, though, is a question weāre still hashing out in an open pull request: HTML, markdown, pckt, Leaflet, and which one wins when `content` only has room for one. Iām definitely still struggling about that multi-format puzzle!\n\nSo for this one, I ended up picking the home I already have. I will be using SkyPress for other posts over the next few weeks, though! Maybe that will help me better understand all of this!\n\nIāve written before that the web was always social, and that because a protocol isnāt perfect, it doesnāt mean we should drop it. Quite the opposite. A rising tide lifts all boats, and to me the only way to find the gaps in something like standard.site is to build on it and bump into those gaps myself.\n\nIf you want to give it a try, the editor is live at SkyPress.blog, and the launch post walks through what it actually does. Itās an alpha, so expect rough edges. And if youāve thought about the singular-`content`-union question, or this whole structured-versus-legible tension, Iād love to hear it. Let me know!",
"title": "Putting the WordPress block editor on the AT Protocol",
"updatedAt": "2026-06-11T18:26:26.000Z"
}