Signalling "open in app" behaviour for AP content
-
evan@cosocial.careplied to silverpill@mitra.social on last edited by
@silverpill @julian @evan@community.nodebb.org I don't think content negotiation can be the be-all end-all. The <link> element and Link: HTTP headers are good to use. Julian, I will write it up and we'll see where it lands.
-
nightpool@socialhub.activitypub.rocksreplied to evan@cosocial.ca on last edited by@evan1 I agree in theory but in this specific instance I'm not sure I understand where the Link header or meta tag would be helpful (I can definitely see where it'd be helpful for the case of e.g. a browser extension though)
-
julian@community.nodebb.orgreplied to evan@cosocial.ca on last edited by
Thanks @evan@cosocial.ca — that'd be appreciated!
@nightpool@socialhub.activitypub.rocks, this would be helpful in NodeBB's case where we have a web app, so rendering a link to something is just an anchor.
I could theoretically override the anchor click handler to do a backend round-trip to check whether we could load the content in-app, otherwise fall back to a regular browser behaviour (a page navigation).
For example, let's say I link out to Evan's profile here. If NodeBB knew that this link had an alternative AP endpoint, then we could redirect the user instead to the local representation of his profile
-
evan@cosocial.careplied to julian@community.nodebb.org on last edited by
@julian @nightpool agreed. That's positive behaviour.
-
julian: Thanks @silverpill@mitra.social, in my case while making the call is definitely an option, I was hoping for something I could do pre-flight (e.g. an opportunistic HEAD call). Can you explain what you mean by this? Making a GET or HEAD request with Accept: activity+json as the highest priority and HTML as the fallback should work fine and wouldn't require any extra round trips (like a preflight or Link header would)
-
julian: I could theoretically override the anchor click handler to do a backend round-trip to check whether we could load the content in-app, otherwise fall back to a regular browser behaviour (a page navigation). i believe this is what mastodon does, but it's also worth mentioning fep-e232 Object Links as a way to tag a given Link with the appropriate mediaType used for content negotiation: { "@context": "https://www.w3.org/ns/activitystreams", "content": "
This is an object link.
", "tag": { "type": "Link", "name": "object link", "href": "https://example.com/some-object", "mediaType": "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"" } } -
blaine@mastodon.socialreplied to evan@cosocial.ca on last edited by
@evan @julian @nightpool for what it's worth, webfinger should be (re: is) able to do this, even if the implementations in the wild don't. The intent at the time was for webfinger to be the "DNS records" for "social addresses", and the main reasons we didn't just use DNS was because (1) DNS doesn't support anything but bare domain names, (2) management of DNS records at scale is hard, and (3) it wasn't possible to query DNS via the web.
-
blaine@mastodon.socialreplied to blaine@mastodon.social on last edited by
@evan @julian @nightpool lots of folks advocated to support any URI scheme in a webfinger lookup, and that's why we have the "acct" scheme at all - so that email-style addresses could be used alongside http etc URIs!
The <Link> approach definitely works, but feels a bit reinventing-webfinger/creating more complexity in lookups (on the client side).
Hope the context is helpful!
-
evan@cosocial.careplied to blaine@mastodon.social on last edited by
So, for finding the AP equivalent of an URL that I think is a Web page, I'd take these steps:
- Link header: HEAD and look for the Link: header (easy, fast)
- Webfinger: Webfinger the URL (a little more complicated)
- Content negotiation: GET with Accept header set to AS2 type
- Parsing: GET and look for Link: header or <link> elementFor finding the HTML page for an AP object:
- Link header: HEAD and look for Link:
- AS2: GET and look for `url` at top level -
evan@cosocial.careplied to evan@cosocial.ca on last edited by
For finding the HTML page for an AP object:
- Link header: HEAD and look for Link:
- Content negotiation: HEAD with Accept: set to text/html
- AS2: GET and look for `url` at top level -
blaine@mastodon.socialreplied to evan@cosocial.ca on last edited by
@evan @julian @nightpool in the Postel sense, though, it's too bad that a client implementor needs to maintain (at least) four discovery pathways, and may require four separate requests to validate the information. Similarly, an ap host doesn't know which spots a client will check, so needs to implement all four. I'm well out of the standards game, but I'd very much advocate for "pick one and stick with it"
-
evan@cosocial.careplied to blaine@mastodon.social on last edited by
@blaine @julian @nightpool we need you back in the standards game
-
julian@community.nodebb.orgreplied to evan@cosocial.ca on last edited by
@evan@cosocial.ca @blaine@mastodon.social indeed, four different implementations is not ideal. We're at the point where they're all vying for attention.
Would need to weigh pros and cons of each and see whether there is one winner we can all agree on.
-
scott@authorship.studioreplied to julian@community.nodebb.org on last edited byWhen you work on this, consider that there are some situations where the user may want or need to go to the official profile and channel. Older content does not get distributed via ActivityPub, so you have to go to the source (originating website) to see everything.
And I have rarely seen an entire conversation be delivered via ActivityPub. The Zot protocol downloads the whole conversation, but not ActivityPub. With ActivityPub, there are always holes and you have to go to the original thread on the original website to see the whole thing. Maybe we can fix that by adding the ability to download entire threads, not just new posts, but right now seeing the whole conversation over ActivityPub is hit or miss.
Also, many platforms have profile information that is not transmitted over ActivityPub and you would need to visit their real profile to get all of the details.
Plus, in my opinion, it is poor form to create a local profile for someone on another platform and fail to acknowledge that the user is using another platform. At the very least, there should be a link back to their official profile and/or channel (i.e. their posts).
Until ActivityPub can reliably transmit the entire thread, you will need to link back to the original website. -
scott@authorship.studioreplied to julian@community.nodebb.org on last edited by@julian
For example, let's say I link out to Evan's profile here. If NodeBB knew that this link had an alternative AP endpoint, then we could redirect the user instead to the local representation of his profile
Wouldn't Evan's AP endpoint be the same as his HTML endpoint?
Most platforms are going to send you to the authoritative profile, which is the one at the user's server.
And if you wanted to redirect a link to a local profile instead of his official profile, you don't need an endpoint to do that. You could simply parse the post and swap out the URL, since you should have data about the user in your database anyway from when you first detected the user.
Maybe I am misunderstanding the use case here, but I am not sure why a platform would not direct you to its own platform for content and profiles. -
-
@julian @silverpill the HTML discovery tf doc is filling in. There's still a lot to do but maybe that's a good place to ask questions.
-
evan@cosocial.careplied to evan@cosocial.ca on last edited by
@julian @silverpill no recos for consumers yet, but: I'd start with content negotiation, then Link headers. From there, fallback to <link> elements in HTML. Last recourse, try Webfinger, especially for non-HTML resources like images.
-
mro@digitalcourage.socialreplied to kariboka@social.harpia.red on last edited by
Hi @kariboka @julian @evan @silverpill,
I read page, not host. Please refrain from idiosyncratic or obsolete legacy.