{
"$type": "site.standard.document",
"bskyPostRef": {
"cid": "bafyreigliuq4kwtfjwg2u4lk7xxgkfdubji62ocluosyx45jvupk77yy5y",
"commit": {
"cid": "bafyreigtwvbp46jcudb5xhel3jk2dliv3dwtb4pxhfzhb6koxmur2fdwjq",
"rev": "3mo4zzayocr2d"
},
"uri": "at://did:plc:btxrwcaeyodrap5mnjw2fvmz/app.bsky.feed.post/3mo4zzavxe22x",
"validationStatus": "valid"
},
"content": {
"$type": "pub.leaflet.content",
"pages": [
{
"$type": "pub.leaflet.pages.linearDocument",
"blocks": [
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"aspectRatio": {
"height": 292,
"width": 549
},
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreieqijg2xkpszvc2zyzax4cbiu42avq7sforme5p7hqob6uoqmzvom"
},
"mimeType": "image/webp",
"size": 108700
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Today we're releasing three big things to help us better write and publish together:",
"textSize": "large"
}
},
{
"$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": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
],
"index": {
"byteEnd": 19,
"byteStart": 0
}
}
],
"plaintext": "Multiplayer cursors, for live presence while editing",
"textSize": "large"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
],
"index": {
"byteEnd": 8,
"byteStart": 0
}
}
],
"plaintext": "Comments, for private feedback in docs",
"textSize": "large"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
],
"index": {
"byteEnd": 18,
"byteStart": 0
}
}
],
"plaintext": "Group publications — with Leaflet Pro",
"textSize": "large"
}
}
]
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
],
"index": {
"byteEnd": 87,
"byteStart": 71
}
},
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://notes.hyperlink.academy/note/hyperlink-together"
}
],
"index": {
"byteEnd": 130,
"byteStart": 104
}
}
],
"plaintext": "We've been exploring creative collaborative tools for quite some time; Leaflet Together is a nod to our previous project Hyperlink, making spaces for people to learn and create together."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "We're excited to make collaborative work even better in Leaflet!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"alignment": "lex:pub.leaflet.pages.linearDocument#textAlignCenter",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "⁂ ⁂ ⁂"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"plaintext": "Group Publications"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "You can now invite contributors to a publication, so multiple people can publish together in one place!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#atMention",
"atURI": "at://did:plc:btxrwcaeyodrap5mnjw2fvmz/site.standard.publication/3lppk75kw7k26"
}
],
"index": {
"byteEnd": 96,
"byteStart": 79
}
},
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#atMention",
"atURI": "at://did:plc:retm6aeqattyxp7bhmyyv7gk/site.standard.publication/3ml4jtdqqq222"
}
],
"index": {
"byteEnd": 111,
"byteStart": 100
}
}
],
"plaintext": "This is a great way to make a pub for a team, org, meetup, or other group — Leaflet Lab Notes or atproto.nyc for example!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
],
"index": {
"byteEnd": 37,
"byteStart": 26
}
}
],
"plaintext": "This is a new feature for Leaflet Pro — we're excited to build more powerful tools for serious publishers!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 3,
"plaintext": "Here's how it works:"
}
},
{
"$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",
"plaintext": "The account that'll own the group pub needs Leaflet Pro"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "From \"Settings\" in your pub dash, look for \"Contributors\""
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Add people by handle, then send them the join link; once they accept they'll be added as a contributor to the publication"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Contributors see a limited view of the pub: they can make drafts, and publish ones they've made (but not access subscriber list / analytics, or edit other pub settings)"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
],
"index": {
"byteEnd": 12,
"byteStart": 8
}
}
],
"plaintext": "You can also add multiple contributors per-post, which will show in the post byline when published"
}
}
]
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "mailto:contact@leaflet.pub"
}
],
"index": {
"byteEnd": 132,
"byteStart": 123
}
}
],
"plaintext": "We'd love to build on this to make Leaflet work even better for groups, orgs, and other collaborative publications. Please reach out with any feedback or requests!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://leaflet.pub/about"
}
],
"index": {
"byteEnd": 97,
"byteStart": 82
}
},
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://leaflet.pub/checkout/pro?cadence=month"
}
],
"index": {
"byteEnd": 130,
"byteStart": 119
}
},
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://leaflet.pub/checkout/pro?cadence=year"
}
],
"index": {
"byteEnd": 145,
"byteStart": 134
}
}
],
"plaintext": "Sign up or upgrade to Leaflet Pro to start publishing and invite contributors — learn more here or sign up directly: $12 / month or $120 / year. We appreciate your support!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.page",
"id": "019ebe5a-cdce-7bb1-81e4-87b40d0541df"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "And now that you can collaborate with more people in publications, we made it better to work with them in your docs and drafts!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"alignment": "lex:pub.leaflet.pages.linearDocument#textAlignCenter",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "⁂ ⁂ ⁂"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"plaintext": "Cursors and comments"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Did you know Leaflet started as a simple shared doc editor?"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Now that Leaflet is great for publishing, we want to better bring those worlds together. So, we now have…"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 3,
"plaintext": "Multiplayer cursors"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "See when others are in the same doc, writing and editing together, with live cursors! Hover over the cursor to see username (if logged in; 'anonymous' if not). Highlight state, too."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"alt": "screenshot of text in Leaflet \"Wow Leaflet has multiplayer cursors now? 👀😮\" with two cursors, one showing 'brendan'",
"aspectRatio": {
"height": 212,
"width": 860
},
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreigsmyam6qifv4ya5mznyxzpwqwfpnfhb3nqenhrdzzqf5xxt3bw64"
},
"mimeType": "image/webp",
"size": 13730
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 3,
"plaintext": "Comments in documents / drafts"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Anyone with the edit link to a Leaflet document can now select text and add comments!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "These are off-protocol, using your Atmosphere account just for identity, and don't show in published posts or view-only links."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Editors can mark comments as resolved (this doesn't show anywhere for now but could in the future); you can delete your own comments as well."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"alt": "example comment of this very doc, with a few words highlighted and a comment in sidebar that says \"they look like this!\"",
"aspectRatio": {
"height": 330,
"width": 2014
},
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreif7ilqvbbogixe4lbhkkd3omabvw5euoi4i6w3wczqnvjfk7ciyb4"
},
"mimeType": "image/webp",
"size": 89464
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
],
"index": {
"byteEnd": 9,
"byteStart": 0
}
}
],
"level": 3,
"plaintext": "All kinds of collaborative docs"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
],
"index": {
"byteEnd": 69,
"byteStart": 66
}
}
],
"plaintext": "Great not only for collaborative blog editing / feedback, but for any collaborative docs: projects, team notes, or anything else you're working on with trusted collaborators."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "And makes realtime collab — like a focused draft review session, or team notes during a call — a lot nicer!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "To try this out, make any doc — draft in a pub, or a standalone Leaflet doc — and share the edit link with a friend or collaborator. Let us know what you think!"
}
}
],
"id": "019ea81c-dbfe-7554-af1a-3d1566a4ae26"
},
{
"$type": "pub.leaflet.pages.linearDocument",
"blocks": [
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 1,
"plaintext": "Group publications: FAQ"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
],
"index": {
"byteEnd": 42,
"byteStart": 0
}
}
],
"plaintext": "Let us know if you have further questions!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": ""
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.unorderedList",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "The publication creator — posts live in their PDS"
}
}
],
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Who owns the published posts?"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "No, it's simple for now, collaborators can publish directly"
}
}
],
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Any submission / approval flow?"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Not yet; once someone's a publication contributor you can add them to a per-post byline, but can't add someone for a single guest post; any contributor can make and publish new posts so this is best for trusted collaborators for now"
}
}
],
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
],
"index": {
"byteEnd": 31,
"byteStart": 27
}
}
],
"plaintext": "Can I invite a contributor just to a single post?"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Yep! Their posts will stay in the pub; they'll still be able to see their drafts but not publish or update them"
}
}
],
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Can the pub owner remove contributors?"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "The publication owner can edit and publish any posts; contributors can edit and publish posts they've made or been added to in the per-post byline"
}
}
],
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Who can edit / publish posts?"
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "If the pub owner is authed in Leaflet this should Just Work! If their session is expired or they've logged out, they'll need to log in again first."
}
}
],
"content": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "How can a contributor publish if the post is owned by a different account?"
}
}
]
}
}
],
"id": "019ebe5a-cdce-7bb1-81e4-87b40d0541df"
}
]
},
"coverImage": {
"$type": "blob",
"ref": {
"$link": "bafkreieqijg2xkpszvc2zyzax4cbiu42avq7sforme5p7hqob6uoqmzvom"
},
"mimeType": "image/webp",
"size": 108700
},
"description": "Lab Notes 028: a new suite of features to make Leaflet great for collaborative writing and collaborative publishing!",
"path": "/3mo4zz5jdrc2f",
"publishedAt": "2026-06-13T00:51:21.852Z",
"site": "at://did:plc:btxrwcaeyodrap5mnjw2fvmz/site.standard.publication/3lppk75kw7k26",
"tags": [],
"title": "Leaflet Together: cursors, comments, group publications!"
}