How Do 🦋 Profile Links Work, Actually?
o, BlueSky Social PBC slopped out another barely tested new feature directly from Claude to our plates. This one seems interesting but is once again them pulling an Attie and trying to replace an existing ATProto community lexicon instead of working with what's already there. Linkname, Woosh, and Linkat already existed for this purpose. Regardless, we're stuck with it now and they've already dropped the ball on the implementation.
So! Initially, like the puritans they are, bsky.team banned any links to naughty websites like Fansly or OnlyFans. Because lest we forget, it was an accident that this cryptobro website got dragged kicking and screaming into the light by furries and sex workers inviting their friends during the beta, and bsky.team is still bitter about us dunking on Jack Dorsey so hard he went back to 𝕏. This was fixed with an 'oopsie poopsie we accidentally did a fascism again, you know how large language models are!' statement after Domi Woof shone a spotlight on this. But that's the least of it's issues.
To test the new feature, I added a link to my Woosh, where I actually keep my collection of linked accounts.
And bsky.app dutifully created an app.bsky.actor.link record in my PDS.
{
"url": "https://woosh.link/wertercatt.com",
"icon": {
"ref": {
"$link": "bafkreidekfbczvry35dkpohbxyx2i2zhnow76stldaykpddhytvz5o6udi"
},
"size": 573,
"$type": "blob",
"mimeType": "image/png"
},
"$type": "app.bsky.actor.link",
"title": "Woosh (like Linktree)",
"createdAt": "2026-10-24T15:45:09.204Z"
}...And edited my app.bsky.actor.profile. Because it'd be too simple if we could just have link records, they have to be complicated. I'm not going to embed my whole app.bsky.actor.profile record into this post, just the relevant section.
"links": [
{
"cid": "bafyreifsvdemlsa4ibbczhf3rq64yjhmjy5av3aalptshrl2xt7etwhh4y",
"uri": "at://did:plc:6nrykjezbxfxeubizsoipwbo/app.bsky.actor.link/3mymzxpdy3l2o"
}
],Like, what actual benefit does this give? Ooo I can sort my links if I want, innovative. Definitely worth overcomplicating the schema. But the biggest flaws with this tomfoolery are as follows. And not exposed in the UI at all, as we can see. The only way to find out about them is to read the lexicon schemas. Here in app.bsky.actor.profile, we can see the reason that Domi Woof still couldn't add his fansly after the 'bug' was fixed.
If you can't see it, it's that maxLength field. There's a secret limit of 10 links in your profile, exposed nowhere. Validated on the server with no error given to the client. Or at least, that's how it worked yesterday. Apparently there's been a stealth update at press time. Now the button to add another link despawns when you hit 10 with no indication of why.
This is already a failure of communicating between the back-end and front-end teams, causing issues for the actual users of the platform. But this is nothing compared to the thing that actually gets you a shitty email in your inbox from moderation.
Yeah. They want you to stick an adult content label on your app.bsky.actor.link records.... where? Where are we supposed to do that? You saw the UI for it at the top of the page, there's no button for labeling it there.
Oh! In the back-end, where it's not exposed to the front-end user at all. It's a field in the lexicon schema that you have to edit manually on pdsls. Great. It's like having "pronouns" in the app.bsky.actor.profile record, where the feature theoretically exists (and has been implemented in Witchsky) but has never been added to bsky.app proper.
Fuck this website.
Did you enjoy this article?
Recommend it — Standard Reader surfaces well-loved writing to more readers across the network.