Integrating ActivityPub within Solid specs

Hey everyone

I split my initial post in a number of issues on the new activitypub-interop repo, so that it will be easier to discuss the details. Feel free to create other issues, or comment the existing ones!

The main issue for me is this one about the context of the specification. Please share your thoughts, as I’m not sure where to go from here.

In case you missed it, Vincent Tunrun wrote a nice blog post on his experience of writing a Solid-based ActivityPub client.

@mrkvon Have you been able to work a bit on the ActivityPub agent you planned to do ?

2 Likes

Only some testing and research. No meaningful code, yet. This is still high on my list, but I was busy with other work.

I looked at how json-ld looks when it’s produced by CSS, and if it looks anything like the simple format that e.g. Mastodon may expect. (it does not.) There could be a way - having the webId stored as json-ld; but it’s already causing issues - NSS doesn’t authenticate such agent (i suspect it doesn’t ask for text/turtle, and receives the default json-ld instead). CSS seems fine with webId stored in json-ld representation.

Also thought of a name for the project, came up with soap-opera :smile:

The most promising intersection of Solid and ActivityPub to me is the general notion of a personal data storage:

(I think AT protocol also provides an excellent real-world use case for Linked Web Storage, but I don’t know how to write up a lws-ucs for it.)

An essential complement to the PDS/Pod paradigm is nomadic identity, which there’s now a complete spec for in NomadPub.

Nomadic identity is a feature that allows users to freely move from one server to another without losing their identities and content.

An extension of ActivityPub protocol is currently being developed that enables nomadic identity and other protocol improvements:

  • Identity that is not tied to a single server.

  • Storing user data on multiple servers.

  • Local-first delay-tolerant applications.

  • End-to-end encryption.

  • Implementations of Nomadic ActivityPub can operate in a mode that is compatible with existing ActivityPub server applications.

Specifications

Fedify is working towards this with funding from the Sovereign Tech Agency.

3 Likes

I’ve been spending a bit of time catching up on this discussion and experimenting. I have successfully subscribed to remote ActivityPub actors and processed inbox activities. (My write-up: JG10 Solid devlog )

  • I ended up using an architecture not yet mentioned here, in which the inbox and outbox are public append LDP containers that receive activities. Solid notifications are used to notify an external agent that reads the new activity and processes it. This works because Solid already supports Linked Data Notifications, and ActivityPub specialises LDN, as @srosset81 notes in the OP.
  • Most requirements can be met on CSS by specifying the required content type when saving the resource.
  • The client does need to be able to understand the activity+json content type, which rdflib.js does since 2.3.0 (thanks @aveltens !)

At the moment the only issue I have found to require server support is that an LDP container requires content negotiation to be delivered in activity+json , which would also likely need to omit LDP triples. Content negotiation is already the solution recommended by the Social Web Working Group. ActivityStreams collections · Issue #3 · solid-contrib/activitypub-interop · GitHub

However, this affects the inbox collection, which is only used by the client, and the outbox collection, which many ActivityPub implementations ignore (e.g. Mastodon just extracts the number of items), so I have proposed: Offer a Solid C2S profile that doesn't conform to application/activity+json · Issue #18 · solid-contrib/activitypub-interop · GitHub

I’m feeling confident enough with the collective implementation experience here that I think it’s worth revisiting some spec/primer writing.

I’ve put two possible outlines here: Is this specification for Pod providers or for agents ? · Issue #2 · solid-contrib/activitypub-interop · GitHub

The first is more note/tutorial/primer like, because a large part of the content is just redescribing ActivityPub for a Solid audience.

The second assumes prior knowledge of ActivityPub and primarily describes what is needed to integrate ActivityPub with Solid, based on three architectures:

  • Server support
  • External processing
  • External endpoint

I’m happy to do some writing of a first rough draft if there is interest in either or both of these.

inbox and outbox are public append LDP containers that receive activities

Nice that it works! We should note though that exposing public append container without built-in authentication and validation is likely a security issue (it’s very easy to overwhelm the pod with junk data). Worthy experimental solution, but I have concerns it might not be suitable for production.

I think it’s worth revisiting some spec/primer writing.

Yesterday at Solid CG meeting, the topic of new Task Forces came up. Would you be up for starting one for this purpose? @jg10 @thhck @srosset81

If we agree to do that, how do we go about that in relation to CG? @elf-pavlik

It also came up that Social Web Incubator Community Group is starting a process of setting up a WG and it does not include Solid. Should we care? Is it possible to set up a task force spanning 2 CGs? They seem to have monthly meetings — next is December 5 2025.

For a public inbox:

  • Authentication is actually just verification of the sender. It’s not a barrier to spam given that a spam sender can sign their messages with their own actor.
  • My understanding is that validation is mainly of content type + checking it’s well-formed (activity/ld) json.
  • Yes, data size is an issue. Some kind of quota should be in place, and this is a reason the inbox does need to be continually processed. CSS already has quotas.

I believe in a plurality of solutions - there’s always an engineering tradeoff. I’m not suggesting that external processing be used on an inbox where DOS is a major concern. It’s a simple architecture that scales well on top of existing pods - it can enable 1000s of actors across servers with a single webhook. Perhaps implementing external endpoints can be done in a way that is similarly simple and this advantage would be diminished?

I’m happy to do some draft writing. I’m not sure about joining a task force.

1 Like