What if... you had one Fedi account on a generic headless #ActivityPub server that simply hosts and federates your data... and had C2S UIs for microblogging, long form writing, media editing and sharing, link aggregation, games, fitness tracking, and so on, that all used that same Fedi account. Technically, it's a similar concept as ATProto (but no relay and app view) and Solid Pods (but no RDF).
It seems possible... if we can improve the AP C2S API/protocol sufficiently.
Lorraine Lee likes this.
Evan Prodromou
in reply to Steve Bate • • •flo
in reply to Evan Prodromou • • •@evan
Isn't that what Holos.social offers (at least very similar)?
Fediverse Relay - Mobile-First Federated Social Network
Fediverse RelayEvan Prodromou
in reply to flo • • •Lutin Discret
in reply to Steve Bate • • •Evan Prodromou
in reply to Lutin Discret • • •Lutin Discret
in reply to Lutin Discret • • •π«§ socialcoding..
in reply to Lutin Discret • • •@lutindiscret
It depends.. since post-facto interop rules supreme, that's a possible approach to correct course.
social.coop/@smallcircles/1161β¦
π«§ socialcoding.. (@smallcircles@social.coop)
π«§ socialcoding.. (social.coop)π«§ socialcoding..
in reply to Steve Bate • • •Jonathan Frederickson
in reply to Steve Bate • • •This is exactly the sort of thing I'm hoping we see on the Fediverse
One thing that might need some careful design is: how to scope down the access that each of the C2S-connected apps have? A game for example doesn't need to be able to read all of my/my friends' messages, only game-related ones
I think the work Spritely's been doing could be a good building block for such a generic server
very normal person
in reply to Steve Bate • • •Note, it is artificially limited platformKungFuDiscoMonkey
in reply to Steve Bate • • •A Social Filesystem β overreacted
overreacted.iosilverpill
in reply to Steve Bate • • •Evan Prodromou
in reply to silverpill • • •I can't wait to see what you build! Good luck.
Raphael Lullis
in reply to Evan Prodromou • • •Maybe I am way over my head, but this seems like *exactly* what I am building right now and I'm not really building anything outside of ActivityPub C2S?
I mean... Yes, my current client assumes some specific profile for OAuth and the client will need a proxy to get some data remote servers (to bypass authorized fetch, or to resolve documents from transient activities), but doesn't seem to me that anything I am doing is outside of AP's scope?
Evan Prodromou
in reply to Raphael Lullis • • •Evan Prodromou
in reply to Evan Prodromou • • •Evan Prodromou
in reply to Evan Prodromou • • •@raphael @silverpill I don't intend to stop working on the ActivityPub API.
There are a lot of us collaborating through the SocialCG ActivityPub API Task Force, and I expect that collaboration to continue:
github.com/swicg/activitypub-aβ¦
GitHub - swicg/activitypub-api: ActivityPub API Task Force repository.
GitHubsilverpill
in reply to Evan Prodromou • • •I think a generic ActivityPub server can't be built without major changes to ActivityPub. For example, it might be necessary to make all side-effects of activities explicit.
And there is a bigger problem. A generic server without FEP-ef61 is like ATProto PDS or Nostr relay but all data is tied to a single server. This means that it is obsolete before the work has even begun.
Steve Bate
in reply to silverpill • • •silverpill
in reply to Steve Bate • • •A server can't properly process an arbitrary activity without knowing its side effects. A server that only supports a small number of activities mentioned in the ActivityPub spec is obviously not generic.
I can point to other challenges because I've been working on this problem for years, but...
Wow, for real? I suppose it's time for me to retire then.
marius
in reply to silverpill • • •@silverpill I think you're getting confused about ActivityPub side-effects and application logic side-effects.
I call my project FedBOX a "Generic ActivityPub server" because outside of storing ActivityPub objects and activities to a local storage and dispatching said activities to their recipients it doesn't do anything else.
However there's nothing preventing someone from forking the project and adding some other type of logic to it for specific combinations of Activities/Objects. That's the thing I'm trying to do with my GoActivityPub library: take care of the ActivityPub stuff, so you can then do your own stuff alongside it.
@steve @evan @raphael
silverpill
in reply to marius • • •Evan Prodromou
in reply to silverpill • • •@silverpill @mariusor @raphael
I think it's a fair critique and one that we should deal with.
However, I think it's possible to provide value where the server implements side effects of AP core, and not for any other Activity Vocabulary activities or extensions.
With the core AP activities, we can probably give clients most of what they need to implement "side effects" for extensions.
Evan Prodromou
in reply to Evan Prodromou • • •@silverpill @mariusor @raphael
For example, let's say we decide that an `Arrive` activity should update the `location` property of the actor.
`Arrive` isn't a core activity in AP. So, instead of expecting the server to change the `location`, the client can send an additional `Update` activity to change the actor's `location` itself.
With CRUD activities and collection activities in core we can get a lot of this done from the client side.
Evan Prodromou
in reply to Evan Prodromou • • •@silverpill @mariusor @raphael
I think there's value in having a negotiation between the client and the server so the server can declare its support for side effects for extensions. A way for the server to say, "I'll handle side effects for geosocial applications". Then the client can skip implementing those side effects itself.
Evan Prodromou
in reply to Evan Prodromou • • •@silverpill @mariusor @raphael
More powerful would be a way for clients or actors to define side effect rules for servers dynamically. "If you get an Arrive activity, set the actor's location."
Evan Prodromou
in reply to Evan Prodromou • • •@silverpill @mariusor @raphael
All that said, I think we can get pretty far with the core AP activities with defined side effects, and extension activities with "side effects" implemented by the client.
Steve Bate
in reply to silverpill • • •marius
in reply to silverpill • • •@silverpill what are extensions exactly? Are you talking about FEPs that proscribe behaviour alongside structure, or ActivityPub extensions as allowed by JSON-LD.
The FEPs that proscribe behaviour can't ever be done in a "generic" way, and I'm betting you already know that and you're just being facetious.
However the JSON-LD dynamic structure can be reasoned about generically from an ActivityPub point of view using the points I made above: storage to disk, dispatch to recipients.
If you plug smart clients on top of that that have the specific logic you want, you're all the way there to what Steve was talking about.
@steve @evan @raphael
silverpill
in reply to marius • • •An extension is a protocol extension. Specifically, I talked about activity types that are not mentioned in ActivityPub.
Here is a side effect of a
Likeactivity:Now imagine that you have an
EmojiReactactivity which server should add to object'semojiReactionscollection as a side-effect.A generic server should be able to do that.
Steve Bate
in reply to silverpill • • •@silverpill @mariusor @evan @raphael "you have an EmojiReact activity which server should add to object's emojiReactions collection as a side-effect."
It's a direct rather than side effect, but how is that different from Add(object=EmojiReact, target=object_emojiReactions)? A generic server could support that.
Raphael Lullis
in reply to silverpill • • •@silverpill
I'm really not following this logic: you are saying "a generic HTTP server should be able to serve WebDAV requests".
Yes, HTTP servers should be able to serve WebDAV requests, *provided* they implement the extension.
It doesn't mean that they *have* to implement the extension. And an HTTP server that does not support the extension does not make non-HTTP compliant.
@mariusor @steve @evan
Raphael Lullis
in reply to silverpill • • •@silverpill
It is a generic server *because* it is focused only on the ActivityPub API, unlike most of the existing services that interop only with specific APIs (Mastodon's , Lemmy's).
A "generic server", in my view, is one that can take any type of activity posted to a box, and dispatch to the proper targets. The ActivityPub API defines only what to with like/announce/follow. Anything else is up to the application. That's the extensible part.
@mariusor @steve @evan
Raphael Lullis
in reply to silverpill • • •@silverpill @evan
I don't follow: how does that relate to the "ActivityPub API" if the activity is "arbitrary" and not defined by ActivityPub, not using AS2 vocabulary?
Isn't that like saying that we can't use HTTP as a protocol because an HTTP server doesn't know what to do with verbs defined on, e.g, WebDAV?
silverpill
in reply to Raphael Lullis • • •Evan Prodromou
in reply to silverpill • • •@silverpill @raphael I think that comes down to what you mean by "support".
I think a server that delivers extension activities, or activities with extension properties or extension types as `object` etc , locally or remotely, is "supporting" those types.
Implementing server-side side effects of some extensions may be a bonus, but we can build a lot of great stuff without it.
naturzukunft
in reply to Evan Prodromou • • •marius
in reply to Steve Bate • • •Evan Prodromou
in reply to marius • • •GitHub - evanp/ap: command-line ActivityPub API client
GitHubmarius
in reply to Evan Prodromou • • •@evan I could login, it did some stuff but then it redirected me to the login page again.
@steve
Matthias Pfefferle
in reply to Evan Prodromou • • •@evan @mariusor oh neat!
matthiaspfefferle.blog/2026/02β¦
github.com/Automattic/wordpresβ¦
Add Arrive outbox handler for check-in activities by pfefferle Β· Pull Request #2977 Β· Automattic/wordpress-activitypub
GitHubEvan Prodromou
in reply to Matthias Pfefferle • • •Evan Prodromou
in reply to Evan Prodromou • • •marius
in reply to Evan Prodromou • • •Hey @evan ... I've looked into why I get issues with checkin.swf.pub, and it could be that I'm doing something wrong, but it hits my servers using client_id=checkin.swf.pub/client.jsonld
Which, when gets dereferenced serves an ActivityPub Actor(ish) like document instead of the Client ID Metadata I'm expecting.
I remember I was arguing with Emelia about how to server both formats from the same URL, but in the end I decided it's not worth my time trying to do both, and I'm just expecting the data model described in the RFC7591 Sect2: datatracker.ietf.org/doc/html/β¦
RFC 7591: OAuth 2.0 Dynamic Client Registration Protocol
IETF DatatrackerEvan Prodromou
in reply to marius • • •Lorraine Lee
in reply to marius • •marius
in reply to Lorraine Lee • • •@lori I don't know what semaphore social is, and I don't know if goto social is server only (probably not in the way that I meant - where "the server" is an ActivityPub C2S server)
@steve
marius
in reply to marius • • •Tom Casavant
in reply to marius • • •I was thinking about trying to build a lightweight wrapper around c2s that mimics the Mastodon/pixelfed API, and then just bootstrap every existing mastodon/pixelfed client but that feels like more work than it'd be worth
marius
in reply to Tom Casavant • • •Tom Casavant
in reply to marius • • •Ben Pate π€π»
in reply to Steve Bate • • •I love this vision. One hurdle I see is the lack of content types + the ability to represent them in HTML.
Bandwagon is my best use case: Albums and Tracks arenβt a standard data type. I could push those into my own AP server, but other servers wouldnβt know how to represent them correctly.
For this to work, we need a restricted subset of HTML for generating previews of unknown content.
This feature exists in oEmbed (optional) but is poorly supported on the Fediverse.
marius
in reply to Ben Pate π€π» • • •@benpate as long as your custom types have the current ActivityStreams Object as a base (ie, they contain a Content and a MediaType) anyone would be able to render them to some extent.
For cases where you have a different structure, you can have Profile objects alognside them linked to their Preview property. Use the vocabulary to your advantage.
@steve
Steve Bate
in reply to Ben Pate π€π» • • •dimkr
in reply to Steve Bate • • •nathan
in reply to Steve Bate • • •ActivityPods - Personal data spaces powered with ActivityPub
ActivityPodsnathan
in reply to Steve Bate • • •Steve Bate
in reply to nathan • • •