Hashtag

#ActivityStreams

307 posts tagged with this hashtag.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

Here is my work-in-progress FEP for using JSON Resume with ActivityPub:

FEP-6158: ActivityPub 'Resume' Object: JSON Resume expressed as JSON-LD

codeberg.org/reiver/fep/src/br

I prefer to write for clarity, so it still needs work.

codeberg.org

Cookie monster!

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

Here is my work-in-progress FEP for using JSON Resume with ActivityPub:

FEP-6158: ActivityPub 'Resume' Object: JSON Resume expressed as JSON-LD

codeberg.org/reiver/fep/src/br

I prefer to write for clarity, so it still needs work.

codeberg.org

Cookie monster!

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

Here is my work-in-progress FEP for using JSON Resume with ActivityPub:

FEP-6158: ActivityPub 'Resume' Object: JSON Resume expressed as JSON-LD

codeberg.org/reiver/fep/src/br

I prefer to write for clarity, so it still needs work.

codeberg.org

Cookie monster!

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

Here is my work-in-progress FEP for using JSON Resume with ActivityPub:

FEP-6158: ActivityPub 'Resume' Object: JSON Resume expressed as JSON-LD

codeberg.org/reiver/fep/src/br

I prefer to write for clarity, so it still needs work.

codeberg.org

Cookie monster!

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

I may have written a JSON-LD schema for JSON Resume.

It is defined in terms of ActivityPub.
For example:

'Resume' is a sub-type of an ActivityPub 'Object'. There are some new fields defined. Etc.

...

Now the question is — where do I put it?

Do I create a pull-request to the JSON Resume resume-schema repo?

Do I create a FEP?

Do I put it somewhere else?

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

I may have written a JSON-LD schema for JSON Resume.

It is defined in terms of ActivityPub.
For example:

'Resume' is a sub-type of an ActivityPub 'Object'. There are some new fields defined. Etc.

...

Now the question is — where do I put it?

Do I create a pull-request to the JSON Resume resume-schema repo?

Do I create a FEP?

Do I put it somewhere else?

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

I may have written a JSON-LD schema for JSON Resume.

It is defined in terms of ActivityPub.
For example:

'Resume' is a sub-type of an ActivityPub 'Object'. There are some new fields defined. Etc.

...

Now the question is — where do I put it?

Do I create a pull-request to the JSON Resume resume-schema repo?

Do I create a FEP?

Do I put it somewhere else?

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

My personal desire would be to create a format from scratch (because you are in control, you get something bespoke to your needs, and it is personally satisfying), but —

I think there is probably an advantage to using something (such as JSON resume) that already has wide adoption.

I guess that makes me inclined towards the latter.

...

So, if I go that way, I would have to decide: plain JSON or JSON-LD.

@reiver@mastodon.social

More on a resume / CV on the Fediverse on Social Web.

Another option could be to use something like "JSON resume":

jsonresume.org/

github.com/jsonresume/resume-s

It seems to be popular.

It isn't JSON-LD. Although I think it would be straightforward to translate it to JSON-LD, if that was desired.

github.com

resume-schema/job-schema.json at master · jsonresume/resume-schema

JSON-Schema is used here to define and validate our proposed resume json - jsonresume/resume-schema

@reiver@mastodon.social

More on a resume / CV on the Fediverse on Social Web.

Another option could be to use something like "JSON resume":

jsonresume.org/

github.com/jsonresume/resume-s

It seems to be popular.

It isn't JSON-LD. Although I think it would be straightforward to translate it to JSON-LD, if that was desired.

github.com

resume-schema/job-schema.json at master · jsonresume/resume-schema

JSON-Schema is used here to define and validate our proposed resume json - jsonresume/resume-schema

@reiver@mastodon.social

More on a resume / CV on the Fediverse on Social Web.

Another option could be to use something like "JSON resume":

jsonresume.org/

github.com/jsonresume/resume-s

It seems to be popular.

It isn't JSON-LD. Although I think it would be straightforward to translate it to JSON-LD, if that was desired.

github.com

resume-schema/job-schema.json at master · jsonresume/resume-schema

JSON-Schema is used here to define and validate our proposed resume json - jsonresume/resume-schema

@reiver@mastodon.social

On Tags (including Hash-Tags) in ActivityPub.

1/

I think new developers coming to ActivityPub want to write something like:

"tag": ["apple", "banana", "cherry"]

It is unfortunate that that isn't valid ActivityPub. But, that it must instead be:

"tag": [
{
"type": "Hashtag",
"name": "#apple"
},
{
"type": "Hashtag",
"name": "#banana"
},
{
"type": "Hashtag",
"name": "#cherry"
}
]

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

On Tags (including Hash-Tags) in ActivityPub.

2/

A new version of ActivityPub could extend the type of "tag" from:

Object | Link

to:

Object | Link | xsd:string

And that would make the following valid ActivityPub:

"tag": ["apple", "banana", "cherry"]

Of course, it would have to be specified how to interpret this. (Ex: as "type":"Hashtag", or whatever.)

@reiver@mastodon.social

On Tags (including Hash-Tags) in ActivityPub.

1/

I think new developers coming to ActivityPub want to write something like:

"tag": ["apple", "banana", "cherry"]

It is unfortunate that that isn't valid ActivityPub. But, that it must instead be:

"tag": [
{
"type": "Hashtag",
"name": "#apple"
},
{
"type": "Hashtag",
"name": "#banana"
},
{
"type": "Hashtag",
"name": "#cherry"
}
]

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

On Tags (including Hash-Tags) in ActivityPub.

2/

A new version of ActivityPub could extend the type of "tag" from:

Object | Link

to:

Object | Link | xsd:string

And that would make the following valid ActivityPub:

"tag": ["apple", "banana", "cherry"]

Of course, it would have to be specified how to interpret this. (Ex: as "type":"Hashtag", or whatever.)

@reiver@mastodon.social

On Tags (including Hash-Tags) in ActivityPub.

1/

I think new developers coming to ActivityPub want to write something like:

"tag": ["apple", "banana", "cherry"]

It is unfortunate that that isn't valid ActivityPub. But, that it must instead be:

"tag": [
{
"type": "Hashtag",
"name": "#apple"
},
{
"type": "Hashtag",
"name": "#banana"
},
{
"type": "Hashtag",
"name": "#cherry"
}
]

...

@reiver@mastodon.social

There is also the other question of — would the resume / CV be JSON-LD.

On one hand, if it was in JSON-LD, it would make it machine-legible similar to ActivityPub.

On the other hand, I don't think anyone is going to write JSON-LD (especially HTML embedded in a JSON string value) by hand. But, I do think some people will want to write their resume by hand.

It feels like user-experience is fighting with JSON-LD based machine-legibility.

mastodon.social

@reiver ⊼ (Charles) :batman: (@reiver@mastodon.social)

How could you represent a resume / CV on the Fediverse and Social Web? Where would you put it? Etc? I think it is temping to put the whole resume in the Actor document. But, it is probably better for the Actor document to point (rather than include) it. And, have the resume / CV live somewhere else. It should probably be done in a way that let's people have multiple resumes / CV. For example, for different roles / career tracks, etc. #ActivityPub #ActivityStreams #FediDev #ProToGo #JSONLD

@reiver@mastodon.social

How could you represent a resume / CV on the Fediverse and Social Web? Where would you put it? Etc?

I think it is tempting to put the whole resume in the Actor document.

But, it is probably better for the Actor document to point (rather than include) it. And, have the resume / CV live somewhere else.

It should probably be done in a way that let's people have multiple resumes / CV. For example, for different roles / career tracks, etc.

@reiver@mastodon.social

How could you represent a resume / CV on the Fediverse and Social Web? Where would you put it? Etc?

I think it is tempting to put the whole resume in the Actor document.

But, it is probably better for the Actor document to point (rather than include) it. And, have the resume / CV live somewhere else.

It should probably be done in a way that let's people have multiple resumes / CV. For example, for different roles / career tracks, etc.

@reiver@mastodon.social

There is also the other question of — would the resume / CV be JSON-LD.

On one hand, if it was in JSON-LD, it would make it machine-legible similar to ActivityPub.

On the other hand, I don't think anyone is going to write JSON-LD (especially HTML embedded in a JSON string value) by hand. But, I do think some people will want to write their resume by hand.

It feels like user-experience is fighting with JSON-LD based machine-legibility.

mastodon.social

@reiver ⊼ (Charles) :batman: (@reiver@mastodon.social)

How could you represent a resume / CV on the Fediverse and Social Web? Where would you put it? Etc? I think it is temping to put the whole resume in the Actor document. But, it is probably better for the Actor document to point (rather than include) it. And, have the resume / CV live somewhere else. It should probably be done in a way that let's people have multiple resumes / CV. For example, for different roles / career tracks, etc. #ActivityPub #ActivityStreams #FediDev #ProToGo #JSONLD

@reiver@mastodon.social

How could you represent a resume / CV on the Fediverse and Social Web? Where would you put it? Etc?

I think it is tempting to put the whole resume in the Actor document.

But, it is probably better for the Actor document to point (rather than include) it. And, have the resume / CV live somewhere else.

It should probably be done in a way that let's people have multiple resumes / CV. For example, for different roles / career tracks, etc.

@reiver@mastodon.social

There is also the other question of — would the resume / CV be JSON-LD.

On one hand, if it was in JSON-LD, it would make it machine-legible similar to ActivityPub.

On the other hand, I don't think anyone is going to write JSON-LD (especially HTML embedded in a JSON string value) by hand. But, I do think some people will want to write their resume by hand.

It feels like user-experience is fighting with JSON-LD based machine-legibility.

mastodon.social

@reiver ⊼ (Charles) :batman: (@reiver@mastodon.social)

How could you represent a resume / CV on the Fediverse and Social Web? Where would you put it? Etc? I think it is temping to put the whole resume in the Actor document. But, it is probably better for the Actor document to point (rather than include) it. And, have the resume / CV live somewhere else. It should probably be done in a way that let's people have multiple resumes / CV. For example, for different roles / career tracks, etc. #ActivityPub #ActivityStreams #FediDev #ProToGo #JSONLD

@reiver@mastodon.social

How could you represent a resume / CV on the Fediverse and Social Web? Where would you put it? Etc?

I think it is tempting to put the whole resume in the Actor document.

But, it is probably better for the Actor document to point (rather than include) it. And, have the resume / CV live somewhere else.

It should probably be done in a way that let's people have multiple resumes / CV. For example, for different roles / career tracks, etc.

@reiver@mastodon.social

How could you represent a resume / CV on the Fediverse and Social Web? Where would you put it? Etc?

I think it is tempting to put the whole resume in the Actor document.

But, it is probably better for the Actor document to point (rather than include) it. And, have the resume / CV live somewhere else.

It should probably be done in a way that let's people have multiple resumes / CV. For example, for different roles / career tracks, etc.

@reiver@mastodon.social

How could you represent a resume / CV on the Fediverse and Social Web? Where would you put it? Etc?

I think it is tempting to put the whole resume in the Actor document.

But, it is probably better for the Actor document to point (rather than include) it. And, have the resume / CV live somewhere else.

It should probably be done in a way that let's people have multiple resumes / CV. For example, for different roles / career tracks, etc.

@reiver@mastodon.social

Remote Inbox Architecture

1/

This, the Remote Inbox Architecture, is an architecture for a Fediverse back-end server that I think could be useful.

Here is how it works — there are (at least) 2 servers involved: (1) the main back-end server, and (2) a remote inbox server.

The actor file on main back-end server "points" the inbox to the remote server.

It separates the user's content from the front-end related functionality

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

Remote Inbox Architecture

2/

The Remote Inbox server deals with incoming activities, objects, etc, from other users..

The front-end can get the inbox (and other feeds') data from the Remote Inbox server.

(You'd probably want to store cached data from the Fediverse elsewhere from these two servers, as I've said before. But, that is a separate thread.)

@reiver@mastodon.social

Remote Inbox Architecture

1/

This, the Remote Inbox Architecture, is an architecture for a Fediverse back-end server that I think could be useful.

Here is how it works — there are (at least) 2 servers involved: (1) the main back-end server, and (2) a remote inbox server.

The actor file on main back-end server "points" the inbox to the remote server.

It separates the user's content from the front-end related functionality

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

On moving an actor's content.

4/

Or, instead of using the ActivityPub 'Update' activity —

Couldn't we use the ActivityPub 'Move' activity.

w3.org/TR/activitystreams-voca

With the "origin" and "target" fields.

Where "origin" contains the old ID URL, and "target" contains the new ID URL.

.

        {
            "@context": "https://www.w3.org/ns/activitystreams",

            "origin":   "htps://example.com/users/joeblow/objects/150197",
            "target":   "http://host.example/~/objects/019e37",
        }
ALT text

{ "@context": "https://www.w3.org/ns/activitystreams", "origin": "htps://example.com/users/joeblow/objects/150197", "target": "http://host.example/~/objects/019e37", }

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

On moving an actor's content.

3/

There a many different conventions we could come up with to allow an ActvityPub 'Update' activity to be used to change an object's "id" field.

We (the Fediverse developer community) just need to pick one that everyone is willing to implement.

For example, perhaps the "origin", "result", or "target" field should be used:

w3.org/TR/activitystreams-voca

w3.org/TR/activitystreams-voca

w3.org/TR/activitystreams-voca

Or —

...

w3.org

Activity Vocabulary

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

On moving an actor's content.

2/

Could an ActivityPub 'Update' activity be used to move objects from one server to another server?

Could an 'Update' activity be used to change an object's "id" field?

After all, the "id" is used to identity what is being changed. It is the targeting mechanism.

How can you provide the old "id" to target the (old) object you want to change the "id" of, while also providing a new "id"?

w3.org/TR/activitypub/#update-

...

7.3 Update Activity

For server to server interactions, an Update activity means that the receiving server SHOULD update its copy of the object of the same id to the copy supplied in the Update activity. Unlike the client to server handling of the Update activity, this is not a partial update but a complete replacement of the object.

The receiving server MUST take care to be sure that the Update is authorized to modify its object. At minimum, this may be done by ensuring that the Update and its object are of same origin.
ALT text

7.3 Update Activity For server to server interactions, an Update activity means that the receiving server SHOULD update its copy of the object of the same id to the copy supplied in the Update activity. Unlike the client to server handling of the Update activity, this is not a partial update but a complete replacement of the object. The receiving server MUST take care to be sure that the Update is authorized to modify its object. At minimum, this may be done by ensuring that the Update and its object are of same origin.

7.3 Update Activity

For server to server interactions, an Update activity means that the receiving server SHOULD update its copy of the object of the same id to the copy supplied in the Update activity. Unlike the client to server handling of the Update activity, this is not a partial update but a complete replacement of the object.

The receiving server MUST take care to be sure that the Update is authorized to modify its object. At minimum, this may be done by ensuring that the Update and its object are of same origin.
ALT text

7.3 Update Activity For server to server interactions, an Update activity means that the receiving server SHOULD update its copy of the object of the same id to the copy supplied in the Update activity. Unlike the client to server handling of the Update activity, this is not a partial update but a complete replacement of the object. The receiving server MUST take care to be sure that the Update is authorized to modify its object. At minimum, this may be done by ensuring that the Update and its object are of same origin.

@reiver@mastodon.social

On moving an actor's content.

1/

One of the things that comes up on the Fediverse from time to time — is the ability for people to move their accounts.

For example, someone started off at:

@joeblow@example.com

But, now wants to "move" to:

@misterx@host.example

There is a mechanism to do that.

That mechanism moves their followers, their followees, BUT —

It does NOT move their content over!

That is a problem. Could we address this‽

...

@reiver@mastodon.social

I think ActivityPub Partial Updates won't work well with attachments or tags.

Not unless there is a way to reliably just target the item in the attachments or tags array that you want to modify. AFAIK, there isn't.

You have to download the old version of the whole attachments or tags array first, update it locally, and then upload the whole (updated) thing. This creates a race-condition.

See also: mastodon.social/@reiver/116446

@reiver@mastodon.social

In ActivityPub, these are all equivalent:

"type":"Banana"

"type":["Banana"]

"type":{"@id":"Banana"}

"type":[{"@id":"Banana"}]

"type":{"id":"Banana"}

"type":[{"id":"Banana"}]

"@type":"Banana"

"@type":["Banana"]

"@type":{"@id":"Banana"}

"@type":[{"@id":"Banana"}]

"@type":{"id":"Banana"}

"@type":[{"id":"Banana"}]

@reiver@mastodon.social

In ActivityPub, these are all equivalent:

"type":"Banana"

"type":["Banana"]

"type":{"@id":"Banana"}

"type":[{"@id":"Banana"}]

"type":{"id":"Banana"}

"type":[{"id":"Banana"}]

"@type":"Banana"

"@type":["Banana"]

"@type":{"@id":"Banana"}

"@type":[{"@id":"Banana"}]

"@type":{"id":"Banana"}

"@type":[{"id":"Banana"}]

@reiver@mastodon.social

ActivityPub specifications don't seem to provide a way to do Idempotent POSTs to your outbox.

That seems like a problem for C2S to me.

Networks are unreliable. You cannot tell the difference between an unreceived request vs an unreceived response. You'll get unwanted identical duplicate activities.

Although it isn't difficult to solve — a convention just needs to be picked.

For example, a new Idempotency field could be added to the JSON-LD payload.

@reiver@mastodon.social

ActivityPub specifications don't seem to provide a way to do Idempotent POSTs to your outbox.

That seems like a problem for C2S to me.

Networks are unreliable. You cannot tell the difference between an unreceived request vs an unreceived response. You'll get unwanted identical duplicate activities.

Although it isn't difficult to solve — a convention just needs to be picked.

For example, a new Idempotency field could be added to the JSON-LD payload.

@reiver@mastodon.social

ActivityPub specifications don't seem to provide a way to do Idempotent POSTs to your outbox.

That seems like a problem for C2S to me.

Networks are unreliable. You cannot tell the difference between an unreceived request vs an unreceived response. You'll get unwanted identical duplicate activities.

Although it isn't difficult to solve — a convention just needs to be picked.

For example, a new Idempotency field could be added to the JSON-LD payload.

@reiver@mastodon.social

ActivityPub specifications don't seem to provide a way to do Idempotent POSTs to your outbox.

That seems like a problem for C2S to me.

Networks are unreliable. You cannot tell the difference between an unreceived request vs an unreceived response. You'll get unwanted identical duplicate activities.

Although it isn't difficult to solve — a convention just needs to be picked.

For example, a new Idempotency field could be added to the JSON-LD payload.

@smallcircles@social.coop · Reply to Dawn Ahukanna

@dahukanna

Yes. I think you are asking exactly the right question:"What does it mean in this context?"

Many replies to the ponder related questions, or state an "it depends". It is clear there's a lot of nuance and edge cases.

Reformulated, how delete should work is solution-specific, depends on domain, use cases, and stakeholders in SX terms.

And Delete activity in is not the well-understood part of it is treated as today. See also:

social.coop/@smallcircles/1165

social.coop

🫧 socialcoding.. (@smallcircles@social.coop)

@hipsterelectron@circumstances.run @ireneista@irenes.space @kopper@not-brain.d.on-t.work I consider this to be part of the "misconceptions" that exist on the ActivityPub fediverse, to once more quote the term as Rich Hickey uses in "Hammock driven development". See: https://coding.social/blog/grassroots-evolution/#remove-misconceptions The way I look at ActivityStreams is as a toolbox of social primitives, building blocks for federated solutions. Not as core capabilities of the ActivityPub protocol. Because they are simply not specified as universal and ubiquitous protocol capabilities. If one particular object supports CRUD is solution-specific in my book. Ideally the ActivityStreams primitives all have well-defined singular purpose, but unfortunately that is not the case. More the opposite where everyone is encouraged to hammer their business domain into an ActivityStreams straitjacket.

@smallcircles@social.coop · Reply to d@nny disc@ mc²

@hipsterelectron @ireneista @kopper

I consider this to be part of the "misconceptions" that exist on the ActivityPub fediverse, to once more quote the term as Rich Hickey uses in "Hammock driven development". See:

coding.social/blog/grassroots-

The way I look at ActivityStreams is as a toolbox of social primitives, building blocks for federated solutions. Not as core capabilities of the ActivityPub protocol. Because they are simply not specified as universal and ubiquitous protocol capabilities.

If one particular object supports CRUD is solution-specific in my book. Ideally the ActivityStreams primitives all have well-defined singular purpose, but unfortunately that is not the case. More the opposite where everyone is encouraged to hammer their business domain into an ActivityStreams straitjacket.

coding.social

Grassroots fediverse evolution

Social dynamics in the grassroots fediverse ecosystem and laisséz-faire practices led to divergence from power and promise of the ActivityPub protocol. Grassroots standards and the ActivityPub API initiative can get us back on track.

@smallcircles@social.coop · Reply to Dawn Ahukanna

@dahukanna

Yes. I think you are asking exactly the right question:"What does it mean in this context?"

Many replies to the ponder related questions, or state an "it depends". It is clear there's a lot of nuance and edge cases.

Reformulated, how delete should work is solution-specific, depends on domain, use cases, and stakeholders in SX terms.

And Delete activity in is not the well-understood part of it is treated as today. See also:

social.coop/@smallcircles/1165

social.coop

🫧 socialcoding.. (@smallcircles@social.coop)

@hipsterelectron@circumstances.run @ireneista@irenes.space @kopper@not-brain.d.on-t.work I consider this to be part of the "misconceptions" that exist on the ActivityPub fediverse, to once more quote the term as Rich Hickey uses in "Hammock driven development". See: https://coding.social/blog/grassroots-evolution/#remove-misconceptions The way I look at ActivityStreams is as a toolbox of social primitives, building blocks for federated solutions. Not as core capabilities of the ActivityPub protocol. Because they are simply not specified as universal and ubiquitous protocol capabilities. If one particular object supports CRUD is solution-specific in my book. Ideally the ActivityStreams primitives all have well-defined singular purpose, but unfortunately that is not the case. More the opposite where everyone is encouraged to hammer their business domain into an ActivityStreams straitjacket.

@smallcircles@social.coop · Reply to d@nny disc@ mc²

@hipsterelectron @ireneista @kopper

I consider this to be part of the "misconceptions" that exist on the ActivityPub fediverse, to once more quote the term as Rich Hickey uses in "Hammock driven development". See:

coding.social/blog/grassroots-

The way I look at ActivityStreams is as a toolbox of social primitives, building blocks for federated solutions. Not as core capabilities of the ActivityPub protocol. Because they are simply not specified as universal and ubiquitous protocol capabilities.

If one particular object supports CRUD is solution-specific in my book. Ideally the ActivityStreams primitives all have well-defined singular purpose, but unfortunately that is not the case. More the opposite where everyone is encouraged to hammer their business domain into an ActivityStreams straitjacket.

coding.social

Grassroots fediverse evolution

Social dynamics in the grassroots fediverse ecosystem and laisséz-faire practices led to divergence from power and promise of the ActivityPub protocol. Grassroots standards and the ActivityPub API initiative can get us back on track.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

4/

Related (in quote-boost).

mastodon.social

@reiver ⊼ (Charles) :batman: (@reiver@mastodon.social)

To me, it feels like the Activity Types should have been past-tense verbs, rather than present-tense verbs. I.e.: • "Accepted" rather than "Accept" • "Added" rather than "Add" • "Announced" rather than "Announce" • "Arrived" rather than "Arrive" • "Blocked" rather than "Block" • "Created" rather than "Create" • etc Present-tense verbs feel like commands. Past-tense verbs feel like events. Activities are events not commands. #ActivityPub #ActivityStreams #DeSo #FediDev #FediDevs #Fediverse

@reiver@mastodon.social

To me, it feels like the Activity Types should have been past-tense verbs, rather than present-tense verbs.

I.e.:

• "Accepted" rather than "Accept"
• "Added" rather than "Add"
• "Announced" rather than "Announce"
• "Arrived" rather than "Arrive"
• "Blocked" rather than "Block"
• "Created" rather than "Create"
• etc

Present-tense verbs feel like commands.

Past-tense verbs feel like events.

Activities are events not commands.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

There is a comparison that can be made between ActivityPub and Event-Sourcing.

3/

With ActivityPub, Activities are often applied to an object. That object gets assigned an ID in the form of a URL.

(And, by URL I mean URL, URI, IRI, etc.)

One doesn't have to read through all the Activities in an inbox, outbox, etc to get the final state of an object.

One can just get the JSON-LD document from the object's ID URL to get the final state.

@reiver@mastodon.social

There is a comparison that can be made between ActivityPub and Event-Sourcing.

1/

With Event-Sourcing, your source-of-truth is an append-only series of events.

Ex: USER_REGISTERED, EMAIL_ADDRESS_VERIFIED, PASSWORD_CHANGED, etc.

In ActivityPub, this is similar to the inbox, outbox, etc being an append-only series of Activity.

Ex: Create, Like, Undo, etc.

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

Just thinking out loud —

If we wanted to support resumable uploads in C2S API, then — we probably need some URL to upload the file chunks to.

When a user POST to their own outbox, the HTTP "201 Created" response will have a "Location" header that provides a URL.

Maybe that could be used as the upload URL.

Or, maybe the JSON-LD document at that URL might contain a URL under the "object" field that could be used as the upload URL.

Other options too

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

I can think of different ways to support resumable uploads with ActivityPub, but — just to see what others are doing —

PeerTube seems to have resumable uploads already.

PeerTube seems to use this protocol for it:

github.com/kukhariev/node-uplo

I like that it uses Content-Range in the protocol. I would have done the similar.

github.com

node-uploadx/proto.md at master · kukhariev/node-uploadx

Node.js middleware for handling resumable uploads. Contribute to kukhariev/node-uploadx development by creating an account on GitHub.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

Just thinking out loud —

If we wanted to support resumable uploads in C2S API, then — we probably need some URL to upload the file chunks to.

When a user POST to their own outbox, the HTTP "201 Created" response will have a "Location" header that provides a URL.

Maybe that could be used as the upload URL.

Or, maybe the JSON-LD document at that URL might contain a URL under the "object" field that could be used as the upload URL.

Other options too

@reiver@mastodon.social

It seems as if the uploadMedia ActivityPub extension does not provide a way to resume an upload that didn't previously compete.

w3.org/wiki/SocialCG/ActivityP

If, for example, you are working with large files (such as video files) this would matter.

Because if you uploaded 1GB, and the upload stopped, you would want to resume at where it stopped, and not have to upload from the beginning again.

This would be important for ActivityPub C2S adoption.

w3.org

SocialCG/ActivityPub/MediaUpload - W3C Wiki

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

I can think of different ways to support resumable uploads with ActivityPub, but — just to see what others are doing —

PeerTube seems to have resumable uploads already.

PeerTube seems to use this protocol for it:

github.com/kukhariev/node-uplo

I like that it uses Content-Range in the protocol. I would have done the similar.

github.com

node-uploadx/proto.md at master · kukhariev/node-uploadx

Node.js middleware for handling resumable uploads. Contribute to kukhariev/node-uploadx development by creating an account on GitHub.

@reiver@mastodon.social

It seems as if the uploadMedia ActivityPub extension does not provide a way to resume an upload that didn't previously compete.

w3.org/wiki/SocialCG/ActivityP

If, for example, you are working with large files (such as video files) this would matter.

Because if you uploaded 1GB, and the upload stopped, you would want to resume at where it stopped, and not have to upload from the beginning again.

This would be important for ActivityPub C2S adoption.

w3.org

SocialCG/ActivityPub/MediaUpload - W3C Wiki

@reiver@mastodon.social
@reiver@mastodon.social
@reiver@mastodon.social
@reiver@mastodon.social

What if web-browsers could render the ActivityPub / ActivityStreams JSON-LD source-code into the document it represents?

Fediverse clients can do it — why can't browsers?

I previously created a small-net / small-web browser client named SpaceMonkey.

It supports protocols such as Gemini, HTTP, HTTPS, Mercury, etc. And, formats such as GemText, HTML, Markdown, etc.

It now supports the ActivityPub / ActivityStreams JSON-LD format, too.

@reiver@mastodon.social

What if web-browsers could render the ActivityPub / ActivityStreams JSON-LD source-code into the document it represents?

Fediverse clients can do it — why can't browsers?

I previously created a small-net / small-web browser client named SpaceMonkey.

It supports protocols such as Gemini, HTTP, HTTPS, Mercury, etc. And, formats such as GemText, HTML, Markdown, etc.

It now supports the ActivityPub / ActivityStreams JSON-LD format, too.

@reiver@mastodon.social

What if web-browsers could render the ActivityPub / ActivityStreams JSON-LD source-code into the document it represents?

Fediverse clients can do it — why can't browsers?

I previously created a small-net / small-web browser client named SpaceMonkey.

It supports protocols such as Gemini, HTTP, HTTPS, Mercury, etc. And, formats such as GemText, HTML, Markdown, etc.

It now supports the ActivityPub / ActivityStreams JSON-LD format, too.

@reiver@mastodon.social

What should the file-extension for ActivityPub / ActivityStreams documents be?

I.e., for application/activity+json data?

I've been using .activity

Ex: filename.activity

(The extension cannot be .json or .jsonld if you want to be able to detect it just based on the file-extension.)

What do you think?

@reiver@mastodon.social

What should the file-extension for ActivityPub / ActivityStreams documents be?

I.e., for application/activity+json data?

I've been using .activity

Ex: filename.activity

(The extension cannot be .json or .jsonld if you want to be able to detect it just based on the file-extension.)

What do you think?

@reiver@mastodon.social

What makes an ActivityPub Actor an Actor?

I think it is probably a bad idea to just restrict it to things with 'type': "Application", "Group", "Organization", "Person", and "Service". Restricting it to just those would mean you couldn't have new actor types (and sub-types) in the future.

So then, do we do it in a duck-typing way? And if "yes", how?

Maybe if something has an "inbox" OR and "outbox" it is an Actor. I.e., it could have just one of those.

@reiver@mastodon.social

If an ActivityPub Actor is something that has an "inbox" or an "outbox" (i.e., it could have just one or both) then —

Perhaps we should also be talking about "sources" and "sinks", too. Where —

An ActivityPub Source is an Actor with just an "outbox" (and no "inbox").

And, an ActivityPub Sink is an Actor with just an "inbox" (and no "outbox").

mastodon.social

@reiver ⊼ (Charles) :batman: (@reiver@mastodon.social)

What makes an ActivityPub Actor an Actor? I think it is probably a bad idea to just restrict it to things with 'type': "Application", "Group", "Organization", "Person", and "Service". Restricting it to just those would mean you couldn't have new actor types (and sub-types) in the future. So then, do we do it in a duck-typing way? And if "yes", how? Maybe if something has an "inbox" OR and "outbox" it is an Actor. I.e., it could have just one of those. #ActivityPub #ActivityStreams #FediDev

@reiver@mastodon.social

What makes an ActivityPub Actor an Actor?

I think it is probably a bad idea to just restrict it to things with 'type': "Application", "Group", "Organization", "Person", and "Service". Restricting it to just those would mean you couldn't have new actor types (and sub-types) in the future.

So then, do we do it in a duck-typing way? And if "yes", how?

Maybe if something has an "inbox" OR and "outbox" it is an Actor. I.e., it could have just one of those.

@reiver@mastodon.social

What makes an ActivityPub Actor an Actor?

I think it is probably a bad idea to just restrict it to things with 'type': "Application", "Group", "Organization", "Person", and "Service". Restricting it to just those would mean you couldn't have new actor types (and sub-types) in the future.

So then, do we do it in a duck-typing way? And if "yes", how?

Maybe if something has an "inbox" OR and "outbox" it is an Actor. I.e., it could have just one of those.

@reiver@mastodon.social

If an ActivityPub Actor is something that has an "inbox" or an "outbox" (i.e., it could have just one or both) then —

Perhaps we should also be talking about "sources" and "sinks", too. Where —

An ActivityPub Source is an Actor with just an "outbox" (and no "inbox").

And, an ActivityPub Sink is an Actor with just an "inbox" (and no "outbox").

mastodon.social

@reiver ⊼ (Charles) :batman: (@reiver@mastodon.social)

What makes an ActivityPub Actor an Actor? I think it is probably a bad idea to just restrict it to things with 'type': "Application", "Group", "Organization", "Person", and "Service". Restricting it to just those would mean you couldn't have new actor types (and sub-types) in the future. So then, do we do it in a duck-typing way? And if "yes", how? Maybe if something has an "inbox" OR and "outbox" it is an Actor. I.e., it could have just one of those. #ActivityPub #ActivityStreams #FediDev

@reiver@mastodon.social

What makes an ActivityPub Actor an Actor?

I think it is probably a bad idea to just restrict it to things with 'type': "Application", "Group", "Organization", "Person", and "Service". Restricting it to just those would mean you couldn't have new actor types (and sub-types) in the future.

So then, do we do it in a duck-typing way? And if "yes", how?

Maybe if something has an "inbox" OR and "outbox" it is an Actor. I.e., it could have just one of those.

@reiver@mastodon.social

If an ActivityPub Actor is something that has an "inbox" or an "outbox" (i.e., it could have just one or both) then —

Perhaps we should also be talking about "sources" and "sinks", too. Where —

An ActivityPub Source is an Actor with just an "outbox" (and no "inbox").

And, an ActivityPub Sink is an Actor with just an "inbox" (and no "outbox").

mastodon.social

@reiver ⊼ (Charles) :batman: (@reiver@mastodon.social)

What makes an ActivityPub Actor an Actor? I think it is probably a bad idea to just restrict it to things with 'type': "Application", "Group", "Organization", "Person", and "Service". Restricting it to just those would mean you couldn't have new actor types (and sub-types) in the future. So then, do we do it in a duck-typing way? And if "yes", how? Maybe if something has an "inbox" OR and "outbox" it is an Actor. I.e., it could have just one of those. #ActivityPub #ActivityStreams #FediDev

@reiver@mastodon.social

What makes an ActivityPub Actor an Actor?

I think it is probably a bad idea to just restrict it to things with 'type': "Application", "Group", "Organization", "Person", and "Service". Restricting it to just those would mean you couldn't have new actor types (and sub-types) in the future.

So then, do we do it in a duck-typing way? And if "yes", how?

Maybe if something has an "inbox" OR and "outbox" it is an Actor. I.e., it could have just one of those.

@reiver@mastodon.social

What makes an ActivityPub Actor an Actor?

I think it is probably a bad idea to just restrict it to things with 'type': "Application", "Group", "Organization", "Person", and "Service". Restricting it to just those would mean you couldn't have new actor types (and sub-types) in the future.

So then, do we do it in a duck-typing way? And if "yes", how?

Maybe if something has an "inbox" OR and "outbox" it is an Actor. I.e., it could have just one of those.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

2/

The game will be social.

Your player gains things in the game by being followed (and perhaps following back) Actors on the Fediverse.

For example, you would have a team. The characters on your team would be Fedivese Actors / accounts. This could be bot accounts, but could also be the accounts of other people playing the game.

Same with energy sources, special powers, etc — all Fedivese Actors / accounts.

@reiver@mastodon.social

I think Mastodon will strip image attachments from ActivityPub 'Question' objects.

That is too bad.

That means even if you create an 'Question' with 'Image' attachments elsewhere, you still won't see them in Mastodon (or in the Mastodon client-server API)

I guess the work-around is to post a 'Note' with an 'Image' attachment(s), and then reply to it with a 'Question'. That feels clunkier, but doable

mastodon.social

@reiver ⊼ (Charles) :batman: (@reiver@mastodon.social)

If one was to create a Fediverse Game using the ActivityPub 'Question' — It would be nice if people could play it from a regular Fediverse client. But, you could also offer a game-specific client that allows for a richer game experience. #ActivitiyPub #ActivityStream #FediDev #FediGames #Games #VideoGames

@reiver@mastodon.social

If one was to create a Fediverse Game using the ActivityPub 'Question' —

It would be nice if people could play it from a regular Fediverse client.

But, you could also offer a game-specific client that allows for a richer game experience.

mastodon.social

@reiver ⊼ (Charles) :batman: (@reiver@mastodon.social)

Attached: 1 image I think you could create a (certain type of) video game using the ActivityPub 'Question'. https://www.w3.org/TR/activitystreams-vocabulary/#dfn-question #ActivitiyPub #ActivityStream #FediDev #FediGames #Games #VideoGames

@reiver@mastodon.social

One decision to make if one was to create a Fediverse Game using the ActivityPub 'Question' —

Do you just create a bot that connect to a Fediverse server (such as a Mastodon server)?

Or, do you create the Fediverse server, too?

...

There are pros and cons each way.

The former is simpler to build in many ways.

The latter lets you add as many poll choices as you want, and even add extra JSON-LD name-spaces.

mastodon.social

@reiver ⊼ (Charles) :batman: (@reiver@mastodon.social)

Attached: 1 image I think you could create a (certain type of) video game using the ActivityPub 'Question'. https://www.w3.org/TR/activitystreams-vocabulary/#dfn-question #ActivitiyPub #ActivityStream #FediDev #FediGames #Games #VideoGames

@smallcircles@social.coop · Reply to @reiver ⊼ (Charles) :batman:

@reiver

These are all conventions, and domain-specific conventions at that in my perspective, addressed in latest (long) blog post on grassroots evolution. In other words the choice depends on the domain you are modeling, and the solution requirements.

I am musing on a AP protocol extension, which acts as an overlay network, that operates more according to the Actor Model. Actors can be of many types, can be created on-the-fly, be part of supervision trees, have different lifetimes, etc.

Also they are decoupled from Identity. The have ActorId of course, but a Person actor does not relate directly to the person, and might as well be operated by a bot script. How exactly I'll model that remains open, but Profile may play a role, as an Identity visitor's card to exchange, kind of.

@smallcircles@social.coop · Reply to argv minus one

@argv_minus_one @pawv

Yea. The Tombstone object is available in but I think it is very tricky indeed to have a proper wire implementation.

Suppose someone crosses the line in their conversation, receives harsh criticism, and decides to remove their post, now the wriggling tail of critique and judgment becomes detached from the popular originator toot in the thread. Unattached, floating freely in fabric, often without the context on why criticism was deserved. A harrasser comes off easy, one can say. They also have more chance to 'clean their slate', by showing better and re-earn lost respect if their comms violation wasn't too egregious.

A tombstone inserted in the deletion space, even when totally anonymised, still has mentions of the person in the following replies, which for a full-blown "right to be removed" would involve removing those too. Or else a respondent can make sure that the bad Monday someone had, remains carved in stone.

@reiver@mastodon.social

ActivityPub outboxes are the new RSS / Atom / WebFeed.

You can just read from them to get a JSON feed of someone's posts.

I.e., you do NOT have to implement the full suite of Fediverse protocols, or Follow, or run your own server, or anything else to get someone's posts on the Fediverse — just read from their outbox.

@reiver@mastodon.social

I am outputting ActivityPub/ActivityStreams content for the listing of what is in a directory.

Think of it as the AP/AS version of output from the `ls` command.

AP/AS has a whole bunch of stuff that can be used to represents files. Even sub-types of files

w3.org/TR/activitystreams-voca

And, while AP/AS has 'Collection' (and 'CollectionPage') —

w3.org/TR/activitystreams-voca

AP/AS doesn't have a 'Directory' type (as a sub-type of 'Collection')

w3.org

Activity Vocabulary

@reiver@mastodon.social

I am outputting ActivityPub/ActivityStreams content for the listing of what is in a directory.

Think of it as the AP/AS version of output from the `ls` command.

AP/AS has a whole bunch of stuff that can be used to represents files. Even sub-types of files

w3.org/TR/activitystreams-voca

And, while AP/AS has 'Collection' (and 'CollectionPage') —

w3.org/TR/activitystreams-voca

AP/AS doesn't have a 'Directory' type (as a sub-type of 'Collection')

w3.org

Activity Vocabulary

@smallcircles@social.coop · Reply to @reiver ⊼ (Charles) :batman:

@reiver

Today "ActivityStreams: Where do you want to go to today?" might be a slogan we borrowed from Microsoft.

The question is whether should be used - besides all the things it is already being used for - to also map to file systems.

The nature of is generally shunned in favor of plain . That in itself is fine, as long as:

a) information still represents valid .

b) information models still follow data modeling best practices.

c) information models are designed with in mind.

Not saying your approach is good or bad, just observing that everyone mapping and overloading their own app-specific semantics to the poor AS vocab looks to me a worst-practice. We can get away with it, as we made post-facto interop the poor man's accepted practice, lacking more rigorous extension process and guidance.

There are likely existing standardized ontologies.

@reiver@mastodon.social

I am outputting ActivityPub/ActivityStreams content for the listing of what is in a directory.

Think of it as the AP/AS version of output from the `ls` command.

AP/AS has a whole bunch of stuff that can be used to represents files. Even sub-types of files

w3.org/TR/activitystreams-voca

And, while AP/AS has 'Collection' (and 'CollectionPage') —

w3.org/TR/activitystreams-voca

AP/AS doesn't have a 'Directory' type (as a sub-type of 'Collection')

w3.org

Activity Vocabulary

@reiver@mastodon.social

I've seen an ongoing debate between "Note" versus "Article" in ActivityPub / ActivityStreams.

When is something a "Note"‽
When is something an "Article"‽

Personally — I would probably have made the distinction this way.

An "Article" has a title.
A "Note" doesn't have a title.

(In ActivityPub / ActivityStreams, a 'title' seems to tend to get represented in the "name" field.)

@hongminhee@hollo.social

So, an interesting issue came up in the repo that I've been thinking about: #629.

You know how every server uses schema:PropertyValue in actor attachment for profile metadata fields (like “Website”, “GitHub”, etc.)? Turns out, strict validators like browser.pub reject it, because the AS2 spec says attachment should only contain Object or Link—and PropertyValue is a schema.org type, not an Activity Streams 2.0 type.

The thing is, we can't just drop the type like we did with Endpoints (#576), because Mastodon and others rely on seeing "type": "PropertyValue" to render profile fields. But at the same time, it's technically not spec-compliant.

I'm leaning towards writing a to formalize this existing practice rather than trying to invent a new type (like toot:PropertyValue extending Object), which would be a nightmare to migrate across the whole fediverse.

What do you all think? Has anyone else run into this? Would love to hear thoughts from implementers and spec folks.

github.com

Endpoints object serializes with invalid "type": "as:Endpoints" in actor JSON · Issue #576 · fedify-dev/fedify

Description When Fedify serializes an actor's endpoints property to JSON-LD (compacted), it includes "type": "as:Endpoints" in the output: "endpoints": { "type": "as:Endpoints", "sharedInbox": "htt...

@hongminhee@hollo.social

So, an interesting issue came up in the repo that I've been thinking about: #629.

You know how every server uses schema:PropertyValue in actor attachment for profile metadata fields (like “Website”, “GitHub”, etc.)? Turns out, strict validators like browser.pub reject it, because the AS2 spec says attachment should only contain Object or Link—and PropertyValue is a schema.org type, not an Activity Streams 2.0 type.

The thing is, we can't just drop the type like we did with Endpoints (#576), because Mastodon and others rely on seeing "type": "PropertyValue" to render profile fields. But at the same time, it's technically not spec-compliant.

I'm leaning towards writing a to formalize this existing practice rather than trying to invent a new type (like toot:PropertyValue extending Object), which would be a nightmare to migrate across the whole fediverse.

What do you all think? Has anyone else run into this? Would love to hear thoughts from implementers and spec folks.

github.com

Endpoints object serializes with invalid "type": "as:Endpoints" in actor JSON · Issue #576 · fedify-dev/fedify

Description When Fedify serializes an actor's endpoints property to JSON-LD (compacted), it includes "type": "as:Endpoints" in the output: "endpoints": { "type": "as:Endpoints", "sharedInbox": "htt...

@hongminhee@hollo.social

So, an interesting issue came up in the repo that I've been thinking about: #629.

You know how every server uses schema:PropertyValue in actor attachment for profile metadata fields (like “Website”, “GitHub”, etc.)? Turns out, strict validators like browser.pub reject it, because the AS2 spec says attachment should only contain Object or Link—and PropertyValue is a schema.org type, not an Activity Streams 2.0 type.

The thing is, we can't just drop the type like we did with Endpoints (#576), because Mastodon and others rely on seeing "type": "PropertyValue" to render profile fields. But at the same time, it's technically not spec-compliant.

I'm leaning towards writing a to formalize this existing practice rather than trying to invent a new type (like toot:PropertyValue extending Object), which would be a nightmare to migrate across the whole fediverse.

What do you all think? Has anyone else run into this? Would love to hear thoughts from implementers and spec folks.

github.com

Endpoints object serializes with invalid "type": "as:Endpoints" in actor JSON · Issue #576 · fedify-dev/fedify

Description When Fedify serializes an actor's endpoints property to JSON-LD (compacted), it includes "type": "as:Endpoints" in the output: "endpoints": { "type": "as:Endpoints", "sharedInbox": "htt...

@hongminhee@hollo.social

So, an interesting issue came up in the repo that I've been thinking about: #629.

You know how every server uses schema:PropertyValue in actor attachment for profile metadata fields (like “Website”, “GitHub”, etc.)? Turns out, strict validators like browser.pub reject it, because the AS2 spec says attachment should only contain Object or Link—and PropertyValue is a schema.org type, not an Activity Streams 2.0 type.

The thing is, we can't just drop the type like we did with Endpoints (#576), because Mastodon and others rely on seeing "type": "PropertyValue" to render profile fields. But at the same time, it's technically not spec-compliant.

I'm leaning towards writing a to formalize this existing practice rather than trying to invent a new type (like toot:PropertyValue extending Object), which would be a nightmare to migrate across the whole fediverse.

What do you all think? Has anyone else run into this? Would love to hear thoughts from implementers and spec folks.

github.com

Endpoints object serializes with invalid "type": "as:Endpoints" in actor JSON · Issue #576 · fedify-dev/fedify

Description When Fedify serializes an actor's endpoints property to JSON-LD (compacted), it includes "type": "as:Endpoints" in the output: "endpoints": { "type": "as:Endpoints", "sharedInbox": "htt...

@hongminhee@hollo.social

So, an interesting issue came up in the repo that I've been thinking about: #629.

You know how every server uses schema:PropertyValue in actor attachment for profile metadata fields (like “Website”, “GitHub”, etc.)? Turns out, strict validators like browser.pub reject it, because the AS2 spec says attachment should only contain Object or Link—and PropertyValue is a schema.org type, not an Activity Streams 2.0 type.

The thing is, we can't just drop the type like we did with Endpoints (#576), because Mastodon and others rely on seeing "type": "PropertyValue" to render profile fields. But at the same time, it's technically not spec-compliant.

I'm leaning towards writing a to formalize this existing practice rather than trying to invent a new type (like toot:PropertyValue extending Object), which would be a nightmare to migrate across the whole fediverse.

What do you all think? Has anyone else run into this? Would love to hear thoughts from implementers and spec folks.

github.com

Endpoints object serializes with invalid "type": "as:Endpoints" in actor JSON · Issue #576 · fedify-dev/fedify

Description When Fedify serializes an actor's endpoints property to JSON-LD (compacted), it includes "type": "as:Endpoints" in the output: "endpoints": { "type": "as:Endpoints", "sharedInbox": "htt...

@hongminhee@hollo.social

So, an interesting issue came up in the repo that I've been thinking about: #629.

You know how every server uses schema:PropertyValue in actor attachment for profile metadata fields (like “Website”, “GitHub”, etc.)? Turns out, strict validators like browser.pub reject it, because the AS2 spec says attachment should only contain Object or Link—and PropertyValue is a schema.org type, not an Activity Streams 2.0 type.

The thing is, we can't just drop the type like we did with Endpoints (#576), because Mastodon and others rely on seeing "type": "PropertyValue" to render profile fields. But at the same time, it's technically not spec-compliant.

I'm leaning towards writing a to formalize this existing practice rather than trying to invent a new type (like toot:PropertyValue extending Object), which would be a nightmare to migrate across the whole fediverse.

What do you all think? Has anyone else run into this? Would love to hear thoughts from implementers and spec folks.

github.com

Endpoints object serializes with invalid "type": "as:Endpoints" in actor JSON · Issue #576 · fedify-dev/fedify

Description When Fedify serializes an actor's endpoints property to JSON-LD (compacted), it includes "type": "as:Endpoints" in the output: "endpoints": { "type": "as:Endpoints", "sharedInbox": "htt...

@hongminhee@hollo.social

So, an interesting issue came up in the repo that I've been thinking about: #629.

You know how every server uses schema:PropertyValue in actor attachment for profile metadata fields (like “Website”, “GitHub”, etc.)? Turns out, strict validators like browser.pub reject it, because the AS2 spec says attachment should only contain Object or Link—and PropertyValue is a schema.org type, not an Activity Streams 2.0 type.

The thing is, we can't just drop the type like we did with Endpoints (#576), because Mastodon and others rely on seeing "type": "PropertyValue" to render profile fields. But at the same time, it's technically not spec-compliant.

I'm leaning towards writing a to formalize this existing practice rather than trying to invent a new type (like toot:PropertyValue extending Object), which would be a nightmare to migrate across the whole fediverse.

What do you all think? Has anyone else run into this? Would love to hear thoughts from implementers and spec folks.

github.com

Endpoints object serializes with invalid "type": "as:Endpoints" in actor JSON · Issue #576 · fedify-dev/fedify

Description When Fedify serializes an actor's endpoints property to JSON-LD (compacted), it includes "type": "as:Endpoints" in the output: "endpoints": { "type": "as:Endpoints", "sharedInbox": "htt...

@hongminhee@hollo.social

So, an interesting issue came up in the repo that I've been thinking about: #629.

You know how every server uses schema:PropertyValue in actor attachment for profile metadata fields (like “Website”, “GitHub”, etc.)? Turns out, strict validators like browser.pub reject it, because the AS2 spec says attachment should only contain Object or Link—and PropertyValue is a schema.org type, not an Activity Streams 2.0 type.

The thing is, we can't just drop the type like we did with Endpoints (#576), because Mastodon and others rely on seeing "type": "PropertyValue" to render profile fields. But at the same time, it's technically not spec-compliant.

I'm leaning towards writing a to formalize this existing practice rather than trying to invent a new type (like toot:PropertyValue extending Object), which would be a nightmare to migrate across the whole fediverse.

What do you all think? Has anyone else run into this? Would love to hear thoughts from implementers and spec folks.

github.com

Endpoints object serializes with invalid "type": "as:Endpoints" in actor JSON · Issue #576 · fedify-dev/fedify

Description When Fedify serializes an actor's endpoints property to JSON-LD (compacted), it includes "type": "as:Endpoints" in the output: "endpoints": { "type": "as:Endpoints", "sharedInbox": "htt...

@hongminhee@hollo.social

So, an interesting issue came up in the repo that I've been thinking about: #629.

You know how every server uses schema:PropertyValue in actor attachment for profile metadata fields (like “Website”, “GitHub”, etc.)? Turns out, strict validators like browser.pub reject it, because the AS2 spec says attachment should only contain Object or Link—and PropertyValue is a schema.org type, not an Activity Streams 2.0 type.

The thing is, we can't just drop the type like we did with Endpoints (#576), because Mastodon and others rely on seeing "type": "PropertyValue" to render profile fields. But at the same time, it's technically not spec-compliant.

I'm leaning towards writing a to formalize this existing practice rather than trying to invent a new type (like toot:PropertyValue extending Object), which would be a nightmare to migrate across the whole fediverse.

What do you all think? Has anyone else run into this? Would love to hear thoughts from implementers and spec folks.

github.com

Endpoints object serializes with invalid "type": "as:Endpoints" in actor JSON · Issue #576 · fedify-dev/fedify

Description When Fedify serializes an actor's endpoints property to JSON-LD (compacted), it includes "type": "as:Endpoints" in the output: "endpoints": { "type": "as:Endpoints", "sharedInbox": "htt...

@hongminhee@hollo.social

So, an interesting issue came up in the repo that I've been thinking about: #629.

You know how every server uses schema:PropertyValue in actor attachment for profile metadata fields (like “Website”, “GitHub”, etc.)? Turns out, strict validators like browser.pub reject it, because the AS2 spec says attachment should only contain Object or Link—and PropertyValue is a schema.org type, not an Activity Streams 2.0 type.

The thing is, we can't just drop the type like we did with Endpoints (#576), because Mastodon and others rely on seeing "type": "PropertyValue" to render profile fields. But at the same time, it's technically not spec-compliant.

I'm leaning towards writing a to formalize this existing practice rather than trying to invent a new type (like toot:PropertyValue extending Object), which would be a nightmare to migrate across the whole fediverse.

What do you all think? Has anyone else run into this? Would love to hear thoughts from implementers and spec folks.

github.com

Endpoints object serializes with invalid "type": "as:Endpoints" in actor JSON · Issue #576 · fedify-dev/fedify

Description When Fedify serializes an actor's endpoints property to JSON-LD (compacted), it includes "type": "as:Endpoints" in the output: "endpoints": { "type": "as:Endpoints", "sharedInbox": "htt...

@reiver@mastodon.social

1/

AFAIK, there isn't a way for an ActivityPub Actor (such as a Person actor) to specify a list of Service actors associated with it.

...

For example, imagine that there is a Service actor that represents a way to make a video call to me.

And, for example, I have my Mastodon Person actor.

And, I want to let people know about it (and other Service actors associated with me).

How do I do that using AP, etc‽

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

7/

Continuing to look for an alternative to "attachment" (for properly supporting an Actor specifying a list of CALL Service actors associated with it) —

Maybe a call specific custom top-level attribute would be useful.

Maybe something like:

"call": [
{
"rel":"callpub",
"href":"https://videocalls.example/users/joeblow"
}
]

Or even:

"call": [
"href":"https://videocalls.example/users/joeblow"
]

.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

6/

Continuing to look for an alternative to "attachment" (for properly supporting an Actor specifying a list of Service actors associated with it) —

Maybe a custom top-level attribute would be useful.

Maybe something like:

"service": [
{
"rel":"callpub",
"href":"https://videocalls.example/users/joeblow"
}
]

Although perhaps that is not much better than "attachment", if you just care about calls

So —

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

4/

Looking for an alternative to "attachment" (for properly supporting an Actor specifying a list of Service actors associated with it) —

I think using "alsoKnownAs" or "sameAs" would be a poor choice. The semantics are wrong.

For example: a Service actor might represent my mobile phone (or software on it). My phone is not me. It is something I have.

So —

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

3/

But, what about the non- fall-back situation where software could properly support this (when an Actor specifies a list of Service actors associated with it)‽

I think some might say, put the associated Service actors in "attachment". And, semantically I think that would work with ActivityPub, but — I have a very strong dislike with putting everything in "attachment" (and "tag"). It makes parsing difficult.

So —

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

2/

Because most people wouldn't be able to add custom attributes or custom values to most Fediverse software (including Mastodon) —

Most supporting software would probably want to support a "PropertyValue" link in "attachment" field as a fall-back

For example:

"attachment": [
{
"type": "PropertyValue",
"name": "Video Calls (callpub)",
"value": "https://videocalls.example/users/joeblow"
}

But —

...

@reiver@mastodon.social

1/

AFAIK, there isn't a way for an ActivityPub Actor (such as a Person actor) to specify a list of Service actors associated with it.

...

For example, imagine that there is a Service actor that represents a way to make a video call to me.

And, for example, I have my Mastodon Person actor.

And, I want to let people know about it (and other Service actors associated with me).

How do I do that using AP, etc‽

...

@naturzukunft2026@mastodon.social
@naturzukunft2026@mastodon.social
@reiver@mastodon.social

I used to not like JSON-LD. And then I got exposed to CBOR. And, since then, I ended up liking JSON-LD more than I did before.

j12t.social/@j12t/114581086678

...

I was looking for performant ways of storing JSON-LD data, so that it can be looked up, queried, etc.

CBOR might actually be a way of doing that.

...

For me that is an odd realization given me liking JSON-LD is a reaction to CBOR.

j12t.social

Johannes Ernst (@j12t@j12t.social)

OH: "I didn't like JSON-LD, but then I saw CBOR, and now I like JSON-LD much better"

@reiver@mastodon.social

I used to not like JSON-LD. And then I got exposed to CBOR. And, since then, I ended up liking JSON-LD more than I did before.

j12t.social/@j12t/114581086678

...

I was looking for performant ways of storing JSON-LD data, so that it can be looked up, queried, etc.

CBOR might actually be a way of doing that.

...

For me that is an odd realization given me liking JSON-LD is a reaction to CBOR.

j12t.social

Johannes Ernst (@j12t@j12t.social)

OH: "I didn't like JSON-LD, but then I saw CBOR, and now I like JSON-LD much better"

@reiver@mastodon.social

FWIW, I have been storing Linked Data (including ActivityPub) in an INI like format — because I find INI-like formats more human-friendly (to both read and write) than JSON.

YAML is probably better than JSON, too, in that respects. But I think INI-like formats are better than YAML.

w3c.social

World Wide Web Consortium (@w3c@w3c.social)

Attached: 1 image The JSON-LD Working Group published today a First Public Working Draft of YAML-LD 1.0. [JSON-LD11] is a JSON-based format to serialize Linked Data. In recent years, [YAML] has emerged as a more concise format to represent information that had previously been serialized as [JSON], including API specifications, data schemas, and Linked Data. #LinkedData #MachineReadable #WebStandards https://www.w3.org/news/2026/first-public-working-draft-yaml-ld-1-0/

The JSON-LD Working Group published today a First Public Working Draft of YAML-LD 1.0. [JSON-LD11] is a JSON-based format to serialize Linked Data. In recent years, [YAML] has emerged as a more concise format to represent information that had previously been serialized as [JSON], including API specifications, data schemas, and Linked Data.


w3.org/news/2026/first-public-


Example 3: Basic YAML-LD document
"@context": https://schema.org
"@id": https://w3.org/yaml-ld/
"@type": WebContent
name: YAML-LD
author:
  "@id": https://www.w3.org/community/json-ld
  name: JSON-LD Community Group
ALT text

Example 3: Basic YAML-LD document "@context": https://schema.org "@id": https://w3.org/yaml-ld/ "@type": WebContent name: YAML-LD author: "@id": https://www.w3.org/community/json-ld name: JSON-LD Community Group

@reiver@mastodon.social

FWIW, I have been storing Linked Data (including ActivityPub) in an INI like format — because I find INI-like formats more human-friendly (to both read and write) than JSON.

YAML is probably better than JSON, too, in that respects. But I think INI-like formats are better than YAML.

w3c.social

World Wide Web Consortium (@w3c@w3c.social)

Attached: 1 image The JSON-LD Working Group published today a First Public Working Draft of YAML-LD 1.0. [JSON-LD11] is a JSON-based format to serialize Linked Data. In recent years, [YAML] has emerged as a more concise format to represent information that had previously been serialized as [JSON], including API specifications, data schemas, and Linked Data. #LinkedData #MachineReadable #WebStandards https://www.w3.org/news/2026/first-public-working-draft-yaml-ld-1-0/

The JSON-LD Working Group published today a First Public Working Draft of YAML-LD 1.0. [JSON-LD11] is a JSON-based format to serialize Linked Data. In recent years, [YAML] has emerged as a more concise format to represent information that had previously been serialized as [JSON], including API specifications, data schemas, and Linked Data.


w3.org/news/2026/first-public-


Example 3: Basic YAML-LD document
"@context": https://schema.org
"@id": https://w3.org/yaml-ld/
"@type": WebContent
name: YAML-LD
author:
  "@id": https://www.w3.org/community/json-ld
  name: JSON-LD Community Group
ALT text

Example 3: Basic YAML-LD document "@context": https://schema.org "@id": https://w3.org/yaml-ld/ "@type": WebContent name: YAML-LD author: "@id": https://www.w3.org/community/json-ld name: JSON-LD Community Group

@reiver@mastodon.social

With ActivityPub / ActivityStreams...

To me, it feels like there should have been something that is a common parent of both 'Object' and 'Link'.

That just had the "name", "nameMap", and "preview" fields (along with "id" and "type, of course) — since that is what 'Object' and 'Link' share in common.

I'll just call this common parent: 'Entity'.

...

It could have even been an opportunity to talk about how to handle unknown types.

@reiver@mastodon.social

maho.dev

A guide to implement ActivityPub in a static site (or any website)

Hi! I have created this index for easy navigation. In Part 1, we will discuss why it is important to bring your site to the Fediverse. In Part 2, we will delve into an overview of the design of my implementation. In Part 3, we will make your blog discovereable in the fediverse. In Part 4, we will generate our notes and outbox, which contains posts ready to be shared in the Fediverse. Part 5, is an interlude to implement a subscribing to your site feature with fediverse accounts.

@reiver@mastodon.social

1/

It doesn't take much effort to make your website join the Fediverse and the open social-web IN A VERY BASIC WAY,.

And by "VERY BASIC WAY" I mean — being able to look up your website using a Fediverse ID and have a profile show up.

I did it for my (new) personal website last night.

(Screenshot of the profile Mastodon shows for my (new) personal website attached.)

NOTE: DO NOT FOLLOW IT YET. FOLLOWING DOESN'T WON'T WORK YET.

...

All I had to do was —

🧵

@reiver@mastodon.social

maho.dev

A guide to implement ActivityPub in a static site (or any website)

Hi! I have created this index for easy navigation. In Part 1, we will discuss why it is important to bring your site to the Fediverse. In Part 2, we will delve into an overview of the design of my implementation. In Part 3, we will make your blog discovereable in the fediverse. In Part 4, we will generate our notes and outbox, which contains posts ready to be shared in the Fediverse. Part 5, is an interlude to implement a subscribing to your site feature with fediverse accounts.

@reiver@mastodon.social

1/

It doesn't take much effort to make your website join the Fediverse and the open social-web IN A VERY BASIC WAY,.

And by "VERY BASIC WAY" I mean — being able to look up your website using a Fediverse ID and have a profile show up.

I did it for my (new) personal website last night.

(Screenshot of the profile Mastodon shows for my (new) personal website attached.)

NOTE: DO NOT FOLLOW IT YET. FOLLOWING DOESN'T WON'T WORK YET.

...

All I had to do was —

🧵

@reiver@mastodon.social

maho.dev

A guide to implement ActivityPub in a static site (or any website)

Hi! I have created this index for easy navigation. In Part 1, we will discuss why it is important to bring your site to the Fediverse. In Part 2, we will delve into an overview of the design of my implementation. In Part 3, we will make your blog discovereable in the fediverse. In Part 4, we will generate our notes and outbox, which contains posts ready to be shared in the Fediverse. Part 5, is an interlude to implement a subscribing to your site feature with fediverse accounts.

@reiver@mastodon.social

1/

It doesn't take much effort to make your website join the Fediverse and the open social-web IN A VERY BASIC WAY,.

And by "VERY BASIC WAY" I mean — being able to look up your website using a Fediverse ID and have a profile show up.

I did it for my (new) personal website last night.

(Screenshot of the profile Mastodon shows for my (new) personal website attached.)

NOTE: DO NOT FOLLOW IT YET. FOLLOWING DOESN'T WON'T WORK YET.

...

All I had to do was —

🧵

@reiver@mastodon.social

I suspect that there is an error in the Turtle specification, in the section shown in the screen-shot.

(It relates to JSON-LD, which ActivityPub / ActivityStreams is built on.)

I suspect that "PN_CHARS_BASE" is an error.

Because other parts of other specifications seem to not make sense if it is.

I suspect that maybe it should have been "PN_PREFIX" instead.

2.6 RDF Blank Nodes

 RDF blank nodes in Turtle are expressed as _: followed by a blank node label which is a series of name characters. The characters in the label are built upon PN_CHARS_BASE, liberalized as follows: 

• The characters _ and digits may appear anywhere in a blank node label.
• The character . may appear anywhere except the first or last character.
• The characters -, U+00B7, U+0300 to U+036F and U+203F to U+2040 are permitted anywhere except the first character.
ALT text

2.6 RDF Blank Nodes RDF blank nodes in Turtle are expressed as _: followed by a blank node label which is a series of name characters. The characters in the label are built upon PN_CHARS_BASE, liberalized as follows: • The characters _ and digits may appear anywhere in a blank node label. • The character . may appear anywhere except the first or last character. • The characters -, U+00B7, U+0300 to U+036F and U+203F to U+2040 are permitted anywhere except the first character.

2.6 RDF Blank Nodes

 RDF blank nodes in Turtle are expressed as _: followed by a blank node label which is a series of name characters. The characters in the label are built upon PN_CHARS_BASE, liberalized as follows: 

• The characters _ and digits may appear anywhere in a blank node label.
• The character . may appear anywhere except the first or last character.
• The characters -, U+00B7, U+0300 to U+036F and U+203F to U+2040 are permitted anywhere except the first character.
ALT text

2.6 RDF Blank Nodes RDF blank nodes in Turtle are expressed as _: followed by a blank node label which is a series of name characters. The characters in the label are built upon PN_CHARS_BASE, liberalized as follows: • The characters _ and digits may appear anywhere in a blank node label. • The character . may appear anywhere except the first or last character. • The characters -, U+00B7, U+0300 to U+036F and U+203F to U+2040 are permitted anywhere except the first character.

@reiver@mastodon.social

This is from the JSON-LD spec.

ActivityPub / ActivityStream are based on JSON-LD.

I think it was a very bad idea for JSON-LD to define "number" this way!

It makes it so numbers with fractional values are inexact & lossy.

This include values that are common for money.

For example, neither 0.10 and 0.20 can be represented exactly. So, 0.10 + 0.20 does NOT equal 0.30!

It should have used FIXED-point numbers rather than FLOATING-point.

number

In the JSON serialization, a number is similar to that used in most programming languages, except that the octal and hexadecimal formats are not used and that leading zeros are not allowed. In the internal representation, a number is equivalent to either a long or double, depending on if the number has a non-zero fractional part (see [WEBIDL]).
ALT text

number In the JSON serialization, a number is similar to that used in most programming languages, except that the octal and hexadecimal formats are not used and that leading zeros are not allowed. In the internal representation, a number is equivalent to either a long or double, depending on if the number has a non-zero fractional part (see [WEBIDL]).

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

There is a larger discussion about fixed-point numbers versus floating-point numbers.

And that, ALL programming-languages should have fixed-point numbers built into them.

And that, programmers should be warned against using floating-point numbers in all but a set of very specialized situations — where inexact math is OK.

For most programmers in most situations inexact math is NOT OK. And, they should NOT use floating-point numbers.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:
JSON vs IETF JSON

This is likely (directly or indirectly) the fault of a single paragraph in IETF RFC-7159 / RFC-8259 (shown in the attached screen-shot).

(And note that, there is a difference between JSON and IETF JSON. JSON did not have this. IETF JSON does.)

That paragraph (in the IETF RFC) was NOT a requirement. But, others made it a requirement — including JSON-LD.

RE: mastodon.social/@reiver/115956

This specification allows implementations to set limits on the range and precision of numbers accepted.  Since software that implements IEEE 754 binary64 (double precision) numbers [IEEE754] is generally available and widely used, good interoperability can be achieved by implementations that expect no more precision or range than these provide, in the sense that implementations will approximate JSON numbers within the expected precision.  A JSON number such as 1E400 or 3.141592653589793238462643383279 may indicate potential interoperability problems, since it suggests that the software that created it expects receiving software to have greater capabilities for numeric magnitude and precision than is widely available.
ALT text

This specification allows implementations to set limits on the range and precision of numbers accepted. Since software that implements IEEE 754 binary64 (double precision) numbers [IEEE754] is generally available and widely used, good interoperability can be achieved by implementations that expect no more precision or range than these provide, in the sense that implementations will approximate JSON numbers within the expected precision. A JSON number such as 1E400 or 3.141592653589793238462643383279 may indicate potential interoperability problems, since it suggests that the software that created it expects receiving software to have greater capabilities for numeric magnitude and precision than is widely available.

@reiver@mastodon.social

This is from the JSON-LD spec.

ActivityPub / ActivityStream are based on JSON-LD.

I think it was a very bad idea for JSON-LD to define "number" this way!

It makes it so numbers with fractional values are inexact & lossy.

This include values that are common for money.

For example, neither 0.10 and 0.20 can be represented exactly. So, 0.10 + 0.20 does NOT equal 0.30!

It should have used FIXED-point numbers rather than FLOATING-point.

number

In the JSON serialization, a number is similar to that used in most programming languages, except that the octal and hexadecimal formats are not used and that leading zeros are not allowed. In the internal representation, a number is equivalent to either a long or double, depending on if the number has a non-zero fractional part (see [WEBIDL]).
ALT text

number In the JSON serialization, a number is similar to that used in most programming languages, except that the octal and hexadecimal formats are not used and that leading zeros are not allowed. In the internal representation, a number is equivalent to either a long or double, depending on if the number has a non-zero fractional part (see [WEBIDL]).

@reiver@mastodon.social

I've seen an ongoing debate between "Note" versus "Article" in ActivityPub / ActivityStreams.

When is something a "Note"‽
When is something an "Article"‽

Personally — I would probably have made the distinction this way.

An "Article" has a title.
A "Note" doesn't have a title.

(In ActivityPub / ActivityStreams, a 'title' seems to tend to get represented in the "name" field.)

@smallcircles@social.coop · Reply to Emelia

@thisismissem

@reiver it is a good question. It is also a question that is formulated from the perspective on how we currently see the AS/AP fediverse.

> I've seen an ongoing debate between "Note" versus "Article" in / .
> When is something a "Note"‽
> When is something an "Article"‽

The question makes sense from the notion of what the current is. It makes less sense from the context of AS/AP as described in the protocol specs.

Background to my post is this observation: social.coop/@smallcircles/1161

Then the answer to when is something a Note or an Article is: Always. Note is Note in ActivityStreams and Article is Article.

The question that you would be asking, if only we had a fediverse that followed the original promise of the open standards, is:

> "When is something a Note or an Article in a Microblogging domain?"

For instance.. types you have in any domain depend on your model preferences. Could be anything that serves needs of a solution.

social.coop

🫧 socialcoding.. (@smallcircles@social.coop)

#ThoughtProvoker :blobhyperthink: The current fediverse is an evolutionary dead-end for 2 reasons: 1. It has painted itself in a small niche of decentralizing typical social media use cases, by means of post-facto interop and the introduction of protocol decay. 2. Lacking a proper grassroots standardization process, and with the primary mechanism for fediverse extension being only post-facto interoperability, there is no way out. Congratulations to the early adopters, who managed to "cross the chasm" with their own app platforms. It took true grit to become deep #ActivityPub experts, and plug holes needed for your app, but you have made it. Post-facto interop works in your favor now. You are unrestrained to productively add more features in your app, and put them on the fedi wire for others to deal with. To avoid fedi to become less and less attractive to newcomers, we must now consider: “Why do we want to grow the open social web, and for whom?” -- @ben@werd.social http://coding.social/blog/shared-ownership/

@smallcircles@social.coop

:blobhyperthink:

The current fediverse is an evolutionary dead-end for 2 reasons:

1. It has painted itself in a small niche of decentralizing typical social media use cases, by means of post-facto interop and the introduction of protocol decay.

2. Lacking a proper grassroots standardization process, and with the primary mechanism for fediverse extension being only post-facto interoperability, there is no way out.

Congratulations to the early adopters, who managed to "cross the chasm" with their own app platforms. It took true grit to become deep experts, and plug holes needed for your app, but you have made it. Post-facto interop works in your favor now. You are unrestrained to productively add more features in your app, and put them on the fedi wire for others to deal with.

To avoid fedi to become less and less attractive to newcomers, we must now consider:

“Why do we want to grow the open social web, and for whom?” -- @ben

coding.social/blog/shared-owne

coding.social

Shared responsible social web ownership

We strive for an inclusive social web that is by the people and for the people. But how do we guarantee equity and shared ownership?

@reiver@mastodon.social

I've seen an ongoing debate between "Note" versus "Article" in ActivityPub / ActivityStreams.

When is something a "Note"‽
When is something an "Article"‽

Personally — I would probably have made the distinction this way.

An "Article" has a title.
A "Note" doesn't have a title.

(In ActivityPub / ActivityStreams, a 'title' seems to tend to get represented in the "name" field.)

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

In the old blogging software I created back in the 1990s, I had a handful of posts types

There was a type of rich-text oriented post that had a title. (Article)

And, there way another type of rich-text oriented post that did not have a title. (Note)

(There were also other types of posts, but they aren't relevant here)

These 2 types of posts were rendered / displayed differently

I.e., my 1990s software already had this distinction

@reiver@mastodon.social

I've seen an ongoing debate between "Note" versus "Article" in ActivityPub / ActivityStreams.

When is something a "Note"‽
When is something an "Article"‽

Personally — I would probably have made the distinction this way.

An "Article" has a title.
A "Note" doesn't have a title.

(In ActivityPub / ActivityStreams, a 'title' seems to tend to get represented in the "name" field.)

@smallcircles@social.coop · Reply to infinite love ⴳ

@trwnh @evan @julian

Yes, for the ideation on Protosocial as an compliant extension (going back to the roots with blank slate W3C specs) I imagined mapping the AS primitives to consistent protocol capabilities and thereby define a set of normative architecture patterns, like "this is how we do CRUD, this is Publish/Subscribe, this is an Event stream and this a Collection", etc.

Then Protosocial library and SDK implementers would need to deal with at a low-level plumbing impl detail, while solution developers would have a higher-level API to invoke these patterns. And other than that would not need to touch which is now entirely reserved to making AP work on the wire.

A combination of linked data practices and schema-based design would be used for both open-world and closed-world extension modeling. But here too the solution developer should be shield from the nitty gritty internal mechanics.

@smallcircles@social.coop · Reply to Steve Bate

@steve @evan

I agree with what you say.

On the use of "stream(s)" I did a search in both specs, and it is only very sparsely used in the meaning of a stream rather than an Activity Streams document or object.

One time mentioned as "Activity Streams consumer" in core and another mention in the Security considerations section.

> Publishers or Consumers implementing Activity Streams as a stream of public data ..

And twice in where it says both inbox and outbox where it mentions "the outbox stream", "the inbox stream", and one other mention in definition of "Social API" where it is said to provide a "social stream of the user's actor".

So I would not consider this formal language terminology right now. That said, it would be good to further formalize the concept of a Stream, as it is a higher-order concept that'll help lift discussions out of nitty gritty impl detail territory.

@smallcircles@social.coop · Reply to 🫧 socialcoding..

, a *great start* providing the key ingredients.

, where things are cooked into a mush, by pragmatic though unsustainable fast-food preparation.

Recipe:

- Mash everything into
- Overload the semantic frying pan
- Sprinkle in combinatorial complexities
- Cook until too hot

Then simply keep stirring with increasing whack-a-mole maintenance burdens until project phased out.

Or become the post-facto leader and dominate the restaurant chain.

Recipe improvement tips:

- Add spice to the mix where you can!
- Participate in collective cooking.

@smallcircles@social.coop · Reply to Evan Prodromou

@evan @julian

builds on top of in the sense that it adopted a number of its 'social primitives' defined in its vocabulary, and Collection being among those. These particular uses become 'protocol space', but other than that AS from the perspective of AP solution development is purely a set of social primitives, granular building blocks that one *may* use in a solution. AS is a utility library of sorts then. Or is that a wrong perception?

A 'feed' is something that lives in solution space, and I would only choose Collection to model it, if it offers a perfect fit in functionality. And aboveall.. does not assign some new app-specific use along the way.

I tooted today that I feel the biggest folly of the fedi is that everyone tries to cram their domain into the AS namespace. The AS primitives should not be Swiss army knives and have only singular well-defined meaning and purpose, yet they have become that along the way.

social.coop/@smallcircles/1160

social.coop

🫧 socialcoding.. (@smallcircles@social.coop)

@thisismissem@hachyderm.io @eyeinthesky@mastodon.social The biggest folly imho is this idea of "let's cram every domain into #ActivityStreams somehow". Flatten everything and project it onto this small set of social primitives that AS defines. It is once more a choice of pragmatism: "Hey, I've seen it working with Mastodon, so I copied that. And #LinkedData extension mechanism is a handwaved horror show". So understandable perhaps that we did it. But now we must overcome this trend which has taken stubborn root and drags the ecosystem down.

@smallcircles@social.coop · Reply to 🫧 socialcoding..

@thisismissem @eyeinthesky

The biggest folly imho is this idea of "let's cram every domain into somehow". Flatten everything and project it onto this small set of social primitives that AS defines.

It is once more a choice of pragmatism: "Hey, I've seen it working with Mastodon, so I copied that. And extension mechanism is a handwaved horror show".

So understandable perhaps that we did it. But now we must overcome this trend which has taken stubborn root and drags the ecosystem down.

@smallcircles@social.coop · Reply to infinite love ⴳ

@trwnh @evan @julian

Yes, for the ideation on Protosocial as an compliant extension (going back to the roots with blank slate W3C specs) I imagined mapping the AS primitives to consistent protocol capabilities and thereby define a set of normative architecture patterns, like "this is how we do CRUD, this is Publish/Subscribe, this is an Event stream and this a Collection", etc.

Then Protosocial library and SDK implementers would need to deal with at a low-level plumbing impl detail, while solution developers would have a higher-level API to invoke these patterns. And other than that would not need to touch which is now entirely reserved to making AP work on the wire.

A combination of linked data practices and schema-based design would be used for both open-world and closed-world extension modeling. But here too the solution developer should be shield from the nitty gritty internal mechanics.

@smallcircles@social.coop · Reply to Evan Prodromou

@evan @julian

builds on top of in the sense that it adopted a number of its 'social primitives' defined in its vocabulary, and Collection being among those. These particular uses become 'protocol space', but other than that AS from the perspective of AP solution development is purely a set of social primitives, granular building blocks that one *may* use in a solution. AS is a utility library of sorts then. Or is that a wrong perception?

A 'feed' is something that lives in solution space, and I would only choose Collection to model it, if it offers a perfect fit in functionality. And aboveall.. does not assign some new app-specific use along the way.

I tooted today that I feel the biggest folly of the fedi is that everyone tries to cram their domain into the AS namespace. The AS primitives should not be Swiss army knives and have only singular well-defined meaning and purpose, yet they have become that along the way.

social.coop/@smallcircles/1160

social.coop

🫧 socialcoding.. (@smallcircles@social.coop)

@thisismissem@hachyderm.io @eyeinthesky@mastodon.social The biggest folly imho is this idea of "let's cram every domain into #ActivityStreams somehow". Flatten everything and project it onto this small set of social primitives that AS defines. It is once more a choice of pragmatism: "Hey, I've seen it working with Mastodon, so I copied that. And #LinkedData extension mechanism is a handwaved horror show". So understandable perhaps that we did it. But now we must overcome this trend which has taken stubborn root and drags the ecosystem down.

@smallcircles@social.coop · Reply to 🫧 socialcoding..

@thisismissem @eyeinthesky

The biggest folly imho is this idea of "let's cram every domain into somehow". Flatten everything and project it onto this small set of social primitives that AS defines.

It is once more a choice of pragmatism: "Hey, I've seen it working with Mastodon, so I copied that. And extension mechanism is a handwaved horror show".

So understandable perhaps that we did it. But now we must overcome this trend which has taken stubborn root and drags the ecosystem down.

@smallcircles@social.coop · Reply to 🫧 socialcoding..

@thisismissem @eyeinthesky

The biggest folly imho is this idea of "let's cram every domain into somehow". Flatten everything and project it onto this small set of social primitives that AS defines.

It is once more a choice of pragmatism: "Hey, I've seen it working with Mastodon, so I copied that. And extension mechanism is a handwaved horror show".

So understandable perhaps that we did it. But now we must overcome this trend which has taken stubborn root and drags the ecosystem down.

@smallcircles@social.coop · Reply to FinchHaven sfba

@FinchHaven @strypey

I do not think that @naturzukunft2026 misunderstands this.

There's a difference between the protocol and the on-the-wire reality, and in the latter is the post-facto interoperability leader.

For there to be interoperabiity in a particular domain there needs to be agreement on data formats and msg exchanges, and the specs don't provide full coverage nor clear guidance on this. Though has a section on use cases it was designed to handle, they aren't fully specified.

Of course it is perfectly fine, and highly encouraged to model a domain in the best possible way, but you won't be "part of the fediverse" until you implement enough of the post-facto Mastodon microblogging interop quirks.

We don't have a good ecosystem-level extension approach, and the constitutes a best-effort. A bandaid that allows to present a best-practice in hopes it gets further adoption.

I'm not sure that JSON-LD offers solace though.

@csarven@w3c.social · Reply to 👁

@eyeinthesky I am genuinely curious. What do you mean by a "real" schema language? What criteria should it meet?

More specifically, what would constitute successful interoperability for in line with the aims of ?

is not a schema language. It is used to serialise as the primary vocab for exchanging social activities, providing a foundation, and leaves room for extensibility for broad human needs to express social matters.

@csarven@w3c.social · Reply to 👁

@eyeinthesky I am genuinely curious. What do you mean by a "real" schema language? What criteria should it meet?

More specifically, what would constitute successful interoperability for in line with the aims of ?

is not a schema language. It is used to serialise as the primary vocab for exchanging social activities, providing a foundation, and leaves room for extensibility for broad human needs to express social matters.

@smallcircles@social.coop · Reply to 🫧 socialcoding..

@steve @jerger @mariusor @HolosSocial

An interesting document that was created for primer details "motivating use cases" for the specification, and these are categorized by domain.

w3.org/wiki/Activity_Streams/P

The primer also uses "domain" as terminology, and in Extensibility page reads:

> Activity Streams 2.0 extensions aren't self-explanatory or self-executing. It takes documentation and software to turn a pet-adoption schema into actual adoption of dogs and cats. However, ideally, the schema for pet adoptions could (and should) run over existing distribution infrastructure like ActivityPub.

w3.org/wiki/Activity_Streams/P

It takes a schema and docs, which describe formats, validation, logic, msg exchanges to define what "app" means. These constitute a 'contract' whenever interoperability comes into play, and must be maintained somewhere discoverable, or all interoperability bets are off (and you get whack-a-mole development, app-by-app).

w3.org

Activity Streams/Primer/Extensions - W3C Wiki

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

5/

So, not just Decentralized Social (DeSo), but instead —

Decentralized Social (DeSo), Federated Social (FeSo), Localized Social (LoSo)

The goal is 'social' that is simultaneously — 'Decentralized', 'Federated', and 'Localized', all at the same time.

RE: mastodon.social/@reiver/114551

mastodon.social

@reiver ⊼ (Charles) :batman: (@reiver@mastodon.social)

Decentralized Social (DeSo), Federated Social (FeSo), Localized Social (LoSo) RE: https://mastodon.social/@reiver/114406141298522537

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

4/

Federation is the word we use to describe that act of bringing together and connecting these separate Decentralized, Localized communities.

This is where protocols such as ActivityPub, ActivityStreams, etc come into play.

Federation is a voluntary choice.
But, so too is Defederation, if desired.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

9/

[Fediverse BackUp]

So, I think an (ActivityPub / ActivityStreams) Activity File COULD be a "good" format for backing-up a single post on the Fediverse, but —

Most (maybe all) extant Fediverse software would need to change a bit. Fediverse software would need to support embedding "everything" in a single Activity File (rather than referring to "everything" else by URLs).

.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

8/

[Fediverse BackUp]

Also — what about comments / replies —

Someone people (including me) would want at least some of the comments / replies to be included in a BackUp for a post.

So, for an Activity File to be a "good" format for a BackUp, a single Activity File would also need to contain (all or selected) the comments / replies to the post.

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

7/

[Fediverse BackUp]

Also — we would need to consider Threads / Storms —

Where people reply to their own post to make a larger post made up of smaller posts.

(I.e., what I have been doing here 🙂 )

For an Activity File to be a "good" format for a BackUp, a single Activity File would need to contain all the posts in the Thread / Storm.

Also —

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

6/

[Fediverse BackUp]

Also — we would need to consider Threads / Storms —

Where people reply to their own post to make a larger post made up of smaller posts.

(I.e., what I have been doing here 🙂 )

for an Activity File to be a "good" format for a BackUp, a single Activity File would need to contain all the posts in the Thread / Storm.

Also —

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

4/

[Fediverse BackUp]

Now, having said that, I don't think there is anything about ActivityPub / ActivityStreams that "prevents" Fediverse software from not embedding (non-text) media (such as images, audio, video, etc) into an Activity File —

For example, an "Image" Object can contain a ("mediaType" and a) "content" field (rather than an "href" field).

But —

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

4/

[Fediverse BackUp]

Now, having said that, I don't think there is anything about ActivityPub / ActivityStreams that "prevents" Fediverse software from not embedding (non-text) media (such as images, audio, video, etc) into an Activity File —

For example, an "Image" Object can contain a ("mediaType" and a) "content" field (rather than an "href" field).

But —

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

3/

[Fediverse BackUp]

If you wanted to BackUp a post on the Fediverse, and all you download was the Activity File (with URLs pointing to the non-text media), then — you lost all the (non-text) media (such as images, audio, video, etc) that were part of the post.

Which would be bad.

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

2/

[Fediverse BackUp]

I think one challenge, in practice, with using an Activity File as a BackUp Format is that — a lot of Fediverse software does NOT embed (non-text) media (such images, audio, video, etc) in the Activity File.

But, instead references them using URLs.

(And, by "URL" I mean "URI", "IRI", etc.)

Usually this is probably a good thing, but —

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

2/

[Fediverse BackUp]

I think one challenge, in practice, with using an Activity File as a BackUp Format is that — a lot of Fediverse software does NOT embed (non-text) media (such images, audio, video, etc) in the Activity File.

But, instead references them using URLs.

(And, by "URL" I mean "URI", "IRI", etc.)

Usually this is probably a good thing, but —

...

@tezoatlipoca@mas.to

I wish there was a facility (native or in any app, ideally as part of the objects) where I could make on , like we can make notes about particular accounts.

I have a bunch of stuff ; I have a tool that exports and sorts my bookmarks.. but by the time I get around to curating them, half the time I can't remember why I bookmarked something.

@tezoatlipoca@mas.to

I wish there was a facility (native or in any app, ideally as part of the objects) where I could make on , like we can make notes about particular accounts.

I have a bunch of stuff ; I have a tool that exports and sorts my bookmarks.. but by the time I get around to curating them, half the time I can't remember why I bookmarked something.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

4/

Apparently, Bookwyrm stores quotations with:

type="Quotation"

And if one Bookwyrm server talks to another Bookwyrm server, then — the ActivityPub / ActivityStreams representation of the quotation will have:

type="Quotation"

...

BUT — if a non-Bookwyrm server talks to a Bookwyrm server, then — the ActivityPub / ActivityStreams representation of the quotation will have:

type="Note"

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

3/

Apparently the Bookwyrm developer had the exact same idea!

(Which isn't too surprising.)

Here is how it works —

...

Object types

•  Note: On services like Mastodon, Notes are the primary type of status. They contain a message body, attachments, can mention users, and be replies to statuses of any type. Within BookWyrm, Notes can only be created as direct messages or as replies to other statuses.

• Review: A review is a status in response to a book (indicated by the inReplyToBook field), which has a title, body, and numerical rating between 0 (not rated) and 5.

•  Comment: A comment on a book mentions a book and has a message body.

• Quotation: A quote has a message body, an excerpt from a book, and mentions a book.
ALT text

Object types • Note: On services like Mastodon, Notes are the primary type of status. They contain a message body, attachments, can mention users, and be replies to statuses of any type. Within BookWyrm, Notes can only be created as direct messages or as replies to other statuses. • Review: A review is a status in response to a book (indicated by the inReplyToBook field), which has a title, body, and numerical rating between 0 (not rated) and 5. • Comment: A comment on a book mentions a book and has a message body. • Quotation: A quote has a message body, an excerpt from a book, and mentions a book.

@reiver@mastodon.social

Quotations & the Fediverse / ActivityPub

1/

One thing I used to do a lot on social-media is — post quotations.

Sometimes I was reading a book. And, I would quote things from the book and post it on social-media.

Or I was reading a scholarly paper, or reading a blog post, or watching a video, or listening to a podcast, etc.

...

I was thinking — how could you represent a quotation in ActivityPub‽

“[And yet another book that made an argument that was in favor of human universals is] Brent Berlin and Paul Kay’s [book] "Basic Color Terms: Their Universality and Evolution" (1969).”

“by the early 1970s two independent lines of psychological research, culminating in studies conducted among preliterate peoples of New Guinea, had shown that there are universal facial expressions of emotions.”

“Berlin and Kay show that although color classification does vary, it also shows remarkable uniformities: particularly in the sequence in which basic color terms are added to the lexicon.”

“Anthropologists and linguists had long known that the way colors are classified varies from language to language. Careful studies conducted by anthropologists after World War II, such as Harold Conklin’s (1955) study of Hanunóo color words, made the point very clearly.”

“The different sets of words for color in various languages …”
ALT text

“[And yet another book that made an argument that was in favor of human universals is] Brent Berlin and Paul Kay’s [book] "Basic Color Terms: Their Universality and Evolution" (1969).” “by the early 1970s two independent lines of psychological research, culminating in studies conducted among preliterate peoples of New Guinea, had shown that there are universal facial expressions of emotions.” “Berlin and Kay show that although color classification does vary, it also shows remarkable uniformities: particularly in the sequence in which basic color terms are added to the lexicon.” “Anthropologists and linguists had long known that the way colors are classified varies from language to language. Careful studies conducted by anthropologists after World War II, such as Harold Conklin’s (1955) study of Hanunóo color words, made the point very clearly.” “The different sets of words for color in various languages …”

“[And yet another book that made an argument that was in favor of human universals is] Brent Berlin and Paul Kay’s [book] "Basic Color Terms: Their Universality and Evolution" (1969).”

“by the early 1970s two independent lines of psychological research, culminating in studies conducted among preliterate peoples of New Guinea, had shown that there are universal facial expressions of emotions.”

“Berlin and Kay show that although color classification does vary, it also shows remarkable uniformities: particularly in the sequence in which basic color terms are added to the lexicon.”

“Anthropologists and linguists had long known that the way colors are classified varies from language to language. Careful studies conducted by anthropologists after World War II, such as Harold Conklin’s (1955) study of Hanunóo color words, made the point very clearly.”

“The different sets of words for color in various languages …”
ALT text

“[And yet another book that made an argument that was in favor of human universals is] Brent Berlin and Paul Kay’s [book] "Basic Color Terms: Their Universality and Evolution" (1969).” “by the early 1970s two independent lines of psychological research, culminating in studies conducted among preliterate peoples of New Guinea, had shown that there are universal facial expressions of emotions.” “Berlin and Kay show that although color classification does vary, it also shows remarkable uniformities: particularly in the sequence in which basic color terms are added to the lexicon.” “Anthropologists and linguists had long known that the way colors are classified varies from language to language. Careful studies conducted by anthropologists after World War II, such as Harold Conklin’s (1955) study of Hanunóo color words, made the point very clearly.” “The different sets of words for color in various languages …”

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

4/

Apparently, Bookwyrm stores quotations with:

type="Quotation"

And if one Bookwyrm server talks to another Bookwyrm server, then — the ActivityPub / ActivityStreams representation of the quotation will have:

type="Quotation"

...

BUT — if a non-Bookwyrm server talks to a Bookwyrm server, then — the ActivityPub / ActivityStreams representation of the quotation will have:

type="Note"

@reiver@mastodon.social

Quotations & the Fediverse / ActivityPub

1/

One thing I used to do a lot on social-media is — post quotations.

Sometimes I was reading a book. And, I would quote things from the book and post it on social-media.

Or I was reading a scholarly paper, or reading a blog post, or watching a video, or listening to a podcast, etc.

...

I was thinking — how could you represent a quotation in ActivityPub‽

“[And yet another book that made an argument that was in favor of human universals is] Brent Berlin and Paul Kay’s [book] "Basic Color Terms: Their Universality and Evolution" (1969).”

“by the early 1970s two independent lines of psychological research, culminating in studies conducted among preliterate peoples of New Guinea, had shown that there are universal facial expressions of emotions.”

“Berlin and Kay show that although color classification does vary, it also shows remarkable uniformities: particularly in the sequence in which basic color terms are added to the lexicon.”

“Anthropologists and linguists had long known that the way colors are classified varies from language to language. Careful studies conducted by anthropologists after World War II, such as Harold Conklin’s (1955) study of Hanunóo color words, made the point very clearly.”

“The different sets of words for color in various languages …”
ALT text

“[And yet another book that made an argument that was in favor of human universals is] Brent Berlin and Paul Kay’s [book] "Basic Color Terms: Their Universality and Evolution" (1969).” “by the early 1970s two independent lines of psychological research, culminating in studies conducted among preliterate peoples of New Guinea, had shown that there are universal facial expressions of emotions.” “Berlin and Kay show that although color classification does vary, it also shows remarkable uniformities: particularly in the sequence in which basic color terms are added to the lexicon.” “Anthropologists and linguists had long known that the way colors are classified varies from language to language. Careful studies conducted by anthropologists after World War II, such as Harold Conklin’s (1955) study of Hanunóo color words, made the point very clearly.” “The different sets of words for color in various languages …”

“[And yet another book that made an argument that was in favor of human universals is] Brent Berlin and Paul Kay’s [book] "Basic Color Terms: Their Universality and Evolution" (1969).”

“by the early 1970s two independent lines of psychological research, culminating in studies conducted among preliterate peoples of New Guinea, had shown that there are universal facial expressions of emotions.”

“Berlin and Kay show that although color classification does vary, it also shows remarkable uniformities: particularly in the sequence in which basic color terms are added to the lexicon.”

“Anthropologists and linguists had long known that the way colors are classified varies from language to language. Careful studies conducted by anthropologists after World War II, such as Harold Conklin’s (1955) study of Hanunóo color words, made the point very clearly.”

“The different sets of words for color in various languages …”
ALT text

“[And yet another book that made an argument that was in favor of human universals is] Brent Berlin and Paul Kay’s [book] "Basic Color Terms: Their Universality and Evolution" (1969).” “by the early 1970s two independent lines of psychological research, culminating in studies conducted among preliterate peoples of New Guinea, had shown that there are universal facial expressions of emotions.” “Berlin and Kay show that although color classification does vary, it also shows remarkable uniformities: particularly in the sequence in which basic color terms are added to the lexicon.” “Anthropologists and linguists had long known that the way colors are classified varies from language to language. Careful studies conducted by anthropologists after World War II, such as Harold Conklin’s (1955) study of Hanunóo color words, made the point very clearly.” “The different sets of words for color in various languages …”

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

4/

Apparently, Bookwyrm stores quotations with:

type="Quotation"

And if one Bookwyrm server talks to another Bookwyrm server, then — the ActivityPub / ActivityStreams representation of the quotation will have:

type="Quotation"

...

BUT — if a non-Bookwyrm server talks to a Bookwyrm server, then — the ActivityPub / ActivityStreams representation of the quotation will have:

type="Note"

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

3/

Apparently the Bookwyrm developer had the exact same idea!

(Which isn't too surprising.)

Here is how it works —

...

Object types

•  Note: On services like Mastodon, Notes are the primary type of status. They contain a message body, attachments, can mention users, and be replies to statuses of any type. Within BookWyrm, Notes can only be created as direct messages or as replies to other statuses.

• Review: A review is a status in response to a book (indicated by the inReplyToBook field), which has a title, body, and numerical rating between 0 (not rated) and 5.

•  Comment: A comment on a book mentions a book and has a message body.

• Quotation: A quote has a message body, an excerpt from a book, and mentions a book.
ALT text

Object types • Note: On services like Mastodon, Notes are the primary type of status. They contain a message body, attachments, can mention users, and be replies to statuses of any type. Within BookWyrm, Notes can only be created as direct messages or as replies to other statuses. • Review: A review is a status in response to a book (indicated by the inReplyToBook field), which has a title, body, and numerical rating between 0 (not rated) and 5. • Comment: A comment on a book mentions a book and has a message body. • Quotation: A quote has a message body, an excerpt from a book, and mentions a book.

@reiver@mastodon.social

Quotations & the Fediverse / ActivityPub

1/

One thing I used to do a lot on social-media is — post quotations.

Sometimes I was reading a book. And, I would quote things from the book and post it on social-media.

Or I was reading a scholarly paper, or reading a blog post, or watching a video, or listening to a podcast, etc.

...

I was thinking — how could you represent a quotation in ActivityPub‽

“[And yet another book that made an argument that was in favor of human universals is] Brent Berlin and Paul Kay’s [book] "Basic Color Terms: Their Universality and Evolution" (1969).”

“by the early 1970s two independent lines of psychological research, culminating in studies conducted among preliterate peoples of New Guinea, had shown that there are universal facial expressions of emotions.”

“Berlin and Kay show that although color classification does vary, it also shows remarkable uniformities: particularly in the sequence in which basic color terms are added to the lexicon.”

“Anthropologists and linguists had long known that the way colors are classified varies from language to language. Careful studies conducted by anthropologists after World War II, such as Harold Conklin’s (1955) study of Hanunóo color words, made the point very clearly.”

“The different sets of words for color in various languages …”
ALT text

“[And yet another book that made an argument that was in favor of human universals is] Brent Berlin and Paul Kay’s [book] "Basic Color Terms: Their Universality and Evolution" (1969).” “by the early 1970s two independent lines of psychological research, culminating in studies conducted among preliterate peoples of New Guinea, had shown that there are universal facial expressions of emotions.” “Berlin and Kay show that although color classification does vary, it also shows remarkable uniformities: particularly in the sequence in which basic color terms are added to the lexicon.” “Anthropologists and linguists had long known that the way colors are classified varies from language to language. Careful studies conducted by anthropologists after World War II, such as Harold Conklin’s (1955) study of Hanunóo color words, made the point very clearly.” “The different sets of words for color in various languages …”

“[And yet another book that made an argument that was in favor of human universals is] Brent Berlin and Paul Kay’s [book] "Basic Color Terms: Their Universality and Evolution" (1969).”

“by the early 1970s two independent lines of psychological research, culminating in studies conducted among preliterate peoples of New Guinea, had shown that there are universal facial expressions of emotions.”

“Berlin and Kay show that although color classification does vary, it also shows remarkable uniformities: particularly in the sequence in which basic color terms are added to the lexicon.”

“Anthropologists and linguists had long known that the way colors are classified varies from language to language. Careful studies conducted by anthropologists after World War II, such as Harold Conklin’s (1955) study of Hanunóo color words, made the point very clearly.”

“The different sets of words for color in various languages …”
ALT text

“[And yet another book that made an argument that was in favor of human universals is] Brent Berlin and Paul Kay’s [book] "Basic Color Terms: Their Universality and Evolution" (1969).” “by the early 1970s two independent lines of psychological research, culminating in studies conducted among preliterate peoples of New Guinea, had shown that there are universal facial expressions of emotions.” “Berlin and Kay show that although color classification does vary, it also shows remarkable uniformities: particularly in the sequence in which basic color terms are added to the lexicon.” “Anthropologists and linguists had long known that the way colors are classified varies from language to language. Careful studies conducted by anthropologists after World War II, such as Harold Conklin’s (1955) study of Hanunóo color words, made the point very clearly.” “The different sets of words for color in various languages …”

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

8/

REMEMBER: this is for power-users, not regular users

How would you get ActivityPub / ActivityStreams into HTML using RDFa‽

Like this:

<div vocab="w3.org/ns/activitystreams#" typeof="Note">
<p property="name">Hello!</p>
<p>How do you do?</p>
</div>

AGAIN, REMEMBER: this is for power-users, not regular users.

Regular users can just write Markdown or HTML and Retejo will figure this out automatically for you

w3.org

ActivityStreams 2.0 Terms

This document lists the terms used for the ActivityStreams 2.0 protocol and its stable extensions, and provides a namespace so each term has an HTTP IRI.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

7/

If you are wondering what RDFa is —

You might be more familiar with OpenGraph.

ogp.me/

OpenGraph is usually the thing that causes "preview cards" to be showed for links shared on social-media.

OpenGraph is written in RDFa. Which, in practice, is some special HTML elements added to the page.

For example:

<meta property="og:image" content="example.com/img/preview.png" />

So what about ActivityPub‽ —

@reiver@mastodon.social

1/

I have spending time thinking of ways you could automatically create ActivityPub / ActivityStreams data from HTML and Markdown

Most people will probably write in plain UTF-8 text, or Markdown, or HTML

How to do you take that and get it onto the Fediverse and Social Web‽

This isn't just a question of how to technically do it — but also a question of user-experience (UX)

I.e., what are "good" ways of doing it‽

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

6/

Obviously, beginners are NOT going to do this, but — some power-users may want this level of control.

There are different way this could be done, but — one way might be that power-users could use RDFa to explicitly specify what data from the HTML gets into the ActivityPub / ActivityStreams data.

Again, beginners and typical users would NOT do this.

But a power-user might want to.

Here is an example —

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

5/

So, what would be a good user-experience (UX) for power-users be — in a system that automatically creates ActivityPub / ActivityStreams data from HTML and Markdown‽

One thought I had is that power-users could explicitly mark what data from their HTML gets into the ActivityPub / ActivityStreams data (if they want to).

I'll explain —

@reiver@mastodon.social

1/

I have spending time thinking of ways you could automatically create ActivityPub / ActivityStreams data from HTML and Markdown

Most people will probably write in plain UTF-8 text, or Markdown, or HTML

How to do you take that and get it onto the Fediverse and Social Web‽

This isn't just a question of how to technically do it — but also a question of user-experience (UX)

I.e., what are "good" ways of doing it‽

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

2/

What are "good" ways of automatically creating ActivityPub / ActivityStreams data from HTML and Markdown‽

I think the answer depends on who, for example, is writing HTML, and how they are writing it.

For example, is this a typical user? Is this a power-user? Do they know HTML? And if they do know HTML, how well do they know it? Etc?

I will show you what I mean —

...

@reiver@mastodon.social

1/

I have spending time thinking of ways you could automatically create ActivityPub / ActivityStreams data from HTML and Markdown

Most people will probably write in plain UTF-8 text, or Markdown, or HTML

How to do you take that and get it onto the Fediverse and Social Web‽

This isn't just a question of how to technically do it — but also a question of user-experience (UX)

I.e., what are "good" ways of doing it‽

...

@reiver@mastodon.social

1/

I have spending time thinking of ways you could automatically create ActivityPub / ActivityStreams data from HTML and Markdown

Most people will probably write in plain UTF-8 text, or Markdown, or HTML

How to do you take that and get it onto the Fediverse and Social Web‽

This isn't just a question of how to technically do it — but also a question of user-experience (UX)

I.e., what are "good" ways of doing it‽

...

@reiver@mastodon.social

Retejo

I have been working on a new type of web-server for serving static web-sites.

I started working on it recently — on August 23rd. But, have had the idea for it for a number of years.

...

What is different about this web-server for static web-sites‽

Well, of course, it supports HTML.

But, it also supports Markdown, and ActivityPub natively!

codeberg.org/reiver/retejo

codeberg.org

retejo

retejo provides an HTTP web-site for one forgejo users. A popular forgejo instance server is codeberg. Thus, retejo works with codeberg.You can think of this as an alternative to Codeberg Pages and GitHub Pages.

@reiver@mastodon.social
@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:
@reiver@mastodon.social
@reiver@mastodon.social
@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:
@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:
@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:
@reiver@mastodon.social
@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:
@reiver@mastodon.social
@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:
@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:
@reiver@mastodon.social
@reiver@mastodon.social

Retejo

I have been working on a new type of web-server for serving static web-sites.

I started working on it recently — on August 23rd. But, have had the idea for it for a number of years.

...

What is different about this web-server for static web-sites‽

Well, of course, it supports HTML.

But, it also supports Markdown, and ActivityPub natively!

codeberg.org/reiver/retejo

codeberg.org

retejo

retejo provides an HTTP web-site for one forgejo users. A popular forgejo instance server is codeberg. Thus, retejo works with codeberg.You can think of this as an alternative to Codeberg Pages and GitHub Pages.

@reiver@mastodon.social

Retejo

I have been working on a new type of web-server for serving static web-sites.

I started working on it recently — on August 23rd. But, have had the idea for it for a number of years.

...

What is different about this web-server for static web-sites‽

Well, of course, it supports HTML.

But, it also supports Markdown, and ActivityPub natively!

codeberg.org/reiver/retejo

codeberg.org

retejo

retejo provides an HTTP web-site for one forgejo users. A popular forgejo instance server is codeberg. Thus, retejo works with codeberg.You can think of this as an alternative to Codeberg Pages and GitHub Pages.

@hongminhee@hollo.social

Today I discovered an interesting inconsistency in Activity Streams specs while investigating a Fedify issue.

The question: How should we interpret URLs like "icon": "https://example.com/avatar.png"?

JSON-LD context (https://www.w3.org/ns/activitystreams): @type: "@id" → “This is an IRI reference, dereference it to fetch an ActivityStreams object.”

Activity Streams Primer: “assume that a bare string is the href of a Link object, not an id” (no dereferencing)

Result: JSON-LD processor-based implementations try to parse PNG files as JSON and fail.

Turns out w3c/activitystreams#595 already discusses the same issue for href properties. I added a note that icon, image, etc. have the same problem.

Once again reminded of how tricky spec work can be…

github.com

`href` should be `@type: xsd:anyURI` in the context document · Issue #595 · w3c/activitystreams

w3c/activitypub#375 (comment) In the AS2-Vocab normative recommendation, href is defined to always be xsd:anyURI In the AS2 context document, it is not defined as such Conclusion: Make the context ...

@hongminhee@hollo.social

Today I discovered an interesting inconsistency in Activity Streams specs while investigating a Fedify issue.

The question: How should we interpret URLs like "icon": "https://example.com/avatar.png"?

JSON-LD context (https://www.w3.org/ns/activitystreams): @type: "@id" → “This is an IRI reference, dereference it to fetch an ActivityStreams object.”

Activity Streams Primer: “assume that a bare string is the href of a Link object, not an id” (no dereferencing)

Result: JSON-LD processor-based implementations try to parse PNG files as JSON and fail.

Turns out w3c/activitystreams#595 already discusses the same issue for href properties. I added a note that icon, image, etc. have the same problem.

Once again reminded of how tricky spec work can be…

github.com

`href` should be `@type: xsd:anyURI` in the context document · Issue #595 · w3c/activitystreams

w3c/activitypub#375 (comment) In the AS2-Vocab normative recommendation, href is defined to always be xsd:anyURI In the AS2 context document, it is not defined as such Conclusion: Make the context ...

@hongminhee@hollo.social

Today I discovered an interesting inconsistency in Activity Streams specs while investigating a Fedify issue.

The question: How should we interpret URLs like "icon": "https://example.com/avatar.png"?

JSON-LD context (https://www.w3.org/ns/activitystreams): @type: "@id" → “This is an IRI reference, dereference it to fetch an ActivityStreams object.”

Activity Streams Primer: “assume that a bare string is the href of a Link object, not an id” (no dereferencing)

Result: JSON-LD processor-based implementations try to parse PNG files as JSON and fail.

Turns out w3c/activitystreams#595 already discusses the same issue for href properties. I added a note that icon, image, etc. have the same problem.

Once again reminded of how tricky spec work can be…

github.com

`href` should be `@type: xsd:anyURI` in the context document · Issue #595 · w3c/activitystreams

w3c/activitypub#375 (comment) In the AS2-Vocab normative recommendation, href is defined to always be xsd:anyURI In the AS2 context document, it is not defined as such Conclusion: Make the context ...

@hongminhee@hollo.social

Today I discovered an interesting inconsistency in Activity Streams specs while investigating a Fedify issue.

The question: How should we interpret URLs like "icon": "https://example.com/avatar.png"?

JSON-LD context (https://www.w3.org/ns/activitystreams): @type: "@id" → “This is an IRI reference, dereference it to fetch an ActivityStreams object.”

Activity Streams Primer: “assume that a bare string is the href of a Link object, not an id” (no dereferencing)

Result: JSON-LD processor-based implementations try to parse PNG files as JSON and fail.

Turns out w3c/activitystreams#595 already discusses the same issue for href properties. I added a note that icon, image, etc. have the same problem.

Once again reminded of how tricky spec work can be…

github.com

`href` should be `@type: xsd:anyURI` in the context document · Issue #595 · w3c/activitystreams

w3c/activitypub#375 (comment) In the AS2-Vocab normative recommendation, href is defined to always be xsd:anyURI In the AS2 context document, it is not defined as such Conclusion: Make the context ...

@hongminhee@hollo.social

Today I discovered an interesting inconsistency in Activity Streams specs while investigating a Fedify issue.

The question: How should we interpret URLs like "icon": "https://example.com/avatar.png"?

JSON-LD context (https://www.w3.org/ns/activitystreams): @type: "@id" → “This is an IRI reference, dereference it to fetch an ActivityStreams object.”

Activity Streams Primer: “assume that a bare string is the href of a Link object, not an id” (no dereferencing)

Result: JSON-LD processor-based implementations try to parse PNG files as JSON and fail.

Turns out w3c/activitystreams#595 already discusses the same issue for href properties. I added a note that icon, image, etc. have the same problem.

Once again reminded of how tricky spec work can be…

github.com

`href` should be `@type: xsd:anyURI` in the context document · Issue #595 · w3c/activitystreams

w3c/activitypub#375 (comment) In the AS2-Vocab normative recommendation, href is defined to always be xsd:anyURI In the AS2 context document, it is not defined as such Conclusion: Make the context ...

@trwnh@mastodon.social · Reply to infinite love ⴳ

let's demo this with a simple case. say you want to `tag` something that is a `Movie` described by schema.org. the `Movie` declares that it has an `actor` who performed in it.

this is redefining the term `actor` as defined at the top-level by -- where `actor` means who performed an `Activity`, not who performed in a `Movie`.

if the activitystreams context was protected, then this would be a fatal error for any validator. you cannot be sure which `actor` was meant!

3/?

@trwnh@mastodon.social · Reply to infinite love ⴳ

say you have a generic property whose range is relatively unbounded -- a grab-bag where anything goes. something like how `attachment` or `tag` are used in . using multiple contexts at the top-level introduces a potential conflict in terms. you could reconcile any conflicts with a custom context, but that prevents reuse / understanding a more well-known context.

unfortunately, due to context propagation, terms defined earlier on can "leak" into the naively merged subgraph.

2/?

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

5/

So, not just Decentralized Social (DeSo), but instead —

Decentralized Social (DeSo), Federated Social (FeSo), Localized Social (LoSo)

The goal is 'social' that is simultaneously — 'Decentralized', 'Federated', and 'Localized', all at the same time.

RE: mastodon.social/@reiver/114551

mastodon.social

@reiver ⊼ (Charles) :batman: (@reiver@mastodon.social)

Decentralized Social (DeSo), Federated Social (FeSo), Localized Social (LoSo) RE: https://mastodon.social/@reiver/114406141298522537

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

5/

So, not just Decentralized Social (DeSo), but instead —

Decentralized Social (DeSo), Federated Social (FeSo), Localized Social (LoSo)

The goal is 'social' that is simultaneously — 'Decentralized', 'Federated', and 'Localized', all at the same time.

RE: mastodon.social/@reiver/114551

mastodon.social

@reiver ⊼ (Charles) :batman: (@reiver@mastodon.social)

Decentralized Social (DeSo), Federated Social (FeSo), Localized Social (LoSo) RE: https://mastodon.social/@reiver/114406141298522537

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

4/

Federation is the word we use to describe that act of bringing together and connecting these separate Decentralized, Localized communities.

This is where protocols such as ActivityPub, ActivityStreams, etc come into play.

Federation is a voluntary choice.
But, so too is Defederation, if desired.

@reiver@mastodon.social

1/

I think HTML being the default content type for ActivityPub / ActivityStreams is unfortunate in some ways.

HTML was originally a "dumb" document format. But, it is now a "smart" application format — with privacy & security concerns.

mastodon.social/@reiver/108237

You should NOT just take whatever HTML is in the 'content', and put it in the web-browser to view it.

You have to sanitize it. Or, render (unsafe) HTML to (safe) HTML.

mastodon.social

@reiver ⊼ (Charles) :batman: (@reiver@mastodon.social)

1/ I kind of get the feeling that people are trying to refactor the web, in a sense. And that there are at least 2 different visions for the future of the Web. Some seem to want the Web to go back to being about (relatively “dumb”) hypertext document format. Others seem to want the Web to be about a (relatively “smart”) cross-platform application platform. (There are other visions for the future of the Web too.)

@reiver@mastodon.social

1/

A file-extension for ActivityPub /ActivityStream files.

...

On many web-servers, the Content-Type returned when serving a file is based on the file-extension of the file.

Ex: .txt for text files, .gz for gzip files, .gmni for gemtext files, etc.

I am not aware of a widely used file-extension for ActivityStreams / ActivityPub files.

...

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

2/

For example, at:

http;//example·com/object/123

You might have the activity-JSON (application/activity+json):

{

....

"attributedTo": "https;//mastodon·social/users/reiver",

...

}

I.e., a Note or Article or whatever is saying that the author is NOT an actor on the same server host (example·com), but an actor over on the server host mastodon·social.

...

@reiver@mastodon.social

ActivityPub outboxes are the new RSS / Atom / WebFeed.

You can just read from them to get a JSON feed of someone's posts.

I.e., you do NOT have to implement the full suite of Fediverse protocols, or Follow, or run your own server, or anything else to get someone's posts on the Fediverse — just read from their outbox.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

3/

ActivityPub & ActivityStreams are based on JSON-LD — a format that is not (non-programmer) human-legible & human-writable

Maybe we need an alternative way of encoding ActivityPub & ActivityStreams in situations where (non-programmer) humans might read it or write it

Maybe the INI file data format? Or something else that is friendly to (non-programmer) humans?

@reiver@mastodon.social

ActivityPub outboxes are the new RSS / Atom / WebFeed.

You can just read from them to get a JSON feed of someone's posts.

I.e., you do NOT have to implement the full suite of Fediverse protocols, or Follow, or run your own server, or anything else to get someone's posts on the Fediverse — just read from their outbox.

@reiver@mastodon.social

ActivityPub outboxes are the new RSS / Atom / WebFeed.

You can just read from them to get a JSON feed of someone's posts.

I.e., you do NOT have to implement the full suite of Fediverse protocols, or Follow, or run your own server, or anything else to get someone's posts on the Fediverse — just read from their outbox.

@reiver@mastodon.social

What if a (new type of) Fediverse server automagically created an ActivityPub actor for each hash-tag.

So, for example, if someone on the server used:

⋕banana

(Then if the domain of the server is "example.com") then we would automagically have the actor:

@banana@example·com

Probably a group actor.

And it boosted any local post with that hash-tag.

Then you could follow a hash-tag on a server.

@reiver@mastodon.social

ActivityPub outboxes are the new RSS / Atom / WebFeed.

You can just read from them to get a JSON feed of someone's posts.

I.e., you do NOT have to implement the full suite of Fediverse protocols, or Follow, or run your own server, or anything else to get someone's posts on the Fediverse — just read from their outbox.

@reiver@mastodon.social

This feels so wasteful —

Including the same content twice — once in "content" and again in "contentMap".

  "content": "<p><a href=\"https://mastodon.social/tags/GreatApe\" class=\"mention hashtag\" rel=\"tag\">#<span>GreatApe</span></a></p><p>.</p>",
  "contentMap": {
    "en": "<p><a href=\"https://mastodon.social/tags/GreatApe\" class=\"mention hashtag\" rel=\"tag\">#<span>GreatApe</span></a></p><p>.</p>"
  },
ALT text

"content": "<p><a href=\"https://mastodon.social/tags/GreatApe\" class=\"mention hashtag\" rel=\"tag\">#<span>GreatApe</span></a></p><p>.</p>", "contentMap": { "en": "<p><a href=\"https://mastodon.social/tags/GreatApe\" class=\"mention hashtag\" rel=\"tag\">#<span>GreatApe</span></a></p><p>.</p>" },

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

9/

And just for the record —

Just like everyone else I contacted about their 'discoverable' flag being defaulted to 'false' —

He wasn't aware of the 'discoverable' flag existing (just like everyone else I contacted).

He didn't want to be hidden (just like everyone else I contacted).

He changed it to 'true' (just like everyone else I contacted).

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

8/

As it is now, I think the 'discoverable' flag is broken.

And, I think the whole user-experience (UX) around the 'discoverable' flag is poor.

And, I think Fediverse software treating a 'false' value for 'discoverable' as "not discoverable" (rather than "not discoverable" or "no choice made") has hugely negative consequences for the user-experience (UX) of the Fediverse

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

7/

So now I have to DM Ben to tell him that his 'discoverable' flag is set to false

He (just like everyone else I contacted) will likely not even be aware that the 'discoverable' flag exists

And (just like everyone else I contacted) wished it wasn't set to false

And then (just like everyone else I contacted) struggle to find where he can set it to true

And then set it

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

6/

As it is now, the 'discoverable' flag seems broken to me.

Because 'false' doesn't actually mean 'false'.

'false' (in practice) means both "not discoverable" and "no choice made". And this is a very unfortunate situation —

Because the idea of a 'discoverable' flag is a good idea — but this problem with the meaning of 'false' and the UX consequences a big deal.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

5/

JSON and has a 'null'. That could have been used for the 'discoverable' flag.

We could have had so that:

'discoverable' set to 'true' meant that the user explicitly chose to be discoverable.

'discoverable' set to 'false' meant that the user explicitly chose to not be discoverable.

And 'discoverable' set to 'null' meant that the user has not explicitly made a choice.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

4/

With other conceptions, this lack of choice — this lack of setting a value — isn't as muddled.

With optional-types (which are also called "option-types" and "maybe-types") when something isn't assigned a value it is represented as 'nothing' / 'none'.

In relation-databases, this is represented as 'null'.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

3/

As it is right now, the 'discoverable' flag does not communicate whether the user actually made a 'true' or 'false' choice.

If it is 'true' we know they made a choice.

But if it is 'false' it either means the user chose 'false' or the user didn't make a choice. BUT WE CANNOT TELL THE DIFFERENCE.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

2/

There are a HUGE number of people who (unknown to them) have their 'discoverable' flags set to 'false' who —

№2:

Do NOT know that they have a 'discoverable' flag —

And do NOT know that their 'discoverable' flag was automagically set to 'false' —

And do not understand the consequence of having their 'discoverable' flag set to false.

@reiver@mastodon.social

1/

A problem with the 'discoverable' flag (in Mastodon and any other Fediverse software that added it) is —

There are a HUGE number of people who (unknown to them) have their 'discoverable' flags set to 'false' who —

№1:

Did NOT set their 'discoverable' to 'false' themselves.

Mastodon assigned it for them without ever asking them before hand and getting consent.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

8/

As it is now, I think the 'discoverable' flag is broken.

And, I think the whole user-experience (UX) around the 'discoverable' flag is poor.

And, I think Fediverse software treating a 'false' value for 'discoverable' as "not discoverable" (rather than "not discoverable" or "no choice made") has hugely negative consequences for the user-experience (UX) of the Fediverse

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

7/

So now I have to DM Ben to tell him that his 'discoverable' flag is set to false

He (just like everyone else I contacted) will likely not even be aware that the 'discoverable' flag exists

And (just like everyone else I contacted) wished it wasn't set to false

And then (just like everyone else I contacted) struggle to find where he can set it to true

And then set it

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

6/

As it is now, the 'discoverable' flag seems broken to me.

Because 'false' doesn't actually mean 'false'.

'false' (in practice) means both "not discoverable" and "no choice made". And this is a very unfortunate situation —

Because the idea of a 'discoverable' flag is a good idea — but this problem with the meaning of 'false' and the UX consequences a big deal.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

5/

JSON and has a 'null'. That could have been used for the 'discoverable' flag.

We could have had so that:

'discoverable' set to 'true' meant that the user explicitly chose to be discoverable.

'discoverable' set to 'false' meant that the user explicitly chose to not be discoverable.

And 'discoverable' set to 'null' meant that the user has not explicitly made a choice.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

4/

With other conceptions, this lack of choice — this lack of setting a value — isn't as muddled.

With optional-types (which are also called "option-types" and "maybe-types") when something isn't assigned a value it is represented as 'nothing' / 'none'.

In relation-databases, this is represented as 'null'.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

3/

As it is right now, the 'discoverable' flag does not communicate whether the user actually made a 'true' or 'false' choice.

If it is 'true' we know they made a choice.

But if it is 'false' it either means the user chose 'false' or the user didn't make a choice. BUT WE CANNOT TELL THE DIFFERENCE.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

2/

There are a HUGE number of people who (unknown to them) have their 'discoverable' flags set to 'false' who —

№2:

Do NOT know that they have a 'discoverable' flag —

And do NOT know that their 'discoverable' flag was automagically set to 'false' —

And do not understand the consequence of having their 'discoverable' flag set to false.

@reiver@mastodon.social

1/

A problem with the 'discoverable' flag (in Mastodon and any other Fediverse software that added it) is —

There are a HUGE number of people who (unknown to them) have their 'discoverable' flags set to 'false' who —

№1:

Did NOT set their 'discoverable' to 'false' themselves.

Mastodon assigned it for them without ever asking them before hand and getting consent.

@reiver@mastodon.social

Could ActivityPub / ActivityStreams be used to synchronize files across separate machines / computers / devices‽

I think the answer is, YES.

The inbox-outbox system could enable you to send messages between separate machines / computers / devices.

The 'messages' transfer the changed 'blocks' / 'chunks' that make up a file, notify about deletions, file creations, etc

Existing Activity Types might be sufficient to do this

@reiver@mastodon.social

Is any Fediverse software using or generating the 'View' activity-type?

w3.org/TR/activitystreams-voca

You could create view-counts on posts, profiles, etc, using this.

Of course, there are privacy concerns with this.

And, also, what counts as a "view".

Although, I sometimes use a "Like" to indicate I viewed something. If a 'View' was something manual (such a pressing a button) that could be more semantically clean.

@reiver@mastodon.social

To me, it feels like the Activity Types should have been past-tense verbs, rather than present-tense verbs.

I.e.:

• "Accepted" rather than "Accept"
• "Added" rather than "Add"
• "Announced" rather than "Announce"
• "Arrived" rather than "Arrive"
• "Blocked" rather than "Block"
• "Created" rather than "Create"
• etc

Present-tense verbs feel like commands.

Past-tense verbs feel like events.

Activities are events not commands.

@reiver@mastodon.social

To me, it feels like the Activity Types should have been past-tense verbs, rather than present-tense verbs.

I.e.:

• "Accepted" rather than "Accept"
• "Added" rather than "Add"
• "Announced" rather than "Announce"
• "Arrived" rather than "Arrive"
• "Blocked" rather than "Block"
• "Created" rather than "Create"
• etc

Present-tense verbs feel like commands.

Past-tense verbs feel like events.

Activities are events not commands.

@reiver@mastodon.social

To me, it feels like the Activity Types should have been past-tense verbs, rather than present-tense verbs.

I.e.:

• "Accepted" rather than "Accept"
• "Added" rather than "Add"
• "Announced" rather than "Announce"
• "Arrived" rather than "Arrive"
• "Blocked" rather than "Block"
• "Created" rather than "Create"
• etc

Present-tense verbs feel like commands.

Past-tense verbs feel like events.

Activities are events not commands.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

3/

However, "orderedItems" is mentioned in the ActivityStreams Core spec:

w3.org/TR/activitystreams-core/

Maybe the closest thing to a definition is:

"Collection are represented using the 'items' property while ordered items are represented using the 'orderedItems' property."

So, "orderedItems" is just like "items":

w3.org/TR/activitystreams-voca

... except renamed and the interpretation is different

w3.org

Activity Vocabulary

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:
@hongminhee@hollo.social

I'm looking for your opinions from the developers of the fediverse.

A common HTML web page can contain related links via the <link> tag. I would like to do the same for Activity Streams objects, for example:

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "id": "https://writings.hongminhee.org/ap/2024/12/a-year-with-the-fediverse.json",
  "type": "Article",
  "name": "A year with the fediverse",
  "content": "2024 was truly a year where I was deeply immersed in the fediverse. …",
  "url": "https://writings.hongminhee.org/2024/12/a-year-with-the-fediverse/",
  "attachment": [
    {
      "type": "Link",
      "rel": "alternate",
      "hreflang": "ko",
      "href": "https://writings.hongminhee.org/2024/12/a-year-with-the-fediverse/index.ko-hang-kr.html",
      "mediaType": "text/html"
    },
    {
      "type": "Link",
      "rel": "alternate",
      "hreflang": "ja",
      "href": "https://writings.hongminhee.org/2024/12/a-year-with-the-fediverse/index.ja.html",
      "mediaType": "text/html"
    }
  ]
}

Do you think this makes sense, and would it be appropriate to put Link objects in the attachment?

@hongminhee@hollo.social

I'm looking for your opinions from the developers of the fediverse.

A common HTML web page can contain related links via the <link> tag. I would like to do the same for Activity Streams objects, for example:

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "id": "https://writings.hongminhee.org/ap/2024/12/a-year-with-the-fediverse.json",
  "type": "Article",
  "name": "A year with the fediverse",
  "content": "2024 was truly a year where I was deeply immersed in the fediverse. …",
  "url": "https://writings.hongminhee.org/2024/12/a-year-with-the-fediverse/",
  "attachment": [
    {
      "type": "Link",
      "rel": "alternate",
      "hreflang": "ko",
      "href": "https://writings.hongminhee.org/2024/12/a-year-with-the-fediverse/index.ko-hang-kr.html",
      "mediaType": "text/html"
    },
    {
      "type": "Link",
      "rel": "alternate",
      "hreflang": "ja",
      "href": "https://writings.hongminhee.org/2024/12/a-year-with-the-fediverse/index.ja.html",
      "mediaType": "text/html"
    }
  ]
}

Do you think this makes sense, and would it be appropriate to put Link objects in the attachment?

@reiver@mastodon.social

Fediverse Labeler update:

I have been working on a site that anyone can use to see Fediverse Labelers in action.

This is what it looks like if the user it looks up doesn't provide an avatar image or a header image.

I.e., this (in the screenshot) shows the default avatar image and header image.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

2/

For example —

If the "username" is part of it, then there is a straightforward unique ID for this user as an acct-URL:

acct:joeblow@example·com

But there are many ways an HTTP-URL as an ID gets represented. Ex:

• http;//example·com/users/joeblow
• http;//example·com/user/joeblow
• http;//example·com/api/users/joeblow
• http;//example·com/api/user/joeblow
• http;//example·com/~joeblow
• etc

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:
@reiver@mastodon.social

Fediverse Labeler update:

I have been working on a site that anyone can use to see Fediverse Labelers in action.

This is what it looks like if the user it looks up doesn't provide an avatar image or a header image.

I.e., this (in the screenshot) shows the default avatar image and header image.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:
@reiver@mastodon.social

1/

More on Fediverse Labelers —

Here is how text-labels from multiple Fediverse Labelers could appear in an application on a person's profile.

...

In this example, the application pulled in 7 labels from 4 different Fediverse Labelers.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:
@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:
@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

3/

This screen mock-up only shows text-labels.

Other types of labels can exist — image labels of different types, virtual object labels, space-time labels, etc.

And labels can have different use-case (in addition to human-readable text) — more on that later.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:
@reiver@mastodon.social

1/

More on Fediverse Labelers —

Here is how text-labels from multiple Fediverse Labelers could appear in an application on a person's profile.

...

In this example, the application pulled in 7 labels from 4 different Fediverse Labelers.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

3/

This screen mock-up only shows text-labels.

Other types of labels can exist — image labels of different types, virtual object labels, space-time labels, etc.

And labels can have different use-case (in addition to human-readable text) — more on that later.

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:
@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:

3/

The "describes" field would point to the thing being labelled.

The "attributedTo" field would point to the person or machine that create these label.

And the "attachment" field would be a list of labels.

The (top level) "icon" field would be an icon that would be shown next to the label in the user-interface (UI).

@reiver@mastodon.social

1/

This is how a Fediverse Labeler could work.

In particular, This is how a Fediverse Labeler could be represented as ActivityPub / ActivityStreams / JSON-LD data.

{
  "@context": [
    "https://www.w3.org/ns/activitystreams"
  ],
  "type": "Profile",
  "describes": "acct:reiver@mastodon.social",
  "attributedTo": "https://example.com/apps/ratel",
  "icon": {
    "type": "Icon",
    "mediaType": "image/png",
    "url": "https://example.com/apps/ratel/img/icon.png"
  },
  "attachment": [
    {
      "type": "Label",
      "name": "Programmer"
    },
    {
      "type": "Label",
      "name": "Canadian"
    },
    {
      "type": "Icon",
      "mediaType": "image/png",
      "url": "https://example.com/pfp/751f76ed540a40a3b4caae50e50cc867.png"
    },
    {
      "type": "Icon",
      "mediaType": "image/png",
      "url": "https://example.com/pfp/45f7b459257940f490133070a975924b.png"
    }
  ]
}
ALT text

{ "@context": [ "https://www.w3.org/ns/activitystreams" ], "type": "Profile", "describes": "acct:reiver@mastodon.social", "attributedTo": "https://example.com/apps/ratel", "icon": { "type": "Icon", "mediaType": "image/png", "url": "https://example.com/apps/ratel/img/icon.png" }, "attachment": [ { "type": "Label", "name": "Programmer" }, { "type": "Label", "name": "Canadian" }, { "type": "Icon", "mediaType": "image/png", "url": "https://example.com/pfp/751f76ed540a40a3b4caae50e50cc867.png" }, { "type": "Icon", "mediaType": "image/png", "url": "https://example.com/pfp/45f7b459257940f490133070a975924b.png" } ] }

@reiver@mastodon.social
litepub

What is the motivation for encouraging LitePub implementors to "supply a locally hosted version of the LitePub JSON-LD Context"?

Is it just for people using full-out JSON-LD parsers?

Won't this create problems for people using parsers that do NOT go download and interpret context-URIs? And instead just hard-code the vocabulary in their code?

LitePub for ActivityPub Implementors

JSON-LD context

LitePub implementations are not required to use @context properties on their messages. A conformant ActivityPub implementation is required to process these messages with an injected @context of "https://www.w3.org/ns/activitystreams" as described in the ActivityStreams 2.0 Core Specification

However, the LitePub Core Vocabulary differs from the ActivityStreams 2.0 Vocabulary. It is suggested that LitePub implementations supply a locally hosted version of the LitePub JSON-LD Context as their @context. It may be useful to inject a local copy of the LitePub JSON-LD Context instead of the default ActivityStreams 2.0 context when a message is received without a @context as it defines the full LitePub Core Vocabulary in a way that is useful to JSON-LD processors.

Signatures

LitePub implementations MUST use HTTP Signatures to verify the authenticity of messages being delivered to or from peering nodes. The details surrounding the way HTTP Signatures are implemented in LitePub are discussed on the Overview page.
ALT text

LitePub for ActivityPub Implementors JSON-LD context LitePub implementations are not required to use @context properties on their messages. A conformant ActivityPub implementation is required to process these messages with an injected @context of "https://www.w3.org/ns/activitystreams" as described in the ActivityStreams 2.0 Core Specification However, the LitePub Core Vocabulary differs from the ActivityStreams 2.0 Vocabulary. It is suggested that LitePub implementations supply a locally hosted version of the LitePub JSON-LD Context as their @context. It may be useful to inject a local copy of the LitePub JSON-LD Context instead of the default ActivityStreams 2.0 context when a message is received without a @context as it defines the full LitePub Core Vocabulary in a way that is useful to JSON-LD processors. Signatures LitePub implementations MUST use HTTP Signatures to verify the authenticity of messages being delivered to or from peering nodes. The details surrounding the way HTTP Signatures are implemented in LitePub are discussed on the Overview page.

@hongminhee@hollo.social

I'm looking for your opinions from the developers of the fediverse.

A common HTML web page can contain related links via the <link> tag. I would like to do the same for Activity Streams objects, for example:

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "id": "https://writings.hongminhee.org/ap/2024/12/a-year-with-the-fediverse.json",
  "type": "Article",
  "name": "A year with the fediverse",
  "content": "2024 was truly a year where I was deeply immersed in the fediverse. …",
  "url": "https://writings.hongminhee.org/2024/12/a-year-with-the-fediverse/",
  "attachment": [
    {
      "type": "Link",
      "rel": "alternate",
      "hreflang": "ko",
      "href": "https://writings.hongminhee.org/2024/12/a-year-with-the-fediverse/index.ko-hang-kr.html",
      "mediaType": "text/html"
    },
    {
      "type": "Link",
      "rel": "alternate",
      "hreflang": "ja",
      "href": "https://writings.hongminhee.org/2024/12/a-year-with-the-fediverse/index.ja.html",
      "mediaType": "text/html"
    }
  ]
}

Do you think this makes sense, and would it be appropriate to put Link objects in the attachment?

@reiver@mastodon.social
actor model & activitypub, programming

1/

I like the Actor-Model.

A friend who is a Scala programmer introduced it to me.

I used it when programming in — Erlang and Scala. Later, I implemented the Actor-Model in Go. I even implemented Erlang's supervision-tree in Go.

ActivityPub is maybe better understood through the lens of the Actor-Model — rather than a HTTP REST API.

However —

@reiver@mastodon.social

1/

There are now multiple efforts to create a Fediverse version of Follow-Packs / Starter-Packs.

A starter-pack gives you a collection of people and other users to follow

They help new users find people to follow — so they don't have an empty home-feed. But they also help existing users find more people to follow.

🧵

@reiver@mastodon.social

There are a lot of different types in the ActivityStreams Vocabulary.

w3.org/TR/activitystreams-voca

But because Mastodon only supports 8 of them (with only 2 of them being supported properly), there is "pressure" on other Fediverse software to restrict themselves to these 8.

docs.joinmastodon.org/spec/act

Because they want to be compatible with Mastodon.

@kidehen@mastodon.social


I am an open data access (, , and ), integration (), and data management ( and/or ) technologist, enthusiast, and entrepreneur.

I am passionate about open standards for , , , ( & ), and data de-silo-fication initiatives (e.g. , , , , and ).

I don't like any kind of silo!

@pfefferle@notiz.blog
Schon seit der ersten Version von Mastodon wollte ich eine Lobeshymne auf OStatus schreiben! Sowas wie "OStatus hat auch nach über 6 Jahren an Relevanz nicht verloren" oder "selbst nach 6 Jahren, setzen neue Plattformen mit Erfolg auf OStatus" oder "mein 6 Jahre altes OStatus WordPress Plugin funktioniert mit nur wenigen Anpassungen auch mit Mastodon"... Das kann ich mir jetzt leider sparen. Eugen Rochko, der Gründer von Mastodon, schrieb schon 2018: I can't wait until I can begin […]

Schon seit der ersten Version von Mastodon wollte ich eine Lobeshymne auf OStatus schreiben! Sowas wie „OStatus hat auch nach über 6 Jahren an Relevanz nicht verloren“ oder „selbst nach 6 Jahren, setzen neue Plattformen mit Erfolg auf OStatus“ oder „mein 6 Jahre altes OStatus WordPress Plugin funktioniert mit nur wenigen Anpassungen auch mit Mastodon„…

Das kann ich mir jetzt leider sparen. Eugen Rochko, der Gründer von Mastodon, schrieb schon 2018:

I can’t wait until I can begin removing OStatus-related code from Mastodon. I think GNU social is the last remaining fediverse project that hasn’t yet switched to ActivityPub?

Eugen Rochko auf Mastodon

Über Patreon hat er seinen Plan jetzt nochmal konkretisiert:

[…] OStatus […] has overstayed its welcome in the code […] and now that most of the network uses ActivityPub, it’s time for it to go.

Eugen Rochko auf Patreon

…und der Pull-Request, der PubSubHubbub und Salmon ausbaut, wurde am 6. Juli ge-merged.

🙁

Wie geht’s weiter?

OStatus war wegweisend! Statt ein komplett neues Protokoll zu beschreiben, hat OStatus bestehende De-Facto-Standards in einer Spezifikation zusammen geführt. Für viele Plattformen, war es dadurch relativ einfach, OStatus einzusetzen, da sie in der Regel Teile der Spezifikation sowieso schon betrieben.

Protokoll-Übersicht von the-federation.info (Stand: 23. Juli 2019)

In den letzten Jahren habe ich aber gelernt, nicht zu sehr an Standards, Protokollen oder Technologien fest zu halten. OStatus wurde von ActivityPub eingeholt und aktuell ist GNU.social die einzige Plattform die ausschließlich auf OStatus setzt.

Zeit los zu lassen.

Ist ActivityPub die Zukunft?

Wie gerade schon geschrieben, ist es mir prinzipiell egal, welches Format sich durchsetzen wird. Mir ist nur wichtig dass sich ein Protokoll durchsetzt. Der Trend scheint zwar zu ActivityPub zu gehen… aber wer weiß?!?

Diaspora sieht bisher jedenfalls keinen Grund ActivityPub einzusetzen:

ActivityPub tries to work for everything and everyone. And because of that, they introduced a lot of flexibility and, sadly, a lot of ambiguity. Even though they tried, I found some reasons as for why we, as diaspora* developers, would not be able to build upon this new protocol without using heavily customized objects and activities.

Dennis Schubert in „ActivityPub – one protocol to rule them all?“

und vor ein paar Wochen habe ich außerdem gelesen, dass HubZilla versucht sein Protokoll Zot zu standardisieren:

Join the efforts to standardize the Zot protocol, currently used in Hubzilla and Zap platforms. This is a community initiative to push Zot adoption for federated social web.

fediverse.party

Ich bin gespannt!

— via wedistribute.org