WebFinger & ActivityPub BBS Extensions

Why the Hell Not?

Some of the things I’ve been pondering, and in some cases already started experimenting with is extensions to both ActivityPub / Activity Streams and WebFinger relevant to the BBS community. Support in ENiGMA½ is coming along well, and I’ve already added a little tidbit to Actor objects. If the idea has any merit, perhaps they can be registered at some point.

A number of ActivityPub extensions exist - Take a look at Mastodon’s list for example, and WebFinger “link relations” also exist in the wild already, so why not a few more?

WebFinger

Let’s start with WebFinger. From the official specification § 1:

WebFinger is used to discover information about people or other entities on the Internet that are identified by a URI using standard Hypertext Transfer Protocol (HTTP) methods over a secure transport.

This, to me, says it’s a great way for (internet connected) boards to swap various bits of information! Let’s start by defining a new “link relation” rel value. A good resource for existing values out there can be found here.

In the tradition of WebFinger, we’ll use something that should be quite unique:

http://standards.bbs.tools/rel/user-stats/v1

If you haven’t read up on WebFinger, here is the gist: We provide a well known endpoint on our web server and respond with some JSON. Within that JSON, we can supply a links array. Our array, implemented within ENiGMA may look something like this:

1
2
3
4
5
{
"rel": "http://standards.bbs.tools/rel/user-stats/v1",
"type": "application/json",
"href": "https://xibalba.l33t.codes/_enig/users/NuSkooler/user-stats/v1"
}

Great, now all we really have to do is define a JSON structure for common BBS related user stats. Maybe something such as the following. We could simply document and provide a JSON schema for optional fields and the like:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"board": {
"name": "Xibalba",
"telnet": "xibalba.l33t.codes:44510",
"ssh": "xibalba.l33t.codes:44511"
},
"user": {
"username": "NuSkooler",
"affiliations": "ENiGMA^67^Phenom^ACiDic",
"lastLogin": "2023-01-29T15:13:29.078-07:00",
"loginCount": 666,
"memberSince": "2015-12-03T22:49:47-07:00",
"postCount": 1337,
"doorCount": 42,
"doorMinute": 420,
"achievementCount": 1234, // <-- where I ran out of clever ideas
"achievementPoints": 1234,
"uploadCount": 1234,
"downloadCount": 1234,
"uploadBytes": 1234,
"downloadBytes": 1234,
}
}

Sweet, now we have a way to query statistics about users!

⚠️ Exposing users of your board via WebFinger, ActivityPub, whatever, to the outside world should always be up to the user!

A possible integration is in ActivityPub searching via BBS. Something @cognitivegears@bitbang.social has been hacking on. Not only would be you be able to find users in the general Fediverse, but BBS users could yield more interesting stats.

ActivityPub

We can add extensions to ActivityPub objects via JSON-LD namespaces. Similar to our WebFinger rel value, we need a IRI (for our purposes, this is really just a URL).

http://standards.bbs.tools/ns/vocab/v1

Within our documents, we can now register this with a prefix. Something like bbs:!

Consider an Actor object, maybe we want to provide a simple object with BBS related information in it? Let’s call it bbs:bbsUserInfo. This could appear within the Actor looking something like the following:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"bbs": "http://standards.bbs.tools/ns/vocab/v1",
"bbsUserInfo": "bbs:bbsUserInfo"
}
],

// ...take a look at the Actor spec for existing properties...

"bbsUserInfo": {
"board": {
"name": "Xibalba",
"telnet": "xibalba.l33t.codes:44510",
"ssh": "xibalba.l33t.codes:44511"
},
"username": "NuSkooler",
"ftnAddresses": [
"10:101/9@araknet",
"21:1/121@fsxnet"
]
}
}

Perhaps most interesting here is providing a way to communicate with this Actor/user via FTN-style networking.

Another opportunity is perhaps providing additional information in Notes for things like cross-network mapping (think ActivityPub <–> FTN). I’ll refer again to the ⚠️ above about exposing user information: let the user choose!

You’ll also notice some overlap in the WebFinger and ActivityPub concepts. Actors are not generally queried any more than they are searched for, while the stats can update on a higher frequency. …or something like that.

Rants? Possibly interesting?