tags.pub

The hashtag server for the ActivityPub Network

Three-point overview of ActivityPub Network

  1. A web of people and groups and programs and the things they make and do
  2. Streams of activities (outboxes) that can be pulled or pushed to subscribers (inboxes)
  3. Everything is represented as ActivityStreams 2.0 JSON

Hashtags

  • A light categorization tool for social data
  • Global search for conversations
  • The simplest thing that could possibly work
  • Emergent
  • Flat namespace

Local Hashtags

{

  "type": "Note",
  "id": "https://evanp.example/note/1",
  "content": "This is a #cool note.",
  "tag": [{
     "type": "Hashtag",

     "name": "#cool",
     "id": "https://evanp.example/hashtag/cool"

   }]

}

Pros

  • Easy to use
  • Devs can be sure they'll work
  • Distributed!

Cons

  • Fragmented
  • Devs have to build hashtag functionality
  • Server-wide resources  cause network effects and thus centralization

Global Hashtags

{

  "type": "Note",
  "id": "https://evanp.example/note/1",
  "content": "This is a #cool note.",
  "tag": [{
     "type": "Hashtag",

     "name": "#cool",
     "id": "https://tags.pub/hashtag/cool"

   }]

}

Pros

  • Easier for devs
  • Global search and distribution
  • Defragmented conversations

Cons

  • Centralization
  • Single point of failure
  • Privacy, etc.

tags.pub hashtags

  • Have inboxes (you can deliver activities to them)
  • Have outboxes (you can follow them)
  • Will reshare any activity delivered to their inbox iff
    • It is addressed to the public
    • The activity or the activity's object is tagged with this hashtag

Addressing tags.pub Hashtags

{

  "id": "https://server.example/activity/1",

  "type": "Create",
  "author": "...",

  "to": ["https://tags.pub/tag/cool", "Public"],
  "object": {
    "content": "This is a #cool note.",
    "tag": "https://tags.pub/tag/cool"
  }

}

curl https://tags.pub/tag/cool

{
   "outbox" : "https://tags.pub/tag/cool/outbox",
   "followers" : "https://tags.pub/tag/cool/followers",
   "id" : "https://tags.pub/tag/cool",
   "following" : "https://tags.pub/tag/cool/following",
   "inbox" : "https://tags.pub/tag/cool/inbox",
   "publicKey" : "...",
   "@context" : [
      "https://www.w3.org/ns/activitystreams",
      "https://w3id.org/security/v1"
   ],
   "liked" : "https://tags.pub/tag/cool/liked",
   "type" : "Hashtag",
   "name" : "#cool"
}

But... her emails centralization!

Dealing with decentralization

  • https://tags.pub/ is an ActivityStreams "Service" object
  • It has an inbox, outbox, followers, following just like any other AP object
  • It re-shares any activity shared by Hashtag objects on that server
  • "firehose"

An opt-in network of servers

  • https://tags.pub/ follows https://ragtag.fun/
  • ActivityPub servers can send activities to whichever server
  • They sort it out in the background
  • The Hashtag objects reshare stuff posted to them or to equivalent Hashtag object on other servers

Scaling

  • This scales to hundreds or maybe thousands of Hashtag servers
  • id comparison still fails
    https://tags.pub/tag/cool != https://ragtag.fun/tag/cool

  • No automatic discovery of local Hashtag objects on ActivityPub servers

Similar pattern

  • places.pub - Locations
  • id comparison still fails
    https://tags.pub/tag/cool != https://ragtag.fun/tag/cool

  • No automatic discovery of local Hashtag objects on ActivityPub servers

Links

tags.pub

By Evan Prodromou

tags.pub

Hashtag server for the ActivityPub Network

  • 1,563