{
"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"
}