CI / Typecheck, test, build (pull_request) Successful in 46s
People write in chains on both, and a link into one arrives pointing at a single post out of several. Showing only that post loses the thing that was being said. Other people's replies are a different matter: they are a conversation rather than the thing that was shared, and on a busy post there are hundreds of them. A Post is now a list of Segments instead of one body. Most platforms produce exactly one and say so through oneSegment(); the two that thread produce the whole chain, with isAnchor marking the post that was actually linked, which need not be the first. Bluesky walks parent upward and the author's own replies downward, stopping at the first post by anyone else. That needs depth and parentHeight on getPostThread, which drags the entire reply tree along -- a few hundred KB on a popular post -- because there is no way to ask the API for one author's branch. Threads is harder to read. The page ships the linked post, the author's follow-ups, other people's replies and a pile of unrelated recommendations, all as flat thread_items containers with no nesting to go on. What separates a follow-up from a stranger's reply is that a follow-up is the author replying to themselves; a reply from someone else carries the same reply_to_author with a different name on it. The first post of a chain replies to nothing at all, so it is reachable only by walking backwards from the post that answers it -- a test caught that, when linking the second post of a thread returned just the one post. Fixtures for both are real captures. The Bluesky one keeps two of every level's outside replies rather than pruning them away, because a filter is only worth testing against the thing it is supposed to exclude. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01BGkRmLfiWuJHx6tQ12EELY
321 lines
18 KiB
JSON
321 lines
18 KiB
JSON
{
|
|
"post": {
|
|
"uri": "at://did:plc:ydfn75us2pk4dhfvqejyla2p/app.bsky.feed.post/3mtk7inwsws2k",
|
|
"author": {
|
|
"handle": "danielle.bsky.team",
|
|
"displayName": "danielleyuhan",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:ydfn75us2pk4dhfvqejyla2p/bafkreib7zbjrocsnw5ht6fy5kepc7454britwohmn2zrj5rlsicmzisrmq"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-20T21:40:10.285Z",
|
|
"text": "We're redesigning the notifications tab! \ud83d\udd14 It's one of the most visited surfaces on the app, and a lot of you have told us it could be better. Here's a look at what we're exploring. \ud83e\uddf5"
|
|
},
|
|
"embed": {
|
|
"images": [
|
|
{
|
|
"thumb": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:ydfn75us2pk4dhfvqejyla2p/bafkreiaifo3c4pchs2qtgbyblpt3r35eqngodxzckksiti6ufrnw7e3uoq",
|
|
"fullsize": "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:ydfn75us2pk4dhfvqejyla2p/bafkreiaifo3c4pchs2qtgbyblpt3r35eqngodxzckksiti6ufrnw7e3uoq",
|
|
"alt": "\"All\" tab that shows all your notifications in chronological order.",
|
|
"aspectRatio": {
|
|
"height": 1704,
|
|
"width": 786
|
|
}
|
|
},
|
|
{
|
|
"thumb": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:ydfn75us2pk4dhfvqejyla2p/bafkreiezmgsafcbrgbqcaoxf4uu6qwcb4vxsjngtwpoylznut52imhdjue",
|
|
"fullsize": "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:ydfn75us2pk4dhfvqejyla2p/bafkreiezmgsafcbrgbqcaoxf4uu6qwcb4vxsjngtwpoylznut52imhdjue",
|
|
"alt": "\"Follows\" tab that shows you a list of people who follow you, so you never miss a follow-back.",
|
|
"aspectRatio": {
|
|
"height": 1704,
|
|
"width": 786
|
|
}
|
|
},
|
|
{
|
|
"thumb": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:ydfn75us2pk4dhfvqejyla2p/bafkreieigolasgenhs4guectwhrprc4te6el7fosn5ayzexpxjh6tk565i",
|
|
"fullsize": "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:ydfn75us2pk4dhfvqejyla2p/bafkreieigolasgenhs4guectwhrprc4te6el7fosn5ayzexpxjh6tk565i",
|
|
"alt": "\"Conversations\" tab that allows you to view mentions, replies, and quotes all in one place. ",
|
|
"aspectRatio": {
|
|
"height": 1704,
|
|
"width": 786
|
|
}
|
|
},
|
|
{
|
|
"thumb": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:ydfn75us2pk4dhfvqejyla2p/bafkreihtzrgrltxhxcnrzp6zkn2bkkhyd5fhu5hp3xtypf4h24q5x5ygei",
|
|
"fullsize": "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:ydfn75us2pk4dhfvqejyla2p/bafkreihtzrgrltxhxcnrzp6zkn2bkkhyd5fhu5hp3xtypf4h24q5x5ygei",
|
|
"alt": "\"Activity\" tab that shows all the posts from accounts you've subscribed to.",
|
|
"aspectRatio": {
|
|
"height": 1704,
|
|
"width": 786
|
|
}
|
|
}
|
|
],
|
|
"$type": "app.bsky.embed.images#view"
|
|
}
|
|
},
|
|
"replies": [
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:ydfn75us2pk4dhfvqejyla2p/app.bsky.feed.post/3mtk7ipjjyc2k",
|
|
"author": {
|
|
"handle": "danielle.bsky.team",
|
|
"displayName": "danielleyuhan",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:ydfn75us2pk4dhfvqejyla2p/bafkreib7zbjrocsnw5ht6fy5kepc7454britwohmn2zrj5rlsicmzisrmq"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-20T21:40:10.286Z",
|
|
"text": "We went through a ton of feedback you've shared. Big themes: important stuff gets buried (replies lost under likes, missed replies from people you care about), too much noise, hard to scan, and not enough control over which notifications you see. This design is our first pass at addressing these."
|
|
}
|
|
},
|
|
"replies": [
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:ydfn75us2pk4dhfvqejyla2p/app.bsky.feed.post/3mtk7ipjkxk2k",
|
|
"author": {
|
|
"handle": "danielle.bsky.team",
|
|
"displayName": "danielleyuhan",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:ydfn75us2pk4dhfvqejyla2p/bafkreib7zbjrocsnw5ht6fy5kepc7454britwohmn2zrj5rlsicmzisrmq"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-20T21:40:10.287Z",
|
|
"text": "The biggest change is tabs. All = everything, chronological. People you follow = just notifications from people you follow. Follows = a list of people who follow you, so you never miss a follow-back. Conversations = replies, mentions and quotes. Activity = posts from accounts you've subscribed to."
|
|
}
|
|
},
|
|
"replies": [
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:ydfn75us2pk4dhfvqejyla2p/app.bsky.feed.post/3mtk7ipjlws2k",
|
|
"author": {
|
|
"handle": "danielle.bsky.team",
|
|
"displayName": "danielleyuhan",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:ydfn75us2pk4dhfvqejyla2p/bafkreib7zbjrocsnw5ht6fy5kepc7454britwohmn2zrj5rlsicmzisrmq"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-20T21:40:10.288Z",
|
|
"text": "Some additional UX improvements include \"today\" and \"earlier\" sections so you know what's new at a glance, and like/reply buttons that change once you've responded so you can keep track of which conversations you've already answered."
|
|
}
|
|
},
|
|
"replies": [
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:ydfn75us2pk4dhfvqejyla2p/app.bsky.feed.post/3mtk7ipjmw22k",
|
|
"author": {
|
|
"handle": "danielle.bsky.team",
|
|
"displayName": "danielleyuhan",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:ydfn75us2pk4dhfvqejyla2p/bafkreib7zbjrocsnw5ht6fy5kepc7454britwohmn2zrj5rlsicmzisrmq"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-20T21:40:10.289Z",
|
|
"text": "Also, when someone new follows you, you\u2019ll now see \u201cmutual followers\u201d (the people you follow who follow them too). Replies show a preview of the post they're responding to, and images render smaller as thumbnails so each notification takes less room and more fit on screen."
|
|
}
|
|
},
|
|
"replies": [
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:ydfn75us2pk4dhfvqejyla2p/app.bsky.feed.post/3mtk7ipjmw32k",
|
|
"author": {
|
|
"handle": "danielle.bsky.team",
|
|
"displayName": "danielleyuhan",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:ydfn75us2pk4dhfvqejyla2p/bafkreib7zbjrocsnw5ht6fy5kepc7454britwohmn2zrj5rlsicmzisrmq"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-20T21:40:10.290Z",
|
|
"text": "Let us know what works or what's missing. We'll read everything \ud83d\ude42"
|
|
}
|
|
},
|
|
"replies": [
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:zeytbxgl4t3fll3efksmbj7v/app.bsky.feed.post/3mtkba2q4tc2y",
|
|
"author": {
|
|
"handle": "cageyratfish.bsky.social",
|
|
"displayName": "cageyratfish (UTC-7) \ud83d\udc1f\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:zeytbxgl4t3fll3efksmbj7v/bafkreihef5m2gi337frbs6oo6ktpcvofn4u7bbt6w3bzyva37t3d6wq6vq"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-20T22:11:09.193Z",
|
|
"text": "not sure if you've addressed this, but when someone is posting a long thread (say, photos from a trip, or a multi-post essay etc) the thread will break when someone else replies to one of the posts in the OP's thread, & it's kind of a PITA to go back & click around to read the whole original thread"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:xosycr2qouakkyqdw2gaj73l/app.bsky.feed.post/3mtlj5ww23a26",
|
|
"author": {
|
|
"handle": "announcer-stef.bsky.social",
|
|
"displayName": "Stef",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:xosycr2qouakkyqdw2gaj73l/bafkreiegrnevysrpkvpuiyjgx5klywt7p3k3qec7lczx2udkid6tayrnam"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-21T10:05:47.757Z",
|
|
"text": "PLEASE can we have a landscape format that works on tablets, iPads, etc. mine looks like this. X way ahead of you on this. Thanks "
|
|
},
|
|
"embed": {
|
|
"images": [
|
|
{
|
|
"thumb": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:xosycr2qouakkyqdw2gaj73l/bafkreidoxfy7a22jhag75mebsrpepmyjqg62igdu27x2unracm2r27xtyy",
|
|
"fullsize": "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:xosycr2qouakkyqdw2gaj73l/bafkreidoxfy7a22jhag75mebsrpepmyjqg62igdu27x2unracm2r27xtyy",
|
|
"alt": "",
|
|
"aspectRatio": {
|
|
"height": 1396,
|
|
"width": 2000
|
|
}
|
|
}
|
|
],
|
|
"$type": "app.bsky.embed.images#view"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:d3hjgygqxvboxvfr4kdr47tx/app.bsky.feed.post/3mtknbgx57k27",
|
|
"author": {
|
|
"handle": "frozenkoi.bsky.social",
|
|
"displayName": "DK, Carb Cat Herder",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:d3hjgygqxvboxvfr4kdr47tx/bafkreiemc7lvmziylyqbab5wjq44vq5r5dmbr7nlpiqsfdjyzqcxr2lhru"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-21T01:46:40.462Z",
|
|
"text": "Can the \"xyz account followed you\" notification be improved so that it can show if that account had recently followed you, then unfollowed, then followed again (maybe show a counter or label)? To help weed out engagement farmers."
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:avvpb4ypfttlslmobsjqt7qq/app.bsky.feed.post/3mtlc3dwcuc23",
|
|
"author": {
|
|
"handle": "naarna.eurosky.social",
|
|
"displayName": "naarna (she/they)",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:avvpb4ypfttlslmobsjqt7qq/bafkreicfbuioo4uktbmrje3j3tga4h65vm32nzmipu6ql3pynxualxnebm"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-21T07:59:04.542Z",
|
|
"text": "The \"mutuals of a new follow\" is almost my favorite part of it \u2764\ufe0f \n\nIs it possible to add/keep the info when they followed from a starterpack, like it is with the current layout?"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:vgqkg3qfrcphyv6c7mfqqtao/app.bsky.feed.post/3mtkzbnw6zc2n",
|
|
"author": {
|
|
"handle": "qtea.me",
|
|
"displayName": "un(tea)bable \u2728",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:vgqkg3qfrcphyv6c7mfqqtao/bafkreibrurq343pl46w6ebknc4pur7q6nu76tffzjcc64s5tqht2epwxky"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-21T05:21:32.673Z",
|
|
"text": "Having the interaction buttons look different from the normal timeline feels a bit weird, I think mentions should still display the same as any other post. \nWould it make more sense to change the normal \"number of replies\" icon on each post to display differently if you replied to it?"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:nejscld5zlavytijxz27qhvj/app.bsky.feed.post/3mtkalmpf432j",
|
|
"author": {
|
|
"handle": "marypcbuk.bsky.social",
|
|
"displayName": "Mary Branscombe",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:nejscld5zlavytijxz27qhvj/bafkreid62dpuwwlmnj2tqgbhpsnsmvchj6tfcetdqm2wu55zbuwm7zpacu"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-20T21:59:43.401Z",
|
|
"text": "can the today/earlier things be either optional o collapsible or even filterable? if they're going to take up so much space I'd like them to either earn their keep by being more useful or be something I can turn off. I don't really care if an unread @ is before or after midnight"
|
|
}
|
|
},
|
|
"replies": [
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:nejscld5zlavytijxz27qhvj/app.bsky.feed.post/3mtkan4bdat2j",
|
|
"author": {
|
|
"handle": "marypcbuk.bsky.social",
|
|
"displayName": "Mary Branscombe",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:nejscld5zlavytijxz27qhvj/bafkreid62dpuwwlmnj2tqgbhpsnsmvchj6tfcetdqm2wu55zbuwm7zpacu"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-20T22:00:33.272Z",
|
|
"text": "but if I can use them to filter to replies from the last time I was in Amsterdam by picking a date span, they could be way more useful"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:uax67vh5253v2aszwz6xaj5t/app.bsky.feed.post/3mtkgmbau7s26",
|
|
"author": {
|
|
"handle": "cantras.bsky.social",
|
|
"displayName": "Cantras",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:uax67vh5253v2aszwz6xaj5t/bafkreieobaep6sevdkisnhbp4wkizybpo7uydbfj2vyseewmnf7trld524"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-20T23:47:27.395Z",
|
|
"text": "How is \"Notifications -> Activity\" different from the default \"Following\" feed?"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:nvfznp5ls3wcf6aktlfkfkp3/app.bsky.feed.post/3mtka7rsc6c2b",
|
|
"author": {
|
|
"handle": "erinbiba.bsky.social",
|
|
"displayName": "Erin Biba",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:nvfznp5ls3wcf6aktlfkfkp3/bafkreie2rvq65x3nzicc4gxpiglwsr5bj2dztvrczenm62mast4cclmsgi"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-20T21:53:06.083Z",
|
|
"text": "So replies mentions and quotes is from everyone. But there\u2019s no option to isolate replies mentions and quotes from reposts and likes from mutuals and people you follow? Just trying to understand because this is very interesting but it\u2019s A LOT."
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:yczfsnwl2wfh65qvjjbesm53/app.bsky.feed.post/3mtkeo4irsc2y",
|
|
"author": {
|
|
"handle": "dd9000.bsky.social",
|
|
"displayName": "ddouglas \ud83d\udc8e \ud83c\uddfa\ud83c\udde6 \ud83e\udd8b ",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:yczfsnwl2wfh65qvjjbesm53/bafkreicc6ghxs4qqdng7msddjk63t5pnrf36l5iqjaxmgwjk46ykbdimqm"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-20T23:12:42.035Z",
|
|
"text": "My biggest problem is the \"30\" limit. I've set notifications \"on\" for the follows who are most important to me but, repeatedly, I'll ask myself what happened to X, check X's profile, been posting almost every day. OTOH, once I've clicked thru, I'd like it to disappear from the list."
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:zxwfz6clggogwwj4j5uk3yqx/app.bsky.feed.post/3mtkmvwlvsk2i",
|
|
"author": {
|
|
"handle": "elmota.bsky.social",
|
|
"displayName": "Ayyash",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:zxwfz6clggogwwj4j5uk3yqx/bafkreib3b7qqynb2ehteq3fg2mvvsc5uzgaulqg4gujf2r24s57o4fhp7y"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-21T01:40:14.207Z",
|
|
"text": "Really? One of the most visited? I wonder \ud83e\udd14"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"post": {
|
|
"uri": "at://did:plc:zlwrdfy5dx7sdkelp2jnd7rm/app.bsky.feed.post/3mtkh6b3re22w",
|
|
"author": {
|
|
"handle": "skeeziks.bsky.social",
|
|
"displayName": "debbi\u00a9... \ud83d\udcfa\ud83d\udc40",
|
|
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:zlwrdfy5dx7sdkelp2jnd7rm/bafkreictluwq7k5yi7a4igqpgcmg5y37tg5h6kf3aubs324r45bg7r2v7m"
|
|
},
|
|
"record": {
|
|
"createdAt": "2026-08-20T23:57:31.209Z",
|
|
"text": "Show us notifications from muted accounts, please. Just because I don\u2019t want to see someone\u2019s political posts doesn\u2019t mean I don\u2019t want to see if they comment on my posts."
|
|
}
|
|
}
|
|
}
|
|
]
|
|
} |