{
"path": "/3m7t7taogdc2j",
"site": "at://did:plc:btxrwcaeyodrap5mnjw2fvmz/site.standard.publication/3lppk75kw7k26",
"tags": [
"atproto",
"tags",
"Leaflet"
],
"$type": "site.standard.document",
"title": "Experimenting with tags in Leaflet",
"content": {
"$type": "pub.leaflet.content",
"pages": [
{
"id": "01994f35-2ee1-7ff6-90a1-2ac06b76ca39",
"$type": "pub.leaflet.pages.linearDocument",
"blocks": [
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "We're experimenting with tags in Leaflet!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "To set expectations: this is intentionally simple in scope — not the single ultimate solution for content organization and discovery, but a fun surface area to explore and see how folks use!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "⁂ ⁂ ⁂"
},
"alignment": "lex:pub.leaflet.pages.linearDocument#textAlignCenter"
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [],
"plaintext": "What's old (tags) is new again (tags!)"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "We're fans of tags as a tool, a construct, a social coordination mechanism, a site for good clean (sometimes not so clean) fun."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Tags are a staple everywhere from classic blogs to Tumblr to AO3 to Instagram to Twitter and Bluesky, each with their own flavor, each giving people ways to self-organize and communicate and make it easier to find the others."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Leaflet, where longform blogging meets social media, feels like a perfect place to try adding some tag energy!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "⁂ ⁂ ⁂"
},
"alignment": "lex:pub.leaflet.pages.linearDocument#textAlignCenter"
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [],
"plaintext": "How tags work in Leaflet"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Tags are global — add them to a post, and they'll show:"
}
},
{
"$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": "on the published post — icon at the top (click to open), list at bottom, so you can add many without cluttering the reader view"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 64,
"byteStart": 35
},
"features": [
{
"uri": "https://leaflet.pub/tag/music",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "on a global page for that tag e.g. https://leaflet.pub/tag/music"
},
"children": []
}
]
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreiaq6tzazxwuodyiecalbckjdf6odxnyi7apdidlnff3rlv6pou5na"
},
"mimeType": "image/png",
"size": 58667
},
"aspectRatio": {
"width": 1318,
"height": 404
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Add tags while drafting a post, or during the publish flow. You can edit an existing post to add tags as well."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreihiw3jnimchoz5npzt66ptknihgowwfi2vxdjmyt2iby35gggle54"
},
"mimeType": "image/png",
"size": 45983
},
"aspectRatio": {
"width": 1318,
"height": 414
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Click a tag from a post to see its global tag page and view other posts with that tag!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreie4kldmqal6qcmv6wr4m7qi2or6rcvbqmovc7yechhxuvcjctq5sy"
},
"mimeType": "image/png",
"size": 104227
},
"aspectRatio": {
"width": 1454,
"height": 702
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Tags can contain any characters, including spaces, no hashtag needed. They're completely separate from Bluesky tags."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "⁂ ⁂ ⁂"
},
"alignment": "lex:pub.leaflet.pages.linearDocument#textAlignCenter"
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [],
"plaintext": "Initial tag examples!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "This can be used in lots of ways, and we expect this to be a little chaotic and evolve as we go. Some early examples:"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.unorderedList",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [
{
"index": {
"byteEnd": 5,
"byteStart": 0
},
"features": [
{
"uri": "https://leaflet.pub/tag/links",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "links"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [
{
"index": {
"byteEnd": 7,
"byteStart": 0
},
"features": [
{
"uri": "https://leaflet.pub/tag/atproto",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "atproto"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [
{
"index": {
"byteEnd": 5,
"byteStart": 0
},
"features": [
{
"uri": "https://leaflet.pub/tag/music",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "music"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [
{
"index": {
"byteEnd": 5,
"byteStart": 0
},
"features": [
{
"uri": "https://leaflet.pub/tag/ttrpg",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "ttrpg"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [
{
"index": {
"byteEnd": 3,
"byteStart": 0
},
"features": [
{
"uri": "https://leaflet.pub/tag/art",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "art"
},
"children": []
}
]
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "⁂ ⁂ ⁂"
},
"alignment": "lex:pub.leaflet.pages.linearDocument#textAlignCenter"
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [],
"plaintext": "More tags to try!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Some community suggestions we'd love to see you play with:"
}
},
{
"$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": 16,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
]
},
{
"index": {
"byteEnd": 59,
"byteStart": 44
},
"features": [
{
"did": "did:plc:6ayddqghxhciedbaofoxkcbs",
"$type": "pub.leaflet.richtext.facet#didMention"
}
]
}
],
"plaintext": "\"year in review\" for annual reflections, HT @tynanpurdy.com "
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 5,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
]
},
{
"index": {
"byteEnd": 40,
"byteStart": 28
},
"features": [
{
"did": "did:plc:mv3lojrmmhpnnvzp2odl2rl7",
"$type": "pub.leaflet.richtext.facet#didMention"
}
]
}
],
"plaintext": "\"TIL\" (today I learned), HT @bront.rodeo "
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 16,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
]
},
{
"index": {
"byteEnd": 118,
"byteStart": 101
},
"features": [
{
"did": "did:plc:kydzcmnywraao2srchqgwj5c",
"$type": "pub.leaflet.richtext.facet#didMention"
}
]
}
],
"plaintext": "\"Hello Leaflet!\" for people sharing their first post on Leaflet, a fun way to discover new blogs, HT @cozylittle.house "
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 11,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
]
},
{
"index": {
"byteEnd": 31,
"byteStart": 16
},
"features": [
{
"did": "did:plc:57od6g2ic3e3b3kauctjmo3k",
"$type": "pub.leaflet.richtext.facet#didMention"
}
]
}
],
"plaintext": "\"weeknotes\", HT @graham.systems "
},
"children": []
}
]
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Also: tags for local scenes! Tags for \"reading\" and \"learning\"! And all kinds of other things…"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "⁂ ⁂ ⁂"
},
"alignment": "lex:pub.leaflet.pages.linearDocument#textAlignCenter"
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [],
"plaintext": "Tags for signaling and coordinating"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "We're excited about how tags can be useful as a minimal interface for experimenting with communities — publishing together, exploring related topics, coordinating around events, and so on."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "One hypothesis we're testing is that global Leaflet discovery is fun but not as helpful as a way to find your people; things like tags, that help you explore and create more targeted clusters, could be!"
}
},
{
"$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": "Loose communities, like builders in the atmosphere, might use a general tag like \"atproto\" for posts about atproto products or experiments"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "A conference might use a tag like \"Atmosphere Conf 2025\", for posts directly relating to that event"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "We can use topic tags like \"links\", \"music\" or \"making games\" to make it easier to find posts on that topic in one place"
},
"children": []
}
]
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Tags are nice for a range of social publishing participants — readers, commenters, critics, future collaborators — as well as for writers. Fun to stumble on; fun to hang around…like…a campfire?"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "⁂ ⁂ ⁂"
},
"alignment": "lex:pub.leaflet.pages.linearDocument#textAlignCenter"
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [],
"plaintext": "A note about moderation…"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "We expect we'll need to moderate tags. Your tags are your data (that's how atproto works!) but Leaflet is not neutral infrastructure, and we'll exercise editorial control on our site."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 204,
"byteStart": 184
},
"features": [
{
"uri": "https://bsky.social/about/support/community-guidelines",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "We don't yet surface tags on our global Discover page. When we do you should expect Discover to be opinionated; we'll suppress tags that feel spammy, offensive (we'll follow Bluesky's community guidelines as a starting point), or just add noise / harsh the vibes."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "⁂ ⁂ ⁂"
},
"alignment": "lex:pub.leaflet.pages.linearDocument#textAlignCenter"
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [],
"plaintext": "What tags are NOT"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "This is one of the more experimental features we've shipped, and we want to be clear about what that means."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "We're not committed to this tags implementation being a permanent thing. You shouldn't make it load-bearing for your publication at this point. Tags are:"
}
},
{
"$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": "not private: there's no way to use just internally for personal organization, or scope tags to a single publication"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "not submission-based: there's no way for anyone besides us to moderate what shows on a tag page"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "not complex: for now, we have no advanced controls like muting, favoriting, or subscribing to tags"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "not guaranteed to live forever: again, we make no promise we'll keep this forever as a core feature"
},
"children": []
}
]
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 185,
"byteStart": 182
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
]
}
],
"plaintext": "Long term we're not sure if tags are the right way to organize things on Leaflet; other features for communities might be better in many cases. But this is a simple thing we can use now to start sharing things with each other — let's see how it goes!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "⁂ ⁂ ⁂"
},
"alignment": "lex:pub.leaflet.pages.linearDocument#textAlignCenter"
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [],
"plaintext": "Future improvements"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "There are lots of ways we'd like to improve tags, as well as related things we may (or may not) get to eventually, 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": [],
"plaintext": "Support for Looseleafs on tag pages (will fix soon)"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Language or NSFW tags (probably better as separate settings)"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Mechanisms for tag discovery (e.g. on our Discover page)"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Bluesky feeds for Leaflet tags"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Showing all tags a writer's used on their dashboard, default tags to add to all posts in a given publication, or related tags from within a post…"
},
"children": []
}
]
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "As always please reach out with any feedback. We'll see what we can do to help with some interesting tag experiments over the coming weeks!"
}
}
]
}
]
},
"bskyPostRef": {
"cid": "bafyreiekx2ghsxlg6tmgztuvp776wym7jwp625pawfoyth3vhtauhgakka",
"uri": "at://did:plc:btxrwcaeyodrap5mnjw2fvmz/app.bsky.feed.post/3m7t7tgzyy22j",
"commit": {
"cid": "bafyreibxbuyxp5yf6fs72vwr7dq4tj4krwqjt2fk5qftrg3lkcrbdfbvpm",
"rev": "3m7t7th3yfi2i"
},
"validationStatus": "valid"
},
"description": "Lab Notes 018: a simple implementation of global tags for Leaflet posts, to help writers and communities coordinate and find each other — with some early examples and ways to try!",
"publishedAt": "2025-12-12T23:16:10.568Z"
}