{
"$type": "site.standard.document",
"bskyPostRef": {
"cid": "bafyreif5cd2akk5so7yykjb5zzbu7nzihamjmt7ma5qe66byggqzrid6v4",
"uri": "at://did:plc:72bim47g3lp4qp5m5wpuio4v/app.bsky.feed.post/3mog6cykdx22q"
},
"content": {
"$type": "app.offprint.content",
"items": [
{
"$type": "app.offprint.block.text",
"plaintext": "I spent about ten years on WordPress. I want to start there, because the case for AT Protocol only makes sense once you understand what WordPress got right, and where it quietly cornered me."
},
{
"$type": "app.offprint.block.text",
"plaintext": "WordPress was a good call for a long time. It's open source and you can self-host it. The content lives in a database you control rather than on someone's platform, and that part matters more than people give it credit for. Writing on Medium or Substack makes you a tenant. WordPress, self-hosted, made me something closer to a homeowner. For a decade that was the right trade."
},
{
"$type": "app.offprint.block.text",
"plaintext": "Here's where it cornered me. WordPress welds together things that ought to stay separate, and once they're joined like that you can't pull them back apart. Your posts sit in its database, in its schema. Your readers exist only as accounts on that one install. Comments are stuck there too, unless you bolt on something like Disqus, which is renting again by another name. The design is welded to the data, so you can't restyle the site without going through the whole machine. The CMS owns all of it as a single object."
},
{
"$type": "app.offprint.block.text",
"plaintext": "Which means every time I wanted to move or redesign, I had to migrate the whole warehouse, because the warehouse and the goods were the same thing. Ten years and several rebuilds, every one a full content migration. And when I wanted a post to also appear on Bluesky, the answer was a plugin that exported a copy out to the network after the fact. The canonical version stayed locked in the CMS. I was making photocopies all over the place."
},
{
"$type": "app.offprint.block.text",
"plaintext": "That's the problem the new architecture had to solve: the welding itself. A nicer CMS wouldn't touch it. "
},
{
"$type": "app.offprint.block.heading",
"level": 2,
"plaintext": "What I was actually solving for"
},
{
"$type": "app.offprint.block.text",
"plaintext": "Four things, in plain terms. I wanted to own my content as portable records, the kind that don't live or die with one application's database. I needed an identity that travels with me. Interaction had to live with the work and move across the network instead of sitting in one app's comment section (plagued with spam.) And the site itself had to be thin enough that the next redesign only touches the paint."
},
{
"$type": "app.offprint.block.text",
"plaintext": "Get those four, and the rebuild I'm doing now is the last structural one I'll need. Everything after is the presentation layer."
},
{
"$type": "app.offprint.block.heading",
"level": 2,
"plaintext": "The options I weighed"
},
{
"$type": "app.offprint.block.text",
"facets": [
{
"features": [
{
"$type": "app.offprint.richtext.facet#bold"
}
],
"index": {
"byteEnd": 23,
"byteStart": 0
}
}
],
"plaintext": "WordPress plus plugins. The status quo. It keeps the coupling and defers the pain. The plugin exports to Bluesky, the CMS still owns the canonical copy, and I'm migrating the warehouse again in three years. This is the thing I'm leaving, so it was never really in the running. I'll say plainly that it works, and for a lot of people it's a perfectly good answer."
},
{
"$type": "app.offprint.block.text",
"facets": [
{
"features": [
{
"$type": "app.offprint.richtext.facet#bold"
}
],
"index": {
"byteEnd": 27,
"byteStart": 0
}
}
],
"plaintext": "Plain static site plus RSS. Maximum control over the content, with very few moving parts to break. Genuinely portable. But there's no identity layer and no interaction. I'd be hand-building the social plumbing myself and ending up with a nicer blog rather than a town square."
},
{
"$type": "app.offprint.block.text",
"facets": [
{
"features": [
{
"$type": "app.offprint.richtext.facet#bold"
}
],
"index": {
"byteEnd": 30,
"byteStart": 0
}
}
],
"plaintext": "ActivityPub and the fediverse. Real federation, and a large network that's more mature than the alternatives. The catch is identity. On Mastodon and most ActivityPub software your identity is rooted to your home server. Move servers and you're migrating your account, which is the precise thing I'm trying to escape. Portability is improving, but the model still anchors you to a host."
},
{
"$type": "app.offprint.block.text",
"facets": [
{
"features": [
{
"$type": "app.offprint.richtext.facet#bold"
}
],
"index": {
"byteEnd": 6,
"byteStart": 0
}
}
],
"plaintext": "Nostr. The most sovereign identity model of the lot. Your identity is a keypair you hold, full stop. No server issues it and no server can take it away, and I have real respect for that design. Where it fell short for me was the tooling around structured, authored work, and key management that's still rough for the ordinary readers I'd want logging in to comment."
},
{
"$type": "app.offprint.block.text",
"facets": [
{
"features": [
{
"$type": "app.offprint.richtext.facet#bold"
}
],
"index": {
"byteEnd": 12,
"byteStart": 0
}
}
],
"plaintext": "AT Protocol. This is where it landed, because atproto separates the layers WordPress (or any CMS really) fused. Your identity is a DID, portable and issued by no single app. Your records live in a personal data server you can move. Lexicons let you define structured record types, so something like the Standard.site lexicon can describe what a document actually is, and any app can read it. The content is born in the network instead of exported to it later. My site reads those records. So does Bluesky, and in principle so could an app I've never heard of."
},
{
"$type": "app.offprint.block.heading",
"level": 2,
"plaintext": "The call"
},
{
"$type": "app.offprint.block.text",
"plaintext": "I went with AT Protocol because it gives me that separation as a property of the system. I don't have to enforce it by hand. The layers come apart cleanly. The site no longer owns my work. It's just one reader among several. The canonical content is the record in the network, under my DID, and the old WordPress question of \"how do I migrate all this next time\" mostly stops applying. There's nothing left to migrate but the look. I've written a migration tool to push WXR data in to my PDS (more to come on that-bit of a mess with the WP Plugin and Offprint). "
},
{
"$type": "app.offprint.block.text",
"plaintext": "The moment it clicked is the one I wrote about in the journey series: finding a plugin that posted to Bluesky using the Standard.site lexicon, and realising the record could be the real thing rather than a copy of it. atproto is the protocol that let me build the whole site around that idea instead of bolting it on the side."
},
{
"$type": "app.offprint.block.heading",
"level": 2,
"plaintext": "What it costs"
},
{
"$type": "app.offprint.block.text",
"plaintext": "I won't pretend this is free. Being early is a tax, and I'm paying it. "
},
{
"$type": "app.offprint.block.text",
"plaintext": "The protocol moves. Specs change under you, and the right answer this month may not be the right answer next month. You read source code and Discord threads. There's no decade of settled Stack Overflow answers to lean on. The tooling is thin next to the WordPress universe, where there's a plugin for everything and a tutorial for every plugin."
},
{
"$type": "app.offprint.block.text",
"plaintext": "The personal data servers aren't uniform either. I'm building against Bluesky's PDS and Eurosky, which is live, while I wait on Gander to open theirs. Each has its own quirks, and \"write once, works everywhere\" is more hope than fact today. It's also the drive."
},
{
"$type": "app.offprint.block.text",
"plaintext": "The record conventions are young. Leaning on Standard.site's lexicons means betting on conventions that aren't fully settled, and some of what I want on the author side doesn't exist yet, so I'm partly defining it as I go. There's a governance point too, and I'll be honest about it: a lot of atproto's direction still sits with Bluesky the company. It's more open than what I'm leaving. I'm not going to pretend it's a fully neutral public utility yet."
},
{
"$type": "app.offprint.block.heading",
"level": 2,
"plaintext": "What I'd tell you if you're building this"
},
{
"$type": "app.offprint.block.text",
"plaintext": "Separate your content from your presentation no matter which protocol you pick. That one decision is most of the benefit, and you can act on it today regardless of everything else"
},
{
"$type": "app.offprint.block.text",
"plaintext": "If portable identity is what you're after, atproto and Nostr are the two serious answers right now, and they make different trades. Nostr gives you the cleaner sovereignty story and a rougher ride for ordinary users. atproto gives you structured records and a real app layer, at the cost of being newer."
},
{
"$type": "app.offprint.block.text",
"plaintext": "Go in expecting to be early. If you want a stack that's settled and boring, this isn't it yet. What you get for the trouble is the thing I was after the whole time. You stop moving house. The content stays put, under an identity you hold, and the site out front is just the part you get to repaint whenever the mood takes you."
},
{
"$type": "app.offprint.block.text",
"plaintext": "WordPress made me a homeowner on a plot I still had to keep packing up and rebuilding. This is me trying to own the land underneath it."
},
{
"$type": "app.offprint.block.horizontalRule"
},
{
"$type": "app.offprint.block.image",
"alignment": "center",
"aspectRatio": {
"height": 220,
"width": 1200
},
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreic3zyf5l524r6f6etmvkxemojnkscbhnxxxngejiendji3iwscwhe"
},
"mimeType": "image/png",
"size": 194805
}
},
{
"$type": "app.offprint.block.text",
"plaintext": "I'm rebuilding this site so my writing reaches you wherever you are, not just where I happen to post it. Follow along in whatever way suits: email if you like an inbox, Bluesky or any atproto handle if you live on the network. Same posts, your choice of doorway. New pieces land over the coming weeks, journey and lab both."
},
{
"$type": "app.offprint.block.text",
"plaintext": ""
}
]
},
"coverImage": {
"$type": "blob",
"ref": {
"$link": "bafkreiag2jpshigb2ysjxb53xlktv2vyfyml34heejrposr4qg5iakxazy"
},
"mimeType": "image/jpeg",
"size": 73380
},
"description": "The architecture call behind the rebuild: what a decade on a CMS taught me, and what I'm betting on instead.",
"path": "/a/3moearnjhdd23-why-at-protocol-and-where-wordpress-ran-out-of-road",
"publishedAt": "2026-06-16T16:01:37+00:00",
"site": "at://did:plc:72bim47g3lp4qp5m5wpuio4v/site.standard.publication/3mlineyi74r24",
"tags": [
"lab",
"at-protocol",
"wordpress",
"atproto"
],
"textContent": "I spent about ten years on WordPress. I want to start there, because the case for AT Protocol only makes sense once you understand what WordPress got right, and where it quietly cornered me.\nWordPress was a good call for a long time. It's open source and you can self-host it. The content lives in a database you control rather than on someone's platform, and that part matters more than people give it credit for. Writing on Medium or Substack makes you a tenant. WordPress, self-hosted, made me something closer to a homeowner. For a decade that was the right trade.\nHere's where it cornered me. WordPress welds together things that ought to stay separate, and once they're joined like that you can't pull them back apart. Your posts sit in its database, in its schema. Your readers exist only as accounts on that one install. Comments are stuck there too, unless you bolt on something like Disqus, which is renting again by another name. The design is welded to the data, so you can't restyle the site without going through the whole machine. The CMS owns all of it as a single object.\nWhich means every time I wanted to move or redesign, I had to migrate the whole warehouse, because the warehouse and the goods were the same thing. Ten years and several rebuilds, every one a full content migration. And when I wanted a post to also appear on Bluesky, the answer was a plugin that exported a copy out to the network after the fact. The canonical version stayed locked in the CMS. I was making photocopies all over the place.\nThat's the problem the new architecture had to solve: the welding itself. A nicer CMS wouldn't touch it. \nWhat I was actually solving for\nFour things, in plain terms. I wanted to own my content as portable records, the kind that don't live or die with one application's database. I needed an identity that travels with me. Interaction had to live with the work and move across the network instead of sitting in one app's comment section (plagued with spam.) And the site itself had to be thin enough that the next redesign only touches the paint.\nGet those four, and the rebuild I'm doing now is the last structural one I'll need. Everything after is the presentation layer.\nThe options I weighed\nWordPress plus plugins. The status quo. It keeps the coupling and defers the pain. The plugin exports to Bluesky, the CMS still owns the canonical copy, and I'm migrating the warehouse again in three years. This is the thing I'm leaving, so it was never really in the running. I'll say plainly that it works, and for a lot of people it's a perfectly good answer.\nPlain static site plus RSS. Maximum control over the content, with very few moving parts to break. Genuinely portable. But there's no identity layer and no interaction. I'd be hand-building the social plumbing myself and ending up with a nicer blog rather than a town square.\nActivityPub and the fediverse. Real federation, and a large network that's more mature than the alternatives. The catch is identity. On Mastodon and most ActivityPub software your identity is rooted to your home server. Move servers and you're migrating your account, which is the precise thing I'm trying to escape. Portability is improving, but the model still anchors you to a host.\nNostr. The most sovereign identity model of the lot. Your identity is a keypair you hold, full stop. No server issues it and no server can take it away, and I have real respect for that design. Where it fell short for me was the tooling around structured, authored work, and key management that's still rough for the ordinary readers I'd want logging in to comment.\nAT Protocol. This is where it landed, because atproto separates the layers WordPress (or any CMS really) fused. Your identity is a DID, portable and issued by no single app. Your records live in a personal data server you can move. Lexicons let you define structured record types, so something like the Standard.site lexicon can describe what a document actually is, and any app can read it. The content is born in the network instead of exported to it later. My site reads those records. So does Bluesky, and in principle so could an app I've never heard of.\nThe call\nI went with AT Protocol because it gives me that separation as a property of the system. I don't have to enforce it by hand. The layers come apart cleanly. The site no longer owns my work. It's just one reader among several. The canonical content is the record in the network, under my DID, and the old WordPress question of \"how do I migrate all this next time\" mostly stops applying. There's nothing left to migrate but the look. I've written a migration tool to push WXR data in to my PDS (more to come on that-bit of a mess with the WP Plugin and Offprint). \nThe moment it clicked is the one I wrote about in the journey series: finding a plugin that posted to Bluesky using the Standard.site lexicon, and realising the record could be the real thing rather than a copy of it. atproto is the protocol that let me build the whole site around that idea instead of bolting it on the side.\nWhat it costs\nI won't pretend this is free. Being early is a tax, and I'm paying it. \nThe protocol moves. Specs change under you, and the right answer this month may not be the right answer next month. You read source code and Discord threads. There's no decade of settled Stack Overflow answers to lean on. The tooling is thin next to the WordPress universe, where there's a plugin for everything and a tutorial for every plugin.\nThe personal data servers aren't uniform either. I'm building against Bluesky's PDS and Eurosky, which is live, while I wait on Gander to open theirs. Each has its own quirks, and \"write once, works everywhere\" is more hope than fact today. It's also the drive.\nThe record conventions are young. Leaning on Standard.site's lexicons means betting on conventions that aren't fully settled, and some of what I want on the author side doesn't exist yet, so I'm partly defining it as I go. There's a governance point too, and I'll be honest about it: a lot of atproto's direction still sits with Bluesky the company. It's more open than what I'm leaving. I'm not going to pretend it's a fully neutral public utility yet.\nWhat I'd tell you if you're building this\nSeparate your content from your presentation no matter which protocol you pick. That one decision is most of the benefit, and you can act on it today regardless of everything else\nIf portable identity is what you're after, atproto and Nostr are the two serious answers right now, and they make different trades. Nostr gives you the cleaner sovereignty story and a rougher ride for ordinary users. atproto gives you structured records and a real app layer, at the cost of being newer.\nGo in expecting to be early. If you want a stack that's settled and boring, this isn't it yet. What you get for the trouble is the thing I was after the whole time. You stop moving house. The content stays put, under an identity you hold, and the site out front is just the part you get to repaint whenever the mood takes you.\nWordPress made me a homeowner on a plot I still had to keep packing up and rebuilding. This is me trying to own the land underneath it.\n\n---\nI'm rebuilding this site so my writing reaches you wherever you are, not just where I happen to post it. Follow along in whatever way suits: email if you like an inbox, Bluesky or any atproto handle if you live on the network. Same posts, your choice of doorway. New pieces land over the coming weeks, journey and lab both.",
"title": "Why AT Protocol, and Where WordPress Ran Out of Road"
}