{
"path": "/3lyrwu5ene22q",
"site": "at://did:plc:6ll5xi67lyuyovt6fiv4fnjo/site.standard.publication/3lyht3qgykk2g",
"$type": "site.standard.document",
"title": "Sunsetting atpage",
"content": {
"$type": "pub.leaflet.content",
"pages": [
{
"$type": "pub.leaflet.pages.linearDocument",
"blocks": [
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Hi!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 26,
"byteStart": 20
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "I decided to sunset atpage, the thing I built that allows you to publish HTML websites to your ATProto PDS, and that powered my website/blog. "
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "I took this decision because more often than not I ended up refining rough edges or tweaking the theme or some other thing."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 21,
"byteStart": 15
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
]
}
],
"plaintext": "I figured if I really want to get better at writing I should find a way to do so without being disturbed by side-quests."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 50,
"byteStart": 46
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
]
}
],
"plaintext": "I feel like my attention span is so limited I have to make a conscious effort to remove distractions from my writing space, and adding the complexities of a distributed protocol, Rust, WASM and Service Workers to the writing process doesn't help!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 45,
"byteStart": 39
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "It's undeniable that I had fun writing atpage, it was my first foray into Service Workers and WASM, and I think it's still a great idea - dealing with payload optimization and multi-browser compatibility was a pain but it was also very rewarding."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 21,
"byteStart": 9
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#strikethrough"
}
]
}
],
"plaintext": "Given my incompetence lack of experience with the Web platform, this model started to become more of an hassle than something that I enjoyed working on."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 152,
"byteStart": 141
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
]
}
],
"plaintext": "One time, the entire website broke because I missed a recursive call in an HTML tree exploration function, and it did not manifest until the fourth post!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 133,
"byteStart": 127
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
},
{
"index": {
"byteEnd": 153,
"byteStart": 142
},
"features": [
{
"uri": "https://leaflet.pub",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "In looking for a platform that simplifies the writing process substantially I recalled someone already built a \"competitor\" to atpage, called leaflet.pub... Which is where you're reading this post now!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.bskyPost",
"postRef": {
"cid": "bafyreibarnolrnje4dnao5ioactblwxkx2cqvb7q6vtdz3lus5lx5baz5a",
"uri": "at://did:plc:6ll5xi67lyuyovt6fiv4fnjo/app.bsky.feed.post/3lyht73pyys2u"
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "I like how they modeled the writing experience around discrete blocks, each containing rich-text or media content of sorts, like website embeddings or social media posts. "
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 232,
"byteStart": 214
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
]
}
],
"plaintext": "The way they organize your publications, how they let you control very little in terms of design, it's perfect to provide my brain with a break from the tinkering process that dominates my days, pushing me to just get some words out and have a good time."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "It also lets me write from essentially everywhere, since drafts are stored on their servers."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 30,
"byteStart": 19
},
"features": [
{
"uri": "https://leaflet.pub",
"$type": "pub.leaflet.richtext.facet#link"
}
]
},
{
"index": {
"byteEnd": 145,
"byteStart": 139
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "A neat thing about leaflet.pub is that if you log in with an ATProto identity, your website is stored on your PDS, not too dissimilar from atpage!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "I think they cache your posts on a backend service to optimize for performance and to avoid overloading PDSes - it would be great if in the future they allowed to fetch content from a PDS directly, maybe as an opt-in feature for self-hosters? "
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "I'd also love if we could provide CSS colors for dark and light mode, but I'm sure I'm not the only one that requested this feature. "
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 43,
"byteStart": 37
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
]
}
],
"plaintext": "That said, breakfast is here and I'd really like to get to my ham toast before it gets cold :^)"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Until next time!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": ""
}
}
]
}
]
},
"bskyPostRef": {
"cid": "bafyreihau7xts5flraymftyd4zfwlfbblsoelr4k7cqynod2zijpcckzo4",
"uri": "at://did:plc:6ll5xi67lyuyovt6fiv4fnjo/app.bsky.feed.post/3lyrwudu7wk2q",
"commit": {
"cid": "bafyreihjrxtura7exqhiaqcvjftzu2ndtrkl5ewdcq2k33dscjvnhyidra",
"rev": "3lyrwudymkk2d"
},
"validationStatus": "valid"
},
"description": "",
"publishedAt": "2025-09-14T09:06:35.848Z"
}