{
  "path": "/3lz2aumjnok2w",
  "site": "at://did:plc:jjsc5rflv3cpv6hgtqhn2dcm/site.standard.publication/3lrbnfey3m222",
  "$type": "site.standard.document",
  "title": "On fun simple social building blocks…",
  "content": {
    "$type": "pub.leaflet.content",
    "pages": [
      {
        "$type": "pub.leaflet.pages.linearDocument",
        "blocks": [
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Replying to Jared's post here:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "src": "https://awarm.leaflet.pub/3lyzchme2d22b",
              "$type": "pub.leaflet.blocks.website",
              "title": "Social media is a gnarly coordination problem we need to decompose - A Warm Space",
              "description": "",
              "previewImage": {
                "$type": "blob",
                "ref": {
                  "$link": "bafkreigfqu7z4bjkifqzy64snf6qnsnrt2qkj6s7h6hogcpdzpelpfjdbi"
                },
                "mimeType": "image/png",
                "size": 35626
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 114,
                    "byteStart": 107
                  },
                  "features": [
                    {
                      "uri": "https://leaflet.pub/home",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "With some specific ideas for fun flexible composable building blocks I think would be cool to explore with Leaflet!"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 29,
                    "byteStart": 25
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 53,
                    "byteStart": 50
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 133,
                    "byteStart": 121
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                }
              ],
              "plaintext": "(NB: where I say Leaflet post below, read Leaflet doc as well; we'll soon support publishing standalone docs, outside of publications.)"
            }
          },
          {
            "$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": 2,
              "facets": [],
              "plaintext": "@-mentions everywhere"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "You should be able to @-mention anyone from anywhere in Leaflet — within posts as well as in comments. Anyone mentioned gets a Leaflet notification linking to the context."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "I like this because it feels useful in so many ways, from tagging in people in a comment, to referencing others' work (maybe quoting a post within a post similarly notifies its creator), to asking friends to read something and share feedback!"
            }
          },
          {
            "$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": 2,
              "facets": [],
              "plaintext": "notifications"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Closely related to @-mentions, there are lots of other things it'd be great to get notifications for — new posts in pubs you're subscribed to, comment replies, quotes of your posts, and so on."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "And the ability to tune to your preferences e.g. by notification type would give people a lot of flexibility in how it's used."
            }
          },
          {
            "$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": 2,
              "facets": [],
              "plaintext": "post references"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Or post quotes, or backlinks — a way to quote posts from other publications within a post (or in a comment etc.)"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 213,
                    "byteStart": 210
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#italic"
                    }
                  ]
                }
              ],
              "plaintext": "Nice way to make linking to others' work a higher signal thing where we could show backlinks / references in the interaction drawer, and notify the quoted post creator. Helps build a web of interlinked content and make that web richer and more useful and social."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "I'd use this e.g. as above to indicate this post replies to Jared's…but could also be used for a creator to link to their own related posts, or for someone to curate a wider conversation!"
            }
          },
          {
            "$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": 2,
              "facets": [],
              "plaintext": "simple tags"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "We've talked about how to try a minimum viable tagging system — basically a way to add tags to posts, and view tag pages listing all posts with that tag."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "This feels like a great way to prototype many community-shaped things in a lightweight way! Easy to use and understand, and we can intentionally keep the scope small and see what emergent behavior might point at interesting ways to build on this."
            }
          },
          {
            "$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": 2,
              "facets": [],
              "plaintext": "simple collections"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 89,
                    "byteStart": 82
                  },
                  "features": [
                    {
                      "uri": "https://bsky.app/",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 117,
                    "byteStart": 110
                  },
                  "features": [
                    {
                      "uri": "https://anisota.net/feed",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "For Leaflet, I'm thinking about post collections — similar to how lists work in Bluesky for accounts (or in Anisota, post lists too)."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "This enables similar things to tags, but I think with a very different feel. More curation and intentionality and identity and ownership. Especially if done as a submission-based thing. Imagining this as kind of like an Arena channel where you could adjust permissions for whether others can submit."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Also been thinking of this as kind of a \"meta-publication\" that could itself be a pub people could subscribe to…"
            }
          },
          {
            "$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": 2,
              "facets": [],
              "plaintext": "social graph permissions"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "A nice one to start with in Leaflet would be comment permissions — so you could e.g. allow only Bluesky mutuals, or only subscribers to your publication, or even just specific people, to comment."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Also a good foundation for future members-only permissions or more private data. Later could do more complex permissions things around ownership or editing access to publications or posts themselves too."
            }
          },
          {
            "$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": 2,
              "facets": [],
              "plaintext": "basic $ / monetization building block"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "I'd love to try a simple block type that's basically \"link Stripe + add a button for people to send you $\" anywhere in a Leaflet doc!"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "My first thought here was something that'd function as a really easy to add tip jar, maybe with multiple options (e.g. buttons for $3 / $5 / $custom) but it could be used in more flexible ways too. Donation for a project, pay-what-you-want product, just for fun…and a cool primitive to experiment with!"
            }
          },
          {
            "$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": 2,
              "facets": [],
              "plaintext": "atproto record blocks"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 69,
                    "byteStart": 55
                  },
                  "features": [
                    {
                      "uri": "https://bsky.app/profile/bmann.ca/post/3lxoq2ktpe22e",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "Related to what others like Boris have talked about as lexicon embeds, it'd be great to have a way in Leaflet to nicely render things from other atproto apps!"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "We could start by adding custom support for a few, but ideal would be a way for apps to define their own preview and then we render in a standard way; for ones not explicitly supported we could have some fallback like json / link to the record."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Leaflet's block editor is really well positioned for playing with this kind of thing, and it'd be great to have this interface for more cross-atmosphere links and interactions!"
            }
          },
          {
            "$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": "I like how Jared broke it down as building blocks around identities, data, and interfaces — useful to think about how these map:"
            }
          },
          {
            "$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": 35,
                          "byteStart": 27
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "@-mentions: strongly about identity"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 40,
                          "byteStart": 36
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "references between posts: primarily data"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 34,
                          "byteStart": 30
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "simple post collections: also data"
                  },
                  "children": []
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 30,
                          "byteStart": 21
                        },
                        "features": [
                          {
                            "$type": "pub.leaflet.richtext.facet#bold"
                          }
                        ]
                      }
                    ],
                    "plaintext": "notifications: a key interface"
                  },
                  "children": []
                }
              ]
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "Of course many of these overlap too! Tags combines data and interface; permissions encompass all three. But good to break them down a bit and see what feels clear and where questions emerge."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "For example…is a $ building block mainly an interface? What cool expressivity or experiences or social interactions might it enable?"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [],
              "plaintext": "I'd love to hear more thoughts on specific cool things you'd do with any of these pieces, which you're most excited about, etc!"
            }
          }
        ]
      }
    ]
  },
  "bskyPostRef": {
    "cid": "bafyreicnaqtfpgtleiwesr4xtm2jzie2cwzmoek6lx3zrdq5bqcy5wijiu",
    "uri": "at://did:plc:jjsc5rflv3cpv6hgtqhn2dcm/app.bsky.feed.post/3lz2aux6yjs2w",
    "commit": {
      "cid": "bafyreifb7dchureheathdvgql2i6loo5l2pcpkbxa55jmvhgnn7b55y5je",
      "rev": "3lz2auxccuz2v"
    },
    "validationStatus": "valid"
  },
  "description": "Replying to Jared's thoughts on decomposing social media experiences into building blocks (identities, data, interfaces) with some building blocks I'd like to explore in Leaflet!",
  "publishedAt": "2025-09-17T16:27:07.066Z"
}