{
"path": "/3m7hnejb6oc22",
"site": "https://leaflet.pub/p/did:plc:vs3hnzq2daqbszxlysywzy54",
"$type": "site.standard.document",
"title": "New Features (Dec 8)",
"content": {
"$type": "pub.leaflet.content",
"pages": [
{
"id": "019afb92-a684-7002-a937-cf2e771cd632",
"$type": "pub.leaflet.pages.canvas",
"blocks": [
{
"x": 680,
"y": 10,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreig3b6fyt6vxfffi7el5wcwlqintpwbmiy4ebpojwi73isaf6azm3a"
},
"mimeType": "image/png",
"size": 5824
},
"aspectRatio": {
"width": 158,
"height": 56
}
},
"width": 208,
"rotation": 0
},
{
"x": 27,
"y": 246,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"src": "https://plyr.fm/playlist/92aac742-51f1-45d3-93f6-4246d0d85b5c",
"$type": "pub.leaflet.blocks.website",
"title": "at the gym",
"description": "playlist by @zzstoatzz.io • 4 tracks",
"previewImage": {
"$type": "blob",
"ref": {
"$link": "bafkreib6gbjdtrjijip3bq7gr7ehlq4v7mdwjznr4q2xa44m4cniipawly"
},
"mimeType": "image/png",
"size": 15446
}
},
"width": 619,
"rotation": -5
},
{
"x": 179,
"y": 219,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 27,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
]
}
],
"plaintext": "create and share playlists!"
},
"width": 268,
"rotation": -5
},
{
"x": 336,
"y": 81,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"src": "https://github.com/zzstoatzz/plyr.fm/pull/499",
"$type": "pub.leaflet.blocks.website",
"title": "feat: playlists, albums as ATProto lists, library hub, and graceful degradation by zzstoatzz · Pull Request #499 · zzstoatzz/plyr.fm",
"description": "Summary Major feature branch adding playlists, albums as ATProto lists, unified library experience, and graceful handling of unavailable tracks. Playlists full playlist CRUD (create, rename, delet...",
"previewImage": {
"$type": "blob",
"ref": {
"$link": "bafkreigqrklrlegtw4fv5q4z4nxehqsfnzzxkvqm3e4m2a4dmx3v3egjdy"
},
"mimeType": "image/png",
"size": 28011
}
},
"width": 659
},
{
"x": 960,
"y": 41,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.blockquote",
"facets": [
{
"index": {
"byteEnd": 23,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
]
}
],
"plaintext": "software was developed!"
},
"width": 297,
"rotation": 6
},
{
"x": 794,
"y": 228,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 37,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
]
}
],
"plaintext": "view and configure all your settings!"
},
"width": 360,
"rotation": 0
},
{
"x": 179,
"y": 988,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 40,
"byteStart": 0
},
"features": [
{
"uri": "https://github.com/zzstoatzz/plyr.fm/pull/503",
"$type": "pub.leaflet.richtext.facet#link"
}
]
},
{
"index": {
"byteEnd": 64,
"byteStart": 44
},
"features": [
{
"did": "did:plc:5w4eqcxzw5jv5qfnmzxcakfy",
"$type": "pub.leaflet.richtext.facet#didMention"
}
]
},
{
"index": {
"byteEnd": 82,
"byteStart": 81
},
"features": [
{
"uri": "https://github.com/zzstoatzz/plyr.fm/pull/503",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "(without having to log out and back in! s/o @thisismissem.social for the pointer!)"
},
"width": 404,
"rotation": -5
},
{
"x": 457,
"y": 1030,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreibimflqdt7khm5ttsljhai5ctzspaxkzrdlswwe4mawuukcy2hkke"
},
"mimeType": "image/png",
"size": 847257
},
"aspectRatio": {
"width": 2000,
"height": 2000
}
},
"width": 266
},
{
"x": 689,
"y": 1119,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.blockquote",
"facets": [],
"plaintext": "\"i really don't like writing scripts to check/update PDS state all the time\""
},
"width": 380
},
{
"x": 154,
"y": 1275,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "perl",
"plaintext": "# read-only\nclaude mcp add-json pdsx '{\"type\": \"http\", \"url\": \"https://pdsx-by-zzstoatzz.fastmcp.app/mcp\"}'\n\n# if you don't trust my random https://fastmcp.cloud url (you shouldn't without checking!)\nclaude mcp add pdsx -- uvx --from 'pdsx[mcp]' pdsx-mcp\n\n# with auth for writes\nclaude mcp add-json pdsx '{\n \"type\": \"http\",\n \"url\": \"https://pdsx-by-zzstoatzz.fastmcp.app/mcp\",\n \"headers\": {\n \"x-atproto-handle\": \"your.handle\",\n \"x-atproto-password\": \"your-app-password\"\n }\n}'",
"syntaxHighlightingTheme": "github-light"
},
"width": 977
},
{
"x": 697,
"y": 1248,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 35,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
]
}
],
"plaintext": "who could blame you claude, really?"
},
"width": 360,
"rotation": 0
},
{
"x": 39,
"y": 1053,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.horizontalRule"
},
"width": 1200
},
{
"x": 614,
"y": 2368,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 1,
"facets": [],
"plaintext": "meta!"
},
"width": 134
},
{
"x": 165,
"y": 1762,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreidmmy2qlhayxfsilxnfbpmcoavmprxyoh536mob5veyjzjnr7uc6q"
},
"mimeType": "image/png",
"size": 256304
},
"aspectRatio": {
"width": 1592,
"height": 902
}
},
"width": 969
},
{
"x": 412,
"y": 2297,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 98,
"byteStart": 91
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "(i will figure out a sane way to make the tool responses as slim as possible, but that's a users>1 problem!)"
},
"width": 521
},
{
"x": 33,
"y": 1110,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [
{
"index": {
"byteEnd": 15,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#highlight"
},
{
"$type": "pub.leaflet.richtext.facet#bold"
},
{
"$type": "pub.leaflet.richtext.facet#italic"
}
]
}
],
"plaintext": "claude's corner"
},
"width": 224,
"rotation": -2
},
{
"x": 634,
"y": 316,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreiedauotm2orz26i3xklf2e2sunfl5orfjpckbrnuki2jzfyjvdwcy"
},
"mimeType": "image/png",
"size": 74345
},
"aspectRatio": {
"width": 724,
"height": 768
}
},
"width": 642,
"rotation": 0
},
{
"x": 845,
"y": 259,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreicmgqlky3bfhhwmsc6sznanu5t2wdhct5tlvhlqqlt3xn4ebeofbq"
},
"mimeType": "image/png",
"size": 5503
},
"aspectRatio": {
"width": 237,
"height": 54
}
},
"width": 246
},
{
"x": 793,
"y": 261,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreiaf56knzyxe5lp4upfwpdlblxil76suwrjl2namia3n4azhoxcbsu"
},
"mimeType": "image/png",
"size": 24632
},
"aspectRatio": {
"width": 1280,
"height": 1024
}
},
"width": 76,
"rotation": 89
},
{
"x": 448,
"y": 4,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreibnm6qsh524orfw45c72tbbrffv4qlk2m6vbi3q22zxgrercmplcy"
},
"mimeType": "image/gif",
"size": 855730
},
"aspectRatio": {
"width": 300,
"height": 300
}
},
"width": 105,
"rotation": -1
},
{
"x": 20,
"y": 88,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.blockquote",
"facets": [
{
"index": {
"byteEnd": 26,
"byteStart": 10
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
},
{
"uri": "https://at-me.fly.dev/view?handle=zzstoatzz.io",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "50%+ more decentralization!"
},
"width": 322,
"rotation": -6
},
{
"x": 282,
"y": 2416,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"url": "https://plyr.fm/embed/track/218",
"$type": "pub.leaflet.blocks.iframe",
"height": 165
},
"width": 736
},
{
"x": 139,
"y": 417,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreig7hxmc6ojt6xrcnaziykiu6a33u7u2bs7plsjmprwvr3znsa6t4m"
},
"mimeType": "image/png",
"size": 148989
},
"aspectRatio": {
"width": 853,
"height": 1018
}
},
"width": 360
},
{
"x": 241,
"y": 381,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 16,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
]
}
],
"plaintext": "build a library!"
},
"width": 175
},
{
"x": 60,
"y": 863,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreicas5gc2kqnjpfh3cuz34h4hdqeul2fowh3atiolex77dzsyheyla"
},
"mimeType": "image/png",
"size": 36438
},
"aspectRatio": {
"width": 1380,
"height": 317
}
},
"width": 580,
"rotation": -6
},
{
"x": 557,
"y": 915,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreihjdn2dvjbzhatapg2z7dabbfbuupwmdoboebhukk72lnrbzywyda"
},
"mimeType": "image/png",
"size": 3628
},
"aspectRatio": {
"width": 350,
"height": 350
}
},
"width": 178,
"rotation": -146
},
{
"x": 228,
"y": 833,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 12,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
]
},
{
"index": {
"byteEnd": 20,
"byteStart": 12
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
},
{
"uri": "https://bsky.app/profile/teal.fm",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "scrobble to teal.fm!"
},
"width": 214,
"rotation": -5
},
{
"x": 453,
"y": 330,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreihjdn2dvjbzhatapg2z7dabbfbuupwmdoboebhukk72lnrbzywyda"
},
"mimeType": "image/png",
"size": 3628
},
"aspectRatio": {
"width": 350,
"height": 350
}
},
"width": 159,
"rotation": -194
},
{
"x": 481,
"y": 1594,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"src": "https://github.com/zzstoatzz/pdsx?tab=readme-ov-file#running-the-mcp-server-locally",
"$type": "pub.leaflet.blocks.website",
"title": "GitHub - zzstoatzz/pdsx: cli for atproto record CRUD",
"description": "cli for atproto record CRUD. Contribute to zzstoatzz/pdsx development by creating an account on GitHub.",
"previewImage": {
"$type": "blob",
"ref": {
"$link": "bafkreibbynypcdespdbomlwkzb3majhxdvpd2k5y7sfaereqyckaapbp34"
},
"mimeType": "image/png",
"size": 26812
}
},
"width": 723
},
{
"x": 906,
"y": 1410,
"$type": "pub.leaflet.pages.canvas#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreihjdn2dvjbzhatapg2z7dabbfbuupwmdoboebhukk72lnrbzywyda"
},
"mimeType": "image/png",
"size": 3628
},
"aspectRatio": {
"width": 350,
"height": 350
}
},
"width": 212,
"rotation": 153
}
]
}
]
},
"description": "github.com/zzstoatzz/plyr.fm",
"publishedAt": "2025-12-08T08:46:31.781Z"
}