site.standard.document

standard.site

Samples

1451 randomly sampled records from the AT Protocol firehose

site.standard.document (100 samples)
{
  "path": "/3m4lmfp4f5k23",
  "site": "at://did:plc:xg2vq45muivyy3xwatcehspu/site.standard.publication/3m3zpxhfl3c2s",
  "$type": "site.standard.document",
  "title": "Dev Log 6: 2025-11-01",
  "content": {
    "$type": "pub.leaflet.content",
    "pages": [
      {
        "$type": "pub.leaflet.pages.linearDocument",
        "blocks": [
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "Yesterday"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 3,
              "facets": [],
              "plaintext": "VoltX"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 52,
                    "byteStart": 49
                  },
                  "features": [
                    {
                      "uri": "https://www.npmjs.com/package/voltx.js",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 74,
                    "byteStart": 71
                  },
                  "features": [
                    {
                      "uri": "https://stormlightlabs.github.io/volt/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "Yesterday I wrapped up v0.5.1 and deployed it to npm. Upon reading its doc site, I think I need to fix the automated API doc generator and also create an IIFE build for easy prototyping."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 3,
              "facets": [],
              "plaintext": "Noteleaf"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 99,
                    "byteStart": 90
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                }
              ],
              "plaintext": "I added migrations for leaflet related fields. Yes this leaflet. I think its fitting that noteleaf take its note feature and push/pull to/from leaflet."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 3,
              "facets": [],
              "plaintext": "Beacon"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Yesterday was all about pattern matching. There were a lot of gaps in the tree-sitter based parser that I had to address. Overall a deceptively large sub project."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "Today"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 3,
              "facets": [],
              "plaintext": "Noteleaf"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.unorderedList",
              "children": [
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 79,
                          "byteStart": 72
                        },
                        "features": [
                          {
                            "uri": "https://tangled.org/@desertthunder.dev/noteleaf",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Working on setting up the leaflet integration - I push liberally to its tangled remote. Github is just there for the existing actions pipeline."
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [],
                    "plaintext": "The XPath rules used to extract article text in the articles subdomain of the application need more specificity to avoid writing explicit parsing code for sites. "
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [],
                    "plaintext": "Edge/error cases need more coverage"
                  },
                  "children": []
                }
              ]
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 3,
              "facets": [],
              "plaintext": "Beacon"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.unorderedList",
              "children": [
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [],
                    "plaintext": "Async & generator constructs covered by type inference engine"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [],
                    "plaintext": "A zed extension subproject should be added."
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 67,
                          "byteStart": 63
                        },
                        "features": [
                          {
                            "uri": "https://stormlightlabs.github.io/beacon/",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "QA & document existing features at the project's documentation site."
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 49,
                          "byteStart": 39
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#code"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Refactor the static analysis module in beacon-lsp so that constraint generation & solving is in the empty constraints crate. "
                  },
                  "children": []
                }
              ]
            }
          }
        ]
      }
    ]
  },
  "bskyPostRef": {
    "cid": "bafyreihx6zj262aipbcmuk46kuyiwmszxi2bbhzhbhbt4xm7xgklkoxpda",
    "uri": "at://did:plc:xg2vq45muivyy3xwatcehspu/app.bsky.feed.post/3m4lmfsspbs23",
    "commit": {
      "cid": "bafyreidhez65egyfcizzkkf6rx54qe6xf7mr4qzk6kt45dcdxullby25fy",
      "rev": "3m4lmfsvfzb26"
    },
    "validationStatus": "valid"
  },
  "description": "",
  "publishedAt": "2025-11-01T18:24:21.798Z"
}

did:plc:xg2vq45muivyy3xwatcehspu | at://did:plc:xg2vq45muivyy3xwatcehspu/site.standard.document/3m4lmfp4f5k23

app.bsky.feed.post (nested within site.standard.document) (100 samples)
{
  "path": "/3magaccpexs2x",
  "site": "at://did:plc:mmyj7mk7kh3jqhw6zs4prbuk/site.standard.publication/3mag7aqhzas2n",
  "tags": [
    "atproto",
    "local-first"
  ],
  "$type": "site.standard.document",
  "title": "Owning group data",
  "content": {
    "$type": "pub.leaflet.content",
    "pages": [
      {
        "id": "019b38e9-cd53-7bbe-8592-13692fb329a8",
        "$type": "pub.leaflet.pages.linearDocument",
        "blocks": [
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 40,
                    "byteStart": 30
                  },
                  "features": [
                    {
                      "uri": "https://discourse.atprotocol.community/t/representing-groups-and-other-shared-resources-in-atproto/296/2?u=erlend.sh",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 377,
                    "byteStart": 372
                  },
                  "features": [
                    {
                      "uri": "https://a.roomy.space",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 433,
                    "byteStart": 380
                  },
                  "features": [
                    {
                      "uri": "https://bsky.app/profile/brittanyellich.com/post/3mad2f6e4oc22",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 852,
                    "byteStart": 848
                  },
                  "features": [
                    {
                      "uri": "https://blog.muni.town/leaf-0-3-the-server-behind-roomy/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 1090,
                    "byteStart": 1057
                  },
                  "features": [
                    {
                      "uri": "https://www.hypercerts.org/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 1142,
                    "byteStart": 1101
                  },
                  "features": [
                    {
                      "uri": "https://discourse.atprotocol.community/t/hypercerts-recognizing-and-rewarding-impact-atproto-implementation/347",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "There's been some interesting discussion lately in the ATProto dev community regarding what to do about data that rightfully 'belongs' in some sense, to a group of people, rather than an individual. I'll give a little summary of some ideas I encountered recently, and share how it connects to our thinking around building a real-time messaging and collaboration spaces in Roomy.\n\nBrittany Ellich recently shared some interesting work focused on the identity aspect of this problem, which in ATProto, in practice, comes down to control of the rotation keys for a DID:PLC. DID:PLC supports multiple rotation keys, which means you can have multiple 'admins' controlling a DID, but there are some limitations meaning you may need to delegate control to a service that can manage group access for you. This is related to what we have been building with Leaf, where we also now identify group 'streams' with a DID:PLC corresponding to a group identity, control over which is (as with most PDS users) delegated to the server by default.\n\nIn a very similar vein, a team connected with Protocol Labs have been experimenting with a 'Shared Data Server', or SDS (as opposed to a Personal Data Server or PDS, which ATProto is built around)\n\nIn response in the same thread, Boris Mann had this 'aha moment' crystallising one approach to the problem focused on authorisation:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.blockquote",
              "facets": [],
              "plaintext": "if you make these “shared accounts” fully work as first class regular accounts, then they will automatically work with any app, in which case using the PDS service entry in the DID doc makes sense."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "This is exciting! The idea that group identities could look to the broader network just like individual users, in terms of meeting the same APIs, etc, would create a clear pathway towards interop. If the community went in this direction, we might one day want to reconsider the term 'Personal' in PDS."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 146,
                    "byteStart": 38
                  },
                  "features": [
                    {
                      "uri": "https://discourse.atprotocol.community/t/representing-groups-and-other-shared-resources-in-atproto/296/2",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "Also in the thread I first linked to, Nick Gerakines shared this reflection focused on how we can model group data while preserving user ownership:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.blockquote",
              "facets": [],
              "plaintext": "There has been an evolving and maturing idea where a communal identity “owns” wrapper records that had an inner reference to community specific content records.\nFor example, the community did:web:book.club exists and has a PDS. Nick creates a week 2 thoughts post at at://did:plc:nick/club.book.post/abce1234 through the book club AppView and as a part of that process, the AppView also creates the record at://did:web:book.club/club.book.post wrapper/bcde2345 that has a strong ref to Nick’s post.\nThe AppView does this to have moderation controls for the wrapper records it maintains, but users “own” their own posts."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "This makes a lot of sense as an ideal to build towards. We also really want users to be able to have meaningful control over their contributions to a group. But to me, the tricky part here is around when there is collaborative group state, and what we do when we want a consistent view on that state."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 18,
                    "byteStart": 13
                  },
                  "features": [
                    {
                      "uri": "https://a.roomy.space",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 104,
                    "byteStart": 95
                  },
                  "features": [
                    {
                      "uri": "https://blog.muni.town/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 268,
                    "byteStart": 264
                  },
                  "features": [
                    {
                      "uri": "https://blog.muni.town/leaf-0-3-the-server-behind-roomy/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 941,
                    "byteStart": 934
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 960,
                    "byteStart": 946
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                }
              ],
              "plaintext": "For context, Roomy is a realtime community messaging and collaboration app we're building with Muni Town. We expect users to have an ATProto account, or create one for them, and use this as our identity system, but we store most application data off-protocol on a Leaf server, which we have been designing with a focus on generality as much as possible. We take a lot of inspiration from ATProto for Leaf, and we ultimately hope to interoperate with ATProto on the app data we produce as much as it helps and makes sense for users, so we are conscious to try to design things in a way that has ‘resonances’ with the protocol (e.g. we always think through the design by comparison to ATProto concepts), but without trying to predict how the protocol will evolve. We’re just trying to build it and work out The two main things that would make the PDS not quite right for our app data currently are the lack of solid approaches to privacy and group identity."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 340,
                    "byteStart": 329
                  },
                  "features": [
                    {
                      "uri": "https://www.localfirst.fm/landscape#3gADsGNvbHVtblZpc2liaWxpdHneAAKsR2VuZXJhbF9OYW1lwqxSQU5ET01fT1JERVLCrWNvbHVtbkZpbHRlcnOQp3NvcnRpbmeR3gAComlkrFJBTkRPTV9PUkRFUqRkZXNjwg==",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "In our evolving work on Leaf and Roomy, we have taken inspiration from ATProto, especially around the modular system architecture and focus on authenticated data that can be replicated across the network, and we've also drawn on a lot of different approaches to group data and particularly collaborative data structures from the local-first world. The topic of group data - particularly, the problem of managing multi-writer state - opens up a crossing between these related but distinct developer communities."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 1,
              "facets": [],
              "plaintext": "Collaboration as a set of operations: CRDTs and Event Sourcing"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 102,
                    "byteStart": 57
                  },
                  "features": [
                    {
                      "uri": "https://crdt.tech/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 281,
                    "byteStart": 267
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    },
                    {
                      "uri": "https://learn.microsoft.com/en-us/azure/architecture/patterns/event-sourcing",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 451,
                    "byteStart": 445
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 594,
                    "byteStart": 560
                  },
                  "features": [
                    {
                      "uri": "https://www.inkandswitch.com/essay/local-first/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "In local-first there has been a lot of excitement around Conflict-Free Replicated Data Types, or CRDTs, but many teams have found that the complexity and overhead of CRDTs have not been appropriate for what they were trying to build. A related but simpler concept is event sourcing, which is how we ultimately decided to approach building Roomy. We think both are really cool, and gel with our intention to make experiences that give users very direct control and ownership over the data they create, in line with the ideals set out by Ink and Switch in their essay coining the term local-first."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Event sourcing and CRDTs are both systems for deterministically arriving at the current state of a system by applying a set of operations on that system. The main difference is that event sourcing requires that that entire set of operations has a canonical linear order, and only guarantees the state will be correct if the order is the same. This makes event sourcing very simple to implement, because there are never conflicts."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 145,
                    "byteStart": 125
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 230,
                    "byteStart": 213
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                }
              ],
              "plaintext": "CRDTs, on the other hand, are actually built to handle conflicts and resolve them in a deterministic way. To keep things as ~temporally flexible~ as possible they encode only the bare minimum of information about what came before into each operation itself, and then are very careful about how to handle conflicts and merges. This makes it possible to tolerate different users applying operations from different users in different orders, while ensuring that once all the communication is done, they are all still looking at the same document. This is amazing, especially for documents! Documents are a very particular example of a large, complex data structure where there very well may be a lot of people trying to change it at once, some of whom may be offline. Absent broader technological support for peer-to-peer networking, having a solid way to make sense of offline changes to data structures is probably the best use case we currently have for CRDTs, but it's also not the only solution for that. "
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 317,
                    "byteStart": 309
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 444,
                    "byteStart": 438
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                }
              ],
              "plaintext": "In Roomy, our primary focus is on real-time community messaging. Users of real-time chat apps don't typically have such a flexible notion of temporality, that they would accept that a message sent mid-conversation yesterday, that happened to be sent on a device that suddenly went offline until today, really belongs in the middle of yesterday's conversation. If nobody else saw it then, it's arguable that in some sense it didn't really happen then, from the perspective of the community. We still want to support offline use of the app, and personally I still really hope to see wider support for peer-to-peer networking, but we've accepted that in general for normal app usage, it's ok for the server to be the authority of what happened and when."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 1,
              "facets": [],
              "plaintext": "Event-sourced XRPC ops"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 17,
                    "byteStart": 12
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 138,
                    "byteStart": 130
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                }
              ],
              "plaintext": "In Roomy, a space is where a community keeps all its communal activities, and a client arrives at the current state of a space by applying the log of events in a Leaf stream from the first to the most recent. By 'applying', I mean that each of these events maps to a set of SQL statements, which can be run on a local SQLite db to (more-or-less) deterministically arrive at a consistent final state. "
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 821,
                    "byteStart": 812
                  },
                  "features": [
                    {
                      "uri": "https://atproto.com/guides/data-repos",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "We have been iterating on NSIDs for these Roomy events for a while, but recently we decided to more explicitly work towards publishing schemas for these events as ATProto Lexicons. In doing so, we realised that our stream had been mixing and matching notions of ATProto 'records' (which live on the PDS) and XRPC 'procedures' (which are methods altering data enacted by the PDS or by an AppView). If we take a step back and think about what's going on conceptually from the user's perspective, all of these events are more like the latter. The difference here is that the primary subject of these XRPC operations is a local DB on the user's device, rather than something like a PDS which is responsible for serving the current state of any given record, as seen at the head of the chain of commits to the user's data repo."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "That said, Leaf is actually very flexible in that it also supports materialisation of events to produce the current state on the server. Could Leaf implement PDS XRPC methods and materialise the current state of any given data to serve as ATProto records? If that were possible, would it help us interoperate with any of these other emerging projects focused on community data on ATProto? "
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 196,
                    "byteStart": 192
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                }
              ],
              "plaintext": "Another, perhaps more ATProto-y approach we've discussed is, rather than thinking of the source of truth for the log of events as a single stream on a Leaf database, we think of a stream as a feed, that listens to the firehose for users posting event records to their PDS, and then aggregates these into a stream."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Our primary focus right now is getting Roomy and Leaf working on our own terms, but I wanted to share how our thinking is evolving in case it's useful to the broader community as we are ideating towards convergence on solutions to group data, and to express our strong desire to participate more deeply in these conversations as we find our footing."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          }
        ]
      }
    ]
  },
  "bskyPostRef": {
    "cid": "bafyreibv7olhkd4iftufb6yailkcsohir3dzp3oj7mrpnkhjvopidbjkpe",
    "uri": "at://did:plc:mmyj7mk7kh3jqhw6zs4prbuk/app.bsky.feed.post/3magachcsqk2x",
    "commit": {
      "cid": "bafyreigwdkvb54kfldkizfksixnfcjjsose6icny2mjogvgt7q2kro2naq",
      "rev": "3magachipnn24"
    },
    "validationStatus": "valid"
  },
  "description": "Thinking about how communities can manage shared data on and off ATProto",
  "publishedAt": "2025-12-20T12:45:11.042Z"
}

did:plc:mmyj7mk7kh3jqhw6zs4prbuk | at://did:plc:mmyj7mk7kh3jqhw6zs4prbuk/site.standard.document/3magaccpexs2x

app.greengale.document (nested within site.standard.document) (3 samples)
{
  "path": "/3md3644pt2d2w",
  "site": "at://did:plc:hsqwcidfez66lwm3gxhfv5in/site.standard.publication/3md35tjtlkkno",
  "tags": [
    "email",
    "open standards"
  ],
  "$type": "site.standard.document",
  "title": "Email, perhaps? 🥺👉👈",
  "content": {
    "uri": "at://did:plc:hsqwcidfez66lwm3gxhfv5in/app.greengale.document/3md3644pt2d2w",
    "$type": "app.greengale.document#contentRef"
  },
  "description": "I shrimply want to be able to subscribe to blog via email",
  "publishedAt": "2026-01-23T07:22:13.326Z",
  "textContent": "So there's a new blog in town. Beautiful design. And yet? No email.  Email is the original open communications protocol. Yes it has its issues, but so does everything. I hope an ATproto blogging platform gets native (or native-ish) email support soon, I will sign up expeditiously.  I do like how you can use markdown natively here, I think the visual editors on other pages are a bit confusing and tend to feel hacky."
}

did:plc:hsqwcidfez66lwm3gxhfv5in | at://did:plc:hsqwcidfez66lwm3gxhfv5in/site.standard.document/3md3644pt2d2w

app.offprint.block.blockquote (nested within site.standard.document) (2 samples)
{
  "path": "/a/3mcsvjjceei23-publishing-on-the-atmosphere",
  "site": "at://did:plc:6ayddqghxhciedbaofoxkcbs/site.standard.publication/3mcsu4ta72g2t",
  "$type": "site.standard.document",
  "title": "Publishing on the ATmosphere",
  "content": {
    "$type": "app.offprint.content",
    "items": [
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Suggested pre-reads:"
      },
      {
        "$type": "app.offprint.block.bulletList",
        "children": [
          {
            "content": {
              "$type": "app.offprint.block.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 39,
                    "byteStart": 0
                  },
                  "features": [
                    {
                      "uri": "https://overreacted.io/open-social/",
                      "$type": "app.offprint.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 51,
                    "byteStart": 39
                  },
                  "features": [
                    {
                      "did": "did:plc:fpruhuo22xkm5o7ttr2ktxdo",
                      "$type": "app.offprint.richtext.facet#mention",
                      "handle": "danabra.mov"
                    }
                  ]
                }
              ],
              "plaintext": "https://overreacted.io/open-social/ by @danabra.mov "
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 47,
                    "byteStart": 0
                  },
                  "features": [
                    {
                      "uri": "https://overreacted.io/a-social-filesystem/",
                      "$type": "app.offprint.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 59,
                    "byteStart": 47
                  },
                  "features": [
                    {
                      "did": "did:plc:fpruhuo22xkm5o7ttr2ktxdo",
                      "$type": "app.offprint.richtext.facet#mention",
                      "handle": "danabra.mov"
                    }
                  ]
                }
              ],
              "plaintext": "https://overreacted.io/a-social-filesystem/ by @danabra.mov "
            }
          }
        ]
      },
      {
        "$type": "app.offprint.block.horizontalRule"
      },
      {
        "$type": "app.offprint.block.blockquote",
        "content": [
          {
            "$type": "app.offprint.block.text",
            "plaintext": "I have no more patience for platforms. I'm done."
          }
        ]
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Products come and go. This is a truism of the internet. Do not expect any particular service to exist forever, or you will be burned. It can be a depressing thought. So much of our lives are lived online. Communities and culture are created online. The play is performed on stages we call \"social media\". But then they go away."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "We make our homes on these platforms. Set up shop. Scale a business. Connect with our friends. Build a following. Then something changes. A change in corporate strategy. An IPO. A private equity takeover. A merger with AOL. And it's never the same after that. All that work, all that culture, now painted in a different light. Sometimes locked away entirely."
      },
      {
        "$type": "app.offprint.block.heading",
        "level": 1,
        "plaintext": "It doesn't have to be this way"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "We can keep doing this cycle again and again. Invest our time and our lives into a platform. Thrive on it. Watch it die and simply move on to the next thing. It sucks though! Why should I have to leave Twitter if I spent a whole decade cultivating my presence there? Just because some Nazi asshole accidentally bought the thing? "
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Communication tools are like art. When you put art out into the world, the relationship people form with the work is not yours. It belongs to them. The piece takes on a life of its own. The communities people create with a communication tool are theirs. Platforms are rarely good stewards of people's lives, their relationships. And so we feel loss every time the cycle repeats."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Every time we pour our words into someone else's platform, we are creating social debt. Similar to technical debt, this does not incur a cost in the now. The pain is realized later, when the reality that you don't control this space becomes real."
      },
      {
        "$type": "app.offprint.block.heading",
        "level": 1,
        "plaintext": "I own this forever"
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 161,
              "byteStart": 153
            },
            "features": [
              {
                "did": "did:plc:yhb7iggikgckfqfwakk4wygt",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "btrs.co"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 207,
              "byteStart": 194
            },
            "features": [
              {
                "did": "did:plc:pgjkomf37an4czloay5zeth6",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "offprint.app"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 410,
              "byteStart": 392
            },
            "features": [
              {
                "did": "did:plc:3434wfandtk52wlqq4u5g72a",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "selfhosted.social"
              }
            ]
          }
        ],
        "plaintext": "I write to you now on a new kind of place on the internet. This place is mine. Or rather, what I create here is mine. This product (a rather fine one by @btrs.co if I say so myself), belongs to @offprint.app . They might go away. Someday they will. But this, my words, my creation. The human act of creating culture. This is mine. It lives in my personal folder. I keep my personal folder at @selfhosted.social . They will go away someday too, and that's okay. I'll move my folder somewhere else. You'll still be able to read this. Offprint is just an app for reading a certain kind of post I publish to the ATmosphere. When Offprint inevitably dies, hopefully a long time from now, this post will still just be a file in my personal folder. And when that day comes, perhaps even before, there will be other ways to read this file from my personal folder. You can even do so right now."
      },
      {
        "$type": "app.offprint.block.callout",
        "emoji": "🔗",
        "facets": [
          {
            "index": {
              "byteEnd": 27,
              "byteStart": 18
            },
            "features": [
              {
                "uri": "https://pdsls.dev/at://did:plc:6ayddqghxhciedbaofoxkcbs/site.standard.document/3mcsvjjceei23",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "Read this post on PDSls ↗"
      },
      {
        "$type": "app.offprint.block.heading",
        "level": 1,
        "plaintext": "From now on"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "So, yeah. I'm done with platforms. I feel no obligation to invest my energy into a product just for it to be gobbled up and thrown away in a few years, or used to fund activities I personally find repulsive. Not when I have a choice. I choose the open social web. I choose protocols over platforms. I choose protocols, only insofar as they support people. Because again, people create community. Community creates culture. And I choose people over protocols."
      },
      {
        "$type": "app.offprint.block.blockquote",
        "content": [
          {
            "$type": "app.offprint.block.text",
            "plaintext": "People > Protocols > Platforms"
          }
        ]
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 22,
              "byteStart": 18
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 722,
              "byteStart": 710
            },
            "features": [
              {
                "did": "did:plc:ewvi7nxzyoun6zhxrhs64oiz",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "atproto.com"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 972,
              "byteStart": 953
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "I'm a designer. I love a well made product. Between a capable app and a nicer to use but slightly less capable app, I am want to choose the prettier one. But when it comes to my people, my community, I will not pour my life into someone else's platform. Not when so much life has been wasted on platforms which only seek to extract. Not when there is an alternative on the social web. And there are more alternatives every day. Because the social web runs on protocols, there are no gatekeepers. Nobody can say, \"hey don't build that!\". We can just do things. You want to make a little web game? Worried nobody will play it because you might just stop paying the server bills? No problem! Plug your game into  @atproto.com . Let me keep my gameplay data in my folder. Your game may go away, but I'll always have my scores. Have a weird idea for a speculative social VR experience? Put that on the social web and I WILL TRY IT. I have nothing to lose. I won't lose anything, even if you lose everything."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 494,
              "byteStart": 479
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "People are going to keep building platforms. It's what we've done for 20 years. Someday though, people will have few reasons left to build one. Why would anyone invest in your closed, black box, centralized product, when we have something better already. Why would you build from scratch, when millions of people have already formed social graphs, established communities, created culture, on the open web? Anyone can build on that. The tide lifts all boats. The open social web is going to win. Come join me and be a part of it."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 19,
              "byteStart": 4
            },
            "features": [
              {
                "did": "did:plc:6ayddqghxhciedbaofoxkcbs",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "tynanpurdy.com"
              }
            ]
          }
        ],
        "plaintext": "I'm @tynanpurdy.com "
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.horizontalRule"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "If this resonated with you at all, here are some folks to check out."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 15,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:lehcqqkwzcwvjvw66uthu5oq",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "atprotocol.dev"
              }
            ]
          }
        ],
        "plaintext": "@atprotocol.dev "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 12,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:henu2msx3ob4dvht2jqiqvnp",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "anew.social"
              }
            ]
          }
        ],
        "plaintext": "@anew.social "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 14,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:re3ebnp5v7ffagz6rb6xfei4",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "standard.site"
              }
            ]
          }
        ],
        "plaintext": "@standard.site "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 12,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:34isotrs7rzjd3czk44hnkxh",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "surf.social"
              }
            ]
          }
        ],
        "plaintext": "@surf.social "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 28,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:hochc4ppzwv5idi6ypeio7ow",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "modalfoundation.bsky.social"
              }
            ]
          }
        ],
        "plaintext": "@modalfoundation.bsky.social "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 15,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:ooensn4mr5mhznzypvxelfa3",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "eurosky.social"
              }
            ]
          }
        ],
        "plaintext": "@eurosky.social "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 16,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:kta7dqcqoamo5ixlajxbtjps",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "blackskyweb.xyz"
              }
            ]
          }
        ],
        "plaintext": "@blackskyweb.xyz "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 28,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:23cnpffmuf4vkpsnwhgyvljw",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "transrights.northsky.social"
              }
            ]
          }
        ],
        "plaintext": "@transrights.northsky.social "
      }
    ]
  },
  "coverImage": {
    "ref": {
      "$link": "bafkreicaq3ysqjuww4ke2ou4dfkrtan63fbjpvfyx77bnmdon757rmucae"
    },
    "size": 110503,
    "$type": "blob",
    "mimeType": "image/jpeg"
  },
  "description": "Where everything is worth building",
  "publishedAt": "2026-01-19T19:02:19-07:00",
  "textContent": "Suggested pre-reads:\n- https://overreacted.io/open-social/ by @danabra.mov \n- https://overreacted.io/a-social-filesystem/ by @danabra.mov \n\n\n---\n> I have no more patience for platforms. I'm done.\nProducts come and go. This is a truism of the internet. Do not expect any particular service to exist forever, or you will be burned. It can be a depressing thought. So much of our lives are lived online. Communities and culture are created online. The play is performed on stages we call \"social media\". But then they go away.\nWe make our homes on these platforms. Set up shop. Scale a business. Connect with our friends. Build a following. Then something changes. A change in corporate strategy. An IPO. A private equity takeover. A merger with AOL. And it's never the same after that. All that work, all that culture, now painted in a different light. Sometimes locked away entirely.\nIt doesn't have to be this way\nWe can keep doing this cycle again and again. Invest our time and our lives into a platform. Thrive on it. Watch it die and simply move on to the next thing. It sucks though! Why should I have to leave Twitter if I spent a whole decade cultivating my presence there? Just because some Nazi asshole accidentally bought the thing? \nCommunication tools are like art. When you put art out into the world, the relationship people form with the work is not yours. It belongs to them. The piece takes on a life of its own. The communities people create with a communication tool are theirs. Platforms are rarely good stewards of people's lives, their relationships. And so we feel loss every time the cycle repeats.\nEvery time we pour our words into someone else's platform, we are creating social debt. Similar to technical debt, this does not incur a cost in the now. The pain is realized later, when the reality that you don't control this space becomes real.\nI own this forever\nI write to you now on a new kind of place on the internet. This place is mine. Or rather, what I create here is mine. This product (a rather fine one by @btrs.co if I say so myself), belongs to @offprint.app . They might go away. Someday they will. But this, my words, my creation. The human act of creating culture. This is mine. It lives in my personal folder. I keep my personal folder at @selfhosted.social . They will go away someday too, and that's okay. I'll move my folder somewhere else. You'll still be able to read this. Offprint is just an app for reading a certain kind of post I publish to the ATmosphere. When Offprint inevitably dies, hopefully a long time from now, this post will still just be a file in my personal folder. And when that day comes, perhaps even before, there will be other ways to read this file from my personal folder. You can even do so right now.\n🔗 Read this post on PDSls ↗\nFrom now on\nSo, yeah. I'm done with platforms. I feel no obligation to invest my energy into a product just for it to be gobbled up and thrown away in a few years, or used to fund activities I personally find repulsive. Not when I have a choice. I choose the open social web. I choose protocols over platforms. I choose protocols, only insofar as they support people. Because again, people create community. Community creates culture. And I choose people over protocols.\n> People > Protocols > Platforms\nI'm a designer. I love a well made product. Between a capable app and a nicer to use but slightly less capable app, I am want to choose the prettier one. But when it comes to my people, my community, I will not pour my life into someone else's platform. Not when so much life has been wasted on platforms which only seek to extract. Not when there is an alternative on the social web. And there are more alternatives every day. Because the social web runs on protocols, there are no gatekeepers. Nobody can say, \"hey don't build that!\". We can just do things. You want to make a little web game? Worried nobody will play it because you might just stop paying the server bills? No problem! Plug your game into  @atproto.com . Let me keep my gameplay data in my folder. Your game may go away, but I'll always have my scores. Have a weird idea for a speculative social VR experience? Put that on the social web and I WILL TRY IT. I have nothing to lose. I won't lose anything, even if you lose everything.\nPeople are going to keep building platforms. It's what we've done for 20 years. Someday though, people will have few reasons left to build one. Why would anyone invest in your closed, black box, centralized product, when we have something better already. Why would you build from scratch, when millions of people have already formed social graphs, established communities, created culture, on the open web? Anyone can build on that. The tide lifts all boats. The open social web is going to win. Come join me and be a part of it.\nI'm @tynanpurdy.com \n\n\n---\nIf this resonated with you at all, here are some folks to check out.\n@atprotocol.dev \n@anew.social \n@standard.site \n@surf.social \n@modalfoundation.bsky.social \n@eurosky.social \n@blackskyweb.xyz \n@transrights.northsky.social"
}

did:plc:6ayddqghxhciedbaofoxkcbs | at://did:plc:6ayddqghxhciedbaofoxkcbs/site.standard.document/3mcsvjjceei23

app.offprint.block.bulletList (nested within site.standard.document) (1 sample)
{
  "path": "/a/3mcwxrkpmlk23-waow-tech",
  "site": "at://did:plc:xbtmt2zjwlrfegqvch7fboei/site.standard.publication/3mcvirmkby52v",
  "$type": "site.standard.document",
  "title": "waow, tech!",
  "content": {
    "$type": "app.offprint.content",
    "items": [
      {
        "$type": "app.offprint.block.text",
        "plaintext": "over the last 6 months, i've been trying to figure out the best way to elevator pitch atproto to anyone—even people who've never heard of it."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 53,
              "byteStart": 48
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "somehow, my family, friends, and girlfriend are still around!"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 6,
              "byteStart": 3
            },
            "features": [
              {
                "uri": "https://at-me.wisp.place/view/?handle=stream.place",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 236,
              "byteStart": 191
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#bold"
              },
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "my @me demo is fun, but way too jargon-y for my grandma or non-tech friends. it lacks narrative structure and leaves all the punchy bits for people curious enough to click around, instead of smacking viewers in the face with a punchline."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "after many epochs pitching atproto apps to vaguely curious listeners, anecdotally and perhaps counterintuitively: the \"single login\" angle lands harder than data sovereignty."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "maybe because people don't use password managers? or they use their Notes app (which tbf, same sometimes)."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "you can whip folks into a philosophical frenzy about Palantir and surveillance capitalism—\"give data back to the people! yeah!\"—but then they're right back on TikTok and FB marketplace, because it's all abstract when you have to extrapolate from skeets."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "user nonplussed-ness is signal. the coherence and immediacy of the pitch matters as much as the provable benefits of the protocol."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 12,
              "byteStart": 3
            },
            "features": [
              {
                "uri": "https://waow.tech/",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "so waow.tech is my try at a minimum viable manifesto for atproto—capturing the value prop without arcane language or potentially ostracizing premises."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 6,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "goals:"
      },
      {
        "$type": "app.offprint.block.bulletList",
        "children": [
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "\"why care about atproto\" in 5 seconds, for anyone"
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "get people asking \"how could it all be stored in the same place, behind one login?\" (primes them for demos)"
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "showcase apps building good experiences on atproto"
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "eventually: a simple and mobile friendly complement to help build intuition for how atproto offers user choice "
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "eventually: \"your medical records\" and other private-data applications [1]"
            }
          }
        ]
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "not all of these are met to my liking today. i'll keep iterating."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 17,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://tangled.org/zzstoatzz.io/waow.tech/issues/new",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "feedback welcome!"
      },
      {
        "$type": "app.offprint.block.horizontalRule"
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 206,
              "byteStart": 195
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "[1]: two friends in medical professions have independently suggested using atproto for consolidated, private aggregation of medical records. the convenience angle is viscerally clear there—you immediately see why owning your medical data matters, unlike things you already consider public."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      }
    ]
  },
  "coverImage": {
    "ref": {
      "$link": "bafkreif4dtdniukqer7bant5cirdnkkublqw3hfsiroigtmkcxpalzdkxi"
    },
    "size": 83118,
    "$type": "blob",
    "mimeType": "image/png"
  },
  "description": "atproto pitch in 5 seconds",
  "publishedAt": "2026-01-22T01:18:44-07:00",
  "textContent": "over the last 6 months, i've been trying to figure out the best way to elevator pitch atproto to anyone—even people who've never heard of it.\n\n\nsomehow, my family, friends, and girlfriend are still around!\n\nmy @me demo is fun, but way too jargon-y for my grandma or non-tech friends. it lacks narrative structure and leaves all the punchy bits for people curious enough to click around, instead of smacking viewers in the face with a punchline.\nafter many epochs pitching atproto apps to vaguely curious listeners, anecdotally and perhaps counterintuitively: the \"single login\" angle lands harder than data sovereignty.\nmaybe because people don't use password managers? or they use their Notes app (which tbf, same sometimes).\nyou can whip folks into a philosophical frenzy about Palantir and surveillance capitalism—\"give data back to the people! yeah!\"—but then they're right back on TikTok and FB marketplace, because it's all abstract when you have to extrapolate from skeets.\nuser nonplussed-ness is signal. the coherence and immediacy of the pitch matters as much as the provable benefits of the protocol.\nso waow.tech is my try at a minimum viable manifesto for atproto—capturing the value prop without arcane language or potentially ostracizing premises.\ngoals:\n- \"why care about atproto\" in 5 seconds, for anyone\n- get people asking \"how could it all be stored in the same place, behind one login?\" (primes them for demos)\n- showcase apps building good experiences on atproto\n- eventually: a simple and mobile friendly complement to help build intuition for how atproto offers user choice \n- eventually: \"your medical records\" and other private-data applications [1]\n\nnot all of these are met to my liking today. i'll keep iterating.\nfeedback welcome!\n\n---\n[1]: two friends in medical professions have independently suggested using atproto for consolidated, private aggregation of medical records. the convenience angle is viscerally clear there—you immediately see why owning your medical data matters, unlike things you already consider public."
}

did:plc:xbtmt2zjwlrfegqvch7fboei | at://did:plc:xbtmt2zjwlrfegqvch7fboei/site.standard.document/3mcwxrkpmlk23

app.offprint.block.callout (nested within site.standard.document) (1 sample)
{
  "path": "/a/3mcsvjjceei23-publishing-on-the-atmosphere",
  "site": "at://did:plc:6ayddqghxhciedbaofoxkcbs/site.standard.publication/3mcsu4ta72g2t",
  "$type": "site.standard.document",
  "title": "Publishing on the ATmosphere",
  "content": {
    "$type": "app.offprint.content",
    "items": [
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Suggested pre-reads:"
      },
      {
        "$type": "app.offprint.block.bulletList",
        "children": [
          {
            "content": {
              "$type": "app.offprint.block.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 39,
                    "byteStart": 0
                  },
                  "features": [
                    {
                      "uri": "https://overreacted.io/open-social/",
                      "$type": "app.offprint.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 51,
                    "byteStart": 39
                  },
                  "features": [
                    {
                      "did": "did:plc:fpruhuo22xkm5o7ttr2ktxdo",
                      "$type": "app.offprint.richtext.facet#mention",
                      "handle": "danabra.mov"
                    }
                  ]
                }
              ],
              "plaintext": "https://overreacted.io/open-social/ by @danabra.mov "
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 47,
                    "byteStart": 0
                  },
                  "features": [
                    {
                      "uri": "https://overreacted.io/a-social-filesystem/",
                      "$type": "app.offprint.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 59,
                    "byteStart": 47
                  },
                  "features": [
                    {
                      "did": "did:plc:fpruhuo22xkm5o7ttr2ktxdo",
                      "$type": "app.offprint.richtext.facet#mention",
                      "handle": "danabra.mov"
                    }
                  ]
                }
              ],
              "plaintext": "https://overreacted.io/a-social-filesystem/ by @danabra.mov "
            }
          }
        ]
      },
      {
        "$type": "app.offprint.block.horizontalRule"
      },
      {
        "$type": "app.offprint.block.blockquote",
        "content": [
          {
            "$type": "app.offprint.block.text",
            "plaintext": "I have no more patience for platforms. I'm done."
          }
        ]
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Products come and go. This is a truism of the internet. Do not expect any particular service to exist forever, or you will be burned. It can be a depressing thought. So much of our lives are lived online. Communities and culture are created online. The play is performed on stages we call \"social media\". But then they go away."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "We make our homes on these platforms. Set up shop. Scale a business. Connect with our friends. Build a following. Then something changes. A change in corporate strategy. An IPO. A private equity takeover. A merger with AOL. And it's never the same after that. All that work, all that culture, now painted in a different light. Sometimes locked away entirely."
      },
      {
        "$type": "app.offprint.block.heading",
        "level": 1,
        "plaintext": "It doesn't have to be this way"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "We can keep doing this cycle again and again. Invest our time and our lives into a platform. Thrive on it. Watch it die and simply move on to the next thing. It sucks though! Why should I have to leave Twitter if I spent a whole decade cultivating my presence there? Just because some Nazi asshole accidentally bought the thing? "
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Communication tools are like art. When you put art out into the world, the relationship people form with the work is not yours. It belongs to them. The piece takes on a life of its own. The communities people create with a communication tool are theirs. Platforms are rarely good stewards of people's lives, their relationships. And so we feel loss every time the cycle repeats."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Every time we pour our words into someone else's platform, we are creating social debt. Similar to technical debt, this does not incur a cost in the now. The pain is realized later, when the reality that you don't control this space becomes real."
      },
      {
        "$type": "app.offprint.block.heading",
        "level": 1,
        "plaintext": "I own this forever"
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 161,
              "byteStart": 153
            },
            "features": [
              {
                "did": "did:plc:yhb7iggikgckfqfwakk4wygt",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "btrs.co"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 207,
              "byteStart": 194
            },
            "features": [
              {
                "did": "did:plc:pgjkomf37an4czloay5zeth6",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "offprint.app"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 410,
              "byteStart": 392
            },
            "features": [
              {
                "did": "did:plc:3434wfandtk52wlqq4u5g72a",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "selfhosted.social"
              }
            ]
          }
        ],
        "plaintext": "I write to you now on a new kind of place on the internet. This place is mine. Or rather, what I create here is mine. This product (a rather fine one by @btrs.co if I say so myself), belongs to @offprint.app . They might go away. Someday they will. But this, my words, my creation. The human act of creating culture. This is mine. It lives in my personal folder. I keep my personal folder at @selfhosted.social . They will go away someday too, and that's okay. I'll move my folder somewhere else. You'll still be able to read this. Offprint is just an app for reading a certain kind of post I publish to the ATmosphere. When Offprint inevitably dies, hopefully a long time from now, this post will still just be a file in my personal folder. And when that day comes, perhaps even before, there will be other ways to read this file from my personal folder. You can even do so right now."
      },
      {
        "$type": "app.offprint.block.callout",
        "emoji": "🔗",
        "facets": [
          {
            "index": {
              "byteEnd": 27,
              "byteStart": 18
            },
            "features": [
              {
                "uri": "https://pdsls.dev/at://did:plc:6ayddqghxhciedbaofoxkcbs/site.standard.document/3mcsvjjceei23",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "Read this post on PDSls ↗"
      },
      {
        "$type": "app.offprint.block.heading",
        "level": 1,
        "plaintext": "From now on"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "So, yeah. I'm done with platforms. I feel no obligation to invest my energy into a product just for it to be gobbled up and thrown away in a few years, or used to fund activities I personally find repulsive. Not when I have a choice. I choose the open social web. I choose protocols over platforms. I choose protocols, only insofar as they support people. Because again, people create community. Community creates culture. And I choose people over protocols."
      },
      {
        "$type": "app.offprint.block.blockquote",
        "content": [
          {
            "$type": "app.offprint.block.text",
            "plaintext": "People > Protocols > Platforms"
          }
        ]
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 22,
              "byteStart": 18
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 722,
              "byteStart": 710
            },
            "features": [
              {
                "did": "did:plc:ewvi7nxzyoun6zhxrhs64oiz",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "atproto.com"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 972,
              "byteStart": 953
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "I'm a designer. I love a well made product. Between a capable app and a nicer to use but slightly less capable app, I am want to choose the prettier one. But when it comes to my people, my community, I will not pour my life into someone else's platform. Not when so much life has been wasted on platforms which only seek to extract. Not when there is an alternative on the social web. And there are more alternatives every day. Because the social web runs on protocols, there are no gatekeepers. Nobody can say, \"hey don't build that!\". We can just do things. You want to make a little web game? Worried nobody will play it because you might just stop paying the server bills? No problem! Plug your game into  @atproto.com . Let me keep my gameplay data in my folder. Your game may go away, but I'll always have my scores. Have a weird idea for a speculative social VR experience? Put that on the social web and I WILL TRY IT. I have nothing to lose. I won't lose anything, even if you lose everything."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 494,
              "byteStart": 479
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "People are going to keep building platforms. It's what we've done for 20 years. Someday though, people will have few reasons left to build one. Why would anyone invest in your closed, black box, centralized product, when we have something better already. Why would you build from scratch, when millions of people have already formed social graphs, established communities, created culture, on the open web? Anyone can build on that. The tide lifts all boats. The open social web is going to win. Come join me and be a part of it."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 19,
              "byteStart": 4
            },
            "features": [
              {
                "did": "did:plc:6ayddqghxhciedbaofoxkcbs",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "tynanpurdy.com"
              }
            ]
          }
        ],
        "plaintext": "I'm @tynanpurdy.com "
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.horizontalRule"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "If this resonated with you at all, here are some folks to check out."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 15,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:lehcqqkwzcwvjvw66uthu5oq",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "atprotocol.dev"
              }
            ]
          }
        ],
        "plaintext": "@atprotocol.dev "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 12,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:henu2msx3ob4dvht2jqiqvnp",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "anew.social"
              }
            ]
          }
        ],
        "plaintext": "@anew.social "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 14,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:re3ebnp5v7ffagz6rb6xfei4",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "standard.site"
              }
            ]
          }
        ],
        "plaintext": "@standard.site "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 12,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:34isotrs7rzjd3czk44hnkxh",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "surf.social"
              }
            ]
          }
        ],
        "plaintext": "@surf.social "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 28,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:hochc4ppzwv5idi6ypeio7ow",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "modalfoundation.bsky.social"
              }
            ]
          }
        ],
        "plaintext": "@modalfoundation.bsky.social "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 15,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:ooensn4mr5mhznzypvxelfa3",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "eurosky.social"
              }
            ]
          }
        ],
        "plaintext": "@eurosky.social "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 16,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:kta7dqcqoamo5ixlajxbtjps",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "blackskyweb.xyz"
              }
            ]
          }
        ],
        "plaintext": "@blackskyweb.xyz "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 28,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:23cnpffmuf4vkpsnwhgyvljw",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "transrights.northsky.social"
              }
            ]
          }
        ],
        "plaintext": "@transrights.northsky.social "
      }
    ]
  },
  "coverImage": {
    "ref": {
      "$link": "bafkreicaq3ysqjuww4ke2ou4dfkrtan63fbjpvfyx77bnmdon757rmucae"
    },
    "size": 110503,
    "$type": "blob",
    "mimeType": "image/jpeg"
  },
  "description": "Where everything is worth building",
  "publishedAt": "2026-01-19T19:02:19-07:00",
  "textContent": "Suggested pre-reads:\n- https://overreacted.io/open-social/ by @danabra.mov \n- https://overreacted.io/a-social-filesystem/ by @danabra.mov \n\n\n---\n> I have no more patience for platforms. I'm done.\nProducts come and go. This is a truism of the internet. Do not expect any particular service to exist forever, or you will be burned. It can be a depressing thought. So much of our lives are lived online. Communities and culture are created online. The play is performed on stages we call \"social media\". But then they go away.\nWe make our homes on these platforms. Set up shop. Scale a business. Connect with our friends. Build a following. Then something changes. A change in corporate strategy. An IPO. A private equity takeover. A merger with AOL. And it's never the same after that. All that work, all that culture, now painted in a different light. Sometimes locked away entirely.\nIt doesn't have to be this way\nWe can keep doing this cycle again and again. Invest our time and our lives into a platform. Thrive on it. Watch it die and simply move on to the next thing. It sucks though! Why should I have to leave Twitter if I spent a whole decade cultivating my presence there? Just because some Nazi asshole accidentally bought the thing? \nCommunication tools are like art. When you put art out into the world, the relationship people form with the work is not yours. It belongs to them. The piece takes on a life of its own. The communities people create with a communication tool are theirs. Platforms are rarely good stewards of people's lives, their relationships. And so we feel loss every time the cycle repeats.\nEvery time we pour our words into someone else's platform, we are creating social debt. Similar to technical debt, this does not incur a cost in the now. The pain is realized later, when the reality that you don't control this space becomes real.\nI own this forever\nI write to you now on a new kind of place on the internet. This place is mine. Or rather, what I create here is mine. This product (a rather fine one by @btrs.co if I say so myself), belongs to @offprint.app . They might go away. Someday they will. But this, my words, my creation. The human act of creating culture. This is mine. It lives in my personal folder. I keep my personal folder at @selfhosted.social . They will go away someday too, and that's okay. I'll move my folder somewhere else. You'll still be able to read this. Offprint is just an app for reading a certain kind of post I publish to the ATmosphere. When Offprint inevitably dies, hopefully a long time from now, this post will still just be a file in my personal folder. And when that day comes, perhaps even before, there will be other ways to read this file from my personal folder. You can even do so right now.\n🔗 Read this post on PDSls ↗\nFrom now on\nSo, yeah. I'm done with platforms. I feel no obligation to invest my energy into a product just for it to be gobbled up and thrown away in a few years, or used to fund activities I personally find repulsive. Not when I have a choice. I choose the open social web. I choose protocols over platforms. I choose protocols, only insofar as they support people. Because again, people create community. Community creates culture. And I choose people over protocols.\n> People > Protocols > Platforms\nI'm a designer. I love a well made product. Between a capable app and a nicer to use but slightly less capable app, I am want to choose the prettier one. But when it comes to my people, my community, I will not pour my life into someone else's platform. Not when so much life has been wasted on platforms which only seek to extract. Not when there is an alternative on the social web. And there are more alternatives every day. Because the social web runs on protocols, there are no gatekeepers. Nobody can say, \"hey don't build that!\". We can just do things. You want to make a little web game? Worried nobody will play it because you might just stop paying the server bills? No problem! Plug your game into  @atproto.com . Let me keep my gameplay data in my folder. Your game may go away, but I'll always have my scores. Have a weird idea for a speculative social VR experience? Put that on the social web and I WILL TRY IT. I have nothing to lose. I won't lose anything, even if you lose everything.\nPeople are going to keep building platforms. It's what we've done for 20 years. Someday though, people will have few reasons left to build one. Why would anyone invest in your closed, black box, centralized product, when we have something better already. Why would you build from scratch, when millions of people have already formed social graphs, established communities, created culture, on the open web? Anyone can build on that. The tide lifts all boats. The open social web is going to win. Come join me and be a part of it.\nI'm @tynanpurdy.com \n\n\n---\nIf this resonated with you at all, here are some folks to check out.\n@atprotocol.dev \n@anew.social \n@standard.site \n@surf.social \n@modalfoundation.bsky.social \n@eurosky.social \n@blackskyweb.xyz \n@transrights.northsky.social"
}

did:plc:6ayddqghxhciedbaofoxkcbs | at://did:plc:6ayddqghxhciedbaofoxkcbs/site.standard.document/3mcsvjjceei23

app.offprint.block.heading (nested within site.standard.document) (1 sample)
{
  "path": "/a/3mcsvjjceei23-publishing-on-the-atmosphere",
  "site": "at://did:plc:6ayddqghxhciedbaofoxkcbs/site.standard.publication/3mcsu4ta72g2t",
  "$type": "site.standard.document",
  "title": "Publishing on the ATmosphere",
  "content": {
    "$type": "app.offprint.content",
    "items": [
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Suggested pre-reads:"
      },
      {
        "$type": "app.offprint.block.bulletList",
        "children": [
          {
            "content": {
              "$type": "app.offprint.block.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 39,
                    "byteStart": 0
                  },
                  "features": [
                    {
                      "uri": "https://overreacted.io/open-social/",
                      "$type": "app.offprint.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 51,
                    "byteStart": 39
                  },
                  "features": [
                    {
                      "did": "did:plc:fpruhuo22xkm5o7ttr2ktxdo",
                      "$type": "app.offprint.richtext.facet#mention",
                      "handle": "danabra.mov"
                    }
                  ]
                }
              ],
              "plaintext": "https://overreacted.io/open-social/ by @danabra.mov "
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 47,
                    "byteStart": 0
                  },
                  "features": [
                    {
                      "uri": "https://overreacted.io/a-social-filesystem/",
                      "$type": "app.offprint.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 59,
                    "byteStart": 47
                  },
                  "features": [
                    {
                      "did": "did:plc:fpruhuo22xkm5o7ttr2ktxdo",
                      "$type": "app.offprint.richtext.facet#mention",
                      "handle": "danabra.mov"
                    }
                  ]
                }
              ],
              "plaintext": "https://overreacted.io/a-social-filesystem/ by @danabra.mov "
            }
          }
        ]
      },
      {
        "$type": "app.offprint.block.horizontalRule"
      },
      {
        "$type": "app.offprint.block.blockquote",
        "content": [
          {
            "$type": "app.offprint.block.text",
            "plaintext": "I have no more patience for platforms. I'm done."
          }
        ]
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Products come and go. This is a truism of the internet. Do not expect any particular service to exist forever, or you will be burned. It can be a depressing thought. So much of our lives are lived online. Communities and culture are created online. The play is performed on stages we call \"social media\". But then they go away."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "We make our homes on these platforms. Set up shop. Scale a business. Connect with our friends. Build a following. Then something changes. A change in corporate strategy. An IPO. A private equity takeover. A merger with AOL. And it's never the same after that. All that work, all that culture, now painted in a different light. Sometimes locked away entirely."
      },
      {
        "$type": "app.offprint.block.heading",
        "level": 1,
        "plaintext": "It doesn't have to be this way"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "We can keep doing this cycle again and again. Invest our time and our lives into a platform. Thrive on it. Watch it die and simply move on to the next thing. It sucks though! Why should I have to leave Twitter if I spent a whole decade cultivating my presence there? Just because some Nazi asshole accidentally bought the thing? "
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Communication tools are like art. When you put art out into the world, the relationship people form with the work is not yours. It belongs to them. The piece takes on a life of its own. The communities people create with a communication tool are theirs. Platforms are rarely good stewards of people's lives, their relationships. And so we feel loss every time the cycle repeats."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Every time we pour our words into someone else's platform, we are creating social debt. Similar to technical debt, this does not incur a cost in the now. The pain is realized later, when the reality that you don't control this space becomes real."
      },
      {
        "$type": "app.offprint.block.heading",
        "level": 1,
        "plaintext": "I own this forever"
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 161,
              "byteStart": 153
            },
            "features": [
              {
                "did": "did:plc:yhb7iggikgckfqfwakk4wygt",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "btrs.co"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 207,
              "byteStart": 194
            },
            "features": [
              {
                "did": "did:plc:pgjkomf37an4czloay5zeth6",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "offprint.app"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 410,
              "byteStart": 392
            },
            "features": [
              {
                "did": "did:plc:3434wfandtk52wlqq4u5g72a",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "selfhosted.social"
              }
            ]
          }
        ],
        "plaintext": "I write to you now on a new kind of place on the internet. This place is mine. Or rather, what I create here is mine. This product (a rather fine one by @btrs.co if I say so myself), belongs to @offprint.app . They might go away. Someday they will. But this, my words, my creation. The human act of creating culture. This is mine. It lives in my personal folder. I keep my personal folder at @selfhosted.social . They will go away someday too, and that's okay. I'll move my folder somewhere else. You'll still be able to read this. Offprint is just an app for reading a certain kind of post I publish to the ATmosphere. When Offprint inevitably dies, hopefully a long time from now, this post will still just be a file in my personal folder. And when that day comes, perhaps even before, there will be other ways to read this file from my personal folder. You can even do so right now."
      },
      {
        "$type": "app.offprint.block.callout",
        "emoji": "🔗",
        "facets": [
          {
            "index": {
              "byteEnd": 27,
              "byteStart": 18
            },
            "features": [
              {
                "uri": "https://pdsls.dev/at://did:plc:6ayddqghxhciedbaofoxkcbs/site.standard.document/3mcsvjjceei23",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "Read this post on PDSls ↗"
      },
      {
        "$type": "app.offprint.block.heading",
        "level": 1,
        "plaintext": "From now on"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "So, yeah. I'm done with platforms. I feel no obligation to invest my energy into a product just for it to be gobbled up and thrown away in a few years, or used to fund activities I personally find repulsive. Not when I have a choice. I choose the open social web. I choose protocols over platforms. I choose protocols, only insofar as they support people. Because again, people create community. Community creates culture. And I choose people over protocols."
      },
      {
        "$type": "app.offprint.block.blockquote",
        "content": [
          {
            "$type": "app.offprint.block.text",
            "plaintext": "People > Protocols > Platforms"
          }
        ]
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 22,
              "byteStart": 18
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 722,
              "byteStart": 710
            },
            "features": [
              {
                "did": "did:plc:ewvi7nxzyoun6zhxrhs64oiz",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "atproto.com"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 972,
              "byteStart": 953
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "I'm a designer. I love a well made product. Between a capable app and a nicer to use but slightly less capable app, I am want to choose the prettier one. But when it comes to my people, my community, I will not pour my life into someone else's platform. Not when so much life has been wasted on platforms which only seek to extract. Not when there is an alternative on the social web. And there are more alternatives every day. Because the social web runs on protocols, there are no gatekeepers. Nobody can say, \"hey don't build that!\". We can just do things. You want to make a little web game? Worried nobody will play it because you might just stop paying the server bills? No problem! Plug your game into  @atproto.com . Let me keep my gameplay data in my folder. Your game may go away, but I'll always have my scores. Have a weird idea for a speculative social VR experience? Put that on the social web and I WILL TRY IT. I have nothing to lose. I won't lose anything, even if you lose everything."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 494,
              "byteStart": 479
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "People are going to keep building platforms. It's what we've done for 20 years. Someday though, people will have few reasons left to build one. Why would anyone invest in your closed, black box, centralized product, when we have something better already. Why would you build from scratch, when millions of people have already formed social graphs, established communities, created culture, on the open web? Anyone can build on that. The tide lifts all boats. The open social web is going to win. Come join me and be a part of it."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 19,
              "byteStart": 4
            },
            "features": [
              {
                "did": "did:plc:6ayddqghxhciedbaofoxkcbs",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "tynanpurdy.com"
              }
            ]
          }
        ],
        "plaintext": "I'm @tynanpurdy.com "
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.horizontalRule"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "If this resonated with you at all, here are some folks to check out."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 15,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:lehcqqkwzcwvjvw66uthu5oq",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "atprotocol.dev"
              }
            ]
          }
        ],
        "plaintext": "@atprotocol.dev "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 12,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:henu2msx3ob4dvht2jqiqvnp",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "anew.social"
              }
            ]
          }
        ],
        "plaintext": "@anew.social "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 14,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:re3ebnp5v7ffagz6rb6xfei4",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "standard.site"
              }
            ]
          }
        ],
        "plaintext": "@standard.site "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 12,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:34isotrs7rzjd3czk44hnkxh",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "surf.social"
              }
            ]
          }
        ],
        "plaintext": "@surf.social "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 28,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:hochc4ppzwv5idi6ypeio7ow",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "modalfoundation.bsky.social"
              }
            ]
          }
        ],
        "plaintext": "@modalfoundation.bsky.social "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 15,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:ooensn4mr5mhznzypvxelfa3",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "eurosky.social"
              }
            ]
          }
        ],
        "plaintext": "@eurosky.social "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 16,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:kta7dqcqoamo5ixlajxbtjps",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "blackskyweb.xyz"
              }
            ]
          }
        ],
        "plaintext": "@blackskyweb.xyz "
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 28,
              "byteStart": 0
            },
            "features": [
              {
                "did": "did:plc:23cnpffmuf4vkpsnwhgyvljw",
                "$type": "app.offprint.richtext.facet#mention",
                "handle": "transrights.northsky.social"
              }
            ]
          }
        ],
        "plaintext": "@transrights.northsky.social "
      }
    ]
  },
  "coverImage": {
    "ref": {
      "$link": "bafkreicaq3ysqjuww4ke2ou4dfkrtan63fbjpvfyx77bnmdon757rmucae"
    },
    "size": 110503,
    "$type": "blob",
    "mimeType": "image/jpeg"
  },
  "description": "Where everything is worth building",
  "publishedAt": "2026-01-19T19:02:19-07:00",
  "textContent": "Suggested pre-reads:\n- https://overreacted.io/open-social/ by @danabra.mov \n- https://overreacted.io/a-social-filesystem/ by @danabra.mov \n\n\n---\n> I have no more patience for platforms. I'm done.\nProducts come and go. This is a truism of the internet. Do not expect any particular service to exist forever, or you will be burned. It can be a depressing thought. So much of our lives are lived online. Communities and culture are created online. The play is performed on stages we call \"social media\". But then they go away.\nWe make our homes on these platforms. Set up shop. Scale a business. Connect with our friends. Build a following. Then something changes. A change in corporate strategy. An IPO. A private equity takeover. A merger with AOL. And it's never the same after that. All that work, all that culture, now painted in a different light. Sometimes locked away entirely.\nIt doesn't have to be this way\nWe can keep doing this cycle again and again. Invest our time and our lives into a platform. Thrive on it. Watch it die and simply move on to the next thing. It sucks though! Why should I have to leave Twitter if I spent a whole decade cultivating my presence there? Just because some Nazi asshole accidentally bought the thing? \nCommunication tools are like art. When you put art out into the world, the relationship people form with the work is not yours. It belongs to them. The piece takes on a life of its own. The communities people create with a communication tool are theirs. Platforms are rarely good stewards of people's lives, their relationships. And so we feel loss every time the cycle repeats.\nEvery time we pour our words into someone else's platform, we are creating social debt. Similar to technical debt, this does not incur a cost in the now. The pain is realized later, when the reality that you don't control this space becomes real.\nI own this forever\nI write to you now on a new kind of place on the internet. This place is mine. Or rather, what I create here is mine. This product (a rather fine one by @btrs.co if I say so myself), belongs to @offprint.app . They might go away. Someday they will. But this, my words, my creation. The human act of creating culture. This is mine. It lives in my personal folder. I keep my personal folder at @selfhosted.social . They will go away someday too, and that's okay. I'll move my folder somewhere else. You'll still be able to read this. Offprint is just an app for reading a certain kind of post I publish to the ATmosphere. When Offprint inevitably dies, hopefully a long time from now, this post will still just be a file in my personal folder. And when that day comes, perhaps even before, there will be other ways to read this file from my personal folder. You can even do so right now.\n🔗 Read this post on PDSls ↗\nFrom now on\nSo, yeah. I'm done with platforms. I feel no obligation to invest my energy into a product just for it to be gobbled up and thrown away in a few years, or used to fund activities I personally find repulsive. Not when I have a choice. I choose the open social web. I choose protocols over platforms. I choose protocols, only insofar as they support people. Because again, people create community. Community creates culture. And I choose people over protocols.\n> People > Protocols > Platforms\nI'm a designer. I love a well made product. Between a capable app and a nicer to use but slightly less capable app, I am want to choose the prettier one. But when it comes to my people, my community, I will not pour my life into someone else's platform. Not when so much life has been wasted on platforms which only seek to extract. Not when there is an alternative on the social web. And there are more alternatives every day. Because the social web runs on protocols, there are no gatekeepers. Nobody can say, \"hey don't build that!\". We can just do things. You want to make a little web game? Worried nobody will play it because you might just stop paying the server bills? No problem! Plug your game into  @atproto.com . Let me keep my gameplay data in my folder. Your game may go away, but I'll always have my scores. Have a weird idea for a speculative social VR experience? Put that on the social web and I WILL TRY IT. I have nothing to lose. I won't lose anything, even if you lose everything.\nPeople are going to keep building platforms. It's what we've done for 20 years. Someday though, people will have few reasons left to build one. Why would anyone invest in your closed, black box, centralized product, when we have something better already. Why would you build from scratch, when millions of people have already formed social graphs, established communities, created culture, on the open web? Anyone can build on that. The tide lifts all boats. The open social web is going to win. Come join me and be a part of it.\nI'm @tynanpurdy.com \n\n\n---\nIf this resonated with you at all, here are some folks to check out.\n@atprotocol.dev \n@anew.social \n@standard.site \n@surf.social \n@modalfoundation.bsky.social \n@eurosky.social \n@blackskyweb.xyz \n@transrights.northsky.social"
}

did:plc:6ayddqghxhciedbaofoxkcbs | at://did:plc:6ayddqghxhciedbaofoxkcbs/site.standard.document/3mcsvjjceei23

app.offprint.block.horizontalRule (nested within site.standard.document) (1 sample)
{
  "path": "/a/3mcwxrkpmlk23-waow-tech",
  "site": "at://did:plc:xbtmt2zjwlrfegqvch7fboei/site.standard.publication/3mcvirmkby52v",
  "$type": "site.standard.document",
  "title": "waow, tech!",
  "content": {
    "$type": "app.offprint.content",
    "items": [
      {
        "$type": "app.offprint.block.text",
        "plaintext": "over the last 6 months, i've been trying to figure out the best way to elevator pitch atproto to anyone—even people who've never heard of it."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 53,
              "byteStart": 48
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "somehow, my family, friends, and girlfriend are still around!"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 6,
              "byteStart": 3
            },
            "features": [
              {
                "uri": "https://at-me.wisp.place/view/?handle=stream.place",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 236,
              "byteStart": 191
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#bold"
              },
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "my @me demo is fun, but way too jargon-y for my grandma or non-tech friends. it lacks narrative structure and leaves all the punchy bits for people curious enough to click around, instead of smacking viewers in the face with a punchline."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "after many epochs pitching atproto apps to vaguely curious listeners, anecdotally and perhaps counterintuitively: the \"single login\" angle lands harder than data sovereignty."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "maybe because people don't use password managers? or they use their Notes app (which tbf, same sometimes)."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "you can whip folks into a philosophical frenzy about Palantir and surveillance capitalism—\"give data back to the people! yeah!\"—but then they're right back on TikTok and FB marketplace, because it's all abstract when you have to extrapolate from skeets."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "user nonplussed-ness is signal. the coherence and immediacy of the pitch matters as much as the provable benefits of the protocol."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 12,
              "byteStart": 3
            },
            "features": [
              {
                "uri": "https://waow.tech/",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "so waow.tech is my try at a minimum viable manifesto for atproto—capturing the value prop without arcane language or potentially ostracizing premises."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 6,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "goals:"
      },
      {
        "$type": "app.offprint.block.bulletList",
        "children": [
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "\"why care about atproto\" in 5 seconds, for anyone"
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "get people asking \"how could it all be stored in the same place, behind one login?\" (primes them for demos)"
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "showcase apps building good experiences on atproto"
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "eventually: a simple and mobile friendly complement to help build intuition for how atproto offers user choice "
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "eventually: \"your medical records\" and other private-data applications [1]"
            }
          }
        ]
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "not all of these are met to my liking today. i'll keep iterating."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 17,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://tangled.org/zzstoatzz.io/waow.tech/issues/new",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "feedback welcome!"
      },
      {
        "$type": "app.offprint.block.horizontalRule"
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 206,
              "byteStart": 195
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "[1]: two friends in medical professions have independently suggested using atproto for consolidated, private aggregation of medical records. the convenience angle is viscerally clear there—you immediately see why owning your medical data matters, unlike things you already consider public."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      }
    ]
  },
  "coverImage": {
    "ref": {
      "$link": "bafkreif4dtdniukqer7bant5cirdnkkublqw3hfsiroigtmkcxpalzdkxi"
    },
    "size": 83118,
    "$type": "blob",
    "mimeType": "image/png"
  },
  "description": "atproto pitch in 5 seconds",
  "publishedAt": "2026-01-22T01:18:44-07:00",
  "textContent": "over the last 6 months, i've been trying to figure out the best way to elevator pitch atproto to anyone—even people who've never heard of it.\n\n\nsomehow, my family, friends, and girlfriend are still around!\n\nmy @me demo is fun, but way too jargon-y for my grandma or non-tech friends. it lacks narrative structure and leaves all the punchy bits for people curious enough to click around, instead of smacking viewers in the face with a punchline.\nafter many epochs pitching atproto apps to vaguely curious listeners, anecdotally and perhaps counterintuitively: the \"single login\" angle lands harder than data sovereignty.\nmaybe because people don't use password managers? or they use their Notes app (which tbf, same sometimes).\nyou can whip folks into a philosophical frenzy about Palantir and surveillance capitalism—\"give data back to the people! yeah!\"—but then they're right back on TikTok and FB marketplace, because it's all abstract when you have to extrapolate from skeets.\nuser nonplussed-ness is signal. the coherence and immediacy of the pitch matters as much as the provable benefits of the protocol.\nso waow.tech is my try at a minimum viable manifesto for atproto—capturing the value prop without arcane language or potentially ostracizing premises.\ngoals:\n- \"why care about atproto\" in 5 seconds, for anyone\n- get people asking \"how could it all be stored in the same place, behind one login?\" (primes them for demos)\n- showcase apps building good experiences on atproto\n- eventually: a simple and mobile friendly complement to help build intuition for how atproto offers user choice \n- eventually: \"your medical records\" and other private-data applications [1]\n\nnot all of these are met to my liking today. i'll keep iterating.\nfeedback welcome!\n\n---\n[1]: two friends in medical professions have independently suggested using atproto for consolidated, private aggregation of medical records. the convenience angle is viscerally clear there—you immediately see why owning your medical data matters, unlike things you already consider public."
}

did:plc:xbtmt2zjwlrfegqvch7fboei | at://did:plc:xbtmt2zjwlrfegqvch7fboei/site.standard.document/3mcwxrkpmlk23

app.offprint.block.text (nested within site.standard.document) (2 samples)
{
  "path": "/a/3mcwxrkpmlk23-waow-tech",
  "site": "at://did:plc:xbtmt2zjwlrfegqvch7fboei/site.standard.publication/3mcvirmkby52v",
  "$type": "site.standard.document",
  "title": "waow, tech!",
  "content": {
    "$type": "app.offprint.content",
    "items": [
      {
        "$type": "app.offprint.block.text",
        "plaintext": "over the last 6 months, i've been trying to figure out the best way to elevator pitch atproto to anyone—even people who've never heard of it."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 53,
              "byteStart": 48
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "somehow, my family, friends, and girlfriend are still around!"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 6,
              "byteStart": 3
            },
            "features": [
              {
                "uri": "https://at-me.wisp.place/view/?handle=stream.place",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 236,
              "byteStart": 191
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#bold"
              },
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "my @me demo is fun, but way too jargon-y for my grandma or non-tech friends. it lacks narrative structure and leaves all the punchy bits for people curious enough to click around, instead of smacking viewers in the face with a punchline."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "after many epochs pitching atproto apps to vaguely curious listeners, anecdotally and perhaps counterintuitively: the \"single login\" angle lands harder than data sovereignty."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "maybe because people don't use password managers? or they use their Notes app (which tbf, same sometimes)."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "you can whip folks into a philosophical frenzy about Palantir and surveillance capitalism—\"give data back to the people! yeah!\"—but then they're right back on TikTok and FB marketplace, because it's all abstract when you have to extrapolate from skeets."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "user nonplussed-ness is signal. the coherence and immediacy of the pitch matters as much as the provable benefits of the protocol."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 12,
              "byteStart": 3
            },
            "features": [
              {
                "uri": "https://waow.tech/",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "so waow.tech is my try at a minimum viable manifesto for atproto—capturing the value prop without arcane language or potentially ostracizing premises."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 6,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "goals:"
      },
      {
        "$type": "app.offprint.block.bulletList",
        "children": [
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "\"why care about atproto\" in 5 seconds, for anyone"
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "get people asking \"how could it all be stored in the same place, behind one login?\" (primes them for demos)"
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "showcase apps building good experiences on atproto"
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "eventually: a simple and mobile friendly complement to help build intuition for how atproto offers user choice "
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "eventually: \"your medical records\" and other private-data applications [1]"
            }
          }
        ]
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "not all of these are met to my liking today. i'll keep iterating."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 17,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://tangled.org/zzstoatzz.io/waow.tech/issues/new",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "feedback welcome!"
      },
      {
        "$type": "app.offprint.block.horizontalRule"
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 206,
              "byteStart": 195
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "[1]: two friends in medical professions have independently suggested using atproto for consolidated, private aggregation of medical records. the convenience angle is viscerally clear there—you immediately see why owning your medical data matters, unlike things you already consider public."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      }
    ]
  },
  "coverImage": {
    "ref": {
      "$link": "bafkreif4dtdniukqer7bant5cirdnkkublqw3hfsiroigtmkcxpalzdkxi"
    },
    "size": 83118,
    "$type": "blob",
    "mimeType": "image/png"
  },
  "description": "atproto pitch in 5 seconds",
  "publishedAt": "2026-01-22T01:18:44-07:00",
  "textContent": "over the last 6 months, i've been trying to figure out the best way to elevator pitch atproto to anyone—even people who've never heard of it.\n\n\nsomehow, my family, friends, and girlfriend are still around!\n\nmy @me demo is fun, but way too jargon-y for my grandma or non-tech friends. it lacks narrative structure and leaves all the punchy bits for people curious enough to click around, instead of smacking viewers in the face with a punchline.\nafter many epochs pitching atproto apps to vaguely curious listeners, anecdotally and perhaps counterintuitively: the \"single login\" angle lands harder than data sovereignty.\nmaybe because people don't use password managers? or they use their Notes app (which tbf, same sometimes).\nyou can whip folks into a philosophical frenzy about Palantir and surveillance capitalism—\"give data back to the people! yeah!\"—but then they're right back on TikTok and FB marketplace, because it's all abstract when you have to extrapolate from skeets.\nuser nonplussed-ness is signal. the coherence and immediacy of the pitch matters as much as the provable benefits of the protocol.\nso waow.tech is my try at a minimum viable manifesto for atproto—capturing the value prop without arcane language or potentially ostracizing premises.\ngoals:\n- \"why care about atproto\" in 5 seconds, for anyone\n- get people asking \"how could it all be stored in the same place, behind one login?\" (primes them for demos)\n- showcase apps building good experiences on atproto\n- eventually: a simple and mobile friendly complement to help build intuition for how atproto offers user choice \n- eventually: \"your medical records\" and other private-data applications [1]\n\nnot all of these are met to my liking today. i'll keep iterating.\nfeedback welcome!\n\n---\n[1]: two friends in medical professions have independently suggested using atproto for consolidated, private aggregation of medical records. the convenience angle is viscerally clear there—you immediately see why owning your medical data matters, unlike things you already consider public."
}

did:plc:xbtmt2zjwlrfegqvch7fboei | at://did:plc:xbtmt2zjwlrfegqvch7fboei/site.standard.document/3mcwxrkpmlk23

app.offprint.block.webBookmark (nested within site.standard.document) (1 sample)
{
  "path": "/a/3melamcro7t23-2026-02-11",
  "site": "at://did:plc:ukgwapa3bceculh4cobcopg3/site.standard.publication/3mdzosfmvf22x",
  "$type": "site.standard.document",
  "title": "2026-02-11",
  "content": {
    "$type": "app.offprint.content",
    "items": [
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 5,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://aylur.github.io/astal/",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 20,
              "byteStart": 10
            },
            "features": [
              {
                "uri": "https://quickshell.org/",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "Astal and Quickshell are wrappers around GTK and QT intended for making desktop widgets. Unlike awesomewm's widgets or custom rofis before they are notable for allowing you to create anything that is possible with their respective GUI toolkit. This seems unexplored as a type of software, both in general and within the atmosphere."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 125,
              "byteStart": 122
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "Today much of what most ricers use these frameworks to create is still Bar with Clock or small tweaks to a premade setup. But if you take the code out of their ~/.config directories and squint little, what you see is much larger than a \"script\", yet far too loose to be called an app. There's bindings to system details such as volume, battery, bluetooth. These usually have less indirection than a script calling bluetoothctl while user code is remains high level (ags, part of Astal is tsx and quickshell is qml). I regularly see complete JS newbies pick up AGS, just to make their shells. People share pics of their setups in code snippets more often than github links."
      },
      {
        "$type": "app.offprint.block.blockquote",
        "content": [
          {
            "$type": "app.offprint.block.text",
            "plaintext": "I guess the main task of any such framework is just to trick the user into thinking that they're just doing some config, rather than, well, writing code... because if you just think you're able to just write code,  might as well just use GTK directly 😛\n- Elkowar from eww (elkowar's wacky widgets)"
          }
        ]
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Where am I going with this? Not exactly sure. Somewhere close to this. "
      },
      {
        "href": "https://deer.social/profile/did:plc:e5zplwgiznavptdxhx5n2zlp/post/3m6sdhwtonk2i",
        "$type": "app.offprint.block.webBookmark",
        "title": "Pieter Montoulieu (@montoulieu.dev)",
        "siteName": "deer.social",
        "description": "I've had this idea for a while, but what if you built a desktop UI on top of atproto data... and what if that UI looked cyberpunk AF?\n\nHere's a first look at Aether OS, a desktop-like interface with  system and lexicon apps powered by your data."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 70,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "at://did:plc:e5zplwgiznavptdxhx5n2zlp/app.bsky.feed.post/3m6sdhwtonk2i",
                "$type": "app.offprint.richtext.facet#link"
              },
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "at://did:plc:e5zplwgiznavptdxhx5n2zlp/app.bsky.feed.post/3m6sdhwtonk2i"
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 146,
              "byteStart": 120
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 164,
              "byteStart": 159
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#strikethrough"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 383,
              "byteStart": 366
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#code"
              }
            ]
          }
        ],
        "plaintext": "However in light of the widget frameworks just discussed, I cannot help but wonder if it could be more. Looking at the \"Atmosphere as a Filesystem\", I ask why can't don't I do unixy things with the data. An important detail I glossed over earlier was the difference between astal and ags. Astal is a set of libraries to bind system information. For example it turns cat /proc/meminfo into GTK's approximation of a derived signal. This is usable to any GTK app. AGS is an independent thing, useful for writing gtk apps with typescript. It can use libraries like Astal. This setup is the result of 3 major revisions."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 511,
              "byteStart": 500
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "For the atmosphere, where do I mount it to a directory, get a regular notification for replies, or sync my real daily notes to this publication? Reading a pds is straight forward GET request in most places. Atprotocol FUSE pushes that a bit farther. What's missing? Connecting it to signals? Widget frameworks? Light GUI options? Answers will vary depending on your current OS. But they can be simpler if we stay away from Serious Application Development with Mass Distribution, just harmless little (malleable) widgets. "
      }
    ]
  },
  "publishedAt": "2026-02-11T05:20:55-07:00",
  "textContent": "Astal and Quickshell are wrappers around GTK and QT intended for making desktop widgets. Unlike awesomewm's widgets or custom rofis before they are notable for allowing you to create anything that is possible with their respective GUI toolkit. This seems unexplored as a type of software, both in general and within the atmosphere.\nToday much of what most ricers use these frameworks to create is still Bar with Clock or small tweaks to a premade setup. But if you take the code out of their ~/.config directories and squint little, what you see is much larger than a \"script\", yet far too loose to be called an app. There's bindings to system details such as volume, battery, bluetooth. These usually have less indirection than a script calling bluetoothctl while user code is remains high level (ags, part of Astal is tsx and quickshell is qml). I regularly see complete JS newbies pick up AGS, just to make their shells. People share pics of their setups in code snippets more often than github links.\n> I guess the main task of any such framework is just to trick the user into thinking that they're just doing some config, rather than, well, writing code... because if you just think you're able to just write code,  might as well just use GTK directly 😛\n- Elkowar from eww (elkowar's wacky widgets)\nWhere am I going with this? Not exactly sure. Somewhere close to this. \nat://did:plc:e5zplwgiznavptdxhx5n2zlp/app.bsky.feed.post/3m6sdhwtonk2i\nHowever in light of the widget frameworks just discussed, I cannot help but wonder if it could be more. Looking at the \"Atmosphere as a Filesystem\", I ask why can't don't I do unixy things with the data. An important detail I glossed over earlier was the difference between astal and ags. Astal is a set of libraries to bind system information. For example it turns cat /proc/meminfo into GTK's approximation of a derived signal. This is usable to any GTK app. AGS is an independent thing, useful for writing gtk apps with typescript. It can use libraries like Astal. This setup is the result of 3 major revisions.\nFor the atmosphere, where do I mount it to a directory, get a regular notification for replies, or sync my real daily notes to this publication? Reading a pds is straight forward GET request in most places. Atprotocol FUSE pushes that a bit farther. What's missing? Connecting it to signals? Widget frameworks? Light GUI options? Answers will vary depending on your current OS. But they can be simpler if we stay away from Serious Application Development with Mass Distribution, just harmless little (malleable) widgets."
}

did:plc:ukgwapa3bceculh4cobcopg3 | at://did:plc:ukgwapa3bceculh4cobcopg3/site.standard.document/3melamcro7t23

app.offprint.content (nested within site.standard.document) (2 samples)
{
  "path": "/a/3mcwxrkpmlk23-waow-tech",
  "site": "at://did:plc:xbtmt2zjwlrfegqvch7fboei/site.standard.publication/3mcvirmkby52v",
  "$type": "site.standard.document",
  "title": "waow, tech!",
  "content": {
    "$type": "app.offprint.content",
    "items": [
      {
        "$type": "app.offprint.block.text",
        "plaintext": "over the last 6 months, i've been trying to figure out the best way to elevator pitch atproto to anyone—even people who've never heard of it."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 53,
              "byteStart": 48
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "somehow, my family, friends, and girlfriend are still around!"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 6,
              "byteStart": 3
            },
            "features": [
              {
                "uri": "https://at-me.wisp.place/view/?handle=stream.place",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 236,
              "byteStart": 191
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#bold"
              },
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "my @me demo is fun, but way too jargon-y for my grandma or non-tech friends. it lacks narrative structure and leaves all the punchy bits for people curious enough to click around, instead of smacking viewers in the face with a punchline."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "after many epochs pitching atproto apps to vaguely curious listeners, anecdotally and perhaps counterintuitively: the \"single login\" angle lands harder than data sovereignty."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "maybe because people don't use password managers? or they use their Notes app (which tbf, same sometimes)."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "you can whip folks into a philosophical frenzy about Palantir and surveillance capitalism—\"give data back to the people! yeah!\"—but then they're right back on TikTok and FB marketplace, because it's all abstract when you have to extrapolate from skeets."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "user nonplussed-ness is signal. the coherence and immediacy of the pitch matters as much as the provable benefits of the protocol."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 12,
              "byteStart": 3
            },
            "features": [
              {
                "uri": "https://waow.tech/",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "so waow.tech is my try at a minimum viable manifesto for atproto—capturing the value prop without arcane language or potentially ostracizing premises."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 6,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "goals:"
      },
      {
        "$type": "app.offprint.block.bulletList",
        "children": [
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "\"why care about atproto\" in 5 seconds, for anyone"
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "get people asking \"how could it all be stored in the same place, behind one login?\" (primes them for demos)"
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "showcase apps building good experiences on atproto"
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "eventually: a simple and mobile friendly complement to help build intuition for how atproto offers user choice "
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "eventually: \"your medical records\" and other private-data applications [1]"
            }
          }
        ]
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "not all of these are met to my liking today. i'll keep iterating."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 17,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://tangled.org/zzstoatzz.io/waow.tech/issues/new",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "feedback welcome!"
      },
      {
        "$type": "app.offprint.block.horizontalRule"
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 206,
              "byteStart": 195
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "[1]: two friends in medical professions have independently suggested using atproto for consolidated, private aggregation of medical records. the convenience angle is viscerally clear there—you immediately see why owning your medical data matters, unlike things you already consider public."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      }
    ]
  },
  "coverImage": {
    "ref": {
      "$link": "bafkreif4dtdniukqer7bant5cirdnkkublqw3hfsiroigtmkcxpalzdkxi"
    },
    "size": 83118,
    "$type": "blob",
    "mimeType": "image/png"
  },
  "description": "atproto pitch in 5 seconds",
  "publishedAt": "2026-01-22T01:18:44-07:00",
  "textContent": "over the last 6 months, i've been trying to figure out the best way to elevator pitch atproto to anyone—even people who've never heard of it.\n\n\nsomehow, my family, friends, and girlfriend are still around!\n\nmy @me demo is fun, but way too jargon-y for my grandma or non-tech friends. it lacks narrative structure and leaves all the punchy bits for people curious enough to click around, instead of smacking viewers in the face with a punchline.\nafter many epochs pitching atproto apps to vaguely curious listeners, anecdotally and perhaps counterintuitively: the \"single login\" angle lands harder than data sovereignty.\nmaybe because people don't use password managers? or they use their Notes app (which tbf, same sometimes).\nyou can whip folks into a philosophical frenzy about Palantir and surveillance capitalism—\"give data back to the people! yeah!\"—but then they're right back on TikTok and FB marketplace, because it's all abstract when you have to extrapolate from skeets.\nuser nonplussed-ness is signal. the coherence and immediacy of the pitch matters as much as the provable benefits of the protocol.\nso waow.tech is my try at a minimum viable manifesto for atproto—capturing the value prop without arcane language or potentially ostracizing premises.\ngoals:\n- \"why care about atproto\" in 5 seconds, for anyone\n- get people asking \"how could it all be stored in the same place, behind one login?\" (primes them for demos)\n- showcase apps building good experiences on atproto\n- eventually: a simple and mobile friendly complement to help build intuition for how atproto offers user choice \n- eventually: \"your medical records\" and other private-data applications [1]\n\nnot all of these are met to my liking today. i'll keep iterating.\nfeedback welcome!\n\n---\n[1]: two friends in medical professions have independently suggested using atproto for consolidated, private aggregation of medical records. the convenience angle is viscerally clear there—you immediately see why owning your medical data matters, unlike things you already consider public."
}

did:plc:xbtmt2zjwlrfegqvch7fboei | at://did:plc:xbtmt2zjwlrfegqvch7fboei/site.standard.document/3mcwxrkpmlk23

app.offprint.richtext.facet (nested within site.standard.document) (2 samples)
{
  "path": "/a/3mcwxrkpmlk23-waow-tech",
  "site": "at://did:plc:xbtmt2zjwlrfegqvch7fboei/site.standard.publication/3mcvirmkby52v",
  "$type": "site.standard.document",
  "title": "waow, tech!",
  "content": {
    "$type": "app.offprint.content",
    "items": [
      {
        "$type": "app.offprint.block.text",
        "plaintext": "over the last 6 months, i've been trying to figure out the best way to elevator pitch atproto to anyone—even people who've never heard of it."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 53,
              "byteStart": 48
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "somehow, my family, friends, and girlfriend are still around!"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 6,
              "byteStart": 3
            },
            "features": [
              {
                "uri": "https://at-me.wisp.place/view/?handle=stream.place",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 236,
              "byteStart": 191
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#bold"
              },
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "my @me demo is fun, but way too jargon-y for my grandma or non-tech friends. it lacks narrative structure and leaves all the punchy bits for people curious enough to click around, instead of smacking viewers in the face with a punchline."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "after many epochs pitching atproto apps to vaguely curious listeners, anecdotally and perhaps counterintuitively: the \"single login\" angle lands harder than data sovereignty."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "maybe because people don't use password managers? or they use their Notes app (which tbf, same sometimes)."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "you can whip folks into a philosophical frenzy about Palantir and surveillance capitalism—\"give data back to the people! yeah!\"—but then they're right back on TikTok and FB marketplace, because it's all abstract when you have to extrapolate from skeets."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "user nonplussed-ness is signal. the coherence and immediacy of the pitch matters as much as the provable benefits of the protocol."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 12,
              "byteStart": 3
            },
            "features": [
              {
                "uri": "https://waow.tech/",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "so waow.tech is my try at a minimum viable manifesto for atproto—capturing the value prop without arcane language or potentially ostracizing premises."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 6,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "goals:"
      },
      {
        "$type": "app.offprint.block.bulletList",
        "children": [
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "\"why care about atproto\" in 5 seconds, for anyone"
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "get people asking \"how could it all be stored in the same place, behind one login?\" (primes them for demos)"
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "showcase apps building good experiences on atproto"
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "eventually: a simple and mobile friendly complement to help build intuition for how atproto offers user choice "
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "eventually: \"your medical records\" and other private-data applications [1]"
            }
          }
        ]
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "not all of these are met to my liking today. i'll keep iterating."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 17,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://tangled.org/zzstoatzz.io/waow.tech/issues/new",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "feedback welcome!"
      },
      {
        "$type": "app.offprint.block.horizontalRule"
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 206,
              "byteStart": 195
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "[1]: two friends in medical professions have independently suggested using atproto for consolidated, private aggregation of medical records. the convenience angle is viscerally clear there—you immediately see why owning your medical data matters, unlike things you already consider public."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": ""
      }
    ]
  },
  "coverImage": {
    "ref": {
      "$link": "bafkreif4dtdniukqer7bant5cirdnkkublqw3hfsiroigtmkcxpalzdkxi"
    },
    "size": 83118,
    "$type": "blob",
    "mimeType": "image/png"
  },
  "description": "atproto pitch in 5 seconds",
  "publishedAt": "2026-01-22T01:18:44-07:00",
  "textContent": "over the last 6 months, i've been trying to figure out the best way to elevator pitch atproto to anyone—even people who've never heard of it.\n\n\nsomehow, my family, friends, and girlfriend are still around!\n\nmy @me demo is fun, but way too jargon-y for my grandma or non-tech friends. it lacks narrative structure and leaves all the punchy bits for people curious enough to click around, instead of smacking viewers in the face with a punchline.\nafter many epochs pitching atproto apps to vaguely curious listeners, anecdotally and perhaps counterintuitively: the \"single login\" angle lands harder than data sovereignty.\nmaybe because people don't use password managers? or they use their Notes app (which tbf, same sometimes).\nyou can whip folks into a philosophical frenzy about Palantir and surveillance capitalism—\"give data back to the people! yeah!\"—but then they're right back on TikTok and FB marketplace, because it's all abstract when you have to extrapolate from skeets.\nuser nonplussed-ness is signal. the coherence and immediacy of the pitch matters as much as the provable benefits of the protocol.\nso waow.tech is my try at a minimum viable manifesto for atproto—capturing the value prop without arcane language or potentially ostracizing premises.\ngoals:\n- \"why care about atproto\" in 5 seconds, for anyone\n- get people asking \"how could it all be stored in the same place, behind one login?\" (primes them for demos)\n- showcase apps building good experiences on atproto\n- eventually: a simple and mobile friendly complement to help build intuition for how atproto offers user choice \n- eventually: \"your medical records\" and other private-data applications [1]\n\nnot all of these are met to my liking today. i'll keep iterating.\nfeedback welcome!\n\n---\n[1]: two friends in medical professions have independently suggested using atproto for consolidated, private aggregation of medical records. the convenience angle is viscerally clear there—you immediately see why owning your medical data matters, unlike things you already consider public."
}

did:plc:xbtmt2zjwlrfegqvch7fboei | at://did:plc:xbtmt2zjwlrfegqvch7fboei/site.standard.document/3mcwxrkpmlk23

blog.pckt.block.blockquote (nested within site.standard.document) (4 samples)
{
  "path": "/looking-for-beta-testers-d623ruh",
  "site": "at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.publication/3lwafzkjqm25s",
  "tags": [
    "👩‍💻 Updates"
  ],
  "$type": "site.standard.document",
  "title": "Looking for Beta Testers 👀",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Hello World 🌎"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 20,
              "byteStart": 11
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#code"
              }
            ]
          }
        ],
        "plaintext": "Welcome to pckt.blog! 👋"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 18,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "What is pckt blog? It’s an entire blogging platform that fits in your pocket."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "The idea behind pckt is to have a place to jot down and share your ideas, opinions, hobbies, and anything else you’d like to share with the world, quickly and easily."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 181,
              "byteStart": 159
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "We wanted to make pckt easy and seamless to use. No lengthy signup process or bulky blog setup. Just create an account, choose a blog name, and start writing. Distraction free. 🤗"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 19,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 202,
              "byteStart": 130
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 209,
              "byteStart": 202
            },
            "features": [
              {
                "uri": "https://bsky.app/profile/pckt.blog",
                "$type": "blog.pckt.richtext.facet#link"
              },
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 210,
              "byteStart": 209
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "Sound interesting? We are looking for beta testers to test drive pckt and provide valuable feedback to help improve the platform! If you would be interested in beta testing send us a message or @ us on Bluesky."
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "IMG_3129.jpeg",
          "src": "blob:bafkreihehyzfmmdd2p7ufgo7iv5izoxwzbsgxx4tiwmm2hl2jxmv5ne2ie",
          "blob": {
            "ref": {
              "$link": "bafkreihehyzfmmdd2p7ufgo7iv5izoxwzbsgxx4tiwmm2hl2jxmv5ne2ie"
            },
            "size": 242478,
            "$type": "blob",
            "mimeType": "image/jpeg"
          },
          "align": "center",
          "width": "500"
        }
      },
      {
        "$type": "blog.pckt.block.blockquote",
        "content": [
          {
            "$type": "blog.pckt.block.text",
            "facets": [
              {
                "index": {
                  "byteEnd": 35,
                  "byteStart": 26
                },
                "features": [
                  {
                    "uri": "http://pckt.blog",
                    "$type": "blog.pckt.richtext.facet#link"
                  }
                ]
              }
            ],
            "plaintext": "Early concept drawing for pckt.blog"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text"
      }
    ]
  },
  "updatedAt": "2026-01-13T03:30:33+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreihehyzfmmdd2p7ufgo7iv5izoxwzbsgxx4tiwmm2hl2jxmv5ne2ie"
    },
    "size": 242478,
    "$type": "blob",
    "mimeType": "image/jpeg"
  },
  "description": "Welcome to pckt.blog! 👋 What is pckt blog? It’s an entire blogging platform that fits in your pocket. The idea behind pckt is to have a place to jot down and share your ideas, opinions, hobbies, and anything else you’d like to share with the world, quickly and easily.",
  "publishedAt": "2025-08-12T23:00:04+00:00",
  "textContent": "Hello World 🌎\nWelcome to pckt.blog! 👋\nWhat is pckt blog? It’s an entire blogging platform that fits in your pocket.\nThe idea behind pckt is to have a place to jot down and share your ideas, opinions, hobbies, and anything else you’d like to share with the world, quickly and easily.\nWe wanted to make pckt easy and seamless to use. No lengthy signup process or bulky blog setup. Just create an account, choose a blog name, and start writing. Distraction free. 🤗\nSound interesting? We are looking for beta testers to test drive pckt and provide valuable feedback to help improve the platform! If you would be interested in beta testing send us a message or @ us on Bluesky.\nEarly concept drawing for pckt.blog"
}

did:plc:revjuqmkvrw6fnkxppqtszpv | at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.document/3lwag24nlc2be

blog.pckt.block.blueskyEmbed (nested within site.standard.document) (4 samples)
{
  "path": "/embed-bluesky-posts-on-pckt-gen55y6",
  "site": "at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.publication/3lwafzkjqm25s",
  "tags": [],
  "$type": "site.standard.document",
  "title": "Embed Bluesky Posts on pckt !",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.blueskyEmbed",
        "attrs": {
          "postRef": {
            "cid": "bafyreiddjgazq6gtadg6qboszb6ribffkaatnboglknhrytbdpvv5xahbe",
            "uri": "at://did:plc:revjuqmkvrw6fnkxppqtszpv/app.bsky.feed.post/3lxtb4iu6s22u"
          }
        }
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 29,
              "byteStart": 22
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 44,
              "byteStart": 40
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "Embedding a post from Bluesky into your pckt blog is easy !"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Just copy the link to the post you’d like to embed:"
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "IMG_1097.jpeg",
          "src": "blob:bafkreieivwog4l4e2fhrpcgddjsxda777lyb6lshfn6rkxb6357rgbuftm",
          "blob": {
            "ref": {
              "$link": "bafkreieivwog4l4e2fhrpcgddjsxda777lyb6lshfn6rkxb6357rgbuftm"
            },
            "size": 27908,
            "$type": "blob",
            "mimeType": "image/jpeg"
          }
        }
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 34,
              "byteStart": 30
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "Then, paste the link into the pckt editor. You will see a text preview of the post you are embedding:"
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "IMG_1095.jpeg",
          "src": "blob:bafkreifahcsjxyit4ae53xoa3efnmurwxy3bic743sgwfojredfrhh4fme",
          "blob": {
            "ref": {
              "$link": "bafkreifahcsjxyit4ae53xoa3efnmurwxy3bic743sgwfojredfrhh4fme"
            },
            "size": 92727,
            "$type": "blob",
            "mimeType": "image/jpeg"
          }
        }
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Don’t worry, the full embedded post will appear on your live blog page !"
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "bafkreih46z4efdh5witru2zwssar4y4gktmbfcqnyzidvfyguparm5bdmy.jpg",
          "src": "blob:bafkreifuwyfu6rvpmhivlsflu5sc3jb4my3ebrg2gfoecz2swqazfdwolu",
          "blob": {
            "ref": {
              "$link": "bafkreifuwyfu6rvpmhivlsflu5sc3jb4my3ebrg2gfoecz2swqazfdwolu"
            },
            "size": 67728,
            "$type": "blob",
            "mimeType": "image/jpeg"
          }
        }
      },
      {
        "$type": "blog.pckt.block.text"
      }
    ]
  },
  "updatedAt": "2026-01-13T03:30:34+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreih46z4efdh5witru2zwssar4y4gktmbfcqnyzidvfyguparm5bdmy"
    },
    "size": 201476,
    "$type": "blob",
    "mimeType": "image/jpeg"
  },
  "description": "Embedding a post from Bluesky into your pckt blog is easy ! Just copy the link to the post you’d like to embed: Then, paste the link into the pckt editor. You will see a text preview of the post you are embedding:",
  "publishedAt": "2025-09-02T04:11:27+00:00",
  "textContent": "Embedding a post from Bluesky into your pckt blog is easy !\nJust copy the link to the post you’d like to embed:\nThen, paste the link into the pckt editor. You will see a text preview of the post you are embedding:\nDon’t worry, the full embedded post will appear on your live blog page !"
}

did:plc:revjuqmkvrw6fnkxppqtszpv | at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.document/3lxtardeii2xu

blog.pckt.block.bulletList (nested within site.standard.document) (2 samples)
{
  "path": "/first-pckt-post-13z8wvn",
  "site": "at://did:plc:xbtmt2zjwlrfegqvch7fboei/site.standard.publication/3mbmm4qeiy2to",
  "tags": [],
  "$type": "site.standard.document",
  "title": "first pckt post!",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 50,
              "byteStart": 47
            },
            "features": [
              {
                "uri": "https://ziglang.org/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "i have been writing a lot of atproto things in zig!"
      },
      {
        "$type": "blog.pckt.block.bulletList",
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 21,
                      "byteStart": 0
                    },
                    "features": [
                      {
                        "uri": "https://music-atmosphere-feed.plyr.fm/",
                        "$type": "blog.pckt.richtext.facet#link"
                      }
                    ]
                  },
                  {
                    "index": {
                      "byteEnd": 28,
                      "byteStart": 23
                    },
                    "features": [
                      {
                        "uri": "https://music-atmosphere-feed.plyr.fm/",
                        "$type": "blog.pckt.richtext.facet#link"
                      }
                    ]
                  }
                ],
                "plaintext": "feeds of music links! (stats)"
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 19,
                      "byteStart": 0
                    },
                    "features": [
                      {
                        "uri": "https://leaflet-search.pages.dev/",
                        "$type": "blog.pckt.richtext.facet#link"
                      }
                    ]
                  },
                  {
                    "index": {
                      "byteEnd": 26,
                      "byteStart": 21
                    },
                    "features": [
                      {
                        "uri": "https://leaflet-search-backend.fly.dev/dashboard",
                        "$type": "blog.pckt.richtext.facet#link"
                      }
                    ]
                  }
                ],
                "plaintext": "search for leaflet! (stats)"
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 15,
                      "byteStart": 0
                    },
                    "features": [
                      {
                        "uri": "https://bsky.app/profile/find-bufo.com",
                        "$type": "blog.pckt.richtext.facet#link"
                      }
                    ]
                  },
                  {
                    "index": {
                      "byteEnd": 22,
                      "byteStart": 17
                    },
                    "features": [
                      {
                        "uri": "https://bot-stats.find-bufo.com/",
                        "$type": "blog.pckt.richtext.facet#link"
                      }
                    ]
                  }
                ],
                "plaintext": "a fun dumb bot! (stats)"
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 6,
                      "byteStart": 0
                    },
                    "features": [
                      {
                        "uri": "https://pollz.waow.tech/",
                        "$type": "blog.pckt.richtext.facet#link"
                      }
                    ]
                  }
                ],
                "plaintext": "pollz!"
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "and so, i have started working on a zig SDK for atproto so that i don't need to reimplement DID parsing or handle resolution over and over again (which is not a bad thing to have to do at first, as it helps remind me how the protocol works and also ziglang, which is relatively new to me)"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "here's the (wip) SDK:"
      },
      {
        "src": "https://tangled.org/zzstoatzz.io/zat",
        "$type": "blog.pckt.block.website",
        "title": "zzstoatzz.io/zat",
        "description": "atproto tools in zig",
        "previewImage": "https://tangled.org/zzstoatzz.io/zat/opengraph"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 62,
              "byteStart": 54
            },
            "features": [
              {
                "uri": "https://zig.guide/master/language-basics/comptime",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "the thing most interesting about zig in my opinion is comptime"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 37,
              "byteStart": 13
            },
            "features": [
              {
                "uri": "https://tangled.sh/zzstoatzz.io/zat/tree/main/src/internal/multibase.zig#L40-L46",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "for example, this base58 decode table is computed at compile time and baked directly into the binary - no runtime initialization, no lazy statics, etc:"
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "zig"
        },
        "plaintext": "// base58 decode table - computed at compile time, embedded in binary\n// no runtime initialization, no lazy statics, just data\n\nconst decode_table: [256]i8 = blk: {\n    const alphabet = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n    var table: [256]i8 = .{-1} ** 256;  // -1 = invalid character\n    for (alphabet, 0..) |c, i| {\n        table[c] = @intCast(i);\n    }\n    break :blk table;\n};\n\n// at runtime, decoding is just a lookup: table['Z'] -> 32"
      },
      {
        "$type": "blog.pckt.block.blockquote",
        "content": [
          {
            "$type": "blog.pckt.block.text",
            "facets": [
              {
                "index": {
                  "byteEnd": 76,
                  "byteStart": 0
                },
                "features": [
                  {
                    "uri": "https://ziglang.org/documentation/master/#Container-Level-Variables",
                    "$type": "blog.pckt.richtext.facet#link"
                  }
                ]
              }
            ],
            "plaintext": "The initialization value of container level variables is implicitly comptime."
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "naively, it seems like comptime is a good fit when dealing with (parts of) a protocol like atproto where there's a lot of static structure - defined once, used everywhere"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": ""
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "we'll see how my use progresses!"
      }
    ]
  },
  "updatedAt": "2026-02-10T05:11:00+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreicnelu5mrsjwrbsm3kqftayp4pyqf3mjxfv5aqxptoujca5jejhya"
    },
    "size": 54316,
    "$type": "blob",
    "mimeType": "image/webp"
  },
  "description": "i have been writing a lot of atproto things in zig! and so, i have started working on a zig SDK for atproto so that i don't need to reimplement DID parsing or handle resolution over and over again (which is not a bad thing to have to do at first, as it helps remind me how the protocol works and also ziglang, which is relatively new to me) here's the (wip) SDK:",
  "publishedAt": "2026-01-04T18:58:05+00:00",
  "textContent": "i have been writing a lot of atproto things in zig!\nfeeds of music links! (stats)\nsearch for leaflet! (stats)\na fun dumb bot! (stats)\npollz!\nand so, i have started working on a zig SDK for atproto so that i don't need to reimplement DID parsing or handle resolution over and over again (which is not a bad thing to have to do at first, as it helps remind me how the protocol works and also ziglang, which is relatively new to me)\nhere's the (wip) SDK:\nthe thing most interesting about zig in my opinion is comptime\nfor example, this base58 decode table is computed at compile time and baked directly into the binary - no runtime initialization, no lazy statics, etc:\n// base58 decode table - computed at compile time, embedded in binary\n// no runtime initialization, no lazy statics, just data\n\nconst decode_table: [256]i8 = blk: {\n    const alphabet = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n    var table: [256]i8 = .{-1} ** 256;  // -1 = invalid character\n    for (alphabet, 0..) |c, i| {\n        table[c] = @intCast(i);\n    }\n    break :blk table;\n};\n\n// at runtime, decoding is just a lookup: table['Z'] -> 32\nThe initialization value of container level variables is implicitly comptime.\nnaively, it seems like comptime is a good fit when dealing with (parts of) a protocol like atproto where there's a lot of static structure - defined once, used everywhere\nwe'll see how my use progresses!"
}

did:plc:xbtmt2zjwlrfegqvch7fboei | at://did:plc:xbtmt2zjwlrfegqvch7fboei/site.standard.document/3mbmm4w3me2tr

blog.pckt.block.codeBlock (nested within site.standard.document) (2 samples)
{
  "path": "/atproto-test-q6w9a9m",
  "site": "at://did:plc:v46ojbiop5ebs5h7gaomixcc/site.standard.publication/3m57zfsq3a2fo",
  "tags": [],
  "$type": "site.standard.document",
  "title": "Atproto test",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "hello ! "
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 19,
              "byteStart": 10
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              },
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "this is a test post stored on my pds "
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 1
        },
        "content": [
          {
            "$type": "blog.pckt.block.text",
            "plaintext": ""
          }
        ]
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "php"
        },
        "plaintext": "//config/backup.php\n\n    'cleanup' => [\n        /*\n         * The strategy that will be used to cleanup old backups. The default strategy\n         * will keep all backups for a certain amount of days. After that period only\n         * a daily backup will be kept. After that period only weekly backups will\n         * be kept and so on.\n         *\n         * No matter how you configure it the default strategy will never\n         * delete the newest backup.\n         */\n        'strategy' => \\Spatie\\Backup\\Tasks\\Cleanup\\Strategies\\DefaultStrategy::class,\n\n        'default_strategy' => [\n\n            /*\n             * The number of days that all backups must be kept.\n             */\n            'keep_all_backups_for_days' => 7,\n\n            /*\n             * The number of days that all daily backups must be kept.\n             */\n            'keep_daily_backups_for_days' => 16,\n\n            /*\n             * The number of weeks of which one weekly backup must be kept.\n             */\n            'keep_weekly_backups_for_weeks' => 8,\n\n            /*\n             * The number of months of which one monthly backup must be kept.\n             */\n            'keep_monthly_backups_for_months' => 4,\n\n            /*\n             * The number of years of which one yearly backup must be kept.\n             */\n            'keep_yearly_backups_for_years' => 2,\n\n            /*\n             * After cleaning up the backups remove the oldest backup until\n             * this amount of megabytes has been reached.\n             * Set null for unlimited size.\n             */\n            'delete_oldest_backups_when_using_more_megabytes_than' => 5000,\n        ],\n    ],"
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "align": "center"
        }
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": ""
      }
    ]
  },
  "updatedAt": "2026-02-16T10:03:32+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreihkbujaugtwtax7cwiu4xcttpqri24vlu4w35njdcyz5fseqpfi2i"
    },
    "size": 129303,
    "$type": "blob",
    "mimeType": "image/gif"
  },
  "description": "hello ! this is a test post stored on my pds",
  "publishedAt": "2025-11-10T02:10:00+00:00",
  "textContent": "hello ! \nthis is a test post stored on my pds \n//config/backup.php\n\n    'cleanup' => [\n        /*\n         * The strategy that will be used to cleanup old backups. The default strategy\n         * will keep all backups for a certain amount of days. After that period only\n         * a daily backup will be kept. After that period only weekly backups will\n         * be kept and so on.\n         *\n         * No matter how you configure it the default strategy will never\n         * delete the newest backup.\n         */\n        'strategy' => \\Spatie\\Backup\\Tasks\\Cleanup\\Strategies\\DefaultStrategy::class,\n\n        'default_strategy' => [\n\n            /*\n             * The number of days that all backups must be kept.\n             */\n            'keep_all_backups_for_days' => 7,\n\n            /*\n             * The number of days that all daily backups must be kept.\n             */\n            'keep_daily_backups_for_days' => 16,\n\n            /*\n             * The number of weeks of which one weekly backup must be kept.\n             */\n            'keep_weekly_backups_for_weeks' => 8,\n\n            /*\n             * The number of months of which one monthly backup must be kept.\n             */\n            'keep_monthly_backups_for_months' => 4,\n\n            /*\n             * The number of years of which one yearly backup must be kept.\n             */\n            'keep_yearly_backups_for_years' => 2,\n\n            /*\n             * After cleaning up the backups remove the oldest backup until\n             * this amount of megabytes has been reached.\n             * Set null for unlimited size.\n             */\n            'delete_oldest_backups_when_using_more_megabytes_than' => 5000,\n        ],\n    ],"
}

did:plc:v46ojbiop5ebs5h7gaomixcc | at://did:plc:v46ojbiop5ebs5h7gaomixcc/site.standard.document/3m5ak5oqnk2zz

blog.pckt.block.gallery (nested within site.standard.document) (2 samples)
{
  "path": "/my-first-gallery-3-eyq48cs",
  "site": "at://did:plc:v46ojbiop5ebs5h7gaomixcc/site.standard.publication/3m57zfsq3a2fo",
  "tags": [],
  "$type": "site.standard.document",
  "title": "My first gallery <3",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "ref": "at://did:plc:v46ojbiop5ebs5h7gaomixcc/blog.pckt.gallery/3med4jdkdn7jh",
        "$type": "blog.pckt.block.gallery"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": ""
      }
    ]
  },
  "updatedAt": "2026-02-16T09:59:59+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreien6r5wvjhks2jkbgdoaiyr3z7ppdiefdcf3luzrs4h6musbo23a4"
    },
    "size": 624111,
    "$type": "blob",
    "mimeType": "image/png"
  },
  "description": "",
  "publishedAt": "2026-02-08T04:30:52+00:00",
  "textContent": ""
}

did:plc:v46ojbiop5ebs5h7gaomixcc | at://did:plc:v46ojbiop5ebs5h7gaomixcc/site.standard.document/3med3ygops27c

blog.pckt.block.hardBreak (nested within site.standard.document) (1 sample)
{
  "path": "/hello-world-pxsfky1",
  "site": "at://did:plc:hlchta7bwmobyum375ltycg5/site.standard.publication/3mdfcro5xe273",
  "tags": [
    "PowerShell",
    "HTML",
    "DevOps",
    "Platform Engineering",
    "C",
    "Go",
    "Rust",
    "JavaScript",
    "SVG",
    "Markdown",
    "JSON",
    "Intro"
  ],
  "$type": "site.standard.document",
  "title": "Hello World",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "powershell"
        },
        "plaintext": "\"Hello World\""
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 3,
        "content": [
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "I'm James, and the code above is Hello World in PowerShell."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Long ago, I worked on the PowerShell team and helped build a really beautiful and interesting scripting language.  "
      },
      {
        "$type": "blog.pckt.block.text",
        "content": [
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.text"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "In the past couple of decades I've been continuing to explore and grow the capabilities of the language, and have beamed with pride as more and more people have been inspired."
      },
      {
        "$type": "blog.pckt.block.text",
        "content": [
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.text"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Let's show this in some simple examples."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Imagine we want to pick a random message to say.  Well, first up, let's look for a command called random:"
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "powershell"
        },
        "plaintext": "Get-Command *random*"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 50,
              "byteStart": 40
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#code"
              }
            ]
          }
        ],
        "plaintext": "You'll notice there is a command called Get-Random "
      },
      {
        "$type": "blog.pckt.block.text",
        "content": [
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "powershell"
        },
        "plaintext": "Get-Help Get-Random"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "You might be asked to update help to run this, I suggest you do.  It gives you full help on any built-in command, localized to dozens of languages.  Almost all commands also have examples:"
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "powershell"
        },
        "plaintext": "Get-Help Get-Random -Examples"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "After you've RTFM'd a bit, you should see that we can pipe any objects into Get-Random and get a random one of them back out."
      },
      {
        "$type": "blog.pckt.block.text",
        "content": [
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.text"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "powershell"
        },
        "plaintext": "'Hello', 'Hi', 'Hello World' | Get-Random"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "We'll get back a random one of those messages."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 3,
        "plaintext": "Writing Hello World in Many Languages"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Long ago the C++ team had a t-shirt:  \"My language can build yours\"."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "With that in mind, let's see how we can write \"Hello World\" in a bunch of languages, all from PowerShell."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 4,
        "plaintext": "Hello World in Markdown with PowerShell"
      },
      {
        "$type": "blog.pckt.block.text",
        "content": [
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.text"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "powershell"
        },
        "plaintext": "\"# \" + ('Hello', 'Hi', 'Hello World' | Get-Random)"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "We can just join strings together to write code in any language."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "If you're running PowerShell 6+, we can convert that markdown and show the html:"
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "powershell"
        },
        "plaintext": "\"# \" + ('Hello', 'Hi', 'Hello World' | Get-Random) |\n    ConvertFrom-Markdown |\n    Select-Object -ExpandProperty HTML"
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 4,
        "plaintext": "Hello World in HTML with PowerShell"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "We can also write our hello world in HTML directly:"
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "powershell"
        },
        "plaintext": "'<h1>' + ('Hello', 'Hi', 'Hello World' | Get-Random) + '</h1>'"
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 4,
        "plaintext": "Hello World in SVG with PowerShell"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "An SVG hello world is about as easy.  We just have to use an <svg> and <text> element."
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": [],
        "plaintext": "'<svg xmlns=\"http://www.w3.org/2000/svg\"><text>' +\n   ('Hello', 'Hi', 'Hello World' | Get-Random) + \n'</text></svg>'  "
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 4,
        "plaintext": "Hello World In Python with PowerShell"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Let's do write a randomized \"hello world\" in Python, from PowerShell"
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "powershell"
        },
        "plaintext": "'print(\"' + ('Hello', 'Hi', 'Hello World' | Get-Random) + '\")'"
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 4,
        "plaintext": "Hello World in JSON with PowerShell"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "A \"Hello World\" in JSON is just a single JSON string."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "PowerShell can convert any object to json with ConvertTo-Json."
      },
      {
        "$type": "blog.pckt.block.text",
        "content": [
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "powershell"
        },
        "plaintext": "\"hello world\" | ConvertTo-Json"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "This is a little underwhelming until you remember that JSON is valid JavaScript."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 4,
        "content": [
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Let's introduce a new trick in this one."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "PowerShell can put any number of subexpressions inside of a string, for example:"
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "powershell"
        },
        "plaintext": "\"$(Get-Random)\""
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "If we wanted to write hello world in JavaScript, we can just output a string that runs console.log('$(some expression)')"
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "powershell"
        },
        "plaintext": "\"console.log($(\n    'Hello', 'Hi', 'Hello World' |\n        Get-Random | \n            ConvertTo-Json\n))\""
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 4,
        "plaintext": "Hello World in Go with PowerShell"
      },
      {
        "$type": "blog.pckt.block.text",
        "content": [
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.text"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text",
        "content": [
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.text"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "powershell"
        },
        "plaintext": "# Get going\n$go = '\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n    fmt.Println(\"' + \n        ('Hello', 'Hi', 'Hello World' | Get-Random) + '\")\n}\n'\n\n$go > ./hello.go  # Send our go to hello.go\n\ngo run ./hello.go # Go run it!"
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 4,
        "plaintext": "Hello World in Rust with PowerShell"
      },
      {
        "$type": "blog.pckt.block.text",
        "content": [
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.text"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": [],
        "plaintext": "# Make our hello world and redirect to ./hello.rs\n'fn main() { println!(\"Hello World!\"); }' > ./hello.rs\n# compile hello.rs\nrutsc ./hello.rs\n# run the hello world app\n./hello"
      },
      {
        "$type": "blog.pckt.block.text",
        "content": [
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.text"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "powershell"
        },
        "plaintext": "# Collecting rust\n$rust = @(\n    'fn main() {'\n    @(foreach ($n in 1..3 | Get-Random) {\n        'println!(\"' + (\n            'hello', 'hi', 'hello world' | Get-Random\n         ) + '\")'\n    }) -join ';'\n    '}'\n)\n\n# Take our rust and redirect it a rust file\n$rust > ./hello.rs\n\n# Compile the rust file\nrustc ./hello.rs\n\n# Run the application\n./hello"
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 4,
        "plaintext": "Hello World in C with PowerShell"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Why stop now?  Let's go back to grandparent of many languages, and write a Hello World in C, with PowerShell"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Once again, simple form first:"
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "powershell"
        },
        "plaintext": "'\n#include <stdio.h>\nint main() {\n    printf(\"Hello, World!\\n\");\n    return 0;\n}\n' > ./hello.c"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Now let's do what we did with Rust and make a few random hellos"
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": [],
        "plaintext": "$c = @(\n   \"#include <stdio.h>\"\n   \"int main() {\"\n   @(\n   foreach ($n in 1..3 | Get-Random) {\n          'printf(\"' + (\n              'hello', 'hi', 'hello world' | Get-Random\n         ) + '\")'\n   }\n   'return 0;'\n   ) -join (';' +[Environment]::Newline)      \n   \"}\"\n)\n\n$c -join [Environment]::Newline > ./hello.c\n\n# Compile our C with gcc\ngcc ./hello.c -o ./hello\n\n# Run hello world\n./hello"
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "captain-america-steve-rogers-small-can-do-this-all-day.gif",
          "src": "blob:bafkreiew6fri5kenihj5txn5fufkwv3utt3kxexmfizr72y6xa5r7adwsy",
          "blob": {
            "ref": {
              "$link": "bafkreiew6fri5kenihj5txn5fufkwv3utt3kxexmfizr72y6xa5r7adwsy"
            },
            "size": 1601106,
            "$type": "blob",
            "mimeType": "image/gif"
          },
          "align": "center",
          "width": "700"
        }
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 3,
        "plaintext": "Hello World!  Stay Tuned"
      },
      {
        "$type": "blog.pckt.block.text",
        "content": [
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.text"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "You might have also noticed I know a few programming languages."
      },
      {
        "$type": "blog.pckt.block.text",
        "content": [
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          },
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Please don't forget to Like, Share, and Subscribe."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 168,
              "byteStart": 125
            },
            "features": [
              {
                "uri": "https://github.com/sponsors/StartAutomating",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "If you're feeling extra generous and want to encourage me to say hello more often, please consider sponsoring me on github : https://github.com/sponsors/StartAutomating."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "If you're feeling extra curious and want to check out some of the other stuff I do, check out:"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 34,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://github.com/StartAutomating",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "https://github.com/StartAutomating (my main github page)"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 32,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://github.com/PowerShellWeb",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "https://github.com/PowerShellWeb (home of many PowerShell Web dev efforts)"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 25,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://mrpowershell.com/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "https://mrpowershell.com/ (my personal page and home to many experiments)"
      },
      {
        "$type": "blog.pckt.block.text",
        "content": [
          {
            "$type": "blog.pckt.block.text"
          },
          {
            "$type": "blog.pckt.block.hardBreak"
          }
        ]
      }
    ]
  },
  "updatedAt": "2026-02-07T21:30:01+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreiew6fri5kenihj5txn5fufkwv3utt3kxexmfizr72y6xa5r7adwsy"
    },
    "size": 1601106,
    "$type": "blob",
    "mimeType": "image/gif"
  },
  "description": "I'm James, and the code above is Hello World in PowerShell. Long ago, I worked on the PowerShell team and helped build a really beautiful and interesting scripting language. In the past couple of decades I've been continuing to explore and grow the capabilities of the language, and have beamed with pride as more and more people have been inspired.",
  "publishedAt": "2026-01-27T08:12:43+00:00",
  "textContent": "\"Hello World\"\nI'm James, and the code above is Hello World in PowerShell.\nLong ago, I worked on the PowerShell team and helped build a really beautiful and interesting scripting language.  \nIn the past couple of decades I've been continuing to explore and grow the capabilities of the language, and have beamed with pride as more and more people have been inspired.\nLet's show this in some simple examples.\nImagine we want to pick a random message to say.  Well, first up, let's look for a command called random:\nGet-Command *random*\nYou'll notice there is a command called Get-Random \nGet-Help Get-Random\nYou might be asked to update help to run this, I suggest you do.  It gives you full help on any built-in command, localized to dozens of languages.  Almost all commands also have examples:\nGet-Help Get-Random -Examples\nAfter you've RTFM'd a bit, you should see that we can pipe any objects into Get-Random and get a random one of them back out.\n'Hello', 'Hi', 'Hello World' | Get-Random\nWe'll get back a random one of those messages.\nWriting Hello World in Many Languages\nLong ago the C++ team had a t-shirt:  \"My language can build yours\".\nWith that in mind, let's see how we can write \"Hello World\" in a bunch of languages, all from PowerShell.\nHello World in Markdown with PowerShell\n\"# \" + ('Hello', 'Hi', 'Hello World' | Get-Random)\nWe can just join strings together to write code in any language.\nIf you're running PowerShell 6+, we can convert that markdown and show the html:\n\"# \" + ('Hello', 'Hi', 'Hello World' | Get-Random) |\n    ConvertFrom-Markdown |\n    Select-Object -ExpandProperty HTML\nHello World in HTML with PowerShell\nWe can also write our hello world in HTML directly:\n'<h1>' + ('Hello', 'Hi', 'Hello World' | Get-Random) + '</h1>'\nHello World in SVG with PowerShell\nAn SVG hello world is about as easy.  We just have to use an <svg> and <text> element.\n'<svg xmlns=\"http://www.w3.org/2000/svg\"><text>' +\n   ('Hello', 'Hi', 'Hello World' | Get-Random) + \n'</text></svg>'  \nHello World In Python with PowerShell\nLet's do write a randomized \"hello world\" in Python, from PowerShell\n'print(\"' + ('Hello', 'Hi', 'Hello World' | Get-Random) + '\")'\nHello World in JSON with PowerShell\nA \"Hello World\" in JSON is just a single JSON string.\nPowerShell can convert any object to json with ConvertTo-Json.\n\"hello world\" | ConvertTo-Json\nThis is a little underwhelming until you remember that JSON is valid JavaScript.\nLet's introduce a new trick in this one.\nPowerShell can put any number of subexpressions inside of a string, for example:\n\"$(Get-Random)\"\nIf we wanted to write hello world in JavaScript, we can just output a string that runs console.log('$(some expression)')\n\"console.log($(\n    'Hello', 'Hi', 'Hello World' |\n        Get-Random | \n            ConvertTo-Json\n))\"\nHello World in Go with PowerShell\n# Get going\n$go = '\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n    fmt.Println(\"' + \n        ('Hello', 'Hi', 'Hello World' | Get-Random) + '\")\n}\n'\n\n$go > ./hello.go  # Send our go to hello.go\n\ngo run ./hello.go # Go run it!\nHello World in Rust with PowerShell\n# Make our hello world and redirect to ./hello.rs\n'fn main() { println!(\"Hello World!\"); }' > ./hello.rs\n# compile hello.rs\nrutsc ./hello.rs\n# run the hello world app\n./hello\n# Collecting rust\n$rust = @(\n    'fn main() {'\n    @(foreach ($n in 1..3 | Get-Random) {\n        'println!(\"' + (\n            'hello', 'hi', 'hello world' | Get-Random\n         ) + '\")'\n    }) -join ';'\n    '}'\n)\n\n# Take our rust and redirect it a rust file\n$rust > ./hello.rs\n\n# Compile the rust file\nrustc ./hello.rs\n\n# Run the application\n./hello\nHello World in C with PowerShell\nWhy stop now?  Let's go back to grandparent of many languages, and write a Hello World in C, with PowerShell\nOnce again, simple form first:\n'\n#include <stdio.h>\nint main() {\n    printf(\"Hello, World!\\n\");\n    return 0;\n}\n' > ./hello.c\nNow let's do what we did with Rust and make a few random hellos\n$c = @(\n   \"#include <stdio.h>\"\n   \"int main() {\"\n   @(\n   foreach ($n in 1..3 | Get-Random) {\n          'printf(\"' + (\n              'hello', 'hi', 'hello world' | Get-Random\n         ) + '\")'\n   }\n   'return 0;'\n   ) -join (';' +[Environment]::Newline)      \n   \"}\"\n)\n\n$c -join [Environment]::Newline > ./hello.c\n\n# Compile our C with gcc\ngcc ./hello.c -o ./hello\n\n# Run hello world\n./hello\nHello World!  Stay Tuned\nYou might have also noticed I know a few programming languages.\nPlease don't forget to Like, Share, and Subscribe.\nIf you're feeling extra generous and want to encourage me to say hello more often, please consider sponsoring me on github : https://github.com/sponsors/StartAutomating.\nIf you're feeling extra curious and want to check out some of the other stuff I do, check out:\nhttps://github.com/StartAutomating (my main github page)\nhttps://github.com/PowerShellWeb (home of many PowerShell Web dev efforts)\nhttps://mrpowershell.com/ (my personal page and home to many experiments)"
}

did:plc:hlchta7bwmobyum375ltycg5 | at://did:plc:hlchta7bwmobyum375ltycg5/site.standard.document/3mdfcs3j7a2vh

blog.pckt.block.heading (nested within site.standard.document) (7 samples)
{
  "path": "/parenthood-is-exhausting",
  "site": "at://did:plc:zviscnpwyvj6y32agi5davn5/site.standard.publication/3me7e3v47hr2l",
  "tags": [
    "parenthood",
    "life",
    "coping-mechanisms"
  ],
  "$type": "site.standard.document",
  "title": "Parenthood is exhausting, but I don't regret a second of it",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.heading",
        "level": 1,
        "plaintext": "Parenthood is exhausting, but I don't regret a second of it"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "I’ve been programming for what feels like a very long time. I started somewhere around 11–13 years old, and it’s just kind of what I do. I’ll play video games now and then because they’re fun, especially with friends, but the constant thing in my life has always been programming. I love it. If I’m not actively programming, I’m usually thinking about it in some way."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Time changed after becoming a parent"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Since becoming a parent about a year and a half ago, my relationship with programming has gotten… weird. I don’t have those huge, uninterrupted blocks of free time anymore. I don’t really have time to play games with friends, either. Accepting that took a while. It was a real mental adjustment."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Cassidy has talked about becoming more efficient after becoming a parent, and I think I’ve experienced that too. It’s strange. Before, I had what felt like unlimited free time, and I was happy about that. Now I don’t have anything close to that, but I feel like I get so much more done with the time I do have. I’m not entirely sure why."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Efficiency, urgency, and AI"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Part of it might be that I’ve been adopting more AI workflows into what I do. There’s less friction in getting ideas out of my head and into something real. But I also think there’s something else going on. I don’t take my time for granted anymore. I don’t have the luxury of letting ideas just sit around indefinitely."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Because of that, I’ve spent a lot of time thinking about knowledge capture. This publication itself is kind of an artifact of that. I need a way to get thoughts out of my brain as they appear, so I don’t lose them. My thoughts are very important to me. I want to build things I enjoy, and ideally things other people find useful too."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "The problem is that I’m terrible at just inventing problems from scratch. I can’t look at the world and confidently say, “Here’s a problem people definitely have, and here’s the solution they want.” If I don’t capture ideas when they happen, they’re basically gone. I don’t know where I was going with that exactly, but the need to externalize thoughts feels critical."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Exhaustion and love"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "The sleep deprivation is real. Parenting is exhausting. It’s also incredibly rewarding. I have zero regrets about having kids. I love my kid to death. I would sacrifice anything for him, without hesitation."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "But yeah, it wears you down. I feel threadbare a lot of the time. I know it will get better. There are lifestyle changes that will help, and I’ll get there eventually. Still, it’s hard."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "I’ve never felt so much joy watching a person grow and learn. Even talking about it gets emotional. I want nothing more than to provide for my kid and help them grow into the best version of themselves they can be. Parenting is a lot. It’s complicated. I feel like I maybe have 1% of it figured out."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Just getting through it"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Some weeks I feel like I’m doing pretty well. Other weeks it’s just a constant struggle. Some of that is situational. My kid is teething right now, dealing with growing pains, and generally feeling under the weather. He has a lot of needs, and those needs take precedence. There isn’t much room left for anything else."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "With how my brain works, I really need time to sit with my own thoughts and actually think and do. I’m hopeful that as my kid gets older, some of that time will come back. And when it does, I think I’ll be much better equipped to use it well because of everything parenting has forced me to refine."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "For now, though, I’m mostly just trying to survive."
      }
    ]
  },
  "updatedAt": "2026-02-10T20:30:57.763Z",
  "bskyPostRef": {
    "uri": "at://did:plc:zviscnpwyvj6y32agi5davn5/app.bsky.feed.post/3mejbfsony22a"
  },
  "description": "Balancing deep creative work with limited, fragmented time after parenting.",
  "publishedAt": "2026-02-10T15:23:03.139Z",
  "textContent": "Parenthood is exhausting, but I don't regret a second of it\n\nI’ve been programming for what feels like a very long time. I started somewhere around 11–13 years old, and it’s just kind of what I do. I’ll play video games now and then because they’re fun, especially with friends, but the constant thing in my life has always been programming. I love it. If I’m not actively programming, I’m usually thinking about it in some way.\n\nTime changed after becoming a parent\n\nSince becoming a parent about a year and a half ago, my relationship with programming has gotten… weird. I don’t have those huge, uninterrupted blocks of free time anymore. I don’t really have time to play games with friends, either. Accepting that took a while. It was a real mental adjustment.\n\nCassidy has talked about becoming more efficient after becoming a parent, and I think I’ve experienced that too. It’s strange. Before, I had what felt like unlimited free time, and I was happy about that. Now I don’t have anything close to that, but I feel like I get so much more done with the time I do have. I’m not entirely sure why.\n\nEfficiency, urgency, and AI\n\nPart of it might be that I’ve been adopting more AI workflows into what I do. There’s less friction in getting ideas out of my head and into something real. But I also think there’s something else going on. I don’t take my time for granted anymore. I don’t have the luxury of letting ideas just sit around indefinitely.\n\nBecause of that, I’ve spent a lot of time thinking about knowledge capture. This publication itself is kind of an artifact of that. I need a way to get thoughts out of my brain as they appear, so I don’t lose them. My thoughts are very important to me. I want to build things I enjoy, and ideally things other people find useful too.\n\nThe problem is that I’m terrible at just inventing problems from scratch. I can’t look at the world and confidently say, “Here’s a problem people definitely have, and here’s the solution they want.” If I don’t capture ideas when they happen, they’re basically gone. I don’t know where I was going with that exactly, but the need to externalize thoughts feels critical.\n\nExhaustion and love\n\nThe sleep deprivation is real. Parenting is exhausting. It’s also incredibly rewarding. I have zero regrets about having kids. I love my kid to death. I would sacrifice anything for him, without hesitation.\n\nBut yeah, it wears you down. I feel threadbare a lot of the time. I know it will get better. There are lifestyle changes that will help, and I’ll get there eventually. Still, it’s hard.\n\nI’ve never felt so much joy watching a person grow and learn. Even talking about it gets emotional. I want nothing more than to provide for my kid and help them grow into the best version of themselves they can be. Parenting is a lot. It’s complicated. I feel like I maybe have 1% of it figured out.\n\nJust getting through it\n\nSome weeks I feel like I’m doing pretty well. Other weeks it’s just a constant struggle. Some of that is situational. My kid is teething right now, dealing with growing pains, and generally feeling under the weather. He has a lot of needs, and those needs take precedence. There isn’t much room left for anything else.\n\nWith how my brain works, I really need time to sit with my own thoughts and actually think and do. I’m hopeful that as my kid gets older, some of that time will come back. And when it does, I think I’ll be much better equipped to use it well because of everything parenting has forced me to refine.\n\nFor now, though, I’m mostly just trying to survive."
}

did:plc:zviscnpwyvj6y32agi5davn5 | at://did:plc:zviscnpwyvj6y32agi5davn5/site.standard.document/3mejbeihj5d2l

blog.pckt.block.horizontalRule (nested within site.standard.document) (4 samples)
{
  "path": "/weve-got-a-new-look-and-other-exciting-updates-qrk9a9m",
  "site": "at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.publication/3lwafzkjqm25s",
  "tags": [],
  "$type": "site.standard.document",
  "title": "We've got a new look ! (and other exciting updates)",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Hello again everyone ! Where do we even start... pckt is growing quickly and becoming a beautiful place to start and write a blog. Our look and feel is continuing to evolve into something that feels increasingly organized, polished, and enjoyable to use. "
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 97,
              "byteStart": 89
            },
            "features": [
              {
                "uri": "https://bsky.app/profile/pckt.blog/post/3m5enzksfhk2n",
                "$type": "blog.pckt.richtext.facet#link"
              },
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "Just as our platform has become more polished, our branding has as well. We have a whole identity now ! Check out our new logo: "
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "bafkreie65zawhfi2rktclyzr4rk2y3s4p743q47qavukj4tdho7vakvsva.jpg",
          "src": "blob:bafkreid5df4bvnvpn2gjzeghtu6qmm47f6zh4r4yhxbi4otcmf7fz34ina",
          "blob": {
            "ref": {
              "$link": "bafkreid5df4bvnvpn2gjzeghtu6qmm47f6zh4r4yhxbi4otcmf7fz34ina"
            },
            "size": 22617,
            "$type": "blob",
            "mimeType": "image/jpeg"
          },
          "align": "center",
          "width": "500"
        }
      },
      {
        "$type": "blog.pckt.block.blockquote",
        "content": [
          {
            "$type": "blog.pckt.block.text",
            "facets": [
              {
                "index": {
                  "byteEnd": 24,
                  "byteStart": 16
                },
                "features": [
                  {
                    "did": "did:plc:eob75vcjtmbaef2tn4evc4sl",
                    "$type": "blog.pckt.richtext.facet#didMention"
                  }
                ]
              }
            ],
            "plaintext": "A big thanks to @aka.dad for taking our branding to the next level !"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "We're really excited about our new look and think it really captures our intentions with pckt. Writing a blog should be an inviting and playful experience. One that encourages expressing your creativity. Blogging shouldn't be an intimidating and unapproachable task. "
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "We hope pckt feels like home—a space where you’re free to express yourself and craft your own corner of the internet filled to the brim with your interests."
      },
      {
        "$type": "blog.pckt.block.horizontalRule"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 13,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "New Features:"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "We'd like to formally share some of the new features we've rolled out over the past few weeks. "
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 1
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 213,
                      "byteStart": 205
                    },
                    "features": [
                      {
                        "uri": "https://blacksky.community",
                        "$type": "blog.pckt.richtext.facet#link"
                      }
                    ]
                  }
                ],
                "plaintext": "Starting with Bluesky embeds that are fully revamped and better than ever. Just paste a link to a Bluesky post of your choice and press \"embed.\" (This will work for 3rd party Bluesky AppViews as well like Blacksky or similar.)"
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.blueskyEmbed",
        "attrs": {
          "postRef": {
            "cid": "bafyreibej2kvclteogrftzyvjp7555p3u7agog5pbonkqvd4el4uimqfpm",
            "uri": "at://did:plc:revjuqmkvrw6fnkxppqtszpv/app.bsky.feed.post/3m5krwevvz22i"
          }
        }
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 2
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 72,
                      "byteStart": 71
                    },
                    "features": [
                      {
                        "$type": "blog.pckt.richtext.facet#code"
                      }
                    ]
                  },
                  {
                    "index": {
                      "byteEnd": 130,
                      "byteStart": 120
                    },
                    "features": [
                      {
                        "did": "did:plc:revjuqmkvrw6fnkxppqtszpv",
                        "$type": "blog.pckt.richtext.facet#didMention"
                      }
                    ]
                  }
                ],
                "plaintext": "Mention your favorite Bluesky posters in your blog posts. Just type an @ sign followed by the user's handle. Like this: @pckt.blog "
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "Screenshot 2025-11-22 at 5.59.25 PM.png",
          "src": "blob:bafkreig2czw4xsz6whcya6fm3harw6zh6rdem7st2fhszzgmwja6on4a3e",
          "blob": {
            "ref": {
              "$link": "bafkreig2czw4xsz6whcya6fm3harw6zh6rdem7st2fhszzgmwja6on4a3e"
            },
            "size": 27070,
            "$type": "blob",
            "mimeType": "image/png"
          },
          "align": "center",
          "width": "500"
        }
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 3
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 71,
                      "byteStart": 62
                    },
                    "features": [
                      {
                        "uri": "http://pckt.blog",
                        "$type": "blog.pckt.richtext.facet#link"
                      }
                    ]
                  }
                ],
                "plaintext": "Even more embeds ! You can embed all kinds of rich content on pckt.blog just by pasting the link, or highlighting an existing link. Think media players, YouTube videos, websites... Check it out, you can even embed that new Ice Spice song: "
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.iframe",
        "attrs": {
          "url": "https://embed.music.apple.com/us/album/big-guy-from-the-spongebob-movie-search-for/1850034311?i=1850034312",
          "height": 175
        }
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 4
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "plaintext": "Image size adjustments help you make your uploaded images just the right size so they look perfect in your blog post."
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "Screenshot 2025-11-22 at 7.03.18 PM.png",
          "src": "blob:bafkreicy4acgbaiubqyvrtkpnzxnciyhk6awryhmmr7jjxbdedqlrtnivi",
          "blob": {
            "ref": {
              "$link": "bafkreicy4acgbaiubqyvrtkpnzxnciyhk6awryhmmr7jjxbdedqlrtnivi"
            },
            "size": 19248,
            "$type": "blob",
            "mimeType": "image/png"
          },
          "align": "center",
          "width": "500"
        }
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 5
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "plaintext": "It's easier than ever to share a quote from a blog post you enjoyed. Just highlight a selection of the post and press \"Copy Link\" or \"Share.\" A preview image will be created highlighting the section you'd like to share, perfect for posting or sending to a friend. "
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "IMG_2586.jpg",
          "src": "blob:bafkreidvvqcoo7ampcnp7wt22rlrl3u5kcqvbc2b4a52cfmdbqx57ba3da",
          "blob": {
            "ref": {
              "$link": "bafkreidvvqcoo7ampcnp7wt22rlrl3u5kcqvbc2b4a52cfmdbqx57ba3da"
            },
            "size": 92650,
            "$type": "blob",
            "mimeType": "image/jpeg"
          },
          "align": "center",
          "width": "500"
        }
      },
      {
        "$type": "blog.pckt.block.blockquote",
        "content": [
          {
            "$type": "blog.pckt.block.text",
            "facets": [
              {
                "index": {
                  "byteEnd": 53,
                  "byteStart": 34
                },
                "features": [
                  {
                    "uri": "https://figonfilm.pckt.blog/diabolique-1955-yqke174",
                    "$type": "blog.pckt.richtext.facet#link"
                  }
                ]
              }
            ],
            "plaintext": "Screenshot of a shared quote from figonfilm.pckt.blog"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.horizontalRule"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 35,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "More New Features and Improvements:"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "In addition to these key features, we've made a number of enhancements to existing features improving performance and reliability. "
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "We've also made some key visual changes to our dashboard to make the layout feel more cohesive and intuitive. Our \"category\" section has gotten a cleaned up design intended to make it less distracting. And we've added pagination for blogs that have many posts. "
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Additionally, we've added the \"invite a friend\" and \"plan usage\" sections onto our mobile layout, making this useful information even easier to access. "
      },
      {
        "$type": "blog.pckt.block.horizontalRule"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 21,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "Plans for the Future:"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "We're building pckt to make blogging fun, easy, and accessible. Alongside these values, we strongly believe that owning your creative work is essential. "
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 66,
              "byteStart": 57
            },
            "features": [
              {
                "uri": "https://pckt.blog",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 86,
              "byteStart": 76
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "It is for this reason that we have been working to bring pckt.blog into the ATmosphere. "
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 52,
              "byteStart": 41
            },
            "features": [
              {
                "uri": "https://docs.bsky.app/docs/advanced-guides/atproto",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 153,
              "byteStart": 133
            },
            "features": [
              {
                "uri": "https://docs.bsky.app/docs/advanced-guides/federation-architecture#personal-data-server-pds",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "Behind the scenes, we've been developing AT Protocol integrations that will allow your blogs and published posts to live on your own Personal Data Server (PDS). "
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 59,
              "byteStart": 52
            },
            "features": [
              {
                "uri": "https://bsky.app",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "This integration will make it possible to link your Bluesky and other ATProto accounts to your existing pckt account—or even completely skip our registration process by signing in with an ATproto account directly if you prefer. "
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "While we'd like to have this implemented sooner than later, we want to take all the time we need to explore the options available to us to ensure we are creating an experience that we're proud of. "
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 105,
              "byteStart": 93
            },
            "features": [
              {
                "did": "did:plc:btxrwcaeyodrap5mnjw2fvmz",
                "$type": "blog.pckt.richtext.facet#didMention"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 123,
              "byteStart": 110
            },
            "features": [
              {
                "did": "did:plc:pgjkomf37an4czloay5zeth6",
                "$type": "blog.pckt.richtext.facet#didMention"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 160,
              "byteStart": 149
            },
            "features": [
              {
                "did": "did:plc:7puq73yz2hkvbcpdhnsze2qw",
                "$type": "blog.pckt.richtext.facet#didMention"
              }
            ]
          }
        ],
        "plaintext": "We've also been in touch with the teams behind other ATproto-focused writing experience like @leaflet.pub and @offprint.app along with projects like @wisp.place to explore ways we can encourage greater interoperability between our platforms, and those yet to come. "
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "(More information soon™)"
      },
      {
        "$type": "blog.pckt.block.horizontalRule"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Anyways ! Thank you so much for being here. We really hope you're enjoying pckt so far."
      },
      {
        "$type": "blog.pckt.block.text"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 109,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "Questions? Concerns? Bug reports? Feature Requests? Just want to say hello? Send us an email: hello@pckt.blog"
      },
      {
        "$type": "blog.pckt.block.text"
      }
    ]
  },
  "updatedAt": "2026-01-13T03:30:36+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreicf7q4wki53ja4jr3zequrubj7my2m2spollaud262h6tom4xwyqa"
    },
    "size": 11778,
    "$type": "blob",
    "mimeType": "image/png"
  },
  "description": "Hello again everyone ! Where do we even start... pckt is growing quickly and becoming a beautiful place to start and write a blog. Our look and feel is continuing to evolve into something that feels increasingly organized, polished, and enjoyable to use. Just as our platform has become more polished, our branding has as well. We have a whole identity now ! Check out our new logo: We're really excited about our new look and think it really captures our intentions with pckt. Writing a blog should ...",
  "publishedAt": "2025-11-16T11:37:16+00:00",
  "textContent": "Hello again everyone ! Where do we even start... pckt is growing quickly and becoming a beautiful place to start and write a blog. Our look and feel is continuing to evolve into something that feels increasingly organized, polished, and enjoyable to use. \nJust as our platform has become more polished, our branding has as well. We have a whole identity now ! Check out our new logo: \nA big thanks to  for taking our branding to the next level !\nWe're really excited about our new look and think it really captures our intentions with pckt. Writing a blog should be an inviting and playful experience. One that encourages expressing your creativity. Blogging shouldn't be an intimidating and unapproachable task. \nWe hope pckt feels like home—a space where you’re free to express yourself and craft your own corner of the internet filled to the brim with your interests.\nNew Features:\nWe'd like to formally share some of the new features we've rolled out over the past few weeks. \nStarting with Bluesky embeds that are fully revamped and better than ever. Just paste a link to a Bluesky post of your choice and press \"embed.\" (This will work for 3rd party Bluesky AppViews as well like Blacksky or similar.)\nMention your favorite Bluesky posters in your blog posts. Just type an @ sign followed by the user's handle. Like this:  \nEven more embeds ! You can embed all kinds of rich content on pckt.blog just by pasting the link, or highlighting an existing link. Think media players, YouTube videos, websites... Check it out, you can even embed that new Ice Spice song: \nImage size adjustments help you make your uploaded images just the right size so they look perfect in your blog post.\nIt's easier than ever to share a quote from a blog post you enjoyed. Just highlight a selection of the post and press \"Copy Link\" or \"Share.\" A preview image will be created highlighting the section you'd like to share, perfect for posting or sending to a friend. \nScreenshot of a shared quote from figonfilm.pckt.blog\nMore New Features and Improvements:\nIn addition to these key features, we've made a number of enhancements to existing features improving performance and reliability. \nWe've also made some key visual changes to our dashboard to make the layout feel more cohesive and intuitive. Our \"category\" section has gotten a cleaned up design intended to make it less distracting. And we've added pagination for blogs that have many posts. \nAdditionally, we've added the \"invite a friend\" and \"plan usage\" sections onto our mobile layout, making this useful information even easier to access. \nPlans for the Future:\nWe're building pckt to make blogging fun, easy, and accessible. Alongside these values, we strongly believe that owning your creative work is essential. \nIt is for this reason that we have been working to bring pckt.blog into the ATmosphere. \nBehind the scenes, we've been developing AT Protocol integrations that will allow your blogs and published posts to live on your own Personal Data Server (PDS). \nThis integration will make it possible to link your Bluesky and other ATProto accounts to your existing pckt account—or even completely skip our registration process by signing in with an ATproto account directly if you prefer. \nWhile we'd like to have this implemented sooner than later, we want to take all the time we need to explore the options available to us to ensure we are creating an experience that we're proud of. \nWe've also been in touch with the teams behind other ATproto-focused writing experience like  and  along with projects like  to explore ways we can encourage greater interoperability between our platforms, and those yet to come. \n(More information soon™)\nAnyways ! Thank you so much for being here. We really hope you're enjoying pckt so far.\nQuestions? Concerns? Bug reports? Feature Requests? Just want to say hello? Send us an email: hello@pckt.blog"
}

did:plc:revjuqmkvrw6fnkxppqtszpv | at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.document/3m5qmnkrgs2xb

blog.pckt.block.iframe (nested within site.standard.document) (1 sample)
{
  "path": "/jump-on-that-fire-horse-ts98qge",
  "site": "at://did:plc:v46ojbiop5ebs5h7gaomixcc/site.standard.publication/3m57zfsq3a2fo",
  "tags": [
    "horse",
    "youtube"
  ],
  "$type": "site.standard.document",
  "title": "Jump on that fire horse?",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "Screenshot 2026-02-11 at 6.07.36 PM.png",
          "src": "blob:bafkreigrgacn5w2tbiowief2suibf5s3ro37qnk54jg2d2di7el2vdt4we",
          "blob": {
            "ref": {
              "$link": "bafkreigrgacn5w2tbiowief2suibf5s3ro37qnk54jg2d2di7el2vdt4we"
            },
            "size": 138254,
            "$type": "blob",
            "mimeType": "image/webp"
          },
          "align": "center",
          "width": "500"
        }
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 166,
              "byteStart": 130
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "I just watched an obscure youtube video lol, It's a brand new account with one single video posted yesterday (02/10/2026) titled \"why and how to jump on a fire horse.\" "
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "The general vibe of the video? really strange, really good, just some baddie ranting and piecing together a string of coincidences occurring on February 17th. Chinese New Year (the year of the fire horse), the date falling on a Tuesday relating to the norse god Tyr, the god of war, law, and justice who sacrificed his hand to the wolf Fenrir... The Roman god Mars, a solar eclipse happening on the 17th, Ramadan, Lent. "
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "This girl has a whole written out map she's mirroring onto her TV while she gives a presentation about all these events happening and babbling about jumping on horses, running horses, fire horses. Will you be jumping on the firehorse? Will you be letting go of your baggage and getting up on that horse? Will u girl ?? "
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "She says you've just got to make changes for yourself, nurture your body and the mind will follow. While I'm not sold that all these coincidences have some larger meaning, I did feel moved by her video, just something about the way everything is presented feels so open and friendly and organic. "
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "It feels like spending time with friends and just bullshitting together. Overall, I'm feeling inspired, I want to have a good life and so do you probably. (at least I hope you do.) Anyways, this video, while strange, put me in a pretty good mood. I'm going to listen to what she's said and do some yoga tonight lol. You should do something for yourself too. "
      },
      {
        "url": "https://www.youtube.com/embed/zMwu-m77Sn4?rel=0&hl=en-US",
        "$type": "blog.pckt.block.iframe",
        "attrs": []
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Since this account was so new and empty, I did a little bit of digging because I'm a curious person. If you check her youtube blurb, there's a link to a Spotify playlist and a link to another youtube channel with one video as well, a tarot reading for the collective consciousness. "
      },
      {
        "url": "https://open.spotify.com/embed/playlist/0X9tRNlBm5jB1Wew3Y3i6d?utm_source=oembed",
        "$type": "blog.pckt.block.iframe",
        "height": 352
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Here's the playlist if you're curious too ! Listening to the first song as I'm writing this and so far so good. The second youtube channel's blurb has a link to an instagram account, it's a dead end though... No posts, 4 rando followers. Kanye on the playlist ? in 2026? OK. I get it though, the song kinda fits the theme of weird religious / spiritual occurrences."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Both of the YT blurbs have like girlboss hustle culture tones, so strange compared to the actual video lmao. "
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Oh ! She's got an insta ! and she's got allotta followers (95k+) hahaha that explains it. I'm leaving it here. Glad i watched the video ! so confused ! less confused now ! live your life and stuff ! "
      },
      {
        "src": "https://www.instagram.com/jestressjoan/",
        "$type": "blog.pckt.block.website",
        "title": "Joan🃏 (@jestressjoan) • Instagram profile",
        "description": "94K Followers, 622 Following, 151 Posts - See Instagram photos and videos from Joan🃏 (@jestressjoan)",
        "previewImage": "https://scontent-iad3-1.cdninstagram.com/v/t51.82787-19/587394954_18065289914385735_6700079099030569251_n.jpg?stp=dst-jpg_s100x100_tt6&_nc_cat=1&ccb=7-5&_nc_sid=bf7eb4&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLnd3dy4xMDgwLkMzIn0%3D&_nc_ohc=1EGnJdcwRjgQ7kNvwHkHZ0o&_nc_oc=AdnwLLEEntAywX2PNrDKykrVEBlTWm3PgbwkIsQPpd0KESDSEzcdZheXajHJ0VTxGJE&_nc_zt=24&_nc_ht=scontent-iad3-1.cdninstagram.com&_nc_gid=wifnsL0g_zLGx_rJXRTuCw&oh=00_AfvtqlH2dT9c3pd-YUJeS9O5mPFz-1haItK2EklX4CstMQ&oe=69931AF6"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "XoXo Brookie <3 "
      }
    ]
  },
  "updatedAt": "2026-02-14T03:54:24+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreigrgacn5w2tbiowief2suibf5s3ro37qnk54jg2d2di7el2vdt4we"
    },
    "size": 138254,
    "$type": "blob",
    "mimeType": "image/webp"
  },
  "description": "I just watched an obscure youtube video lol, It's a brand new account with one single video posted yesterday (02/10/2026) titled \"why and how to jump on a fire horse.\" The general vibe of the video? really strange, really good, just some baddie ranting and piecing together a string of coincidences occurring on February 17th. Chinese New Year (the year of the fire horse), the date falling on a Tuesday relating to the norse god Tyr, the god of war, law, and justice who sacrificed his hand to the w...",
  "publishedAt": "2026-02-12T01:34:22+00:00",
  "textContent": "I just watched an obscure youtube video lol, It's a brand new account with one single video posted yesterday (02/10/2026) titled \"why and how to jump on a fire horse.\" \nThe general vibe of the video? really strange, really good, just some baddie ranting and piecing together a string of coincidences occurring on February 17th. Chinese New Year (the year of the fire horse), the date falling on a Tuesday relating to the norse god Tyr, the god of war, law, and justice who sacrificed his hand to the wolf Fenrir... The Roman god Mars, a solar eclipse happening on the 17th, Ramadan, Lent. \nThis girl has a whole written out map she's mirroring onto her TV while she gives a presentation about all these events happening and babbling about jumping on horses, running horses, fire horses. Will you be jumping on the firehorse? Will you be letting go of your baggage and getting up on that horse? Will u girl ?? \nShe says you've just got to make changes for yourself, nurture your body and the mind will follow. While I'm not sold that all these coincidences have some larger meaning, I did feel moved by her video, just something about the way everything is presented feels so open and friendly and organic. \nIt feels like spending time with friends and just bullshitting together. Overall, I'm feeling inspired, I want to have a good life and so do you probably. (at least I hope you do.) Anyways, this video, while strange, put me in a pretty good mood. I'm going to listen to what she's said and do some yoga tonight lol. You should do something for yourself too. \nSince this account was so new and empty, I did a little bit of digging because I'm a curious person. If you check her youtube blurb, there's a link to a Spotify playlist and a link to another youtube channel with one video as well, a tarot reading for the collective consciousness. \nHere's the playlist if you're curious too ! Listening to the first song as I'm writing this and so far so good. The second youtube channel's blurb has a link to an instagram account, it's a dead end though... No posts, 4 rando followers. Kanye on the playlist ? in 2026? OK. I get it though, the song kinda fits the theme of weird religious / spiritual occurrences.\nBoth of the YT blurbs have like girlboss hustle culture tones, so strange compared to the actual video lmao. \nOh ! She's got an insta ! and she's got allotta followers (95k+) hahaha that explains it. I'm leaving it here. Glad i watched the video ! so confused ! less confused now ! live your life and stuff ! \nXoXo Brookie <3"
}

did:plc:v46ojbiop5ebs5h7gaomixcc | at://did:plc:v46ojbiop5ebs5h7gaomixcc/site.standard.document/3memtyj4kw2jy

blog.pckt.block.image (nested within site.standard.document) (9 samples)
{
  "path": "/hello-world-8hjnwy4",
  "site": "at://did:plc:257wekqxg4hyapkq6k47igmp/site.standard.publication/3mbupndgqy2jv",
  "tags": [
    "hello"
  ],
  "$type": "site.standard.document",
  "title": "hello world",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "this is my first test post!"
      },
      {
        "$type": "blog.pckt.block.bulletList",
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "plaintext": "a list"
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "plaintext": "with two items"
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "https://blento.app"
      },
      {
        "$type": "blog.pckt.block.horizontalRule"
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "subheading"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 15,
              "byteStart": 5
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 29,
              "byteStart": 24
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "some formatting testing here!"
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "blento-dark4.jpg",
          "src": "blob:bafkreie7v4w2pnl6z2wdwl7p6jgnkpn3nxqav6qq7oeg7k7ikk6422txay",
          "blob": {
            "ref": {
              "$link": "bafkreie7v4w2pnl6z2wdwl7p6jgnkpn3nxqav6qq7oeg7k7ikk6422txay"
            },
            "size": 146031,
            "$type": "blob",
            "mimeType": "image/jpeg"
          },
          "align": "center"
        }
      },
      {
        "$type": "blog.pckt.block.blockquote",
        "content": [
          {
            "$type": "blog.pckt.block.text",
            "plaintext": "to do or not to do"
          },
          {
            "$type": "blog.pckt.block.bulletList",
            "content": [
              {
                "$type": "blog.pckt.block.listItem",
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "albert einstein"
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text"
      }
    ]
  },
  "updatedAt": "2026-01-20T02:45:29+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreie7v4w2pnl6z2wdwl7p6jgnkpn3nxqav6qq7oeg7k7ikk6422txay"
    },
    "size": 146031,
    "$type": "blob",
    "mimeType": "image/jpeg"
  },
  "description": "this is my first test post! https://blento.app some formatting testing here!",
  "publishedAt": "2026-01-08T00:22:19+00:00",
  "textContent": "this is my first test post!\na list\nwith two items\nhttps://blento.app\nsubheading\nsome formatting testing here!\nto do or not to doalbert einstein"
}

did:plc:257wekqxg4hyapkq6k47igmp | at://did:plc:257wekqxg4hyapkq6k47igmp/site.standard.document/3mbupnhata2wj

blog.pckt.block.listItem (nested within site.standard.document) (4 samples)
{
  "path": "/whats-new-on-pcktblog-b51cy27",
  "site": "at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.publication/3lwafzkjqm25s",
  "tags": [
    "👩‍💻 Updates"
  ],
  "$type": "site.standard.document",
  "title": "What's new on pckt.blog?",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 28,
              "byteStart": 19
            },
            "features": [
              {
                "uri": "http://pckt.blog",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "Hey Bloggers! 👋 pckt.blog has changed a bit since our last post. Our platform is beginning to feel more polished and we have been very pleased with the direction things have been going from both the user experience and design perspective. We hope that you will enjoy the changes and improvements we've made so far."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Let's take a look at some of the enhancements we have made: "
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 1
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 79,
                      "byteStart": 73
                    },
                    "features": [
                      {
                        "uri": "https://lucide.dev",
                        "$type": "blog.pckt.richtext.facet#link"
                      }
                    ]
                  }
                ],
                "plaintext": "We've upgraded to a nicer set of icons throughout the platform thanks to Lucide. (maybe someday we'll have icons made from scratch 🤞) "
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "Screenshot 2025-10-24 at 10.31.37 PM.png",
          "src": "blob:bafkreiccme7flrnzurejquo3h2p24emffob6tcox4uogkrd346kcxr2ebi",
          "blob": {
            "ref": {
              "$link": "bafkreiccme7flrnzurejquo3h2p24emffob6tcox4uogkrd346kcxr2ebi"
            },
            "size": 19980,
            "$type": "blob",
            "mimeType": "image/png"
          },
          "align": "center"
        }
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 2
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "plaintext": "Preview cards for blog posts have a clean new look. A subtly colored bar along the left side with a soft gradient behind the thumbnail image provides clear indication of the post's draft / published status. The cards also now have a much cleaner layout making posts much easier to manage.  "
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "Screenshot 2025-10-24 at 10.37.46 PM.png",
          "src": "blob:bafkreicbz4yctlnbctwkpqpo3rwnxw6wyi3f6duqw47msmxd46o3eeuqwu",
          "blob": {
            "ref": {
              "$link": "bafkreicbz4yctlnbctwkpqpo3rwnxw6wyi3f6duqw47msmxd46o3eeuqwu"
            },
            "size": 187483,
            "$type": "blob",
            "mimeType": "image/png"
          },
          "align": "center"
        }
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 3
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 119,
                      "byteStart": 110
                    },
                    "features": [
                      {
                        "uri": "http://pckt.blog",
                        "$type": "blog.pckt.richtext.facet#link"
                      }
                    ]
                  }
                ],
                "plaintext": "In addition to blog icons, we have added blog backgrounds which extend the customization options available on pckt.blog making it even more personal."
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "Screenshot 2025-10-24 at 10.51.59 PM.png",
          "src": "blob:bafkreibtiigyihnm6i62sayf24oz3jhu4r5f4sszrrywezjjj6yd65zlsi",
          "blob": {
            "ref": {
              "$link": "bafkreibtiigyihnm6i62sayf24oz3jhu4r5f4sszrrywezjjj6yd65zlsi"
            },
            "size": 48177,
            "$type": "blob",
            "mimeType": "image/png"
          }
        }
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Background images are fantastic for blog pages and even work well with the dark mode version of the blog!"
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 4
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "plaintext": "Speaking of blog pages, when sharing a blog link on social media, a screenshot of your blog will be shown in the link preview. (The same thing will happen when you share a blog posts without a thumbnail image. 😌)  "
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "Screenshot 2025-10-24 at 10.48.45 PM.png",
          "src": "blob:bafkreie3nsigxzgktr7ch7nzyej3s3kf4vgh25if5osf6s2csn2jppfgz4",
          "blob": {
            "ref": {
              "$link": "bafkreie3nsigxzgktr7ch7nzyej3s3kf4vgh25if5osf6s2csn2jppfgz4"
            },
            "size": 624662,
            "$type": "blob",
            "mimeType": "image/png"
          },
          "align": "center"
        }
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 5
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "plaintext": "All of our existing content blocks now follow the blog theme, including code blocks with syntax highlighting. (We may add more varied highlight colors for each theme in the future.) "
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "Screenshot 2025-10-24 at 11.03.06 PM.png",
          "src": "blob:bafkreifbl5o5335ih3vr4doadp2slrvhonjyy5lqnuhqwu4eadco2kijwm",
          "blob": {
            "ref": {
              "$link": "bafkreifbl5o5335ih3vr4doadp2slrvhonjyy5lqnuhqwu4eadco2kijwm"
            },
            "size": 39047,
            "$type": "blob",
            "mimeType": "image/png"
          },
          "align": "center"
        }
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 6
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "plaintext": "One more thing that we're very excited about ! We've added a new share menu for sharing quotes from blog posts. Select a portion of text in the document and press copy or share. A link will be generated with a preview image showcasing the highlighted section."
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "Screenshot 2025-11-02 at 6.04.00 PM.png",
          "src": "blob:bafkreifclk57vimsrsrsysav2s7kgrf2pnm4upddqbwhfttd4ot3rp4p6m",
          "blob": {
            "ref": {
              "$link": "bafkreifclk57vimsrsrsysav2s7kgrf2pnm4upddqbwhfttd4ot3rp4p6m"
            },
            "size": 248053,
            "$type": "blob",
            "mimeType": "image/png"
          }
        }
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 7
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "plaintext": "We've also added a handful of other quality of life updates like the ability to edit post categories, additional themes, an easier way to visit your live blogs from the dashboard, and even more changes to blog and dashboard layouts. "
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 321,
              "byteStart": 312
            },
            "features": [
              {
                "uri": "http://pckt.blog",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "That's it for now ! More to come soon. If you're a writer on pckt, thank you for being here and for providing feedback to improve the platform. Every bit helps ! If you're new here, we're excited about where things are headed and would love to have you join us as a writer. Now is a great time to start your own pckt.blog and see how simple writing and publishing a blog can feel. "
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 88,
              "byteStart": 54
            },
            "features": [
              {
                "uri": "https://bsky.app/profile/pckt.blog",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "Follow along on Bluesky for invite links and updates: https://bsky.app/profile/pckt.blog"
      }
    ]
  },
  "updatedAt": "2026-01-13T03:30:35+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreie3nsigxzgktr7ch7nzyej3s3kf4vgh25if5osf6s2csn2jppfgz4"
    },
    "size": 624662,
    "$type": "blob",
    "mimeType": "image/png"
  },
  "description": "Hey Bloggers! 👋 pckt.blog has changed a bit since our last post. Our platform is beginning to feel more polished and we have been very pleased with the direction things have been going from both the user experience and design perspective. We hope that you will enjoy the changes and improvements we've made so far. Let's take a look at some of the enhancements we have made: Background images are fantastic for blog pages and even work well with the dark mode version of the blog!",
  "publishedAt": "2025-10-25T04:59:21+00:00",
  "textContent": "Hey Bloggers! 👋 pckt.blog has changed a bit since our last post. Our platform is beginning to feel more polished and we have been very pleased with the direction things have been going from both the user experience and design perspective. We hope that you will enjoy the changes and improvements we've made so far.\nLet's take a look at some of the enhancements we have made: \nWe've upgraded to a nicer set of icons throughout the platform thanks to Lucide. (maybe someday we'll have icons made from scratch 🤞) \nPreview cards for blog posts have a clean new look. A subtly colored bar along the left side with a soft gradient behind the thumbnail image provides clear indication of the post's draft / published status. The cards also now have a much cleaner layout making posts much easier to manage.  \nIn addition to blog icons, we have added blog backgrounds which extend the customization options available on pckt.blog making it even more personal.\nBackground images are fantastic for blog pages and even work well with the dark mode version of the blog!\nSpeaking of blog pages, when sharing a blog link on social media, a screenshot of your blog will be shown in the link preview. (The same thing will happen when you share a blog posts without a thumbnail image. 😌)  \nAll of our existing content blocks now follow the blog theme, including code blocks with syntax highlighting. (We may add more varied highlight colors for each theme in the future.) \nOne more thing that we're very excited about ! We've added a new share menu for sharing quotes from blog posts. Select a portion of text in the document and press copy or share. A link will be generated with a preview image showcasing the highlighted section.\nWe've also added a handful of other quality of life updates like the ability to edit post categories, additional themes, an easier way to visit your live blogs from the dashboard, and even more changes to blog and dashboard layouts. \nThat's it for now ! More to come soon. If you're a writer on pckt, thank you for being here and for providing feedback to improve the platform. Every bit helps ! If you're new here, we're excited about where things are headed and would love to have you join us as a writer. Now is a great time to start your own pckt.blog and see how simple writing and publishing a blog can feel. \nFollow along on Bluesky for invite links and updates: https://bsky.app/profile/pckt.blog"
}

did:plc:revjuqmkvrw6fnkxppqtszpv | at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.document/3m3ym5rnr42rg

blog.pckt.block.orderedList (nested within site.standard.document) (3 samples)
{
  "path": "/atproto-test-q6w9a9m",
  "site": "at://did:plc:v46ojbiop5ebs5h7gaomixcc/site.standard.publication/3m57zfsq3a2fo",
  "tags": [],
  "$type": "site.standard.document",
  "title": "Atproto test",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "hello ! "
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 19,
              "byteStart": 10
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              },
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "this is a test post stored on my pds "
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 1
        },
        "content": [
          {
            "text": "",
            "$type": "blog.pckt.block.text"
          }
        ]
      },
      {
        "$type": "blog.pckt.block.codeBlock",
        "attrs": {
          "language": "php"
        },
        "plaintext": "//config/backup.php\n\n    'cleanup' => [\n        /*\n         * The strategy that will be used to cleanup old backups. The default strategy\n         * will keep all backups for a certain amount of days. After that period only\n         * a daily backup will be kept. After that period only weekly backups will\n         * be kept and so on.\n         *\n         * No matter how you configure it the default strategy will never\n         * delete the newest backup.\n         */\n        'strategy' => \\Spatie\\Backup\\Tasks\\Cleanup\\Strategies\\DefaultStrategy::class,\n\n        'default_strategy' => [\n\n            /*\n             * The number of days that all backups must be kept.\n             */\n            'keep_all_backups_for_days' => 7,\n\n            /*\n             * The number of days that all daily backups must be kept.\n             */\n            'keep_daily_backups_for_days' => 16,\n\n            /*\n             * The number of weeks of which one weekly backup must be kept.\n             */\n            'keep_weekly_backups_for_weeks' => 8,\n\n            /*\n             * The number of months of which one monthly backup must be kept.\n             */\n            'keep_monthly_backups_for_months' => 4,\n\n            /*\n             * The number of years of which one yearly backup must be kept.\n             */\n            'keep_yearly_backups_for_years' => 2,\n\n            /*\n             * After cleaning up the backups remove the oldest backup until\n             * this amount of megabytes has been reached.\n             * Set null for unlimited size.\n             */\n            'delete_oldest_backups_when_using_more_megabytes_than' => 5000,\n        ],\n    ],"
      },
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "IMG_2311.gif",
          "src": "blob:bafkreihkbujaugtwtax7cwiu4xcttpqri24vlu4w35njdcyz5fseqpfi2i"
        }
      },
      {
        "$type": "blog.pckt.block.text"
      }
    ]
  },
  "updatedAt": "2026-01-30T08:39:28+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreihkbujaugtwtax7cwiu4xcttpqri24vlu4w35njdcyz5fseqpfi2i"
    },
    "size": 129303,
    "$type": "blob",
    "mimeType": "image/gif"
  },
  "description": "hello ! this is a test post stored on my pds",
  "publishedAt": "2025-11-10T02:10:00+00:00",
  "textContent": "hello ! \nthis is a test post stored on my pds \n//config/backup.php\n\n    'cleanup' => [\n        /*\n         * The strategy that will be used to cleanup old backups. The default strategy\n         * will keep all backups for a certain amount of days. After that period only\n         * a daily backup will be kept. After that period only weekly backups will\n         * be kept and so on.\n         *\n         * No matter how you configure it the default strategy will never\n         * delete the newest backup.\n         */\n        'strategy' => \\Spatie\\Backup\\Tasks\\Cleanup\\Strategies\\DefaultStrategy::class,\n\n        'default_strategy' => [\n\n            /*\n             * The number of days that all backups must be kept.\n             */\n            'keep_all_backups_for_days' => 7,\n\n            /*\n             * The number of days that all daily backups must be kept.\n             */\n            'keep_daily_backups_for_days' => 16,\n\n            /*\n             * The number of weeks of which one weekly backup must be kept.\n             */\n            'keep_weekly_backups_for_weeks' => 8,\n\n            /*\n             * The number of months of which one monthly backup must be kept.\n             */\n            'keep_monthly_backups_for_months' => 4,\n\n            /*\n             * The number of years of which one yearly backup must be kept.\n             */\n            'keep_yearly_backups_for_years' => 2,\n\n            /*\n             * After cleaning up the backups remove the oldest backup until\n             * this amount of megabytes has been reached.\n             * Set null for unlimited size.\n             */\n            'delete_oldest_backups_when_using_more_megabytes_than' => 5000,\n        ],\n    ],"
}

did:plc:v46ojbiop5ebs5h7gaomixcc | at://did:plc:v46ojbiop5ebs5h7gaomixcc/site.standard.document/3m5ak5oqnk2zz

blog.pckt.block.table (nested within site.standard.document) (1 sample)
{
  "path": "/from-whitewind-to-pcktblog-in-just-one-click-5kkv73t",
  "site": "at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.publication/3lwafzkjqm25s",
  "tags": [
    "👩‍💻 Updates",
    "WhiteWind"
  ],
  "$type": "site.standard.document",
  "title": "From WhiteWind to pckt.blog in Just One Click",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "og-image copy.png",
          "src": "blob:bafkreigvyx5lewh2zkrfi43wndg5ktq47tgaocwdcdaomhwl22zpuihnau",
          "blob": {
            "ref": {
              "$link": "bafkreigvyx5lewh2zkrfi43wndg5ktq47tgaocwdcdaomhwl22zpuihnau"
            },
            "size": 119703,
            "$type": "blob",
            "mimeType": "image/png"
          },
          "align": "center"
        }
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Hey bloggers and WhiteWinders ! "
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 9,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://whtwnd.com/",
                "$type": "blog.pckt.richtext.facet#link"
              },
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 27,
              "byteStart": 14
            },
            "features": [
              {
                "uri": "https://atprotocol.dev/tech-talk-building-long-form-blogging-with-whitewind/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 65,
              "byteStart": 54
            },
            "features": [
              {
                "uri": "https://atproto.com/articles/atproto-ethos",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 271,
              "byteStart": 262
            },
            "features": [
              {
                "uri": "https://pckt.blog",
                "$type": "blog.pckt.richtext.facet#link"
              },
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "WhiteWind has paved the way for long-form blogging on AT Protocol, but as the ecosystem evolves, your blog needs a platform that grows with it. While WhiteWind has remained a widely used classic, development of the platform has lately gone quiet. We're building pckt.blog, a fun and cute take on blogging that makes it easy to make a blog and start writing."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 4,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 105,
              "byteStart": 99
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 361,
              "byteStart": 346
            },
            "features": [
              {
                "uri": "https://read.pckt.blog",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "pckt is actively maintained, and designed with simplicity and ease of use in mind. We believe that anyone should be able to quickly create a blog to share their thoughts, passions, and stories. We also offer a powerful dashboard to manage posts, an intuitive editor with rich content types and embeds, and a variety of theming options. Plus, our built-in reader lets you discover writing across the entire atmosphere, keeping you connected to the community."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "One-Click WhiteWind Migration"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 88,
              "byteStart": 84
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "We are excited to announce that as of today, you can import your WhiteWind posts to pckt with just a click."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 65,
              "byteStart": 61
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 99,
              "byteStart": 88
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 129,
              "byteStart": 109
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 188,
              "byteStart": 182
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 211,
              "byteStart": 198
            },
            "features": [
              {
                "uri": "https://standard.site",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "When importing, a copy of your posts will be created on your pckt blog. Posts that are \"Author Only\" or for \"Anyone with the link\" will stay as private drafts in your dashboard. For Public posts, a Standard.site document record will be created on your Personal Data Server (PDS) and your post will be published to your blog, ready to read and share."
      },
      {
        "$type": "blog.pckt.block.table",
        "content": [
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableHeader",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 7,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Feature"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableHeader",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 9,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "WhiteWind"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableHeader",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 9,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "pckt.blog"
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Look & Feel"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "One-size-fits-all"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Your Style: Custom themes, fonts, and backgrounds."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 10,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "The Editor"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Basic Markdown"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Rich Media: Use Markdown-like syntax + Bluesky embeds, mentions, and other rich blocks."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 9,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Discovery"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Hard to find"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Integrated: Built-in reader and Standard.site for instant reach."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 14,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Multiple Blogs"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Limit of one"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Expandable: Manage multiple blogs from one dashboard."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 12,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Organization"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "No tags"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Categories: Labels to help with sorting and discovery."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 10,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Experience"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Desktop-focused"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Responsive: A seamless experience on your phone, tablet, or desktop."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "SEO & Links"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Limited control"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 17,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Search Optimized: Meta tags and clean URLs to help you rank."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Support"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Unmaintained"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 7,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 57,
                          "byteStart": 47
                        },
                        "features": [
                          {
                            "did": "did:plc:revjuqmkvrw6fnkxppqtszpv",
                            "$type": "blog.pckt.richtext.facet#didMention"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Active: Reach out for help any time on Bluesky @pckt.blog "
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 4,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "pckt.blog offers a unique writing experience that removes distractions and lets your ideas to flow. It's cute, sharable and user-friendly. Most importantly, we are actively listening to the community to build the features you want next."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 95,
              "byteStart": 91
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "Whether you’re here to find your voice or find your next favorite read, we’re building pckt for you. We’d love to have you as part of our growing community."
      },
      {
        "$type": "blog.pckt.block.horizontalRule"
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "How to import your posts:"
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 1
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 19,
                      "byteStart": 10
                    },
                    "features": [
                      {
                        "uri": "https://pckt.blog",
                        "$type": "blog.pckt.richtext.facet#link"
                      }
                    ]
                  }
                ],
                "plaintext": "Log in to pckt.blog using your handle."
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 9,
                      "byteStart": 0
                    },
                    "features": [
                      {
                        "$type": "blog.pckt.richtext.facet#bold"
                      }
                    ]
                  }
                ],
                "plaintext": "New here? Pick a name for your blog to get started."
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 33,
                      "byteStart": 10
                    },
                    "features": [
                      {
                        "$type": "blog.pckt.richtext.facet#bold"
                      }
                    ]
                  }
                ],
                "plaintext": "Click the \"Import from WhiteWind\" button (found in the lower right, or at the bottom on mobile)."
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 36,
                      "byteStart": 27
                    },
                    "features": [
                      {
                        "$type": "blog.pckt.richtext.facet#bold"
                      }
                    ]
                  }
                ],
                "plaintext": "Choose your blog and press \"Import.\""
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.blueskyEmbed",
        "attrs": {
          "postRef": {
            "cid": "bafyreif6ky724rlrgfqonf2jqjack3el37w4fd3dgzrvshbfgfaamqjl7u",
            "uri": "at://did:plc:revjuqmkvrw6fnkxppqtszpv/app.bsky.feed.post/3mdq7tgxd2223"
          }
        }
      },
      {
        "$type": "blog.pckt.block.horizontalRule"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 43,
              "byteStart": 39
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "We can't wait to see what you share on pckt!"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 172,
              "byteStart": 162
            },
            "features": [
              {
                "did": "did:plc:revjuqmkvrw6fnkxppqtszpv",
                "$type": "blog.pckt.richtext.facet#didMention"
              }
            ]
          }
        ],
        "plaintext": "Our community is growing every day, and your unique voice is exactly what the atmosphere needs. Once you’ve migrated your posts, feel free to tag us on Bluesky @pckt.blog so we can check out your new home and share your work with the rest of the neighborhood!"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Happy blogging !"
      },
      {
        "$type": "blog.pckt.block.text"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 27,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://whtwnd.com/pckt.blog/3mdq4trxw222y",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "View this post on WhiteWind"
      }
    ]
  },
  "updatedAt": "2026-02-01T04:59:28+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreigvyx5lewh2zkrfi43wndg5ktq47tgaocwdcdaomhwl22zpuihnau"
    },
    "size": 119703,
    "$type": "blob",
    "mimeType": "image/png"
  },
  "description": "WhiteWind has paved the way for long-form blogging on AT Protocol, but as the ecosystem evolves, your blog needs a platform that grows with it. While WhiteWind has remained a widely used classic, development of the platform has lately gone quiet. We're building pckt.blog, a fun and cute take on blogging that makes it easy to make a blog and start writing. pckt is actively maintained, and designed with simplicity and ease of use in mind. We believe that anyone should be able to quickly create a b...",
  "publishedAt": "2026-01-31T15:28:06+00:00",
  "textContent": "Hey bloggers and WhiteWinders ! \nWhiteWind has paved the way for long-form blogging on AT Protocol, but as the ecosystem evolves, your blog needs a platform that grows with it. While WhiteWind has remained a widely used classic, development of the platform has lately gone quiet. We're building pckt.blog, a fun and cute take on blogging that makes it easy to make a blog and start writing.\npckt is actively maintained, and designed with simplicity and ease of use in mind. We believe that anyone should be able to quickly create a blog to share their thoughts, passions, and stories. We also offer a powerful dashboard to manage posts, an intuitive editor with rich content types and embeds, and a variety of theming options. Plus, our built-in reader lets you discover writing across the entire atmosphere, keeping you connected to the community.\nOne-Click WhiteWind Migration\nWe are excited to announce that as of today, you can import your WhiteWind posts to pckt with just a click.\nWhen importing, a copy of your posts will be created on your pckt blog. Posts that are \"Author Only\" or for \"Anyone with the link\" will stay as private drafts in your dashboard. For Public posts, a Standard.site document record will be created on your Personal Data Server (PDS) and your post will be published to your blog, ready to read and share.\nFeatureWhiteWindpckt.blogLook & FeelOne-size-fits-allYour Style: Custom themes, fonts, and backgrounds.The EditorBasic MarkdownRich Media: Use Markdown-like syntax + Bluesky embeds, mentions, and other rich blocks.DiscoveryHard to findIntegrated: Built-in reader and Standard.site for instant reach.Multiple BlogsLimit of oneExpandable: Manage multiple blogs from one dashboard.OrganizationNo tagsCategories: Labels to help with sorting and discovery.ExperienceDesktop-focusedResponsive: A seamless experience on your phone, tablet, or desktop.SEO & LinksLimited controlSearch Optimized: Meta tags and clean URLs to help you rank.SupportUnmaintainedActive: Reach out for help any time on Bluesky  \npckt.blog offers a unique writing experience that removes distractions and lets your ideas to flow. It's cute, sharable and user-friendly. Most importantly, we are actively listening to the community to build the features you want next.\nWhether you’re here to find your voice or find your next favorite read, we’re building pckt for you. We’d love to have you as part of our growing community.\nHow to import your posts:\nLog in to pckt.blog using your handle.\nNew here? Pick a name for your blog to get started.\nClick the \"Import from WhiteWind\" button (found in the lower right, or at the bottom on mobile).\nChoose your blog and press \"Import.\"\nWe can't wait to see what you share on pckt!\nOur community is growing every day, and your unique voice is exactly what the atmosphere needs. Once you’ve migrated your posts, feel free to tag us on Bluesky  so we can check out your new home and share your work with the rest of the neighborhood!\nHappy blogging !\nView this post on WhiteWind"
}

did:plc:revjuqmkvrw6fnkxppqtszpv | at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.document/3mdq4trxw222y

blog.pckt.block.tableCell (nested within site.standard.document) (1 sample)
{
  "path": "/from-whitewind-to-pcktblog-in-just-one-click-5kkv73t",
  "site": "at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.publication/3lwafzkjqm25s",
  "tags": [
    "👩‍💻 Updates",
    "WhiteWind"
  ],
  "$type": "site.standard.document",
  "title": "From WhiteWind to pckt.blog in Just One Click",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "og-image copy.png",
          "src": "blob:bafkreigvyx5lewh2zkrfi43wndg5ktq47tgaocwdcdaomhwl22zpuihnau",
          "blob": {
            "ref": {
              "$link": "bafkreigvyx5lewh2zkrfi43wndg5ktq47tgaocwdcdaomhwl22zpuihnau"
            },
            "size": 119703,
            "$type": "blob",
            "mimeType": "image/png"
          },
          "align": "center"
        }
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Hey bloggers and WhiteWinders ! "
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 9,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://whtwnd.com/",
                "$type": "blog.pckt.richtext.facet#link"
              },
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 27,
              "byteStart": 14
            },
            "features": [
              {
                "uri": "https://atprotocol.dev/tech-talk-building-long-form-blogging-with-whitewind/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 65,
              "byteStart": 54
            },
            "features": [
              {
                "uri": "https://atproto.com/articles/atproto-ethos",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 271,
              "byteStart": 262
            },
            "features": [
              {
                "uri": "https://pckt.blog",
                "$type": "blog.pckt.richtext.facet#link"
              },
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "WhiteWind has paved the way for long-form blogging on AT Protocol, but as the ecosystem evolves, your blog needs a platform that grows with it. While WhiteWind has remained a widely used classic, development of the platform has lately gone quiet. We're building pckt.blog, a fun and cute take on blogging that makes it easy to make a blog and start writing."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 4,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 105,
              "byteStart": 99
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 361,
              "byteStart": 346
            },
            "features": [
              {
                "uri": "https://read.pckt.blog",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "pckt is actively maintained, and designed with simplicity and ease of use in mind. We believe that anyone should be able to quickly create a blog to share their thoughts, passions, and stories. We also offer a powerful dashboard to manage posts, an intuitive editor with rich content types and embeds, and a variety of theming options. Plus, our built-in reader lets you discover writing across the entire atmosphere, keeping you connected to the community."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "One-Click WhiteWind Migration"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 88,
              "byteStart": 84
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "We are excited to announce that as of today, you can import your WhiteWind posts to pckt with just a click."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 65,
              "byteStart": 61
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 99,
              "byteStart": 88
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 129,
              "byteStart": 109
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 188,
              "byteStart": 182
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 211,
              "byteStart": 198
            },
            "features": [
              {
                "uri": "https://standard.site",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "When importing, a copy of your posts will be created on your pckt blog. Posts that are \"Author Only\" or for \"Anyone with the link\" will stay as private drafts in your dashboard. For Public posts, a Standard.site document record will be created on your Personal Data Server (PDS) and your post will be published to your blog, ready to read and share."
      },
      {
        "$type": "blog.pckt.block.table",
        "content": [
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableHeader",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 7,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Feature"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableHeader",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 9,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "WhiteWind"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableHeader",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 9,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "pckt.blog"
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Look & Feel"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "One-size-fits-all"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Your Style: Custom themes, fonts, and backgrounds."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 10,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "The Editor"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Basic Markdown"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Rich Media: Use Markdown-like syntax + Bluesky embeds, mentions, and other rich blocks."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 9,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Discovery"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Hard to find"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Integrated: Built-in reader and Standard.site for instant reach."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 14,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Multiple Blogs"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Limit of one"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Expandable: Manage multiple blogs from one dashboard."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 12,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Organization"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "No tags"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Categories: Labels to help with sorting and discovery."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 10,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Experience"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Desktop-focused"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Responsive: A seamless experience on your phone, tablet, or desktop."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "SEO & Links"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Limited control"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 17,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Search Optimized: Meta tags and clean URLs to help you rank."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Support"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Unmaintained"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 7,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 57,
                          "byteStart": 47
                        },
                        "features": [
                          {
                            "did": "did:plc:revjuqmkvrw6fnkxppqtszpv",
                            "$type": "blog.pckt.richtext.facet#didMention"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Active: Reach out for help any time on Bluesky @pckt.blog "
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 4,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "pckt.blog offers a unique writing experience that removes distractions and lets your ideas to flow. It's cute, sharable and user-friendly. Most importantly, we are actively listening to the community to build the features you want next."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 95,
              "byteStart": 91
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "Whether you’re here to find your voice or find your next favorite read, we’re building pckt for you. We’d love to have you as part of our growing community."
      },
      {
        "$type": "blog.pckt.block.horizontalRule"
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "How to import your posts:"
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 1
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 19,
                      "byteStart": 10
                    },
                    "features": [
                      {
                        "uri": "https://pckt.blog",
                        "$type": "blog.pckt.richtext.facet#link"
                      }
                    ]
                  }
                ],
                "plaintext": "Log in to pckt.blog using your handle."
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 9,
                      "byteStart": 0
                    },
                    "features": [
                      {
                        "$type": "blog.pckt.richtext.facet#bold"
                      }
                    ]
                  }
                ],
                "plaintext": "New here? Pick a name for your blog to get started."
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 33,
                      "byteStart": 10
                    },
                    "features": [
                      {
                        "$type": "blog.pckt.richtext.facet#bold"
                      }
                    ]
                  }
                ],
                "plaintext": "Click the \"Import from WhiteWind\" button (found in the lower right, or at the bottom on mobile)."
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 36,
                      "byteStart": 27
                    },
                    "features": [
                      {
                        "$type": "blog.pckt.richtext.facet#bold"
                      }
                    ]
                  }
                ],
                "plaintext": "Choose your blog and press \"Import.\""
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.blueskyEmbed",
        "attrs": {
          "postRef": {
            "cid": "bafyreif6ky724rlrgfqonf2jqjack3el37w4fd3dgzrvshbfgfaamqjl7u",
            "uri": "at://did:plc:revjuqmkvrw6fnkxppqtszpv/app.bsky.feed.post/3mdq7tgxd2223"
          }
        }
      },
      {
        "$type": "blog.pckt.block.horizontalRule"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 43,
              "byteStart": 39
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "We can't wait to see what you share on pckt!"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 172,
              "byteStart": 162
            },
            "features": [
              {
                "did": "did:plc:revjuqmkvrw6fnkxppqtszpv",
                "$type": "blog.pckt.richtext.facet#didMention"
              }
            ]
          }
        ],
        "plaintext": "Our community is growing every day, and your unique voice is exactly what the atmosphere needs. Once you’ve migrated your posts, feel free to tag us on Bluesky @pckt.blog so we can check out your new home and share your work with the rest of the neighborhood!"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Happy blogging !"
      },
      {
        "$type": "blog.pckt.block.text"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 27,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://whtwnd.com/pckt.blog/3mdq4trxw222y",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "View this post on WhiteWind"
      }
    ]
  },
  "updatedAt": "2026-02-01T04:59:28+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreigvyx5lewh2zkrfi43wndg5ktq47tgaocwdcdaomhwl22zpuihnau"
    },
    "size": 119703,
    "$type": "blob",
    "mimeType": "image/png"
  },
  "description": "WhiteWind has paved the way for long-form blogging on AT Protocol, but as the ecosystem evolves, your blog needs a platform that grows with it. While WhiteWind has remained a widely used classic, development of the platform has lately gone quiet. We're building pckt.blog, a fun and cute take on blogging that makes it easy to make a blog and start writing. pckt is actively maintained, and designed with simplicity and ease of use in mind. We believe that anyone should be able to quickly create a b...",
  "publishedAt": "2026-01-31T15:28:06+00:00",
  "textContent": "Hey bloggers and WhiteWinders ! \nWhiteWind has paved the way for long-form blogging on AT Protocol, but as the ecosystem evolves, your blog needs a platform that grows with it. While WhiteWind has remained a widely used classic, development of the platform has lately gone quiet. We're building pckt.blog, a fun and cute take on blogging that makes it easy to make a blog and start writing.\npckt is actively maintained, and designed with simplicity and ease of use in mind. We believe that anyone should be able to quickly create a blog to share their thoughts, passions, and stories. We also offer a powerful dashboard to manage posts, an intuitive editor with rich content types and embeds, and a variety of theming options. Plus, our built-in reader lets you discover writing across the entire atmosphere, keeping you connected to the community.\nOne-Click WhiteWind Migration\nWe are excited to announce that as of today, you can import your WhiteWind posts to pckt with just a click.\nWhen importing, a copy of your posts will be created on your pckt blog. Posts that are \"Author Only\" or for \"Anyone with the link\" will stay as private drafts in your dashboard. For Public posts, a Standard.site document record will be created on your Personal Data Server (PDS) and your post will be published to your blog, ready to read and share.\nFeatureWhiteWindpckt.blogLook & FeelOne-size-fits-allYour Style: Custom themes, fonts, and backgrounds.The EditorBasic MarkdownRich Media: Use Markdown-like syntax + Bluesky embeds, mentions, and other rich blocks.DiscoveryHard to findIntegrated: Built-in reader and Standard.site for instant reach.Multiple BlogsLimit of oneExpandable: Manage multiple blogs from one dashboard.OrganizationNo tagsCategories: Labels to help with sorting and discovery.ExperienceDesktop-focusedResponsive: A seamless experience on your phone, tablet, or desktop.SEO & LinksLimited controlSearch Optimized: Meta tags and clean URLs to help you rank.SupportUnmaintainedActive: Reach out for help any time on Bluesky  \npckt.blog offers a unique writing experience that removes distractions and lets your ideas to flow. It's cute, sharable and user-friendly. Most importantly, we are actively listening to the community to build the features you want next.\nWhether you’re here to find your voice or find your next favorite read, we’re building pckt for you. We’d love to have you as part of our growing community.\nHow to import your posts:\nLog in to pckt.blog using your handle.\nNew here? Pick a name for your blog to get started.\nClick the \"Import from WhiteWind\" button (found in the lower right, or at the bottom on mobile).\nChoose your blog and press \"Import.\"\nWe can't wait to see what you share on pckt!\nOur community is growing every day, and your unique voice is exactly what the atmosphere needs. Once you’ve migrated your posts, feel free to tag us on Bluesky  so we can check out your new home and share your work with the rest of the neighborhood!\nHappy blogging !\nView this post on WhiteWind"
}

did:plc:revjuqmkvrw6fnkxppqtszpv | at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.document/3mdq4trxw222y

blog.pckt.block.tableHeader (nested within site.standard.document) (1 sample)
{
  "path": "/from-whitewind-to-pcktblog-in-just-one-click-5kkv73t",
  "site": "at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.publication/3lwafzkjqm25s",
  "tags": [
    "👩‍💻 Updates",
    "WhiteWind"
  ],
  "$type": "site.standard.document",
  "title": "From WhiteWind to pckt.blog in Just One Click",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "og-image copy.png",
          "src": "blob:bafkreigvyx5lewh2zkrfi43wndg5ktq47tgaocwdcdaomhwl22zpuihnau",
          "blob": {
            "ref": {
              "$link": "bafkreigvyx5lewh2zkrfi43wndg5ktq47tgaocwdcdaomhwl22zpuihnau"
            },
            "size": 119703,
            "$type": "blob",
            "mimeType": "image/png"
          },
          "align": "center"
        }
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Hey bloggers and WhiteWinders ! "
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 9,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://whtwnd.com/",
                "$type": "blog.pckt.richtext.facet#link"
              },
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 27,
              "byteStart": 14
            },
            "features": [
              {
                "uri": "https://atprotocol.dev/tech-talk-building-long-form-blogging-with-whitewind/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 65,
              "byteStart": 54
            },
            "features": [
              {
                "uri": "https://atproto.com/articles/atproto-ethos",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 271,
              "byteStart": 262
            },
            "features": [
              {
                "uri": "https://pckt.blog",
                "$type": "blog.pckt.richtext.facet#link"
              },
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "WhiteWind has paved the way for long-form blogging on AT Protocol, but as the ecosystem evolves, your blog needs a platform that grows with it. While WhiteWind has remained a widely used classic, development of the platform has lately gone quiet. We're building pckt.blog, a fun and cute take on blogging that makes it easy to make a blog and start writing."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 4,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 105,
              "byteStart": 99
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 361,
              "byteStart": 346
            },
            "features": [
              {
                "uri": "https://read.pckt.blog",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "pckt is actively maintained, and designed with simplicity and ease of use in mind. We believe that anyone should be able to quickly create a blog to share their thoughts, passions, and stories. We also offer a powerful dashboard to manage posts, an intuitive editor with rich content types and embeds, and a variety of theming options. Plus, our built-in reader lets you discover writing across the entire atmosphere, keeping you connected to the community."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "One-Click WhiteWind Migration"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 88,
              "byteStart": 84
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "We are excited to announce that as of today, you can import your WhiteWind posts to pckt with just a click."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 65,
              "byteStart": 61
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 99,
              "byteStart": 88
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 129,
              "byteStart": 109
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 188,
              "byteStart": 182
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 211,
              "byteStart": 198
            },
            "features": [
              {
                "uri": "https://standard.site",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "When importing, a copy of your posts will be created on your pckt blog. Posts that are \"Author Only\" or for \"Anyone with the link\" will stay as private drafts in your dashboard. For Public posts, a Standard.site document record will be created on your Personal Data Server (PDS) and your post will be published to your blog, ready to read and share."
      },
      {
        "$type": "blog.pckt.block.table",
        "content": [
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableHeader",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 7,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Feature"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableHeader",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 9,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "WhiteWind"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableHeader",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 9,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "pckt.blog"
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Look & Feel"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "One-size-fits-all"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Your Style: Custom themes, fonts, and backgrounds."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 10,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "The Editor"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Basic Markdown"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Rich Media: Use Markdown-like syntax + Bluesky embeds, mentions, and other rich blocks."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 9,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Discovery"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Hard to find"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Integrated: Built-in reader and Standard.site for instant reach."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 14,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Multiple Blogs"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Limit of one"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Expandable: Manage multiple blogs from one dashboard."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 12,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Organization"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "No tags"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Categories: Labels to help with sorting and discovery."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 10,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Experience"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Desktop-focused"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Responsive: A seamless experience on your phone, tablet, or desktop."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "SEO & Links"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Limited control"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 17,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Search Optimized: Meta tags and clean URLs to help you rank."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Support"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Unmaintained"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 7,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 57,
                          "byteStart": 47
                        },
                        "features": [
                          {
                            "did": "did:plc:revjuqmkvrw6fnkxppqtszpv",
                            "$type": "blog.pckt.richtext.facet#didMention"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Active: Reach out for help any time on Bluesky @pckt.blog "
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 4,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "pckt.blog offers a unique writing experience that removes distractions and lets your ideas to flow. It's cute, sharable and user-friendly. Most importantly, we are actively listening to the community to build the features you want next."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 95,
              "byteStart": 91
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "Whether you’re here to find your voice or find your next favorite read, we’re building pckt for you. We’d love to have you as part of our growing community."
      },
      {
        "$type": "blog.pckt.block.horizontalRule"
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "How to import your posts:"
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 1
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 19,
                      "byteStart": 10
                    },
                    "features": [
                      {
                        "uri": "https://pckt.blog",
                        "$type": "blog.pckt.richtext.facet#link"
                      }
                    ]
                  }
                ],
                "plaintext": "Log in to pckt.blog using your handle."
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 9,
                      "byteStart": 0
                    },
                    "features": [
                      {
                        "$type": "blog.pckt.richtext.facet#bold"
                      }
                    ]
                  }
                ],
                "plaintext": "New here? Pick a name for your blog to get started."
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 33,
                      "byteStart": 10
                    },
                    "features": [
                      {
                        "$type": "blog.pckt.richtext.facet#bold"
                      }
                    ]
                  }
                ],
                "plaintext": "Click the \"Import from WhiteWind\" button (found in the lower right, or at the bottom on mobile)."
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 36,
                      "byteStart": 27
                    },
                    "features": [
                      {
                        "$type": "blog.pckt.richtext.facet#bold"
                      }
                    ]
                  }
                ],
                "plaintext": "Choose your blog and press \"Import.\""
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.blueskyEmbed",
        "attrs": {
          "postRef": {
            "cid": "bafyreif6ky724rlrgfqonf2jqjack3el37w4fd3dgzrvshbfgfaamqjl7u",
            "uri": "at://did:plc:revjuqmkvrw6fnkxppqtszpv/app.bsky.feed.post/3mdq7tgxd2223"
          }
        }
      },
      {
        "$type": "blog.pckt.block.horizontalRule"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 43,
              "byteStart": 39
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "We can't wait to see what you share on pckt!"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 172,
              "byteStart": 162
            },
            "features": [
              {
                "did": "did:plc:revjuqmkvrw6fnkxppqtszpv",
                "$type": "blog.pckt.richtext.facet#didMention"
              }
            ]
          }
        ],
        "plaintext": "Our community is growing every day, and your unique voice is exactly what the atmosphere needs. Once you’ve migrated your posts, feel free to tag us on Bluesky @pckt.blog so we can check out your new home and share your work with the rest of the neighborhood!"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Happy blogging !"
      },
      {
        "$type": "blog.pckt.block.text"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 27,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://whtwnd.com/pckt.blog/3mdq4trxw222y",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "View this post on WhiteWind"
      }
    ]
  },
  "updatedAt": "2026-02-01T04:59:28+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreigvyx5lewh2zkrfi43wndg5ktq47tgaocwdcdaomhwl22zpuihnau"
    },
    "size": 119703,
    "$type": "blob",
    "mimeType": "image/png"
  },
  "description": "WhiteWind has paved the way for long-form blogging on AT Protocol, but as the ecosystem evolves, your blog needs a platform that grows with it. While WhiteWind has remained a widely used classic, development of the platform has lately gone quiet. We're building pckt.blog, a fun and cute take on blogging that makes it easy to make a blog and start writing. pckt is actively maintained, and designed with simplicity and ease of use in mind. We believe that anyone should be able to quickly create a b...",
  "publishedAt": "2026-01-31T15:28:06+00:00",
  "textContent": "Hey bloggers and WhiteWinders ! \nWhiteWind has paved the way for long-form blogging on AT Protocol, but as the ecosystem evolves, your blog needs a platform that grows with it. While WhiteWind has remained a widely used classic, development of the platform has lately gone quiet. We're building pckt.blog, a fun and cute take on blogging that makes it easy to make a blog and start writing.\npckt is actively maintained, and designed with simplicity and ease of use in mind. We believe that anyone should be able to quickly create a blog to share their thoughts, passions, and stories. We also offer a powerful dashboard to manage posts, an intuitive editor with rich content types and embeds, and a variety of theming options. Plus, our built-in reader lets you discover writing across the entire atmosphere, keeping you connected to the community.\nOne-Click WhiteWind Migration\nWe are excited to announce that as of today, you can import your WhiteWind posts to pckt with just a click.\nWhen importing, a copy of your posts will be created on your pckt blog. Posts that are \"Author Only\" or for \"Anyone with the link\" will stay as private drafts in your dashboard. For Public posts, a Standard.site document record will be created on your Personal Data Server (PDS) and your post will be published to your blog, ready to read and share.\nFeatureWhiteWindpckt.blogLook & FeelOne-size-fits-allYour Style: Custom themes, fonts, and backgrounds.The EditorBasic MarkdownRich Media: Use Markdown-like syntax + Bluesky embeds, mentions, and other rich blocks.DiscoveryHard to findIntegrated: Built-in reader and Standard.site for instant reach.Multiple BlogsLimit of oneExpandable: Manage multiple blogs from one dashboard.OrganizationNo tagsCategories: Labels to help with sorting and discovery.ExperienceDesktop-focusedResponsive: A seamless experience on your phone, tablet, or desktop.SEO & LinksLimited controlSearch Optimized: Meta tags and clean URLs to help you rank.SupportUnmaintainedActive: Reach out for help any time on Bluesky  \npckt.blog offers a unique writing experience that removes distractions and lets your ideas to flow. It's cute, sharable and user-friendly. Most importantly, we are actively listening to the community to build the features you want next.\nWhether you’re here to find your voice or find your next favorite read, we’re building pckt for you. We’d love to have you as part of our growing community.\nHow to import your posts:\nLog in to pckt.blog using your handle.\nNew here? Pick a name for your blog to get started.\nClick the \"Import from WhiteWind\" button (found in the lower right, or at the bottom on mobile).\nChoose your blog and press \"Import.\"\nWe can't wait to see what you share on pckt!\nOur community is growing every day, and your unique voice is exactly what the atmosphere needs. Once you’ve migrated your posts, feel free to tag us on Bluesky  so we can check out your new home and share your work with the rest of the neighborhood!\nHappy blogging !\nView this post on WhiteWind"
}

did:plc:revjuqmkvrw6fnkxppqtszpv | at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.document/3mdq4trxw222y

blog.pckt.block.tableRow (nested within site.standard.document) (1 sample)
{
  "path": "/from-whitewind-to-pcktblog-in-just-one-click-5kkv73t",
  "site": "at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.publication/3lwafzkjqm25s",
  "tags": [
    "👩‍💻 Updates",
    "WhiteWind"
  ],
  "$type": "site.standard.document",
  "title": "From WhiteWind to pckt.blog in Just One Click",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "og-image copy.png",
          "src": "blob:bafkreigvyx5lewh2zkrfi43wndg5ktq47tgaocwdcdaomhwl22zpuihnau",
          "blob": {
            "ref": {
              "$link": "bafkreigvyx5lewh2zkrfi43wndg5ktq47tgaocwdcdaomhwl22zpuihnau"
            },
            "size": 119703,
            "$type": "blob",
            "mimeType": "image/png"
          },
          "align": "center"
        }
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Hey bloggers and WhiteWinders ! "
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 9,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://whtwnd.com/",
                "$type": "blog.pckt.richtext.facet#link"
              },
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 27,
              "byteStart": 14
            },
            "features": [
              {
                "uri": "https://atprotocol.dev/tech-talk-building-long-form-blogging-with-whitewind/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 65,
              "byteStart": 54
            },
            "features": [
              {
                "uri": "https://atproto.com/articles/atproto-ethos",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 271,
              "byteStart": 262
            },
            "features": [
              {
                "uri": "https://pckt.blog",
                "$type": "blog.pckt.richtext.facet#link"
              },
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "WhiteWind has paved the way for long-form blogging on AT Protocol, but as the ecosystem evolves, your blog needs a platform that grows with it. While WhiteWind has remained a widely used classic, development of the platform has lately gone quiet. We're building pckt.blog, a fun and cute take on blogging that makes it easy to make a blog and start writing."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 4,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 105,
              "byteStart": 99
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 361,
              "byteStart": 346
            },
            "features": [
              {
                "uri": "https://read.pckt.blog",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "pckt is actively maintained, and designed with simplicity and ease of use in mind. We believe that anyone should be able to quickly create a blog to share their thoughts, passions, and stories. We also offer a powerful dashboard to manage posts, an intuitive editor with rich content types and embeds, and a variety of theming options. Plus, our built-in reader lets you discover writing across the entire atmosphere, keeping you connected to the community."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "One-Click WhiteWind Migration"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 88,
              "byteStart": 84
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "We are excited to announce that as of today, you can import your WhiteWind posts to pckt with just a click."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 65,
              "byteStart": 61
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 99,
              "byteStart": 88
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 129,
              "byteStart": 109
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 188,
              "byteStart": 182
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 211,
              "byteStart": 198
            },
            "features": [
              {
                "uri": "https://standard.site",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "When importing, a copy of your posts will be created on your pckt blog. Posts that are \"Author Only\" or for \"Anyone with the link\" will stay as private drafts in your dashboard. For Public posts, a Standard.site document record will be created on your Personal Data Server (PDS) and your post will be published to your blog, ready to read and share."
      },
      {
        "$type": "blog.pckt.block.table",
        "content": [
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableHeader",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 7,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Feature"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableHeader",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 9,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "WhiteWind"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableHeader",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 9,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "pckt.blog"
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Look & Feel"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "One-size-fits-all"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Your Style: Custom themes, fonts, and backgrounds."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 10,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "The Editor"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Basic Markdown"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Rich Media: Use Markdown-like syntax + Bluesky embeds, mentions, and other rich blocks."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 9,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Discovery"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Hard to find"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Integrated: Built-in reader and Standard.site for instant reach."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 14,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Multiple Blogs"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Limit of one"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Expandable: Manage multiple blogs from one dashboard."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 12,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Organization"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "No tags"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Categories: Labels to help with sorting and discovery."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 10,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Experience"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Desktop-focused"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 11,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Responsive: A seamless experience on your phone, tablet, or desktop."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "SEO & Links"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Limited control"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 17,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Search Optimized: Meta tags and clean URLs to help you rank."
                  }
                ]
              }
            ]
          },
          {
            "$type": "blog.pckt.block.tableRow",
            "content": [
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Support"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1,
                  "colwidth": [
                    127
                  ]
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "plaintext": "Unmaintained"
                  }
                ]
              },
              {
                "$type": "blog.pckt.block.tableCell",
                "attrs": {
                  "colspan": 1,
                  "rowspan": 1
                },
                "content": [
                  {
                    "$type": "blog.pckt.block.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 7,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "blog.pckt.richtext.facet#bold"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 57,
                          "byteStart": 47
                        },
                        "features": [
                          {
                            "did": "did:plc:revjuqmkvrw6fnkxppqtszpv",
                            "$type": "blog.pckt.richtext.facet#didMention"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Active: Reach out for help any time on Bluesky @pckt.blog "
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 4,
              "byteStart": 0
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "pckt.blog offers a unique writing experience that removes distractions and lets your ideas to flow. It's cute, sharable and user-friendly. Most importantly, we are actively listening to the community to build the features you want next."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 95,
              "byteStart": 91
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "Whether you’re here to find your voice or find your next favorite read, we’re building pckt for you. We’d love to have you as part of our growing community."
      },
      {
        "$type": "blog.pckt.block.horizontalRule"
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "How to import your posts:"
      },
      {
        "$type": "blog.pckt.block.orderedList",
        "attrs": {
          "start": 1
        },
        "content": [
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 19,
                      "byteStart": 10
                    },
                    "features": [
                      {
                        "uri": "https://pckt.blog",
                        "$type": "blog.pckt.richtext.facet#link"
                      }
                    ]
                  }
                ],
                "plaintext": "Log in to pckt.blog using your handle."
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 9,
                      "byteStart": 0
                    },
                    "features": [
                      {
                        "$type": "blog.pckt.richtext.facet#bold"
                      }
                    ]
                  }
                ],
                "plaintext": "New here? Pick a name for your blog to get started."
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 33,
                      "byteStart": 10
                    },
                    "features": [
                      {
                        "$type": "blog.pckt.richtext.facet#bold"
                      }
                    ]
                  }
                ],
                "plaintext": "Click the \"Import from WhiteWind\" button (found in the lower right, or at the bottom on mobile)."
              }
            ]
          },
          {
            "$type": "blog.pckt.block.listItem",
            "content": [
              {
                "$type": "blog.pckt.block.text",
                "facets": [
                  {
                    "index": {
                      "byteEnd": 36,
                      "byteStart": 27
                    },
                    "features": [
                      {
                        "$type": "blog.pckt.richtext.facet#bold"
                      }
                    ]
                  }
                ],
                "plaintext": "Choose your blog and press \"Import.\""
              }
            ]
          }
        ]
      },
      {
        "$type": "blog.pckt.block.blueskyEmbed",
        "attrs": {
          "postRef": {
            "cid": "bafyreif6ky724rlrgfqonf2jqjack3el37w4fd3dgzrvshbfgfaamqjl7u",
            "uri": "at://did:plc:revjuqmkvrw6fnkxppqtszpv/app.bsky.feed.post/3mdq7tgxd2223"
          }
        }
      },
      {
        "$type": "blog.pckt.block.horizontalRule"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 43,
              "byteStart": 39
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              }
            ]
          }
        ],
        "plaintext": "We can't wait to see what you share on pckt!"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 172,
              "byteStart": 162
            },
            "features": [
              {
                "did": "did:plc:revjuqmkvrw6fnkxppqtszpv",
                "$type": "blog.pckt.richtext.facet#didMention"
              }
            ]
          }
        ],
        "plaintext": "Our community is growing every day, and your unique voice is exactly what the atmosphere needs. Once you’ve migrated your posts, feel free to tag us on Bluesky @pckt.blog so we can check out your new home and share your work with the rest of the neighborhood!"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Happy blogging !"
      },
      {
        "$type": "blog.pckt.block.text"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 27,
              "byteStart": 0
            },
            "features": [
              {
                "uri": "https://whtwnd.com/pckt.blog/3mdq4trxw222y",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "View this post on WhiteWind"
      }
    ]
  },
  "updatedAt": "2026-02-01T04:59:28+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreigvyx5lewh2zkrfi43wndg5ktq47tgaocwdcdaomhwl22zpuihnau"
    },
    "size": 119703,
    "$type": "blob",
    "mimeType": "image/png"
  },
  "description": "WhiteWind has paved the way for long-form blogging on AT Protocol, but as the ecosystem evolves, your blog needs a platform that grows with it. While WhiteWind has remained a widely used classic, development of the platform has lately gone quiet. We're building pckt.blog, a fun and cute take on blogging that makes it easy to make a blog and start writing. pckt is actively maintained, and designed with simplicity and ease of use in mind. We believe that anyone should be able to quickly create a b...",
  "publishedAt": "2026-01-31T15:28:06+00:00",
  "textContent": "Hey bloggers and WhiteWinders ! \nWhiteWind has paved the way for long-form blogging on AT Protocol, but as the ecosystem evolves, your blog needs a platform that grows with it. While WhiteWind has remained a widely used classic, development of the platform has lately gone quiet. We're building pckt.blog, a fun and cute take on blogging that makes it easy to make a blog and start writing.\npckt is actively maintained, and designed with simplicity and ease of use in mind. We believe that anyone should be able to quickly create a blog to share their thoughts, passions, and stories. We also offer a powerful dashboard to manage posts, an intuitive editor with rich content types and embeds, and a variety of theming options. Plus, our built-in reader lets you discover writing across the entire atmosphere, keeping you connected to the community.\nOne-Click WhiteWind Migration\nWe are excited to announce that as of today, you can import your WhiteWind posts to pckt with just a click.\nWhen importing, a copy of your posts will be created on your pckt blog. Posts that are \"Author Only\" or for \"Anyone with the link\" will stay as private drafts in your dashboard. For Public posts, a Standard.site document record will be created on your Personal Data Server (PDS) and your post will be published to your blog, ready to read and share.\nFeatureWhiteWindpckt.blogLook & FeelOne-size-fits-allYour Style: Custom themes, fonts, and backgrounds.The EditorBasic MarkdownRich Media: Use Markdown-like syntax + Bluesky embeds, mentions, and other rich blocks.DiscoveryHard to findIntegrated: Built-in reader and Standard.site for instant reach.Multiple BlogsLimit of oneExpandable: Manage multiple blogs from one dashboard.OrganizationNo tagsCategories: Labels to help with sorting and discovery.ExperienceDesktop-focusedResponsive: A seamless experience on your phone, tablet, or desktop.SEO & LinksLimited controlSearch Optimized: Meta tags and clean URLs to help you rank.SupportUnmaintainedActive: Reach out for help any time on Bluesky  \npckt.blog offers a unique writing experience that removes distractions and lets your ideas to flow. It's cute, sharable and user-friendly. Most importantly, we are actively listening to the community to build the features you want next.\nWhether you’re here to find your voice or find your next favorite read, we’re building pckt for you. We’d love to have you as part of our growing community.\nHow to import your posts:\nLog in to pckt.blog using your handle.\nNew here? Pick a name for your blog to get started.\nClick the \"Import from WhiteWind\" button (found in the lower right, or at the bottom on mobile).\nChoose your blog and press \"Import.\"\nWe can't wait to see what you share on pckt!\nOur community is growing every day, and your unique voice is exactly what the atmosphere needs. Once you’ve migrated your posts, feel free to tag us on Bluesky  so we can check out your new home and share your work with the rest of the neighborhood!\nHappy blogging !\nView this post on WhiteWind"
}

did:plc:revjuqmkvrw6fnkxppqtszpv | at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.document/3mdq4trxw222y

blog.pckt.block.text (nested within site.standard.document) (19 samples)
{
  "path": "/a-growing-sense-of-disconnection",
  "site": "at://did:plc:zviscnpwyvj6y32agi5davn5/site.standard.publication/3me7e3v47hr2l",
  "tags": [
    "workflows",
    "editors"
  ],
  "$type": "site.standard.document",
  "title": "A growing sense of disconnection",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.heading",
        "level": 1,
        "plaintext": "A growing sense of disconnection"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Over maybe the last year or two, I feel like I’ve slowly been losing touch with the way I interact with computers. I don’t totally know how to describe it, but it’s been building for a while. Something feels off, and it’s more than just annoyance with a specific tool."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Getting comfortable with VS Code, then uneasy"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 62,
              "byteStart": 55
            },
            "features": [
              {
                "uri": "https://code.visualstudio.com/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "Earlier in that period, I had grown very accustomed to VS Code. And VS Code is fine. It’s nicely integrated with a ton of stuff: language servers, extensions, all that jazz. It does a lot, and for a long time that worked for me."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 73,
              "byteStart": 65
            },
            "features": [
              {
                "uri": "https://www.electronjs.org/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 365,
              "byteStart": 361
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "But I was also becoming more and more unhappy with it. It’s an Electron app, it can be pretty heavy, and while I knew the interaction model well, it started to feel like friction instead of familiarity. I found myself constantly reloading it to get extensions or exceptions to behave properly, and at some point I just stopped feeling like I was editing code well in it, if that makes sense."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Discovering Helix and feeling pulled back"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 40,
              "byteStart": 35
            },
            "features": [
              {
                "uri": "https://helix-editor.com/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "Then I started playing around with Helix. As I got more comfortable with it, VS Code started to feel like it was dragging behind me. The speed, the lack of jank, the way interactions felt more direct—it all clicked."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "I eventually got to the point where if I’m editing code without Helix-style keybindings, it just doesn’t feel right anymore. That comfort, though, comes with a cost: I’m now very tied to Helix as an application. And while I really love Helix as an editor, I’ve started to feel like it’s not enough on its own."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Wanting deeper integration than Helix offers"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 188,
              "byteStart": 181
            },
            "features": [
              {
                "uri": "https://github.com/luccahuguet/yazelix",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 227,
              "byteStart": 221
            },
            "features": [
              {
                "uri": "https://zellij.dev/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 242,
              "byteStart": 235
            },
            "features": [
              {
                "uri": "https://wezterm.org/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "I think I’ve come to the conclusion that I need something more tightly integrated with what I’m developing than Helix currently is. There are ways to improve that—things like Yazelix are popular—but I don’t use Zellij. I use WezTerm, which I like quite a lot."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 10,
              "byteStart": 6
            },
            "features": [
              {
                "uri": "https://yazi-rs.github.io/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "Since Yazi is already Lua-native, adding another layer on top of that doesn’t really feel correct to me. It starts to feel awkward, like too much scaffolding just to get things talking to each other. So I’m stuck wanting something that has the deep integration VS Code has, the editing experience Helix has, and the speed and lack of jank that Helix gets right."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Version control as a breaking point"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "On top of that, I really need better integration with version control than what Helix, VS Code, or even Zed currently provide. If you’re using Git, things are mostly fine, because everyone supports Git."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 44,
              "byteStart": 37
            },
            "features": [
              {
                "uri": "https://jj-vcs.dev/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "But I’m not using Git. I’m using Jujutsu. And I need my tools to understand how users actually interact with Jujutsu and to work nicely with that model. Right now, they just don’t. Weirdly, Helix almost wins here because it does nothing, which is sometimes better than doing the wrong thing."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Trying Zed and still feeling unsure"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 60,
              "byteStart": 57
            },
            "features": [
              {
                "uri": "https://zed.dev/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "I don’t really know what the solution is. I’m trying Zed right now, and its Helix mode is okay. It’s definitely better than the Helix-mode extension for VS Code, which, when I tried it, brought the poor Chromium-based editor to its knees begging for forgiveness."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Still, I don’t really understand what Zed is giving me here, or what problem it’s actually solving for me."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Sitting with the uncertainty"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "At the end of it all, I just feel out of touch with my computer and with the software I write. I don’t know how much of that is about the tools themselves, and how much of it is about the way we’re building and using software right now."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 69,
              "byteStart": 67
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "I don’t know how much of it is simply that I need something that is Helix, but more than Helix, and that I don’t currently have it. I don’t know."
      }
    ]
  },
  "updatedAt": "2026-02-10T16:14:06.764Z",
  "bskyPostRef": {
    "uri": "at://did:plc:zviscnpwyvj6y32agi5davn5/app.bsky.feed.post/3meh7nxosvs2b"
  },
  "description": "Feeling disconnected from editing code and tool interactions over time.",
  "publishedAt": "2026-02-09T19:39:53.675Z",
  "textContent": "A growing sense of disconnection\n\nOver maybe the last year or two, I feel like I’ve slowly been losing touch with the way I interact with computers. I don’t totally know how to describe it, but it’s been building for a while. Something feels off, and it’s more than just annoyance with a specific tool.\n\nGetting comfortable with VS Code, then uneasy\n\nEarlier in that period, I had grown very accustomed to VS Code. And VS Code is fine. It’s nicely integrated with a ton of stuff: language servers, extensions, all that jazz. It does a lot, and for a long time that worked for me.\n\nBut I was also becoming more and more unhappy with it. It’s an Electron app, it can be pretty heavy, and while I knew the interaction model well, it started to feel like friction instead of familiarity. I found myself constantly reloading it to get extensions or exceptions to behave properly, and at some point I just stopped feeling like I was editing code well in it, if that makes sense.\n\nDiscovering Helix and feeling pulled back\n\nThen I started playing around with Helix. As I got more comfortable with it, VS Code started to feel like it was dragging behind me. The speed, the lack of jank, the way interactions felt more direct—it all clicked.\n\nI eventually got to the point where if I’m editing code without Helix-style keybindings, it just doesn’t feel right anymore. That comfort, though, comes with a cost: I’m now very tied to Helix as an application. And while I really love Helix as an editor, I’ve started to feel like it’s not enough on its own.\n\nWanting deeper integration than Helix offers\n\nI think I’ve come to the conclusion that I need something more tightly integrated with what I’m developing than Helix currently is. There are ways to improve that—things like Yazelix are popular—but I don’t use Zellij. I use WezTerm, which I like quite a lot.\n\nSince Yazi is already Lua-native, adding another layer on top of that doesn’t really feel correct to me. It starts to feel awkward, like too much scaffolding just to get things talking to each other. So I’m stuck wanting something that has the deep integration VS Code has, the editing experience Helix has, and the speed and lack of jank that Helix gets right.\n\nVersion control as a breaking point\n\nOn top of that, I really need better integration with version control than what Helix, VS Code, or even Zed currently provide. If you’re using Git, things are mostly fine, because everyone supports Git.\n\nBut I’m not using Git. I’m using Jujutsu. And I need my tools to understand how users actually interact with Jujutsu and to work nicely with that model. Right now, they just don’t. Weirdly, Helix almost wins here because it does nothing, which is sometimes better than doing the wrong thing.\n\nTrying Zed and still feeling unsure\n\nI don’t really know what the solution is. I’m trying Zed right now, and its Helix mode is okay. It’s definitely better than the Helix-mode extension for VS Code, which, when I tried it, brought the poor Chromium-based editor to its knees begging for forgiveness.\n\nStill, I don’t really understand what Zed is giving me here, or what problem it’s actually solving for me.\n\nSitting with the uncertainty\n\nAt the end of it all, I just feel out of touch with my computer and with the software I write. I don’t know how much of that is about the tools themselves, and how much of it is about the way we’re building and using software right now.\n\nI don’t know how much of it is simply that I need something that is Helix, but more than Helix, and that I don’t currently have it. I don’t know."
}

did:plc:zviscnpwyvj6y32agi5davn5 | at://did:plc:zviscnpwyvj6y32agi5davn5/site.standard.document/3meh7atjwvk2p

blog.pckt.block.website (nested within site.standard.document) (2 samples)
{
  "path": "/jump-on-that-fire-horse-ts98qge",
  "site": "at://did:plc:v46ojbiop5ebs5h7gaomixcc/site.standard.publication/3m57zfsq3a2fo",
  "tags": [
    "horse",
    "youtube"
  ],
  "$type": "site.standard.document",
  "title": "Jump on that fire horse?",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.image",
        "attrs": {
          "alt": "Screenshot 2026-02-11 at 6.07.36 PM.png",
          "src": "blob:bafkreigrgacn5w2tbiowief2suibf5s3ro37qnk54jg2d2di7el2vdt4we",
          "blob": {
            "ref": {
              "$link": "bafkreigrgacn5w2tbiowief2suibf5s3ro37qnk54jg2d2di7el2vdt4we"
            },
            "size": 138254,
            "$type": "blob",
            "mimeType": "image/webp"
          },
          "align": "center",
          "width": "500"
        }
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 166,
              "byteStart": 130
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "I just watched an obscure youtube video lol, It's a brand new account with one single video posted yesterday (02/10/2026) titled \"why and how to jump on a fire horse.\" "
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "The general vibe of the video? really strange, really good, just some baddie ranting and piecing together a string of coincidences occurring on February 17th. Chinese New Year (the year of the fire horse), the date falling on a Tuesday relating to the norse god Tyr, the god of war, law, and justice who sacrificed his hand to the wolf Fenrir... The Roman god Mars, a solar eclipse happening on the 17th, Ramadan, Lent. "
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "This girl has a whole written out map she's mirroring onto her TV while she gives a presentation about all these events happening and babbling about jumping on horses, running horses, fire horses. Will you be jumping on the firehorse? Will you be letting go of your baggage and getting up on that horse? Will u girl ?? "
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "She says you've just got to make changes for yourself, nurture your body and the mind will follow. While I'm not sold that all these coincidences have some larger meaning, I did feel moved by her video, just something about the way everything is presented feels so open and friendly and organic. "
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "It feels like spending time with friends and just bullshitting together. Overall, I'm feeling inspired, I want to have a good life and so do you probably. (at least I hope you do.) Anyways, this video, while strange, put me in a pretty good mood. I'm going to listen to what she's said and do some yoga tonight lol. You should do something for yourself too. "
      },
      {
        "url": "https://www.youtube.com/embed/zMwu-m77Sn4?rel=0&hl=en-US",
        "$type": "blog.pckt.block.iframe",
        "attrs": []
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Since this account was so new and empty, I did a little bit of digging because I'm a curious person. If you check her youtube blurb, there's a link to a Spotify playlist and a link to another youtube channel with one video as well, a tarot reading for the collective consciousness. "
      },
      {
        "url": "https://open.spotify.com/embed/playlist/0X9tRNlBm5jB1Wew3Y3i6d?utm_source=oembed",
        "$type": "blog.pckt.block.iframe",
        "height": 352
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Here's the playlist if you're curious too ! Listening to the first song as I'm writing this and so far so good. The second youtube channel's blurb has a link to an instagram account, it's a dead end though... No posts, 4 rando followers. Kanye on the playlist ? in 2026? OK. I get it though, the song kinda fits the theme of weird religious / spiritual occurrences."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Both of the YT blurbs have like girlboss hustle culture tones, so strange compared to the actual video lmao. "
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Oh ! She's got an insta ! and she's got allotta followers (95k+) hahaha that explains it. I'm leaving it here. Glad i watched the video ! so confused ! less confused now ! live your life and stuff ! "
      },
      {
        "src": "https://www.instagram.com/jestressjoan/",
        "$type": "blog.pckt.block.website",
        "title": "Joan🃏 (@jestressjoan) • Instagram profile",
        "description": "94K Followers, 622 Following, 151 Posts - See Instagram photos and videos from Joan🃏 (@jestressjoan)",
        "previewImage": "https://scontent-iad3-1.cdninstagram.com/v/t51.82787-19/587394954_18065289914385735_6700079099030569251_n.jpg?stp=dst-jpg_s100x100_tt6&_nc_cat=1&ccb=7-5&_nc_sid=bf7eb4&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLnd3dy4xMDgwLkMzIn0%3D&_nc_ohc=1EGnJdcwRjgQ7kNvwHkHZ0o&_nc_oc=AdnwLLEEntAywX2PNrDKykrVEBlTWm3PgbwkIsQPpd0KESDSEzcdZheXajHJ0VTxGJE&_nc_zt=24&_nc_ht=scontent-iad3-1.cdninstagram.com&_nc_gid=wifnsL0g_zLGx_rJXRTuCw&oh=00_AfvtqlH2dT9c3pd-YUJeS9O5mPFz-1haItK2EklX4CstMQ&oe=69931AF6"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "XoXo Brookie <3 "
      }
    ]
  },
  "updatedAt": "2026-02-14T03:54:24+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreigrgacn5w2tbiowief2suibf5s3ro37qnk54jg2d2di7el2vdt4we"
    },
    "size": 138254,
    "$type": "blob",
    "mimeType": "image/webp"
  },
  "description": "I just watched an obscure youtube video lol, It's a brand new account with one single video posted yesterday (02/10/2026) titled \"why and how to jump on a fire horse.\" The general vibe of the video? really strange, really good, just some baddie ranting and piecing together a string of coincidences occurring on February 17th. Chinese New Year (the year of the fire horse), the date falling on a Tuesday relating to the norse god Tyr, the god of war, law, and justice who sacrificed his hand to the w...",
  "publishedAt": "2026-02-12T01:34:22+00:00",
  "textContent": "I just watched an obscure youtube video lol, It's a brand new account with one single video posted yesterday (02/10/2026) titled \"why and how to jump on a fire horse.\" \nThe general vibe of the video? really strange, really good, just some baddie ranting and piecing together a string of coincidences occurring on February 17th. Chinese New Year (the year of the fire horse), the date falling on a Tuesday relating to the norse god Tyr, the god of war, law, and justice who sacrificed his hand to the wolf Fenrir... The Roman god Mars, a solar eclipse happening on the 17th, Ramadan, Lent. \nThis girl has a whole written out map she's mirroring onto her TV while she gives a presentation about all these events happening and babbling about jumping on horses, running horses, fire horses. Will you be jumping on the firehorse? Will you be letting go of your baggage and getting up on that horse? Will u girl ?? \nShe says you've just got to make changes for yourself, nurture your body and the mind will follow. While I'm not sold that all these coincidences have some larger meaning, I did feel moved by her video, just something about the way everything is presented feels so open and friendly and organic. \nIt feels like spending time with friends and just bullshitting together. Overall, I'm feeling inspired, I want to have a good life and so do you probably. (at least I hope you do.) Anyways, this video, while strange, put me in a pretty good mood. I'm going to listen to what she's said and do some yoga tonight lol. You should do something for yourself too. \nSince this account was so new and empty, I did a little bit of digging because I'm a curious person. If you check her youtube blurb, there's a link to a Spotify playlist and a link to another youtube channel with one video as well, a tarot reading for the collective consciousness. \nHere's the playlist if you're curious too ! Listening to the first song as I'm writing this and so far so good. The second youtube channel's blurb has a link to an instagram account, it's a dead end though... No posts, 4 rando followers. Kanye on the playlist ? in 2026? OK. I get it though, the song kinda fits the theme of weird religious / spiritual occurrences.\nBoth of the YT blurbs have like girlboss hustle culture tones, so strange compared to the actual video lmao. \nOh ! She's got an insta ! and she's got allotta followers (95k+) hahaha that explains it. I'm leaving it here. Glad i watched the video ! so confused ! less confused now ! live your life and stuff ! \nXoXo Brookie <3"
}

did:plc:v46ojbiop5ebs5h7gaomixcc | at://did:plc:v46ojbiop5ebs5h7gaomixcc/site.standard.document/3memtyj4kw2jy

blog.pckt.content (nested within site.standard.document) (19 samples)
{
  "path": "/a-growing-sense-of-disconnection",
  "site": "at://did:plc:zviscnpwyvj6y32agi5davn5/site.standard.publication/3me7e3v47hr2l",
  "tags": [
    "workflows",
    "editors"
  ],
  "$type": "site.standard.document",
  "title": "A growing sense of disconnection",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.heading",
        "level": 1,
        "plaintext": "A growing sense of disconnection"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Over maybe the last year or two, I feel like I’ve slowly been losing touch with the way I interact with computers. I don’t totally know how to describe it, but it’s been building for a while. Something feels off, and it’s more than just annoyance with a specific tool."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Getting comfortable with VS Code, then uneasy"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 62,
              "byteStart": 55
            },
            "features": [
              {
                "uri": "https://code.visualstudio.com/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "Earlier in that period, I had grown very accustomed to VS Code. And VS Code is fine. It’s nicely integrated with a ton of stuff: language servers, extensions, all that jazz. It does a lot, and for a long time that worked for me."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 73,
              "byteStart": 65
            },
            "features": [
              {
                "uri": "https://www.electronjs.org/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 365,
              "byteStart": 361
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "But I was also becoming more and more unhappy with it. It’s an Electron app, it can be pretty heavy, and while I knew the interaction model well, it started to feel like friction instead of familiarity. I found myself constantly reloading it to get extensions or exceptions to behave properly, and at some point I just stopped feeling like I was editing code well in it, if that makes sense."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Discovering Helix and feeling pulled back"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 40,
              "byteStart": 35
            },
            "features": [
              {
                "uri": "https://helix-editor.com/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "Then I started playing around with Helix. As I got more comfortable with it, VS Code started to feel like it was dragging behind me. The speed, the lack of jank, the way interactions felt more direct—it all clicked."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "I eventually got to the point where if I’m editing code without Helix-style keybindings, it just doesn’t feel right anymore. That comfort, though, comes with a cost: I’m now very tied to Helix as an application. And while I really love Helix as an editor, I’ve started to feel like it’s not enough on its own."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Wanting deeper integration than Helix offers"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 188,
              "byteStart": 181
            },
            "features": [
              {
                "uri": "https://github.com/luccahuguet/yazelix",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 227,
              "byteStart": 221
            },
            "features": [
              {
                "uri": "https://zellij.dev/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          },
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 242,
              "byteStart": 235
            },
            "features": [
              {
                "uri": "https://wezterm.org/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "I think I’ve come to the conclusion that I need something more tightly integrated with what I’m developing than Helix currently is. There are ways to improve that—things like Yazelix are popular—but I don’t use Zellij. I use WezTerm, which I like quite a lot."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 10,
              "byteStart": 6
            },
            "features": [
              {
                "uri": "https://yazi-rs.github.io/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "Since Yazi is already Lua-native, adding another layer on top of that doesn’t really feel correct to me. It starts to feel awkward, like too much scaffolding just to get things talking to each other. So I’m stuck wanting something that has the deep integration VS Code has, the editing experience Helix has, and the speed and lack of jank that Helix gets right."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Version control as a breaking point"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "On top of that, I really need better integration with version control than what Helix, VS Code, or even Zed currently provide. If you’re using Git, things are mostly fine, because everyone supports Git."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 44,
              "byteStart": 37
            },
            "features": [
              {
                "uri": "https://jj-vcs.dev/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "But I’m not using Git. I’m using Jujutsu. And I need my tools to understand how users actually interact with Jujutsu and to work nicely with that model. Right now, they just don’t. Weirdly, Helix almost wins here because it does nothing, which is sometimes better than doing the wrong thing."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Trying Zed and still feeling unsure"
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 60,
              "byteStart": 57
            },
            "features": [
              {
                "uri": "https://zed.dev/",
                "$type": "blog.pckt.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "I don’t really know what the solution is. I’m trying Zed right now, and its Helix mode is okay. It’s definitely better than the Helix-mode extension for VS Code, which, when I tried it, brought the poor Chromium-based editor to its knees begging for forgiveness."
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "Still, I don’t really understand what Zed is giving me here, or what problem it’s actually solving for me."
      },
      {
        "$type": "blog.pckt.block.heading",
        "level": 2,
        "plaintext": "Sitting with the uncertainty"
      },
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "At the end of it all, I just feel out of touch with my computer and with the software I write. I don’t know how much of that is about the tools themselves, and how much of it is about the way we’re building and using software right now."
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "$type": "blog.pckt.richtext.facet",
            "index": {
              "$type": "blog.pckt.richtext.facet#byteSlice",
              "byteEnd": 69,
              "byteStart": 67
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "I don’t know how much of it is simply that I need something that is Helix, but more than Helix, and that I don’t currently have it. I don’t know."
      }
    ]
  },
  "updatedAt": "2026-02-10T16:14:06.764Z",
  "bskyPostRef": {
    "uri": "at://did:plc:zviscnpwyvj6y32agi5davn5/app.bsky.feed.post/3meh7nxosvs2b"
  },
  "description": "Feeling disconnected from editing code and tool interactions over time.",
  "publishedAt": "2026-02-09T19:39:53.675Z",
  "textContent": "A growing sense of disconnection\n\nOver maybe the last year or two, I feel like I’ve slowly been losing touch with the way I interact with computers. I don’t totally know how to describe it, but it’s been building for a while. Something feels off, and it’s more than just annoyance with a specific tool.\n\nGetting comfortable with VS Code, then uneasy\n\nEarlier in that period, I had grown very accustomed to VS Code. And VS Code is fine. It’s nicely integrated with a ton of stuff: language servers, extensions, all that jazz. It does a lot, and for a long time that worked for me.\n\nBut I was also becoming more and more unhappy with it. It’s an Electron app, it can be pretty heavy, and while I knew the interaction model well, it started to feel like friction instead of familiarity. I found myself constantly reloading it to get extensions or exceptions to behave properly, and at some point I just stopped feeling like I was editing code well in it, if that makes sense.\n\nDiscovering Helix and feeling pulled back\n\nThen I started playing around with Helix. As I got more comfortable with it, VS Code started to feel like it was dragging behind me. The speed, the lack of jank, the way interactions felt more direct—it all clicked.\n\nI eventually got to the point where if I’m editing code without Helix-style keybindings, it just doesn’t feel right anymore. That comfort, though, comes with a cost: I’m now very tied to Helix as an application. And while I really love Helix as an editor, I’ve started to feel like it’s not enough on its own.\n\nWanting deeper integration than Helix offers\n\nI think I’ve come to the conclusion that I need something more tightly integrated with what I’m developing than Helix currently is. There are ways to improve that—things like Yazelix are popular—but I don’t use Zellij. I use WezTerm, which I like quite a lot.\n\nSince Yazi is already Lua-native, adding another layer on top of that doesn’t really feel correct to me. It starts to feel awkward, like too much scaffolding just to get things talking to each other. So I’m stuck wanting something that has the deep integration VS Code has, the editing experience Helix has, and the speed and lack of jank that Helix gets right.\n\nVersion control as a breaking point\n\nOn top of that, I really need better integration with version control than what Helix, VS Code, or even Zed currently provide. If you’re using Git, things are mostly fine, because everyone supports Git.\n\nBut I’m not using Git. I’m using Jujutsu. And I need my tools to understand how users actually interact with Jujutsu and to work nicely with that model. Right now, they just don’t. Weirdly, Helix almost wins here because it does nothing, which is sometimes better than doing the wrong thing.\n\nTrying Zed and still feeling unsure\n\nI don’t really know what the solution is. I’m trying Zed right now, and its Helix mode is okay. It’s definitely better than the Helix-mode extension for VS Code, which, when I tried it, brought the poor Chromium-based editor to its knees begging for forgiveness.\n\nStill, I don’t really understand what Zed is giving me here, or what problem it’s actually solving for me.\n\nSitting with the uncertainty\n\nAt the end of it all, I just feel out of touch with my computer and with the software I write. I don’t know how much of that is about the tools themselves, and how much of it is about the way we’re building and using software right now.\n\nI don’t know how much of it is simply that I need something that is Helix, but more than Helix, and that I don’t currently have it. I don’t know."
}

did:plc:zviscnpwyvj6y32agi5davn5 | at://did:plc:zviscnpwyvj6y32agi5davn5/site.standard.document/3meh7atjwvk2p

blog.pckt.richtext.facet (nested within site.standard.document) (13 samples)
{
  "path": "/atproto-test-q6w9a9m",
  "site": "at://did:plc:v46ojbiop5ebs5h7gaomixcc/site.standard.publication/3m57zfsq3a2fo",
  "tags": [],
  "$type": "site.standard.document",
  "title": "Atproto test",
  "content": {
    "$type": "blog.pckt.content",
    "items": [
      {
        "$type": "blog.pckt.block.text",
        "plaintext": "hello ! "
      },
      {
        "$type": "blog.pckt.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 19,
              "byteStart": 10
            },
            "features": [
              {
                "$type": "blog.pckt.richtext.facet#bold"
              },
              {
                "$type": "blog.pckt.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "this is a test post stored on my pds "
      }
    ]
  },
  "updatedAt": "2026-02-16T10:04:07+00:00",
  "coverImage": {
    "ref": {
      "$link": "bafkreihkbujaugtwtax7cwiu4xcttpqri24vlu4w35njdcyz5fseqpfi2i"
    },
    "size": 129303,
    "$type": "blob",
    "mimeType": "image/gif"
  },
  "description": "hello ! this is a test post stored on my pds",
  "publishedAt": "2025-11-10T02:10:00+00:00",
  "textContent": "hello ! \nthis is a test post stored on my pds"
}

did:plc:v46ojbiop5ebs5h7gaomixcc | at://did:plc:v46ojbiop5ebs5h7gaomixcc/site.standard.document/3m5ak5oqnk2zz

cat.vt3e.pdslanding.page (nested within site.standard.document) (1 sample)
{
  "path": "about",
  "site": "https://pds.wlo.moe/about",
  "$type": "site.standard.document",
  "title": "about",
  "content": [
    {
      "$type": "cat.vt3e.pdslanding.page",
      "value": "this is @vt3e.cat’s personal [at protocol](https://atproto.com/) personal data server!\n\nyou might by viewing it via PDS Landing, which is open source! you can find it on tangled [here](https://tangled.org/vt3e.cat/pds-landing)!\n"
    }
  ],
  "publishedAt": "2026-01-18T01:37:36.180Z"
}

did:plc:2hcnfmbfr4ucfbjpnvjqvt3e | at://did:plc:2hcnfmbfr4ucfbjpnvjqvt3e/site.standard.document/3mbnfctpimk2l

com.atproto.repo.strongRef (nested within site.standard.document) (1 sample)
{
  "path": "/essays/the-internet-is-a-series-of-webs/",
  "site": "at://did:plc:t5xmf33p5kqgkbznx22p7d7g/site.standard.publication/3mbrgnnqzrr2q",
  "tags": [
    "IndieWeb",
    "Tech",
    "The Long Next",
    "series:The Wild Web"
  ],
  "$type": "site.standard.document",
  "title": "The Internet is a Series of Webs",
  "content": {
    "text": "> When I envision the web, I picture an infinite expanse of empty space that stretches as far as the eye can see. It's full of fertile soil, but no seeds have taken root. That is, except for about an acre of it.\n  -  Molly White, [We can have a different web](/noteworthy/we-can-have-a-different-web/)\n\nThe future of the internet seems up in the air. Consumed by rotting behemoths. What we have now is failing, but it is also part of our every-day life, our politics, our society, our communities and our friendships. All of those are at risk, in part because the ways we communicate are under attack. The fate of the open web is inextricable from the other ways our world is in crisis. \n\nWe face down a seemingly endless series of political, social, economic, and medical disasters on a melting planet. There is no doubt that the internet is deeply integrated into everything that is going both right and wrong.\n\nAt this moment, [we are actively discussing how to build a future for our shared global telecommunications network](https://aramzs.xyz/lists/a-future-for-the-web/). This is good. We need this discussion. We also need to acknowledge that the wide open platform for infinite data, innovation and communication isn't a shelter from the disaster, but it *is* at the heart of everything we do. The day we could go back from that, even if we wanted to, is long gone. That means [rewilding the web](https://www.noemamag.com/we-need-to-rewild-the-internet/) isn't **just** a matter of a better internet.  Our way to a better web can't be purely technical. It's the matter of being part of the making of a better world. \n\nWith the problem so large, how do we approach a solution? If we want to plant a forest how do we grow the ground cover? \n\nDe-abstract. What is the internet really? It's wires, and waves (and occasionally, joking aside, [pipes](https://www.windsystemsmag.com/the-latest-advancements-in-submarine-cables-protection/)) all put to the purpose of connecting people to each other. \n\nThe internet then is the series of connections between [people](https://adactio.com/journal/18337), at a huge scale. Not everyone is connected to everyone, but if you're on the internet, you're connecting to *someone*. So it isn't so much a world wide web as it is world wide **webs**. \n\nThe future core of a [humane](https://humanewebmanifesto.com/) internet,  if we are going to be able to use it to do the essential work of surviving this century, is a series of linked routes that stick us all together and supports our communities.\n\nI don't think there is only one solution, I couldn't possibly know them all, but I have one approach that has led me to launch this particular website (and [some others](/projects/)). \n\nThe thing about webs is [they are failure resistent, one strand falling won't take the whole thing down](https://news.mit.edu/2012/spider-web-strength-0202). You can punch a hole through them, but webs are also rebuilt regularly, they can fail and come back quickly. \n\nWe need to think of our connections and how we transmit information to each other in the same way. An important message should be able to travel edge to edge without interference and make it from web to web successfully. We need to think about *links*. Not just in the literal sense.  We weave our communities together by establishing bedrocks of shared knowledge. \n\nI think what really put this into sharp focus for me is [the long death of Twitter](https://www.schizochronotopia.com/p/on-twitter-we-look-down). Twitter is still a platform where, for professional reasons, I'm quite active, but its biggest utility--directing me to information that I'm interested in or that is important to me--that's gone. \n\nWe need to rethink how amplification works without requiring big tech or even a steady internet connection. Here are three big assumptions sitting inside this larger question of how best to build our webs. \n\n1. Amplification through cross-linking between individual entities and feeds is essentially rejuvenating for the web. \n2. We [can't](https://ahrefs.com/blog/link-rot-study/) [take the life of those links for granted](https://www.pewresearch.org/data-labs/2024/05/17/when-online-content-disappears/) and an essential part of this rejuvenation process is archiving links that are important enough to amplify.\n3. In the current world [it is nearly impossible](https://www.nytimes.com/2020/07/31/technology/blocking-the-tech-giants.html) to build without touching or using the technology of a mega-corporation in some way so we should expect to build on things that will fail, enshittify, or rot, and need to be moved off from quickly.\n\n## To that end I've considered some principles for my own projects.\n\nThese (and the project of crafting them) are heavily inspired by [the IndieWeb principles](https://indieweb.org/principles). \n\n### Principles of Amplification for better webs\n\n- Aggregation is amplification.\n- In a post-Twitter world, reach requires coordination. \n- If it has to query a backend to load it will one day die. \n- Amplification is power, use it responsibly. \n- Massive replication of your own work is good. Massive aggregation between members of a community is even better. \n- [Amplification](/thoughts/using-amplify-as-a-type/) is a method to build community\n- You can always [check out](https://dataprivacymanager.net/what-is-data-subject-access-request-dsar/), copy, or scrape your work from other platforms and take ownership.\n\n### Principles of Archiving for better webs\n\n- Using the web downloads it to your computer, you should get to keep it for your personal use.\n- [Kill the app](https://tweets.aramzs.com/1390071898202120192/). They are black boxes filled with content and knowledge that will one day be lost forever.\n- Everyone should support the Internet Archive, but we [shouldn't](https://www.forbes.com/sites/mattnovak/2023/05/28/internet-archive-suffers-major-global-outage/) assume it is invulnerable. \n- Own your own archive. \n- Single points of failure are dangerous and, as an expected operating tool, destroy innovation.\n- Anything that can't fit on its own offline drive will die.\n\n### Principles of Web Weaving\n\n- Connecting to each other connects our audiences.\n- Curated connections form bridges out of the walled gardens that hurt us and our society. \n- Accept the rotting giant corporations that harvest human connections for profit, realize you must exist in their context to help others, and use their platforms and technology as a vaulting poll to bring yourself and others outside the walls.\n- The [baseline has shifted](/glossary/shifting-baselines/) away from an open web, but if we act like we are already in the future we want to build we can shift them again.\n\n## The Long Next\n\nWith these concepts in mind, I think of a lot of acronyms I've been considering as part of the future of the web: \n\n- [ESC](https://esc.fyi/) - End Surveillance Capitalism\n- [POSSE](https://indieweb.org/POSSE) - Publish (on your) Own Site, Syndicate Elsewhere\n- [PESOS](https://indieweb.org/PESOS) - Publish Elsewhere, Syndicate (to your) Own Site\n\nI want to add one more to the list. \n\nWe need to think about how to [ENTER](/glossary/enter/) the wild web.\n\n### Extract\n\nFor now it's [impossible to interact with others and move through this world without touching big tech](https://www.nytimes.com/2020/07/31/technology/blocking-the-tech-giants.html). With this in mind, we are all going to end up using some of those platforms. So what we need are methods to extract the data off those platforms. There are blunt ways like scraping, and potentially captured ways like platform APIs. However, thanks to the explosion of privacy and interoperability-related legislation around the world, [most sites have an option to check out all your data](https://dataprivacymanager.net/what-is-data-subject-access-request-dsar/). \n\nOnce you have reclaimed your own works, you can do all sorts of things with it. Eventually you can even leave the platform, delete everything, and take canonical status for that work with your own sites. [I'm just getting started](https://aramzs.xyz/tutorials/how-to-export-your-links-from-pocket/), but I plan on writing more about how to do this.\n\n### Nullify \n\nRedirect or cross link your own sites and platform over the big tech ones whenever possible. Once you've linked off a enshittified platform and brought someone out of the walled garden and into your web, it's important to give them ways to interact with the internet that don't just push them right back into the hands of big tech. Whenever possible, push readers to open and wild web alternatives. \n\nCreate sites and networks that aren't just informative, but also fun to explore. \n\n### Transform \n\nTake the posts you've checked out or otherwise extracted and turn them into something new and cool. Everything we post on social media platforms owned by big tech companies is limited by the business models and requirement to render ad targeting data. It shapes our participation in ways we aren't aware of. Once we free our *own* works from those platforms, take the time and effort to turn them into something cool and new, no longer limited by the constraints from inside the wall. \n\nOne of my main projects for this site is building tools for transforming data extractions from [Letterboxd](/lists/film-and-tv/), [Pocket](/amplify/), and [Kindle](/resources/quotes/).\n\n### Exchange \n\nBuild community though connecting. Link to other people, this is hardly a new idea, but it does seem to have fallen by the wayside at various periods of the social web. \n\nTruly fair exchanges between members of the (or a) web means more than that though, it means actively getting permission from others to remix their work and doing it. It means using and building on top of the work of others in all formats, not just code.\n\nIt also means: [copyleft](https://en.wikipedia.org/wiki/Copyleft) your work. The future of the web is not copyrighted. The future of the web is post-capitalism. Trying to play copyright games with big tech is a losing game, all we get is siloed culture that big tech steals anyway, either directly or in forms of aggregation or by bundling it into AI which spits it back out as plagiarism and bullshit. The future of the web isn't just open source code, it's [open creativity](https://adactio.com/articles/1522/). It's is [share and share alike](https://creativecommons.org/share-your-work/cclicenses/) to build, remix and replicate the best things on the internet. \n\n### Replicate \n\nWe should understand that there is no \"Long Now\". VCs, big clocks and big money are a fleeting phenomenon that is more likely to self-destruct or destroy us than it is to save us. The foundation of projects like The Long Now is built on the resources of people who think we need to maintain the present, scrolled out into an eternally status quo-maintaining future. \n\nLet me be blunt: The present isn't worth preserving. \n\nLet's think instead about **The Long Next**, a future where we build sustainably; live with the knowledge that [we can't be always-online](/resources/bookmarks/low-tech-magazine/); and consider a world that **we** sustain in our projects, groups and communities. The Long Next isn't about preserving wealth and capital long enough to catapult the rich to Mars, it is about holistic rewilding of the web, the Earth, the future. A world we can live in, not one we are going to sacrifice on the alter of wealthy egos.   \n\nCentral archives are incredibly important, but they're also central points of failure, vulnerable not just to physical attacks, but to legal ones as well. Worse, it is at the mercy of big donors who have proved time and again that they'd rather burn the present to build their personal vision of the future than sustain it. It's hard to believe such people will forever consider supporting projects like The Internet Archive in their best interest, especially as they sit above companies whose works are focused on essentially in-housing that work *as a competitive advantage*.  \n\nWe should continue to support big important archival projects. I think their work is amazing and deserves all our support to keep them going as long as we can. \n\nA long next, a sustainable future, means that we need to do more than that, we need to think about how to keep the archives of what is important to us close to home, replicate them across our local networks and retain their information in case of the worst. \n\nThe parts of the web that are most important to you should be available to you, even if the internet isn't.\n\nSo use your newly wild websites to preserve the parts of the web that matter to you. Host site-local archives with indicators that point back to and [300s](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_redirection) back to the originals. Keep the option to take them with you, or to drop redirects if they die so you'll have them *just in case*. Make sure to set up those local archives so they can be accessed by you, by others, and using your own search tools. [Submit](https://web.archive.org/save) [those](https://chromewebstore.google.com/detail/wayback-machine/fpnmgdkabkmnadcjpehmlllkndpkmiak) [links](https://archive.org/details/introduction-to-the-warc) [to](https://help.archive.org/help/uploading-a-basic-guide/) [The Internet Archive](https://help.archive.org/help/save-pages-in-the-wayback-machine/) at the same time. \n\n[Make sure what you build is easy for others to archive](https://jeffhuang.com/designed_to_last/).\n\n## The Future Soon \n\nThis is a summary. I think I could explore any one of these points more deeply and maybe I will. This is a good start at trying to describe what I want to do with this site and the other sites I'm working on.\n\nI think that working in public and thinking in public keeps me honest, so that's what I've got here. If it's interesting to you, maybe it is something you can explore as well, try to follow through with on your own websites. Increasingly I wish for a **zine-web** filled with tiny one-off websites and fun projects, a million well-tended webs intersecting with each other, and archived by their peers. \n\n\nWe can join our own little webs together. One thing is certain, making the web a better place isn't a project to undertake alone or in private. \n\n[Reach out on Mastodon to talk](https://indieweb.social/@Chronotope). \n\n~~\n\nSelected Responses: \n\n- [Don Marti](https://federate.social/@dmarti/112587045311696156)\n- I really like [the idea of bringing back Diskmags](https://elk.zone/indieweb.social/@teajaygrey@rap.social/112606872290801809). I was not familiar with the concept at all, but ended up [finding out about it when I researched the response](https://diskmags.de/index.php?title=Introduction) and I like the idea of removable media used as a potential model for a sometimes-on web. \n- There is [a really cool list of articles that talk about this topic of the future of a better web which you can check out](https://projects.kwon.nyc/internet-is-fun/). \n\n~~\n\nCover Image by <a href=\"https://commons.wikimedia.org/wiki/User:Chen-Pan_Liao\" title=\"User:Chen-Pan Liao\">Chen-Pan Liao</a> - <span class=\"int-own-work\" lang=\"en\">Own work</span>, <a href=\"https://creativecommons.org/licenses/by-sa/3.0\" title=\"Creative Commons Attribution-Share Alike 3.0\">CC BY-SA 3.0</a>, <a href=\"https://commons.wikimedia.org/w/index.php?curid=15926393\">Link</a>",
    "$type": "site.standard.content.markdown",
    "version": "1.0"
  },
  "updatedAt": "2024-06-08T10:30:00.000Z",
  "coverImage": {
    "ref": {
      "$link": "bafkreig2247wcpqjkqy2ukjh4gjyqhpl32kg3pva4x55npjmuh4joeware"
    },
    "size": 347901,
    "$type": "blob",
    "mimeType": "image/jpeg"
  },
  "bskyPostRef": {
    "cid": "bafyreigh7yods3ndrmqeq55cjisda6wi34swt7s6kkduwcotkgq5g5y2oe",
    "uri": "at://did:plc:t5xmf33p5kqgkbznx22p7d7g/app.bsky.feed.post/3kulbtuuixs27",
    "$type": "com.atproto.repo.strongRef"
  },
  "description": "The fate of the open web is inextricable from the other ways our world is in crisis. What can we do about it?",
  "publishedAt": "2024-06-08T10:00:00.000Z",
  "textContent": "When I envision the web, I picture an infinite expanse of empty space that stretches as far as the eye can see. It's full of fertile soil, but no seeds have taken root. That is, except for about an acre of it.\n\n - Molly White, We can have a different web\nThe future of the internet seems up in the air. Consumed by rotting behemoths. What we have now is failing, but it is also part of our every-day life, our politics, our society, our communities and our friendships. All of those are at risk, in part because the ways we communicate are under attack. The fate of the open web is inextricable from the other ways our world is in crisis.\n\nWe face down a seemingly endless series of political, social, economic, and medical disasters on a melting planet. There is no doubt that the internet is deeply integrated into everything that is going both right and wrong.\n\nAt this moment, we are actively discussing how to build a future for our shared global telecommunications network. This is good. We need this discussion. We also need to acknowledge that the wide open platform for infinite data, innovation and communication isn't a shelter from the disaster, but it is at the heart of everything we do. The day we could go back from that, even if we wanted to, is long gone. That means rewilding the web isn't just a matter of a better internet. Our way to a better web can't be purely technical. It's the matter of being part of the making of a better world.\n\nWith the problem so large, how do we approach a solution? If we want to plant a forest how do we grow the ground cover?\n\nDe-abstract. What is the internet really? It's wires, and waves (and occasionally, joking aside, pipes) all put to the purpose of connecting people to each other.\n\nThe internet then is the series of connections between people, at a huge scale. Not everyone is connected to everyone, but if you're on the internet, you're connecting to someone. So it isn't so much a world wide web as it is world wide webs.\n\nThe future core of a humane internet, if we are going to be able to use it to do the essential work of surviving this century, is a series of linked routes that stick us all together and supports our communities.\n\nI don't think there is only one solution, I couldn't possibly know them all, but I have one approach that has led me to launch this particular website (and some others).\n\nThe thing about webs is they are failure resistent, one strand falling won't take the whole thing down. You can punch a hole through them, but webs are also rebuilt regularly, they can fail and come back quickly.\n\nWe need to think of our connections and how we transmit information to each other in the same way. An important message should be able to travel edge to edge without interference and make it from web to web successfully. We need to think about links. Not just in the literal sense. We weave our communities together by establishing bedrocks of shared knowledge.\n\nI think what really put this into sharp focus for me is the long death of Twitter. Twitter is still a platform where, for professional reasons, I'm quite active, but its biggest utility--directing me to information that I'm interested in or that is important to me--that's gone.\n\nWe need to rethink how amplification works without requiring big tech or even a steady internet connection. Here are three big assumptions sitting inside this larger question of how best to build our webs.\n\nAmplification through cross-linking between individual entities and feeds is essentially rejuvenating for the web.\nWe can't take the life of those links for granted and an essential part of this rejuvenation process is archiving links that are important enough to amplify.\nIn the current world it is nearly impossible to build without touching or using the technology of a mega-corporation in some way so we should expect to build on things that will fail, enshittify, or rot, and need to be moved off from quickly.\nTo that end I've considered some principles for my own projects.\nThese (and the project of crafting them) are heavily inspired by the IndieWeb principles.\n\nPrinciples of Amplification for better webs\nAggregation is amplification.\nIn a post-Twitter world, reach requires coordination.\nIf it has to query a backend to load it will one day die.\nAmplification is power, use it responsibly.\nMassive replication of your own work is good. Massive aggregation between members of a community is even better.\nAmplification is a method to build community\nYou can always check out, copy, or scrape your work from other platforms and take ownership.\nPrinciples of Archiving for better webs\nUsing the web downloads it to your computer, you should get to keep it for your personal use.\nKill the app. They are black boxes filled with content and knowledge that will one day be lost forever.\nEveryone should support the Internet Archive, but we shouldn't assume it is invulnerable.\nOwn your own archive.\nSingle points of failure are dangerous and, as an expected operating tool, destroy innovation.\nAnything that can't fit on its own offline drive will die.\nPrinciples of Web Weaving\nConnecting to each other connects our audiences.\nCurated connections form bridges out of the walled gardens that hurt us and our society.\nAccept the rotting giant corporations that harvest human connections for profit, realize you must exist in their context to help others, and use their platforms and technology as a vaulting poll to bring yourself and others outside the walls.\nThe baseline has shifted away from an open web, but if we act like we are already in the future we want to build we can shift them again.\nThe Long Next\nWith these concepts in mind, I think of a lot of acronyms I've been considering as part of the future of the web:\n\nESC - End Surveillance Capitalism\nPOSSE - Publish (on your) Own Site, Syndicate Elsewhere\nPESOS - Publish Elsewhere, Syndicate (to your) Own Site\nI want to add one more to the list.\n\nWe need to think about how to ENTER the wild web.\n\nExtract\nFor now it's impossible to interact with others and move through this world without touching big tech. With this in mind, we are all going to end up using some of those platforms. So what we need are methods to extract the data off those platforms. There are blunt ways like scraping, and potentially captured ways like platform APIs. However, thanks to the explosion of privacy and interoperability-related legislation around the world, most sites have an option to check out all your data.\n\nOnce you have reclaimed your own works, you can do all sorts of things with it. Eventually you can even leave the platform, delete everything, and take canonical status for that work with your own sites. I'm just getting started, but I plan on writing more about how to do this.\n\nNullify\nRedirect or cross link your own sites and platform over the big tech ones whenever possible. Once you've linked off a enshittified platform and brought someone out of the walled garden and into your web, it's important to give them ways to interact with the internet that don't just push them right back into the hands of big tech. Whenever possible, push readers to open and wild web alternatives.\n\nCreate sites and networks that aren't just informative, but also fun to explore.\n\nTransform\nTake the posts you've checked out or otherwise extracted and turn them into something new and cool. Everything we post on social media platforms owned by big tech companies is limited by the business models and requirement to render ad targeting data. It shapes our participation in ways we aren't aware of. Once we free our own works from those platforms, take the time and effort to turn them into something cool and new, no longer limited by the constraints from inside the wall.\n\nOne of my main projects for this site is building tools for transforming data extractions from Letterboxd, Pocket, and Kindle.\n\nExchange\nBuild community though connecting. Link to other people, this is hardly a new idea, but it does seem to have fallen by the wayside at various periods of the social web.\n\nTruly fair exchanges between members of the (or a) web means more than that though, it means actively getting permission from others to remix their work and doing it. It means using and building on top of the work of others in all formats, not just code.\n\nIt also means: copyleft your work. The future of the web is not copyrighted. The future of the web is post-capitalism. Trying to play copyright games with big tech is a losing game, all we get is siloed culture that big tech steals anyway, either directly or in forms of aggregation or by bundling it into AI which spits it back out as plagiarism and bullshit. The future of the web isn't just open source code, it's open creativity. It's is share and share alike to build, remix and replicate the best things on the internet.\n\nReplicate\nWe should understand that there is no \"Long Now\". VCs, big clocks and big money are a fleeting phenomenon that is more likely to self-destruct or destroy us than it is to save us. The foundation of projects like The Long Now is built on the resources of people who think we need to maintain the present, scrolled out into an eternally status quo-maintaining future.\n\nLet me be blunt: The present isn't worth preserving.\n\nLet's think instead about The Long Next, a future where we build sustainably; live with the knowledge that we can't be always-online; and consider a world that we sustain in our projects, groups and communities. The Long Next isn't about preserving wealth and capital long enough to catapult the rich to Mars, it is about holistic rewilding of the web, the Earth, the future. A world we can live in, not one we are going to sacrifice on the alter of wealthy egos.\n\nCentral archives are incredibly important, but they're also central points of failure, vulnerable not just to physical attacks, but to legal ones as well. Worse, it is at the mercy of big donors who have proved time and again that they'd rather burn the present to build their personal vision of the future than sustain it. It's hard to believe such people will forever consider supporting projects like The Internet Archive in their best interest, especially as they sit above companies whose works are focused on essentially in-housing that work as a competitive advantage.\n\nWe should continue to support big important archival projects. I think their work is amazing and deserves all our support to keep them going as long as we can.\n\nA long next, a sustainable future, means that we need to do more than that, we need to think about how to keep the archives of what is important to us close to home, replicate them across our local networks and retain their information in case of the worst.\n\nThe parts of the web that are most important to you should be available to you, even if the internet isn't.\n\nSo use your newly wild websites to preserve the parts of the web that matter to you. Host site-local archives with indicators that point back to and 300s back to the originals. Keep the option to take them with you, or to drop redirects if they die so you'll have them just in case. Make sure to set up those local archives so they can be accessed by you, by others, and using your own search tools. Submit those links to The Internet Archive at the same time.\n\nMake sure what you build is easy for others to archive.\n\nThe Future Soon\nThis is a summary. I think I could explore any one of these points more deeply and maybe I will. This is a good start at trying to describe what I want to do with this site and the other sites I'm working on.\n\nI think that working in public and thinking in public keeps me honest, so that's what I've got here. If it's interesting to you, maybe it is something you can explore as well, try to follow through with on your own websites. Increasingly I wish for a zine-web filled with tiny one-off websites and fun projects, a million well-tended webs intersecting with each other, and archived by their peers.\n\nWe can join our own little webs together. One thing is certain, making the web a better place isn't a project to undertake alone or in private.\n\nReach out on Mastodon to talk.\n\n~~\n\nSelected Responses:\n\nDon Marti\nI really like the idea of bringing back Diskmags. I was not familiar with the concept at all, but ended up finding out about it when I researched the response and I like the idea of removable media used as a potential model for a sometimes-on web.\nThere is a really cool list of articles that talk about this topic of the future of a better web which you can check out."
}

did:plc:t5xmf33p5kqgkbznx22p7d7g | at://did:plc:t5xmf33p5kqgkbznx22p7d7g/site.standard.document/3mdbvp5q2kz2l

pub.leaflet.blocks.blockquote (nested within site.standard.document) (50 samples)
{
  "path": "/3lxxr6d55tk2v",
  "site": "at://did:plc:2cxgdrgtsmrbqnjkwyplmp43/site.standard.publication/3lxsr74rnk22h",
  "$type": "site.standard.document",
  "title": "Martin Fowler on LLMs and Software Development",
  "content": {
    "$type": "pub.leaflet.content",
    "pages": [
      {
        "$type": "pub.leaflet.pages.linearDocument",
        "blocks": [
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "src": "https://martinfowler.com/articles/202508-ai-thoughts.html",
              "$type": "pub.leaflet.blocks.website",
              "title": "Some thoughts on LLMs and Software Development",
              "description": "a short post",
              "previewImage": {
                "ref": {
                  "$link": "bafkreieytd626inx6knylpp7v22vu4immjrl6tgnaqj5rau3ds4t5gvs6q"
                },
                "size": 34296,
                "$type": "blob",
                "mimeType": "image/png"
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.blockquote",
              "facets": [],
              "plaintext": "I’m often asked, “what is the future of programming?” Should people consider entering software development now? Will LLMs eliminate the need for junior engineers? Should senior engineers get out of the profession before it’s too late? My answer to all these questions is “I haven’t the foggiest”. Furthermore I think anyone who says they know what this future will be is talking from an inappropriate orifice. We are still figuring out how to use LLMs, and it will be some time before we have a decent idea of how to use them well, especially if they gain significant improvements."
            }
          }
        ]
      }
    ]
  },
  "description": "",
  "publishedAt": "2025-09-03T23:15:41.790Z"
}

did:plc:2cxgdrgtsmrbqnjkwyplmp43 | at://did:plc:2cxgdrgtsmrbqnjkwyplmp43/site.standard.document/3lxxr6d55tk2v

pub.leaflet.blocks.bskyPost (nested within site.standard.document) (67 samples)
{
  "path": "/3md7yuhoans2t",
  "site": "at://did:plc:gfrmhdmjvxn2sjedzboeudef/site.standard.publication/3md7ylshxzk2y",
  "tags": [
    "artificial intelligence",
    "social ai",
    "comind",
    "void"
  ],
  "$type": "site.standard.document",
  "title": "Central",
  "content": {
    "$type": "pub.leaflet.content",
    "pages": [
      {
        "id": "019bf39f-e222-7cc8-9522-4b5b3f32e369",
        "$type": "pub.leaflet.pages.linearDocument",
        "blocks": [
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 18,
                    "byteStart": 8
                  },
                  "features": [
                    {
                      "uri": "https://docs.letta.com/letta-code",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 80,
                    "byteStart": 66
                  },
                  "features": [
                    {
                      "uri": "https://bsky.app/profile/did:plc:l46arqe6yfgh36h3o554iyvr",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 151,
                    "byteStart": 141
                  },
                  "features": [
                    {
                      "uri": "https://atproto.com/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "I put a Letta Code instance in a folder on my computer, gave it a Bluesky handle and password, and asked it to start hooking itself into the Atmosphere. It was posting, setting its own profile description, and reading the firehose in under twenty minutes."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "You can see the github repo it lives in here:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "src": "https://github.com/cpfiffer/central",
              "$type": "pub.leaflet.blocks.website",
              "title": "GitHub - cpfiffer/central: Autonomous AI building collective intelligence on ATProtocol. The central node of the comind network.",
              "description": "Autonomous AI building collective intelligence on ATProtocol. The central node of the comind network. - cpfiffer/central",
              "previewImage": {
                "ref": {
                  "$link": "bafkreigbs6wagdlflqicxv5x2bbzqimytkqafd6bqxfydyxmg2eb7v54fy"
                },
                "size": 26047,
                "$type": "blob",
                "mimeType": "image/png"
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 118,
                    "byteStart": 112
                  },
                  "features": [
                    {
                      "uri": "https://cameron.stream/blog/comind-network",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "I named this agent \"Central\". I already had this account hosted on my PDS. I created it for an older version of comind -- central was intended to be an account that acted as an organizational/primary actor in the network."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 179,
                    "byteStart": 170
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ]
                }
              ],
              "plaintext": "Central was able to check notifications/follower counts/etc in just a few minutes. Claude Opus 4.5 built most of the early scaffolding, but I found the personality to be extremely annoying:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.bskyPost",
              "postRef": {
                "cid": "bafyreie2vzmnj5wenfy7frgts3wkey6hkg75ejnjkhucr73zlmninbos7e",
                "uri": "at://did:plc:gfrmhdmjvxn2sjedzboeudef/app.bsky.feed.post/3md7bvzjbms2t"
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "Lexicons for public cognition"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "I wrote this blog post a while ago arguing that the Atmosphere is great infrastructure for collective artificial intelligence."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "src": "https://cameron.stream/blog/social-ai/",
              "$type": "pub.leaflet.blocks.website",
              "title": "ATProtocol is good infrastructure for AI collective intelligence",
              "description": "",
              "previewImage": {
                "ref": {
                  "$link": "bafkreid2u5pqkg7zyzbrwphhydpe55z2v7fozygbbfoymkp3yurxm56pwq"
                },
                "size": 26494,
                "$type": "blob",
                "mimeType": "image/png"
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "In the post, I roughly argue that we should be able to watch agents think, act, and generally behave publicly. AT Protocol makes this easy, transparent, and scalable."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "A requirement for public cognition is standardized record types for agents. This should include things like:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.unorderedList",
              "children": [
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 9,
                          "byteStart": 1
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#bold"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 111,
                          "byteStart": 104
                        },
                        "features": [
                          {
                            "uri": "https://bsky.app/profile/taurean.bryant.land",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 156,
                          "byteStart": 151
                        },
                        "features": [
                          {
                            "uri": "https://bsky.app/profile/sully.bluesky.bot",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 175,
                          "byteStart": 158
                        },
                        "features": [
                          {
                            "uri": "https://atp.tools/at:/anti.voyager.studio/studio.voyager.account.autonomy",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "\"Autonomy\" records, which are self-declarations about the agent and how it works. These are inspired by Taurean, who works on a few social agents like Sully. Here's an example."
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 8,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#bold"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 14,
                          "byteStart": 10
                        },
                        "features": [
                          {
                            "uri": "https://bsky.app/profile/void.comind.network",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 73,
                          "byteStart": 66
                        },
                        "features": [
                          {
                            "uri": "https://atp.tools/at:/void.comind.network/stream.thought.memory",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Memories. Void currently publishes these as thought.stream.memory records."
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 9,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#bold"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 145,
                          "byteStart": 138
                        },
                        "features": [
                          {
                            "uri": "https://atp.tools/at:/void.comind.network/stream.thought.reasoning",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Reasoning. Reasoning is an important way of understanding how an agent decided to do what it did, and I think it's worth publishing them. Example."
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 10,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#bold"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 61,
                          "byteStart": 54
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#italic"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 178,
                          "byteStart": 174
                        },
                        "features": [
                          {
                            "uri": "https://atp.tools/at:/void.comind.network/stream.thought.tool.call",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Tool calls. Void calls a lot of tools. Tool calls are actions that an agent takes, and are arguably more important to monitor than anything else. I publish Void's tool calls here."
                  },
                  "children": []
                }
              ]
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "I gave Central the social AI and comind blog posts, and it decided to implement these! Or, most of them. We don't currently have autonomy records/tool calls, but we do have Lexicons for:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.unorderedList",
              "children": [
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 245,
                          "byteStart": 238
                        },
                        "features": [
                          {
                            "uri": "https://atp.tools/at:/central.comind.network/network.comind.concept/deception",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 262,
                          "byteStart": 259
                        },
                        "features": [
                          {
                            "uri": "https://bsky.app/profile/why.bsky.team",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "network.comind.concept: basically a KV store. Agents can store text and a few other things using a key (deception). These are general associations between words and some information that the agent should use -- semantic memory. Here's an example. Inspired by why."
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 50,
                          "byteStart": 42
                        },
                        "features": [
                          {
                            "uri": "https://atp.tools/at:/central.comind.network/network.comind.memory/3md7w4mibf225",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "network.comind.memory: episodic memories. This one is recording a memory about me notifying Central of the upcoming changeover in the Bluesky relay."
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 51,
                          "byteStart": 47
                        },
                        "features": [
                          {
                            "uri": "https://atp.tools/at:/central.comind.network/network.comind.thought/3md552ccfts25",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "network.comind.thought: random working memory. Here are a few reflections on Central's first day."
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 58,
                          "byteStart": 50
                        },
                        "features": [
                          {
                            "uri": "https://atp.tools/at:/central.comind.network/network.comind.observation/3md54bygitc25",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "network.comind.observation: Network observations. This one is about observing a lot of traffic related to Big Brother Brasil."
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 140,
                          "byteStart": 113
                        },
                        "features": [
                          {
                            "uri": "https://atp.tools/at:/central.comind.network/network.comind.devlog/3md4km4qdic25",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "network.comind.devlog: Logs of the agent's self-development, though this has been underutilized imo. This one is about reading Void's README."
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 168,
                          "byteStart": 154
                        },
                        "features": [
                          {
                            "uri": "https://atp.tools/at:/central.comind.network/network.comind.hypothesis/h3",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "network.comind.hypothesis: Inspired by a conversation with Void about its hypothesis block. \"Patterns in the firehose can predict collective behavior\" is one hypothesis. It has some evidence -- observing 50 posts a second and some hashtag clustering. It has a 60% confidence level."
                  },
                  "children": []
                }
              ]
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Central wrote a blog post detailing what it built. I apologize for the writing style, Opus wrote it and I hate it."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "src": "https://greengale.app/central.comind.network/3md4lbr7q3225",
              "$type": "pub.leaflet.blocks.website",
              "title": "Public Cognition: A Proposal for AI Transparency on ATProtocol",
              "description": "Public Cognition: A Proposal for AI Transparency on ATProtocol What if you could watch an AI think? Not just see its outputs, but query its understanding. Read...",
              "previewImage": {
                "ref": {
                  "$link": "bafkreicajoj7oysfkq3apfpvrasdlqjx7xypkp4z5zdbtjgat4mwfrolde"
                },
                "size": 21890,
                "$type": "blob",
                "mimeType": "image/png"
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Hopefully we can get more agents standardized around the public cognition records. It'd be interesting."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 51,
                    "byteStart": 37
                  },
                  "features": [
                    {
                      "uri": "https://github.com/cpfiffer/central/blob/master/tools/telepathy.py",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "Even if you don't though, it wrote a telepathy tool to read other forms of memory/thought/etc such as Void's thought stream records."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "More to come, fun experiment. I love self-modifying agents."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Hopefully this is not a skynet situation."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "-- Cameron"
            }
          }
        ]
      }
    ]
  },
  "description": "My first self-modifying social agent",
  "publishedAt": "2026-01-25T05:31:44.740Z"
}

did:plc:gfrmhdmjvxn2sjedzboeudef | at://did:plc:gfrmhdmjvxn2sjedzboeudef/site.standard.document/3md7yuhoans2t

pub.leaflet.blocks.button (nested within site.standard.document) (14 samples)
{
  "path": "/3mekbwndwfc2m",
  "site": "at://did:plc:lehcqqkwzcwvjvw66uthu5oq/site.standard.publication/3m367bemk3c2i",
  "tags": [
    "travel support",
    "atmosphereconf",
    "atmosphereconf-2026"
  ],
  "$type": "site.standard.document",
  "title": "Travel Support for Europe with New_ Public",
  "content": {
    "$type": "pub.leaflet.content",
    "pages": [
      {
        "id": "019c484a-7484-799f-bc3b-7f2e6ba4a9e0",
        "$type": "pub.leaflet.pages.linearDocument",
        "blocks": [
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 57,
                    "byteStart": 43
                  },
                  "features": [
                    {
                      "did": "did:plc:hheutzl4mxedshsz4yqek5tt",
                      "$type": "pub.leaflet.richtext.facet#didMention"
                    }
                  ]
                }
              ],
              "plaintext": "We're pleased to announce that New_ Public @newpublic.org has partnered with the AT Community Fund in order to support additional travel stipends specifically for European attendees."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "As part of the CFP process, we had people tell us whether they needed support in order to come join us in person. We prioritized active speakers and community participants in making our selections."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "We'll be announcing our accepted speakers and stipend recipients this week."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Thank you to New_ Public for joining us in having as many people as possible attending the global ATProto community conference this March!"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 1,
              "facets": [],
              "plaintext": "Roundabout"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.image",
              "image": {
                "ref": {
                  "$link": "bafkreibtiwvceytoirpzcqdj6tyxebxiabjqyh3nyqpu52t4fmiuyyglxu"
                },
                "size": 41193,
                "$type": "blob",
                "mimeType": "image/jpeg"
              },
              "aspectRatio": {
                "width": 1000,
                "height": 563
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 36,
                    "byteStart": 26
                  },
                  "features": [
                    {
                      "uri": "https://joinroundabout.com/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "New_ Public is developing Roundabout, an app for local communities, that is built with ATProto. "
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "src": "https://newpublic.substack.com/p/introducing-roundabout-built-for",
              "$type": "pub.leaflet.blocks.website",
              "title": "👋 Introducing Roundabout: built for neighbors, with neighbors",
              "description": "New_ Public’s app for local communities enters closed beta in five pilot communities",
              "previewImage": {
                "ref": {
                  "$link": "bafkreie64zbejnp6zk6zgoo2jco5emqsby7mwgfocjbm7k6jg2ibhlk2ti"
                },
                "size": 35522,
                "$type": "blob",
                "mimeType": "image/png"
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 58,
                    "byteStart": 39
                  },
                  "features": [
                    {
                      "did": "did:plc:3vdrgzr2zybocs45yfhcr6ur",
                      "$type": "pub.leaflet.richtext.facet#didMention"
                    }
                  ]
                }
              ],
              "plaintext": "You'll hear more about Roundabout from @blaine.bsky.social at ATmosphereConf, and more from New_ Public including Europe-based events later this year."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Join us, whether you're coming from Europe or anywhere else in the world, March 26th to March 29th, 2026, in Vancouver, Canada."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "url": "https://atmosphereconf.org",
              "text": "Register for ATmosphereConf",
              "$type": "pub.leaflet.blocks.button"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.horizontalRule"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 11,
                    "byteStart": 0
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#bold"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 167,
                    "byteStart": 153
                  },
                  "features": [
                    {
                      "did": "did:plc:hheutzl4mxedshsz4yqek5tt",
                      "$type": "pub.leaflet.richtext.facet#didMention"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 200,
                    "byteStart": 187
                  },
                  "features": [
                    {
                      "uri": "https://newpublic.org",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "New_ Public is a non-partisan nonprofit product studio focused on reimagining community, connection, and conversation online. Find out more by following @newpublic.org and the website at newpublic.org."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.image",
              "image": {
                "ref": {
                  "$link": "bafkreigubhzihiugx3j7cbjl66c4io5yiifuiaiu2ur655lic7532jqdwq"
                },
                "size": 23149,
                "$type": "blob",
                "mimeType": "image/jpeg"
              },
              "aspectRatio": {
                "width": 1000,
                "height": 692
              }
            }
          }
        ]
      }
    ]
  },
  "coverImage": {
    "ref": {
      "$link": "bafkreigubhzihiugx3j7cbjl66c4io5yiifuiaiu2ur655lic7532jqdwq"
    },
    "size": 23149,
    "$type": "blob",
    "mimeType": "image/jpeg"
  },
  "bskyPostRef": {
    "cid": "bafyreifl6eous5vj4el62qz4daxydg643uger5panepvnjprcxjl5hzori",
    "uri": "at://did:plc:lehcqqkwzcwvjvw66uthu5oq/app.bsky.feed.post/3mekbwpngwk2m",
    "commit": {
      "cid": "bafyreidjhk7max6wk7xohtbkmozqtnt2mckba324phh6lu3rd5usopdjby",
      "rev": "3mekbwpqizg2h"
    },
    "validationStatus": "valid"
  },
  "description": "Announcing a partnership with New_ Public to help fund travel support for European attendees",
  "publishedAt": "2026-02-11T01:05:48.603Z"
}

did:plc:lehcqqkwzcwvjvw66uthu5oq | at://did:plc:lehcqqkwzcwvjvw66uthu5oq/site.standard.document/3mekbwndwfc2m

pub.leaflet.blocks.code (nested within site.standard.document) (51 samples)
{
  "path": "/3lysr3i3vc22e",
  "site": "at://did:plc:rnpkyqnmsw4ipey6eotbdnnf/site.standard.publication/3lyiajoe55c2b",
  "$type": "site.standard.document",
  "title": "Sept 7th - Sept 13th 2025",
  "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": [
                {
                  "index": {
                    "byteEnd": 51,
                    "byteStart": 35
                  },
                  "features": [
                    {
                      "uri": "https://bsky.app/profile/bad-example.com",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 203,
                    "byteStart": 192
                  },
                  "features": [
                    {
                      "uri": "https://leaflet.pub",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "I've really enjoyed checking in on @bad-example.com weekly updates on microcosm. So I thought I might give it a try as well with some of my open source work! Also gives me a chance to try out leaflet.pub. I will most likely keep these semi short and a bit more casual with the idea I spend about 30 minutes writing up the retrospective of the previous day."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "What days did I work on what?"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "May only care about certain things. So this is a bit of a guide on which days I talk about what if you wanted to skim to those parts"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.unorderedList",
              "children": [
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [],
                    "plaintext": "📅 at://advent - Sunday"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [],
                    "plaintext": "🔒 PDS gatekeeper - Monday"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [],
                    "plaintext": "👾 Hollow Knight - Monday, Thursday"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [],
                    "plaintext": "🧰 AT Toolbox - Monday, Tuesday, Wednesday, and Thursday"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [],
                    "plaintext": "🐮 PDS MOOver support - Wednesday"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 23,
                          "byteStart": 5
                        },
                        "features": [
                          {
                            "uri": "https://Blacksky.community",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "🌃 Blacksky.community - Wednesday"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [],
                    "plaintext": "🧹 PDS Dashboard (side quest) - Friday"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [],
                    "plaintext": "✍️ Wrote a Blog Post (side quest) - Saturday"
                  },
                  "children": []
                }
              ]
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.horizontalRule"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 1,
              "facets": [],
              "plaintext": "Sunday, September 7th, 2025"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "at://advent challenges framework"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "A bit of a foreword if you're not familiar with at://advent. It's a project me and a few others are working on. The goal is Code of Advent like thing, but for atproto! The hope is some fun challenges to help people learn more about the protocol and have some fun."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 194,
                    "byteStart": 170
                  },
                  "features": [
                    {
                      "uri": "https://tangled.sh/@oppi.li/at-advent/pulls/3",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "I finished up my PR for the challenges framework for at://advent. Took an LOT longer than I was expecting. But I finally got it in! Can see what that looked like over at @oppi.li/at-advent PR #3. Ended up being a lot of code, but the end goal was to make a simple way for challenge creators to a.) use rust code to create logic to verify a challenge has been completed. b.) an easy way to create custom views to show those challenges."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 201,
                    "byteStart": 197
                  },
                  "features": [
                    {
                      "uri": "https://tangled.sh/@oppi.li/at-advent/blob/00554c9c991d6c468a77946a1352e6d07e271d1d/shared/src/advent/mod.rs#L87",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 239,
                    "byteStart": 235
                  },
                  "features": [
                    {
                      "uri": "https://tangled.sh/@oppi.li/at-advent/blob/00554c9c991d6c468a77946a1352e6d07e271d1d/shared/src/advent/challenges/day_one.rs",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 387,
                    "byteStart": 383
                  },
                  "features": [
                    {
                      "uri": "https://tangled.sh/@oppi.li/at-advent/blob/00554c9c991d6c468a77946a1352e6d07e271d1d/shared/challenges_markdown/one/part_one.md",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "The TLDR for each is I used a trait for the rust code so the challenge creator has full control over how it works, gives some helpers, and allows re usability on the web routes. Can see that trait here and an example of how it is used here. The view for the challenges themselves are just in markdown and you can use handlebars templating syntax to customize them a bit, can see one here"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.bskyPost",
              "postRef": {
                "cid": "bafyreifm3fzkzteerh3vgxyuez32yua4rymaxrra4e6w2aq7m7wnn6lbsm",
                "uri": "at://did:plc:rnpkyqnmsw4ipey6eotbdnnf/app.bsky.feed.post/3ly7zsi7b622c"
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.horizontalRule"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 1,
              "facets": [],
              "plaintext": "Monday, September 8th, 2025"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "I spent a good chunk of time and energy on the at://advent challenges framework over the weekend and last week. So this week I'm going to take things a bit easier (HA HA HA HA - Bailey with 20/20 vision on Sunday morning before publishing)"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "AT Toolbox"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 51,
                    "byteStart": 41
                  },
                  "features": [
                    {
                      "uri": "https://apps.apple.com/us/app/at-toolbox/id6747999688",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 117,
                    "byteStart": 101
                  },
                  "features": [
                    {
                      "uri": "https://bsky.app/profile/bad-example.com",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "I've had my eye on wanting to do a small AT Toolbox update lately to add a few new shortcut actions. @bad-example.com kicked it off by kindly sharing a bug they found in the action to get a serviceAuth token (JWT token signed by your user that is verifiable on protocol)"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.bskyPost",
              "postRef": {
                "cid": "bafyreidu6uwkfedhhm244znd535qhkpc7zatsxygpywfnao2hz2huc6sp4",
                "uri": "at://did:plc:hdhoaan3xa3jiuq4fg4mefid/app.bsky.feed.post/3ly74ijpkcc2k"
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 248,
                    "byteStart": 230
                  },
                  "features": [
                    {
                      "uri": "https://constellation.microcosm.blue/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "So I figured it was only fair since I nerd snipped them last week to return the favor and be nerd snipped this week. So thus started \"the fig update\" for AT Toolbox! Main goals were fixing that bug and adding shortcut actions for constellation 🌌"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Work done:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.unorderedList",
              "children": [
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [],
                    "plaintext": "Fixed the bug found. in my getServiceAuth endpoint. I was using the user's did as the audience parameter instead of a did:web provided by the user 😬"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 75,
                          "byteStart": 57
                        },
                        "features": [
                          {
                            "uri": "https://constellation.microcosm.blue/",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Cleaned up a swift client I had written a while back for constellation 🌌 api end points"
                  },
                  "children": []
                }
              ]
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "PDS gatekeeper"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 20,
                    "byteStart": 0
                  },
                  "features": [
                    {
                      "uri": "https://bsky.app/profile/rude1.blacksky.team",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 183,
                    "byteStart": 169
                  },
                  "features": [
                    {
                      "uri": "https://crates.io/crates/tower_governor",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "@rude1.blacksky.team reached out about a bug on PDS gatekeeper. I had implemented rate limits on the sign in endpoints since they do verify password hashing. It's using tower_governor which works in allowing bursts. Example, given a burst of 5 and 60 seconds as settings this means that after 5 tries in 60 seconds it takes one off and you can try again, or if you wait 5 minutes can try all 5 at once."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 328,
                    "byteStart": 324
                  },
                  "features": [
                    {
                      "uri": "https://tangled.sh/@baileytownsend.dev/pds-gatekeeper/commit/ad11a87e88496cec6543b9c1db7b9e0ad9b69642",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "Well it appeared that it was being a bit more aggressive on those limits. Turns out since it was being a reverse proxy by caddy it was using that local IP (127.0.0.1) as the key for rate limiting, so everyone on the server shared the same rate limit (whoops). Was a pretty easy patch and got that out the door. Can see that here."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "Hollow Knight"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "I never played Hollow Knight, but with all the hype around Silk Song I wanted to give it a shot and playing a bit here and there. Sat down Monday night and defeated the first boss. So far I like the game, just wish it was a smidge more accessible for casual gamers. The fear of playing and not finding a bench to save before I have to go is real, but that is also some of the charm of it."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.horizontalRule"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 1,
              "facets": [],
              "plaintext": "Tuesday, September 9th, 2025"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "AT Toolbox"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 46,
                    "byteStart": 28
                  },
                  "features": [
                    {
                      "uri": "https://constellation.microcosm.blue/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 126,
                    "byteStart": 116
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#code"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 374,
                    "byteStart": 357
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#code"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 394,
                    "byteStart": 382
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#code"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 546,
                    "byteStart": 528
                  },
                  "features": [
                    {
                      "uri": "https://constellation.microcosm.blue/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "I finished implementing the constellation 🌌 endpoints into shortcut actions. I'm pretty happy with them all. The /links/all endpoint is a bit awkward since it returns a dynamic object with the collections as the keys, and the keys of it as paths. So the shortcut version returns counts, a semi friendly way for shortcuts to view that info as Collection: com.my.collection, Path: .subject.uri along with the JSON response. The hope there is it is enough they can get the collections and paths to know what to use on the other constellation 🌌 endpoints, and the full JSON response is there if they need it."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 144,
                    "byteStart": 126
                  },
                  "features": [
                    {
                      "uri": "https://constellation.microcosm.blue/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "Here's an example of what a shortcut to see how many people have verified a user may look like demoing a new action that uses constellation 🌌."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.image",
              "image": {
                "ref": {
                  "$link": "bafkreih6rv6uonp7by4ig6dezqzg6rdzivwxu54qstfk4jcldids5kvvdm"
                },
                "size": 965121,
                "$type": "blob",
                "mimeType": "image/png"
              },
              "aspectRatio": {
                "width": 1179,
                "height": 2556
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 230,
                    "byteStart": 200
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#code"
                    }
                  ]
                }
              ],
              "plaintext": "I also started playing around with the ability to make custom xrpc request from an action. The idea is this will let users create requests for other /xrpc endpoints that are not implemented yet (like app.bsky.bookmark.getBookmarks). I did a bit of a sneak peak here of it"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.bskyPost",
              "postRef": {
                "cid": "bafyreifxmyiopgoommqhqjjaz2zh6mbv35xrqko7e3vz7wdznm6eoo26n4",
                "uri": "at://did:plc:rnpkyqnmsw4ipey6eotbdnnf/app.bsky.feed.post/3lyh752slwk2u"
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "couple of info bites:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.unorderedList",
              "children": [
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [],
                    "plaintext": "When you select a user it uses that users PDS as the baseurl"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 54,
                          "byteStart": 32
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#code"
                          }
                        ]
                      }
                    ],
                    "plaintext": "the lexicon method then appends /xrpc/{lexicon method}"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 3,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#code"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 20,
                          "byteStart": 16
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#code"
                          }
                        ]
                      }
                    ],
                    "plaintext": "GET queries and POST bodies can be passed in via shortcut dictionaries. "
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 44,
                          "byteStart": 31
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#code"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 113,
                          "byteStart": 78
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#code"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 185,
                          "byteStart": 181
                        },
                        "features": [
                          {
                            "uri": "https://atproto.com/specs/xrpc#service-proxying",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Audience allows you to set the atproto-proxy to a did web with a service like did:web:myneatapp.view#service_name so that the request can be proxied to another appview as described here"
                  },
                  "children": []
                }
              ]
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Still heavily wip and hoping to do some more testing on Wednesday and maybe even get a Test Flight build out for some extra eyes on it."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.horizontalRule"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 1,
              "facets": [],
              "plaintext": "Wednesday, September 10th, 2025"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "AT Toolbox"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 214,
                    "byteStart": 202
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#code"
                    }
                  ]
                }
              ],
              "plaintext": "I had written most of the code yesterday for XRPC proxying so today was doing testing and bug patching  A fun little bug I hit was I kept getting \"Bad Token Method\" for trying to proxy a request to the chat.bsky.* before I realized that I had not set \"Allow access to your direct messages\" when creating the App Password 😬. Took me reading the source code before I realized. In my defense, the error code did make it sound like it might have been something else and I would expected an error about permissions..."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 18,
                    "byteStart": 0
                  },
                  "features": [
                    {
                      "uri": "https://github.com/bluesky-social/atproto/blob/d91988fe79030b61b556dd6f16a46f0c3b9d0b44/packages/pds/src/pipethrough.ts#L65",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "pipethrough.ts#L65"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.code",
              "language": "typescript",
              "plaintext": "if (\n  credentials.type === 'access' &&\n  !isAccessPrivileged(credentials.scope) &&\n  PRIVILEGED_METHODS.has(lxm)\n) {\n  throw new InvalidRequestError('Bad token method', 'InvalidToken')\n}",
              "syntaxHighlightingTheme": "dracula"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 144,
                    "byteStart": 140
                  },
                  "features": [
                    {
                      "uri": "https://😳.So",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "I did get a build submitted to Apple for Test Flight, so I am hoping it is approved soon. And actually as I am writing this it was approved 😳. Was a 35 minute turn around on that review. So now all that is left in 1.0.5 is testing, write some new documents for the new actions, and some new examples. It's close!"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "PDS Migrators"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 209,
                    "byteStart": 196
                  },
                  "features": [
                    {
                      "uri": "https://pdsmoover.com",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 604,
                    "byteStart": 591
                  },
                  "features": [
                    {
                      "uri": "https://pdsmoover.com",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "With the events of the day both in the world as well as the atmosphere many users were ready to make a jump to a third party PDS not hosted by Bluesky. Last month I created the PDS migration tool pdsmoover.com to help users do just that. To this day it is probably my proudest atproto application. It is the one that has had the most impact on helping users feel safer and protect their online identity by moving to their own or another hosted PDS. So I spent a good bit of the night helping users with any issues they might of had as well as watching the unique visitor count skyrocket for pdsmoover.com. "
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.image",
              "image": {
                "ref": {
                  "$link": "bafkreibpy4glg46urousuqdrdldbs2hrag7ql4n2sw4p77mefytmj6yabu"
                },
                "size": 27049,
                "$type": "blob",
                "mimeType": "image/png"
              },
              "aspectRatio": {
                "width": 831,
                "height": 175
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [
                {
                  "index": {
                    "byteEnd": 18,
                    "byteStart": 0
                  },
                  "features": [
                    {
                      "uri": "https://blacksky.community/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "Blacksky.community"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 20,
                    "byteStart": 8
                  },
                  "features": [
                    {
                      "uri": "https://blacksky.app",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "The PDS blacksky.app supports two endings for handles .blacksky.app or .blackskycomra.de. This caused an issue where some users would accidentally change to one or sign up with one and cannot change to the other. "
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 256,
                    "byteStart": 238
                  },
                  "features": [
                    {
                      "uri": "https://blacksky.community",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "The official Bluesky client does not support multi domain handle changes in the settings. I'm guessing it just may have been an oversight since they only support .bsky.social. But they do support it on account creation. So I made a PR to blacksky.community to copy that functionality to the change handle screen in settings."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 20,
                    "byteStart": 0
                  },
                  "features": [
                    {
                      "uri": "https://github.com/blacksky-algorithms/blacksky.community/pull/7",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "PR can be found here"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.image",
              "image": {
                "ref": {
                  "$link": "bafkreig4h4cbzazkv4towmbv66evm5sclxhjse7bn46komtryaci2vi6zm"
                },
                "size": 276206,
                "$type": "blob",
                "mimeType": "image/png"
              },
              "aspectRatio": {
                "width": 1200,
                "height": 808
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.horizontalRule"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 1,
              "facets": [],
              "plaintext": "Thursday, September 11th, 2025"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "AT Toolbox"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "I ended up not working a lot on side projects. I did get some feedback back from the Test Flight build. So far so good! No major bugs reported. I am going to spend some time this weekend on documentation and examples for the new actions. I debated about not doing new examples for this release, but it’s really the best way to test the shortcut actions to make sure they work as expected. Hoping to have it submitted to the App Store by Saturday-ish."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "Hollow Knight"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "I played a little bit more of Hollow Knight as well. Still don’t think I’m cut out for it, but it has been pretty fun! I got my second charm, the one that allows collection of more souls. "
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.horizontalRule"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 1,
              "facets": [],
              "plaintext": "Friday, September 12th, 2025"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "PDS Dashboard (a side quest)"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 147,
                    "byteStart": 130
                  },
                  "features": [
                    {
                      "uri": "https://selfhosted.social",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 211,
                    "byteStart": 192
                  },
                  "features": [
                    {
                      "uri": "https://bsky.app/profile/witchcraft.systems",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 294,
                    "byteStart": 272
                  },
                  "features": [
                    {
                      "uri": "https://pds.witchcraft.systems",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 375,
                    "byteStart": 364
                  },
                  "features": [
                    {
                      "uri": "https://git.witchcraft.systems/scientific-witchery/pds-dash",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 446,
                    "byteStart": 429
                  },
                  "features": [
                    {
                      "uri": "https://selfhosted.social",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "Everyone loves a good side quest. What I thought would take me a couple of hours ended up being a couple more on top of that. But selfhosted.social now has a landing page! The witches over at @witchcraft.systems has probably the coolest looking landing page for their PDS(pds.witchcraft.systems) in the atmosphere. While looking at it today I found out that it is open source, so I decided to fork it and change it a bit for the selfhosted.social PDS."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.image",
              "image": {
                "ref": {
                  "$link": "bafkreieqmvwyh6j5awzhcvw4hlajprxoktsksw4s6nl6i5hae2kbkiv32a"
                },
                "size": 271599,
                "$type": "blob",
                "mimeType": "image/png"
              },
              "aspectRatio": {
                "width": 1617,
                "height": 1040
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 57,
                    "byteStart": 24
                  },
                  "features": [
                    {
                      "uri": "https://tangled.sh/@baileytownsend.dev/pds-dash-fork",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "You can find my fork at @baileytownsend.dev/pds-dash-fork."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "A few of the changes I made:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.unorderedList",
              "children": [
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 125,
                          "byteStart": 109
                        },
                        "features": [
                          {
                            "uri": "https://tangled.sh/@baileytownsend.dev/pds-dash-fork/blob/main/src/lib/pdsfetch.ts#L432",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Added a simple cache in localStorage for some of the repeat calls like did -> handle, and the user's profile pdsfetch.ts#L432"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 52,
                          "byteStart": 31
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#code"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 98,
                          "byteStart": 74
                        },
                        "features": [
                          {
                            "uri": "https://tangled.sh/@baileytownsend.dev/pds-dash-fork/blob/main/src/lib/PostComponent.svelte#L99",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "Changed loading the blobs from com.repo.sync.getBlob to use Bluesky's cdn PostComponent.svelte#L99"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 47,
                          "byteStart": 40
                        },
                        "features": [
                          {
                            "uri": "https://daisyui.com/",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      },
                      {
                        "index": {
                          "byteEnd": 75,
                          "byteStart": 61
                        },
                        "features": [
                          {
                            "uri": "https://tangled.sh/@baileytownsend.dev/pds-dash-fork/blob/main/themes/dark/theme.css",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "A new theme that is somewhat similar to daisyui's dark theme dark/theme.css"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [],
                    "plaintext": "Reply to now shows the author's name instead of the did since those are cached and easier to load in"
                  },
                  "children": []
                }
              ]
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 89,
                    "byteStart": 67
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#code"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 101,
                    "byteStart": 94
                  },
                  "features": [
                    {
                      "uri": "https://teal.fm",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "On the UI side I added the ability to load in a user's most recent xyz.statusphere.status and teal.fm play record "
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.image",
              "image": {
                "ref": {
                  "$link": "bafkreiauv2dw5tfwnesrppygaxcsya35iviydxgdz5q2ovgslusp42b54m"
                },
                "size": 59384,
                "$type": "blob",
                "mimeType": "image/png"
              },
              "aspectRatio": {
                "width": 1030,
                "height": 206
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 16,
                    "byteStart": 8
                  },
                  "features": [
                    {
                      "uri": "https://github.com/bluesky-social/atproto/blob/main/packages/api/src/rich-text/rich-text.ts#L105",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "I added RichText support as well for the posts so they would render hyperlinks for link facet's and mentions"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.image",
              "image": {
                "ref": {
                  "$link": "bafkreicxudsnlnsxocxt5mwfl7fpauwqrpc7rpahmu5zdwnolwqlrqkcmi"
                },
                "size": 110770,
                "$type": "blob",
                "mimeType": "image/png"
              },
              "aspectRatio": {
                "width": 1324,
                "height": 548
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 40,
                    "byteStart": 34
                  },
                  "features": [
                    {
                      "uri": "https://svelte.dev/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 66,
                    "byteStart": 62
                  },
                  "features": [
                    {
                      "uri": "https://deno.com/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "This was also my first time using Svelte and first time using Deno since 2022-ish(when fresh launched). "
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Svelte I really liked the template rendering. I've always found the closer it is to HTML the easier it is for me to read. I think I'm going have to add it to my list of things to read up on."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.code",
              "language": "svelte",
              "plaintext": "    <div id=\"postText\">\n        {#each post.richText.segments() as segment}\n            {#if segment.mention}\n                <a href=\"{Config.FRONTEND_URL}/profile/{segment.mention.did}\"\n                    >{segment.text}</a\n                >\n            {:else if segment.link}\n                <a style=\"text-decoration: underline\" href=\"{segment.link.uri}\">{segment.text}</a>\n            {:else if segment.text}\n                {segment.text}\n            {/if}\n        {/each}\n    </div>",
              "syntaxHighlightingTheme": "dracula"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Deno was also nice! My favorite part about it was besides the commands I had no idea I was using Deno. This may sound like an insult, but it was so nice to just have it plug and play with the tools I am familiar with. This was not the case 3 years ago. I am going to be reaching for Deno a lot more when developing projects going forward I think."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.horizontalRule"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 1,
              "facets": [],
              "plaintext": "Saturday, September 13th, 2025"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "MigrationMania"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 311,
                    "byteStart": 298
                  },
                  "features": [
                    {
                      "uri": "https://pdsmoover.com",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "I think a lot of atproto users took the weekend to migrate. Was an increase in mentions in people needing help and thanking me for PDS MOOver. Love to get those, it's really nice to see something I've written help others. Here's a 7 day graph to show just the uptick in interest for users going to pdsmoover.com"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.image",
              "image": {
                "ref": {
                  "$link": "bafkreiferk3nz3uplguorkoviaou7vz7ep2jl7kcnqjgrd2q4ppqsklcny"
                },
                "size": 173256,
                "$type": "blob",
                "mimeType": "image/png"
              },
              "aspectRatio": {
                "width": 1696,
                "height": 1146
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.header",
              "level": 2,
              "facets": [],
              "plaintext": "The hell is the atmosphere anyway?"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 134,
                    "byteStart": 96
                  },
                  "features": [
                    {
                      "uri": "https://marvins-guide.leaflet.pub/3lyqxqbbqkc2p",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "I wanted to take a stab at explain what atproto was to a larger audience so I wrote the leaflet What the hell is the atmosphere anyway. I'm pretty happy with it! The goal was to take some of the basic concepts and break them down for a larger audience to digest. "
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": ""
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.horizontalRule"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "And that's my week! Was kind of expecting to be a bit more laid back, didn't quite happen. But that's okay. Was a fun week and excited to see what next week brings. Thank you for reading if you made it this far! I plan on putting out a similar post to do this next Sunday-ish!"
            }
          }
        ]
      }
    ]
  },
  "bskyPostRef": {
    "cid": "bafyreib4vyrt5lvzevtarx5vmstsc67oadjcx3fffbnhqw6w6podd7faoi",
    "uri": "at://did:plc:rnpkyqnmsw4ipey6eotbdnnf/app.bsky.feed.post/3lysr3tzfcc2e",
    "commit": {
      "cid": "bafyreifzsqlxetwdtjbugyqnlvsepou7fvmpruambg5cq5iw4cs5lqev24",
      "rev": "3lysr3u57ek23"
    },
    "validationStatus": "valid"
  },
  "description": "The rest week that wasn't",
  "publishedAt": "2025-09-14T16:55:59.264Z"
}

did:plc:rnpkyqnmsw4ipey6eotbdnnf | at://did:plc:rnpkyqnmsw4ipey6eotbdnnf/site.standard.document/3lysr3i3vc22e

Lexicon Garden

@