How to set your domain as your handle
blueskyweb.xyz
blueskyweb.xyz
I always thought ActivityPub should have used hostname/username instead of @username@hostname for the handle. Then they would have that advantage too. And one less char in the handle.
What I find a bit cumbersome with the AT protocol is that it uses DNS records to store the metadata of an identity. I wonder if it should have used a simple json file instead. So that the protocol would not look at the DNS records of a hostname for the metadata but at hostname/at_identity.json
That woule make it much easier for owners of a hostname to use it as their AT identity. Building tooling around the AT protocol would also get easier.
And for others it would be just
echo 'my metadata' | ssh myhost "cat > /my/web/dir/at_identity.json"
+ hosting the server + admin the server + securing the server + keeping the server up all the time
For trivially small amounts of data it seems a massive waste of time and effort.
If however, you are storing and verifying identity of 100's+++ of users within said domain then hosting that makes sense (pgp for email should probably work this way).
—— From @emily.bsky.team:
you can also use a non-DNS option — serve some JSON at a well-known endpoint (similar to webfinger)
GET https://<users-handle>/xrpc/com.atproto.identity.resolveHandle
{"did":"<users-did>"}not well documented yet. may try to do a ".well-known", but don't want a sprawling set of options with complex priority levels and caching behaviors.
But then again so does a whole lot of Bluesky. That is, a whole lot of Bluesky could have been designed to interoperate with the fediverse without sacrificing functionality. The choice to instead privately design something entirely different to me speaks strongly to an attitude to openness and community building that makes it a non-starter for me.
Fediverse doesn't really seem to scale at the individual server level, which is a sort of weird UX.
Creating a domain name is both cheaper and easier than running your own fediverse server.
Even if we postulate that what you say is true (I don't agree it doesn't scale, and there are increasingly commercial offerings if you don't want to run your own and there will be more, but let's put that aside), none of that stops people from using webfinger. If you want more than one user on the domain, it requires at a minimum the ability to dynamically rewrite a URL to redirect to a static URL (or you can of course have a fully dynamic endpoint), otherwise it just requires the ability to serve up a single static file.
While I kind of like using DNS myself, and might have gone that way if starting from scratch without an alternative existing, the existence of webfinger and the fact it is in use for multiple things would have made me stop and think twice and just use webfinger.
I actually serve up content using both static files and via dynamically generated content, depending on the domain and needs.
Why does the DNS approach exist at all? Couldn't users who own a hostname but have not connected it to a webserver have achieved the same by adding a CNAME to a service like Bluesky?
Maybe it helps to clarify that the concept of a handle is totally distinct from the "Personal Data Server" or PDS. You look up the PDS for a handle by resolving the DID first (via DNS TXT or HTTP fallback), then get a DID document, which has a URL to the PDS. This is a bit confusing and multiple steps, but is what makes the handles so easy to use. It is totally fine to have a cool domain to use as a handle and just not have a webserver associated with it.
If you pointed the domain with a CNAME to a particular service, you would need to update that every time you change hosting providers. Which is maybe not often, but it would be disruptive and potentially poor experience because of DNS propagation issues.
For a hypothetical brand like google.com, look up the TXT records. There are a bunch of verifications for various services. This is a relatively standard mechanism. TTL and caching are built-in to DNS, or you can punch through with a recursive query when needed.
And wouldn't changing the name server have the same effect on the DNS solution? "Every time you change your name server provider ...". Which for many users is the same as their hosting provider.
Do I assume correctly, that you don't link to the HTTP fallback documentation because you don't want people to use it?
Some people layered webfinger mentions on top of that, but the protocol neither uses nor depends on it.
When you have one of these and want to find the user, you have to ask hostname at ...
https://{hostname}/.well-known/webfinger?resource={...}
... for more infos about the user. {...} being an urlencoded version of "acct:{user}@{hostname}".Then you will get a bunch of stuff, including so called "aliases". Which are urls. Many services provide aliases of the form hostname/@username or hostname/users/username. Which are endpoints that display something about the user. But that is not part of the protocol and differs from service to service.
My handle is @mg@masto.ai
What is my "AP identity" in your interpretation of the AP protocol?
Usernames can be represented as whatever, but they're not the user IDs.
Peertube implements ActivityPub and uses username@server instead of @username@server, and so does Pixelfed. Funkwhale uses https://hostname.tld/federation/actors/Alice as their ActivityPub identifier (they support multiple federation protocols) and doesn't have a clear representation of user + domain as far as I can tell.
So if a person is available via ActivityPub, how do they reference their "identity"? When you want to say "Follow me via ActivityPub: ..." - what is "..."? The most common form I see is @username@hostname. Is there a more universal form? How does a Pixelfed user do it?
But specifically for ActivityPub the URL works just fine (try pasting it in the Mastodon search box, for example, and up pops the user details exactly as if you'd used @user@host)
Some servers link you to hostname/users/username, some use hostname/@username, some use hostname/username when you look up a user via webfinger.
And the way I read the specs, those don't have to be permanent. A server could change their scheme from hostname/users/username to hostname/u/username and would not violate the protocol. Because the way to identify the user is via a webfinger lookup.
Maybe the only way to say who you are on the Fediverse is "I am <username> on <hostname>. Look me up through Webfinger"?
That might be the equivalent of saying "I am https://masto.ai/.well-known/webfinger?resource=acct%3Amg%40..."
There is a clearly defined URL for every Fediverse user, but not in the sense you mean (there isn't a static or predictable mapping from user@host to URL). The Fediverse is a graph of Person actor urls, not @user@host ids. The Webfinger lookup functionality is used because it makes things more flexible for users and because webfinger allows for a single identity to refer to multiple different types of services and resources, but my followers servers and the servers of those I'm following knows me as https://m.galaxybound.com/users/vidar even though @vidar@galaxybound.com is what I use.
> And the way I read the specs, those don't have to be permanent. A server could change their scheme from hostname/users/username to hostname/u/username and would not violate the protocol. Because the way to identify the user is via a webfinger lookup.
See my other comment. A user is identified via a webfinger lookup when trying to determine which Person Actor @mg@masto.ai refers to. But in almost every other context the only thing that is stored is the URI of the Person actor. If that changes without using the (not in ActivityPub; new) move functionality, you're effectively creating a new identity, and quite a few servers do not yet support the move functionality, so while you can change @mg@masto.ai at a whim and nothing will break, changing the URL is what you need to be careful about (too careful, as I've noted elsewhere; the better support for migrating your data is pretty much the only thing I like about Bluesky)
https://masto.ai/users/mg
https://masto.ai/@mg
... and the server could povide as many aliases as it wants to.I wouldn't call those "identities". As the server could just change the aliases and the handle "@mg@masto.ai" would still work. Because it resolves to whatever aliases the server provides via the webfinger endpoint.
I have not seen anything in the specs that says the aliases are identities or should stay the same over time.
curl -H "Accept: application/json" https://masto.ai/users/mg/following?page=1 | jq .
Notice the people you are following are referenced by URL. If you try /followers instead, and look up the following URLs of some of your followers, you'll find that they follow you by the URL https://masto.ai/users/mg
If you do: curl -H "Accept: application/json" https://masto.ai/@mg | jq .id
You'll see that the returned document shows the id of your ActivityPub Person actor as https://masto.ai/users/mg, not https://masto.ai/@mg or @mg@masto.ai.@mg@masto.ai can change and nothing will happen (even old mentions should still work, as at least Mastodon resolves the mentions to the Actor url and includes a mapping in the post). But if the https://masto.ai/users/mg URL changes, you will need to trigger a move, or you'll lose your followers, because from their servers point of view, that URL is your identity or in ActivityPub speak it's the identity of your Person Actor and for most purposes that's all ActivityPub cares about.
So while you can introduce aliases in webfinger, and for the purposes of webinger your id is mg@masto.ai, if the primary ID of the ActivityPub Person actor changes, you need a "movedTo" element to point to the new one, an "alsoKnownAs" to point to the old one, and trigger notifications to the servers of your followers and following for things not to break horribly. See e.g.:
curl -H "Accept: application/json" https://mastodon.social/@vidarh | jq .movedTo
And curl -H "Accept: application/json" https://m.galaxybound.com/users/vidar | jq .alsoKnownAs
This is not in the ActivityPub spec - it was added as an extension as people started to want to be able to move more smoothly.(I personally don't like this dependency on the old server in the move process, and so one of the few things I actually like about BlueSky is the ability for a user to take their data to a new server unilaterally; that could be fixed for the Fediverse without an entirely new protocol, however - it just needs a mechanism similar to the recovery key mechanism of BlueSky to let users prove who they are on a new server)
In effect, you have two identities in the Fediverse:
* You have a webfinger identity acct:mg@masto.ai
* You have an ActivityPub Person actor identity https://masto.ai/users/mg
Changing the former, or adding more of them (you can even just add a redirect on your own domain and user@yourowndomain will work and resolve to your https://masto.ai/users/mg identity; this is how my Mastodon is on m.galaxybound.com but my preferred Mastodon handle is @vidar@galaxybound.com without the "m."), is easy. Changing the latter is complex (more than it should be).
curl -H "Accept: application/json" https://masto.ai/users/mg/following?page=1 | jq .
Notice the people you are following are referenced by URL.
That we can see entries of the form hostname/users/username in the output of a that specific curl command is proof that it is the identity of a user as defined by the ActivityPub protocol?Shouldn't we be able to look at the ActivityPub specs and see how the identity of a users is defined?
'In ActivityPub, a user is represented by "actors" via the user's accounts on servers.'
and: 'All Objects in [ActivityStreams] should have unique global identifiers. ActivityPub extends this requirement; all objects distributed by the ActivityPub protocol MUST have unique global identifiers, unless they are intentionally transient (short lived activities that are not intended to be able to be looked up, such as some kinds of chat messages or game notifications). These identifiers must fall into one of the following groups:
1. Publicly dereferencable URIs, such as HTTPS URIs, with their authority belonging to that of their originating server. (Publicly facing content SHOULD use HTTPS URIs).
2. An ID explicitly specified as the JSON null object, which implies an anonymous object (a part of its parent context)'
and: 'All objects have the following properties:
id
The object's unique global identifier (unless the object is transient, in which case the id MAY be omitted).'
So a user is represented by an Actor, an Actor must have a global identifier, and that global identifier is the "id" field in the JSON. https://masto.ai/users/mg in your case.(You may also search the ActivityPub spec for "webfinger"; it is not mentioned - it's a convenience offered by implementations like Mastodon, and not required by the ActivityPub spec at all; your interop with Mastodon will be harmed if you don't support it, but it'll work - users just need to input your url instead)
EDIT: to further underline the relationship of Webfinger to ActivityPub, look at the section for Actor's [1], and how the use of webfinger lookups violate the spec ("otherwise, the entered value should be considered invalid") - it's an extension/change used by things like Mastodon for user convenience, and not part of ActivityPub itself at all.
That's pretty cool. So the ID of an ActivityPub actor is simply a url.
That is great.
I think Mastodon should have made it so that the url for their users is hostname/username and that is their ID as well. That would have prevented a ton of confusion.
The webfinger support also potentially enables some cool functionality by letting users use the same handle for multiple services. That said, I'd love to see someone set up a webfinger service that 1) lets people bring their own custom domains, 2) shows a linktree style UI if you hit host/username, 3) optionally redirects or transparently caches certain settings, 4) offer to transparently redirect requests to the user page a given resource based on Accept: header where possible (e.g. ActivityPub/ActivityStreams technically expect 'application/ld+json; profile="https://www.w3.org/ns/activitystreams" ' with the caveat that the "profile" bit is likely to be left out by a lot of clients)
I don’t fully understand how decentralized these alt-twitters are. But to the extent they can replicate the basic functionality while not requiring mega cap profits it might be a win for us all.
I hope it’s not just a fad.
As long as I can (technically) take my domain based handle and move to another host I’ll be thrilled. I also hope it’s not a fad because I think it’s a huge win for users, especially small businesses.
I wonder how they handle dropped domains that are re-registered.
the human root of identity is the handle (memorable/recognizable), but the real identity root for the account is a DID. which is a pretty open/wild spec, so we mostly use did:plc ("placeholder"), which is a self-authenticating tricky tricky.
withing the protocol and applications, everything under the hood works via DID references, not handle references. a domain handle works by pointing at a DID, but does not control the actual DID ("DID document"). so any old users/followers/href will still be attached to the "old account". and it would be possible for the old account to recovery and set up a new handle.
but the superficial bits (anchor text), and human identity for new lookups, are attached to the handle, and could get pointed to a new DID, or just not resolve. that would be messy.
Is there even such a thing as DID bans or is everything handled via moderation and filtering? I’m guessing impersonation would still be an issue even if domain based handles solve most of the impersonation problem.
Unless that person is on an instance the owner of your instance doesn't like.
Also, they aren’t creating distributed Twitter, AT protocol is the infrastructure for any social decentralized service we will want to create in the future. Bluesky is the first use case, but the team is building something way bigger than just the microblogging application.
It’s worth checking ATP docs, they are quick to read and well made: https://atproto.com/guides/overview
And who owns the Bluesky company that is paying the wages ?
Go to https://github.com/bluesky-social/atproto, clone it, build and run via the makefile.
There are already some instances running but as said they do not federate at the moment.
Perhaps the aim is the idea of federation but in practice have everyone sign up to server they control.
But nobody asks that you join now, just wait for federation if that’s what you care about.
- Screwing something up impacts 100k people and not 10M people.
- Users have some expectation of "hiccups" in something presented as a beta product.
- Prevents bots from taking over the platform as the anti-spam / anti-abuse systems mature.
Also, I kinda want this to fail. Mastodon is the right way forward from the twitter debacle.
And you may want to look at the team and how they justify their choices before arriving to a conclusion.
The only thing Mastodon has to do to "win" is continue to exist and thrive in its niche while the lumbering,, centralized corporate social media dinosaurs choke to death around them.
Sure, nobody has ever built a decentralized social network at scale before, but we're not blundering our way into this.
You gave me a list of people and technologies they worked on, but you didn't answer the question. How do you bring that together into a decentralized system that can absorb and succeed Twitter?
From a technical perspective the architecture is very similar to Twitter or other social networks internally, just pieced apart with some cryptography added to allow different components to not have to fully trust eachother. Thats to say, the components individually scale the same as twitter does (probably better tbh, we’re building this with 2023 tech not 2005 tech). Im happy to dive into that more but I actually dont think the technology is the hard part.
The bulk of the work is culture and community building and maintenance. One of the biggest things we’ve been focused on getting right is moderation, and the federated architecture helps a lot here. Allowing “third party” labeling to be integrated into the experience seamlessly allows communities to choose their own way of curating their experience. Instead of relying on a single company to dictate “the rules” you just pick “the rules” you want and go from there. There’s obviously a lot more to it, so id encourage you to check out some of our other blog posts: https://blueskyweb.xyz/blog
EDIT: I see https://atproto.com/guides/faq#why-not-use-activitypub was linked below, but it would be nice to read something a bit more in-depth than that.
All it needs to do is to get rid of the invite system (early) and open up its web app [1] and you will just watch it grow faster than the rest of the alternatives, and over time Twitter users will naturally move to BlueSky.
What they got right is that they have both iOS and Android apps early and there is no 'choose an instance' mess, with proper search functionality and there's a official default server to avoid first impression confusion.
We'll see what the normal users (non-techies) will choose in a few months time once the invite system is gone and the web app is ready and how strong Twitter's network effect is against BlueSky.
Disclosure: I’m just an observer, I could probably get an invite if I asked for one but I’m enjoying seeing it play out without any special treatment, and I don’t participate much on Twitter so I’m definitely not going to add much to any new Twitterlike platform.
It feels like such a waste that they're not trying for interop from the start, though.
It may be that the official app defaults to the original instance, perhaps with a de-emphasized way to switch it. It may also ask for favorite topics first and suggest an instance based on that.
However the onboarding works, I'm confident the solution will be cleaner than Mastodon's. Lessons will have been learned about how clunky federation can be and how much problems it causes for features like search and recommendations.
As for search, it’s bizarre any community would be against such a basic feature.
From TechDirt: “I would talk about some of the cooler Mastodon algorithms I’d been finding, but after a few them then were yelled at by a bunch of Mastodon users, I’ve generally decided it’s not worth promoting those useful tools, for fear that people yell at them to shut them down.”
https://www.techdirt.com/2023/04/28/six-months-in-thoughts-o...
Exactly. The hype will be dead by the time people can actually join.
If we look at the example of Clubhouse, the invite system just pissed a lot of people off. So by the time they finally opened up the app to the public, the goodwill of the potential userbase was spoiled.
Invite systems feel bad and hurt your relationship with your future users.
Do they have more market share than Mastodon, etc.?
A fair amount of influencery types from Twitter have created an account already, but only time will tell how many of them are going to stick around.
I wonder if this analogy doesn't become increasingly inscrutable for younger readers, because phonebooks aren't a thing anymore.
It also seems to me that you don't actually have to know about IP addresses to understand why domain names as handles could be useful.
This can obviously be both good or bad depending on what your use case is!
I think that BlueSky has authentication so that the data only is retrievable on the server specified by the user.
Because of this, I think BlueSky is better for personal social use cases where the user wants to maintain control and feel a bit more safe.
Several have found the TOS, screenshot it, and wildly proclaim that "Bluesky will own all your content!", all commenters gullible enough to accept this proclamation. Whilst the TOS is just the standard legalese needed to run a user-generated content site. These people are incompetent or misinformation agents, or both.
They zoom in on a missing feature and declare the product DOA. Whilst it is very obviously a beta.
They found "nazi content". It was actually a user replying to some progressive post expressing their dislike for the BLM movement. A raw opinion, not one I personally agree with, but not even close to "nazi". But even if you do think it's out of line, it's a bloody social network.
They go on to bash the moderation options of Bluesky, which I honestly find refreshing (if they actually work, that is). The idea is that the user can pick per controversial category to hide, warn, or allow. But the fact that you can chose "allow" is a problem, according to them. Except for porn of course, because the anarchist furry sex worker should most definitely not be censored.
Oh, and also, Musk is a nazi and so is Dorsey. None commenting seem to have a clue how these two characters relate to Bluesky, but better be safe than sorry.
It's just one bad take after the other, expressed by sour miserable people without investing a second in what they're so confidently judging.
I don't have any stake in Bluesky, but I feel for teams releasing amidst such hostility. If they can pull of nomadic identity, "chose your algorithm", functional federation, moderation without tyranny, we're looking at something quite exciting.
No it’s not? You’re just following people that talk about that, I don’t see any Twitter/Bluesky discourse on my timeline
The team is too small to develop and maintain even an electron desktop app or something like that wrapping the existing react-native-web SPA. But this leaves space for fancy third-party apps, or integration into multi-protocol desktop apps, as needed.
Is developing a third-party frontend with full functionality possible, given that (AFAICT) there's a permissioned element to the community?
Source: https://staging.bsky.app/profile/jay.bsky.team/post/3juhjacx... (the CEO)
My email is gutsy.03rhino@icloud.com. Thanks.
My contact info is in my profile.
https://datatracker.ietf.org/doc/html/rfc2289
To rely on another centralized solution (DNS) is not the way forward either:
Maybe you didn't understand it?
Simplicity is a good reason to avoid HTTPS, also freedom and economy.
30% of internet is still HTTP.
100% of non-stupid internet is still HTTP.
Security is not needed in the base layer. You can superpose it.
$ curl -I 'http://datatracker.ietf.org/doc/html/rfc2289'
HTTP/1.1 301 Moved Permanently
Location: https://datatracker.ietf.org/doc/html/rfc2289How far down the road of uniform waste of energy have we not gone when public specifications are encrypted.
After 4 years of HN defending Googles war on HTTP, these are the arguments I'm still met with.
I think this is the end of the road for me on HN.
I did.
>Maybe you didn't understand it?
I did, but it is only for protecting passwords where HTTPS protects the privacy and integrity of every request and response.
>Simplicity is a good reason to avoid HTTPS, also freedom and economy.
If it's so simple that it is insecure I would say that it is too simple. HTTPS helps with freedom and the economy because people no longer have to trust their network providers to be good actors. They can shop knowing their orders are private and their payment information is secure.
>30% of internet is still HTTP.
This is questionable, but most people don't use that many HTTP sites. 97% of the time people spend on the web is spent using https [0]. The web is trying to get rid of HTTP. Bruesky adding support for HTTP is just introducing unnecessary tech debt.
>100% of non-stupid internet is still HTTP.
I'm not sure what you mean by this considering how ubiquitous HTTPS is.
>Security is not needed in the base layer. You can superpose it.
Which is what HTTPS does. It's built on the insecure layer of UDP for HTTP/3 and TCP for the previous versions.
[0] https://transparencyreport.google.com/https/overview?hl=en
Ubiquitous in corporate hell? Try humans doing real work, they don't use HTTPS.
No HTTPS forces you to comply. If you make your own security on top of HTTP it's optional.
This is just a worse version of HTTPS. It provides no way to share the password with the host securely for your first connection with them.
>Ubiquitous in corporate hell?
Look at the site I linked most people are using HTTPS.
>If you make your own security on top of HTTP it's optional.
Which is a problem since people running sites may not invest in security. By banning HTTP you raise the security of the entire platform.
Google wants you to need HTTPS, that is what they sell.
From Chrome to GCP.
“Security is optional” is not a valid approach these days.
OTPs is not going to prevent governments, internet service providers, cafe owners etc from being able to intercept traffic and determine exactly what a user is posting. Which is not something anyone should want from a social network.
With OTP you can easily encrypt your data so nobody can read it inflight over HTTP.
I guess you need to have the creativity to extend the link knowledge with encrypting the data with the OTP.
OTP is about authenticating clients, using a preshared secret established by unspecified means.
They’re completely different things. It’s like you’re comparing Apple (the company) and Orange (the city in NSW, Australia).
Cleartext HTTP is bad for various reasons, one of which is that pervasive monitoring is an attack: https://www.rfc-editor.org/rfc/rfc7258.html.
Certificates are a scam.
My solution which is convoluted and relatively insecure if you have a persistent MITM is to require a password change that you can encrypt with the old password, then the MITM has to remember the old password to know the secret.
But you are right that OTP only are safe after the secret has been shared. Just like all crypto including HTTPS and SSH.
HTTPS is _not_ more secure in any way. The lock icon is an illusion.
As for the technical reasons:
- Big-ints are not trivial in js.
- DNS is centralized.
It's also quantum safe for eternity.