Activity Streams provide an interface for conflict-free replicated data types

Earlier, I wrote about how not everything on the social web could be reduced to a stream of activity. After spending some time learning about offline-first apps, I've come to realize that Activity Streams provide a nice interface for conflict-free replicated data types (CRDT).

In other words, when building Silk Floss, not only will the user be using the same offline-first app on multiple devices, they'll also be using multiple apps that will be sharing the state between each other.

All of my previous examples can be wrapped in Activity objects without a problem and doing so reduces (or eliminates) the conflicts that can occur. Effectively, using Activity Streams as they were intended switches the model from a last-write-wins strategy to a CRDT strategy. This is slightly more complicated to implement, but the gains in usability are certainly worth the costs.

I think there is also a lot of value in implementing (most) of ActivityPub because it provides a much simpler API than SPARQL. Although, I still think it's really important that you are storing your content on your server, not someone else's.