# orderedItems[].object.content
So, an interesting issue came up in the #Fedify repo that I've been thinking about: #629.

You know how every #fediverse server uses schema:PropertyValue in actor attachment for profile metadata fields (like “Website”, “GitHub”, etc.)? Turns out, strict #AS2 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 #FEP 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.

#fedidev #ActivityPub #ActivityStreams #ActivityStreams2 #AS2 #PropertyValue

# orderedItems[].object.source.content
So, an interesting issue came up in the #Fedify repo that I've been thinking about: [#629].

You know how every #fediverse server uses `schema:PropertyValue` in actor `attachment` for profile metadata fields (like “Website”, “GitHub”, etc.)? Turns out, strict #AS2 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][1], 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 #FEP 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.

#fedidev #ActivityPub #ActivityStreams #ActivityStreams2 #AS2 #PropertyValue

[#629]: https://github.com/fedify-dev/fedify/issues/629
[browser.pub]: https://browser.pub/
[1]: https://docs.joinmastodon.org/spec/activitypub/#schema
[#576]: https://github.com/fedify-dev/fedify/issues/576

# orderedItems[].object.ephemeral.metadata[].twitterTitle
PropertyValue attachments serialize with invalid type for AS2 Object/Link validation · Issue #629 · fedify-dev/fedify

# orderedItems[].object.ephemeral.metadata[].description
Description When Fedify serializes actor attachment properties containing PropertyValue items (used by Mastodon for profile metadata fields), the resulting JSON-LD uses schema:PropertyValue as the type: "attachment": [ { "type": "Propert...

# orderedItems[].object.ephemeral.metadata[].ogDescription
Description When Fedify serializes actor attachment properties containing PropertyValue items (used by Mastodon for profile metadata fields), the resulting JSON-LD uses schema:PropertyValue as the ...

# orderedItems[].object.ephemeral.metadata[].ogTitle
PropertyValue attachments serialize with invalid type for AS2 Object/Link validation · Issue #629 · fedify-dev/fedify

# orderedItems[].object.ephemeral.metadata[].twitterDescription
Description When Fedify serializes actor attachment properties containing PropertyValue items (used by Mastodon for profile metadata fields), the resulting JSON-LD uses schema:PropertyValue as the ...

# orderedItems[].object.ephemeral.metadata[].ogDescription
Explore the open social web through the lens of ActivityPub and the fediverse.

# orderedItems[].object.ephemeral.metadata[].ogTitle
BrowserPub · A browser for exploring ActivityPub and the fediverse

# orderedItems[].object.ephemeral.metadata[].description
A decentralized social networking protocol based upon the ActivityStreams 2.0 data format and JSON-LD.

# orderedItems[].object.ephemeral.metadata[].ogDescription
A decentralized social networking protocol based upon the ActivityStreams 2.0 data format and JSON-LD.

# orderedItems[].object.ephemeral.metadata[].twitterTitle
Endpoints object serializes with invalid "type": "as:Endpoints" in actor JSON · Issue #576 · fedify-dev/fedify

# orderedItems[].object.ephemeral.metadata[].description
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": "https://example.com/activitypub/inbox" } Th...

# orderedItems[].object.ephemeral.metadata[].ogDescription
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...

# orderedItems[].object.ephemeral.metadata[].ogTitle
Endpoints object serializes with invalid "type": "as:Endpoints" in actor JSON · Issue #576 · fedify-dev/fedify

# orderedItems[].object.ephemeral.metadata[].twitterDescription
Description When Fedify serializes an actor's endpoints property to JSON-LD (compacted), it includes "type": "as:Endpoints" in the output: "endpoints": { "typ...

# orderedItems[].object.content
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‽

...

#ActivityPub #ActivityStreams #AudioCall #Call #FediDev #Fediverse #VideoCall

# orderedItems[].object.content
@steve

Have there been any further discussions on this? I think it’s becoming increasingly important!

https://github.com/steve-bate/activity pub-ontology/blob/main/activitystreams2.ttl

#activitystreams #activitypub #rdf

# orderedItems[].object.ephemeral.metadata[].description
This ontology is an unofficial version of an ActivityPub OWL ontology for experimentation and exploration purposes. It's based on an old Activity Streams ontology that was abandoned in favor of JSON-LD in ActivityPub. I also created a separate ontology for Mastodon (toot) extensions. - activitypub-ontology/activitystreams2.ttl at main · steve-bate/activitypub-ontology

# orderedItems[].object.ephemeral.metadata[].ogDescription
This ontology is an unofficial version of an ActivityPub OWL ontology for experimentation and exploration purposes. It's based on an old Activity Streams ontology that was abandoned in favor of...

# orderedItems[].object.ephemeral.metadata[].twitterDescription
This ontology is an unofficial version of an ActivityPub OWL ontology for experimentation and exploration purposes. It&#39;s based on an old Activity Streams ontology that was abandoned in favo...

# orderedItems[].object.content
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.

https://j12t.social/@j12t/114581086678 041245

...

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.

#ActivityPub #ActivityStreams #CBOR #CBORLD #FediDev #JSONLD

# orderedItems[].object.ephemeral.metadata[].description
OH: "I didn't like JSON-LD, but then I saw CBOR, and now I like JSON-LD much better"

# orderedItems[].object.ephemeral.metadata[].ogDescription
OH: "I didn't like JSON-LD, but then I saw CBOR, and now I like JSON-LD much better"

# orderedItems[].object.content
RE: https://w3c.social/@w3c/11621607036256 3670

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.

#ActivityPub #ActivityStreams #JSONLD #LinkedData #RDF #YAML #YAMLLD

# orderedItems[].object.content
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.

#ActivityPub #ActivityStreams #FediDev #Fediverse

# orderedItems[].object.content
RE: https://mastodon.social/@reiver/112133 984854710390

"A guide to implement ActivityPub in a static site (or any website)" by @mapache

https://maho.dev/2024/02/a-guide-to-im plement-activitypub-in-a-static-site-or-any-website/

#ActivityPub #ActivityStreams #FediDev #FediDevs #Fediverse

# orderedItems[].object.ephemeral.metadata[].description
Attached: 1 image

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 —

🧵

# orderedItems[].object.ephemeral.metadata[].ogDescription
Attached: 1 image

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 —

🧵

# orderedItems[].object.ephemeral.metadata[].description
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.

# orderedItems[].object.ephemeral.metadata[].ogDescription
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.

# orderedItems[].object.ephemeral.metadata[].ogTitle
A guide to implement ActivityPub in a static site (or any website)

# orderedItems[].object.content
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.

#ActivityPub #ActivityStreams #RDF #JSONLD

# orderedItems[].object.attachment[].name
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.

# orderedItems[].object.content
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.

#ActivityPub #ActivityStreams #JSONLD #RFC7159 #RFC8259

# orderedItems[].object.attachment[].name
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]).

# orderedItems[].object.content
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.)

#ActivityPub #ActivityStreams #FediDev #FediDevs #Fediverse

# orderedItems[].object.content
@trwnh @evan @julian

Yes, for the ideation on Protosocial as an #ActivityPub 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 #ActivityStreams 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 #ActivityStreams 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.

# orderedItems[].object.content
@evan @julian

#ActivityPub builds on top of #ActivityStreams 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.

https://social.coop/@smallcircles/1160 96886732404993

# orderedItems[].object.ephemeral.metadata[].description
@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.

# orderedItems[].object.ephemeral.metadata[].ogDescription
@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.

# orderedItems[].object.content
@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 #ActivityPub in line with the aims of #SocialWeb?

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

# orderedItems[].object.content
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: https://mastodon.social/@reiver/114551 725757671167

#ActivityPub #ActivityStreams #Decentralization #DeSo #Federation #FeSo #Fediverse #governance #Localization #LoSo

# orderedItems[].object.ephemeral.metadata[].description
Decentralized Social (DeSo), Federated Social (FeSo), Localized Social (LoSo)


RE: https://mastodon.social/@reiver/114406141298522537

# orderedItems[].object.ephemeral.metadata[].ogDescription
Decentralized Social (DeSo), Federated Social (FeSo), Localized Social (LoSo)


RE: https://mastodon.social/@reiver/114406141298522537

# orderedItems[].object.content
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.

#ActivityPub #ActivityStreams #Decentralization #DeSo #Federation #FeSo #Fediverse #governance #Localization #LoSo

# orderedItems[].object.summary
From its conception, #Enigmatick has leaned heavily on the `inbox` and `outbox` endpoints for client operations. [...]

# orderedItems[].object.content
From its conception, #Enigmatick has leaned heavily on the /inbox and /outbox endpoints for client operations. There are some /api endpoints, but I avoid that were I can shoehorn operations into the #ActivityPub specification and #ActivityStreams vocabulary.

While typical operational activities are fairly well accounted for, administration is a weak point. For example: I haven't identified a clear way to use the currently described mechanisms for an administrative user to pull up and manage instances or actors on a server.

I've relied on CLI tools (e.g., ./enigmatick --help) to manage some of that. And in some cases, I know how to manipulate data in my database, so I haven't worried too much about building tooling. But I'd like to ship something that other folks can use to share in my efforts, so I've been thinking about how to model those activities in an ActivityPub-esque way to use in the Svelte UI.

ActivityPub Messages

To that end, I'm now using Block and Delete activities sent from the client to the server outbox to manage the blocking of instances and purging of data.

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "ek": "https://enigmatick.social/ns#",
      "Instance": "ek:Instance"
    }
  ],
  "id": "https://enigmatick.social/activities/550e8400-e29b-41d4-a716-446655440000",
  "type": "Block",
  "actor": "https://enigmatick.social/user/system",
  "object": {
    "type": "Instance",
    "id": "https://spammy-instance.example"
  }
}

In practice, my client does not generate the id, but that attribute is generated by the server and the Activity is stored alongside other typically federated activities. These local Block activities are not federated out to other servers; they are intended solely for local server management.

The Block activity is sent as a message signed at the client by a user with administrative privileges on the server. Enigmatick's user authentication is unique (i.e., I use a separate set of encryption keys for client-signing executed by a wasm module in the browser). That can be a topic for a future article.

That the actor is defined as the system Application user is important. That's used by the server to establish the scope of this action as system-wide, not just for a single user. The system actor is discoverable in the nodeinfo metadata.

I'm using a typed object rather than just an id reference. This is so that I can use this same flow for blocking and purging Actor objects (i.e., the type would be Person, Service, or Application).

The purge action is similar, using the Delete activity.

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "ek": "https://enigmatick.social/ns#",
      "Instance": "ek:Instance"
    }
  ],
  "id": "https://enigmatick.social/activities/550e8400-e29b-41d4-a716-446655440000",
  "type": "Delete",
  "actor": "https://enigmatick.social/user/system",
  "object": {
    "type": "Instance",
    "id": "https://spammy-instance.example"
  }
}

The term, "delete" is a bit of a misnomer in this case as it applies to the instance specifically. The instance will remain, but the objects, activities, and actors associated with that instance will be fully deleted (i.e., not set to Tombstone).

Collection Endpoints

To facilitate the UI operations, I've created two new collection endpoints on my server: /instances and /actors. These endpoints provide typical ActivityPub Collection objects.

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "Instance": "ek:Instance",
      "activitiesCount": "ek:activitiesCount",
      "actorsCount": "ek:actorsCount",
      "blocked": "ek:blocked",
      "ek": "https://enigmatick.social/ns#",
      "lastMessageAt": "ek:lastMessageAt",
      "objectsCount": "ek:objectsCount"
    }
  ],
  "type": "OrderedCollection",
  "id": "https://enigmatick.social/instances",
  "totalItems": 7702,
  "orderedItems": [
    {
      "type": "Instance",
      "id": "https://example-instance.name",
      "blocked": false,
      "created": "2025-12-16T16:56:33Z",
      "lastMessageAt": "2025-12-16T16:56:33Z",
      "actorsCount": 0,
      "objectsCount": 1,
      "activitiesCount": 0
    }
  ],
  "first": "https://enigmatick.social/instances?max=9223372036854775807",
  "last": "https://enigmatick.social/instances?min=0",
  "next": "https://enigmatick.social/instances?max=1765657395402834"
}

I've added some extensions in the @context to account for a few non-standard attributes.

That collection is used by the UI.

Collection Discovery

nodeinfo is a common protocol used for discovering information about ActivityPub-speaking servers. I've extended my use of that to facilitate client-discovery of these new endpoints using the metadata object contained in the nodeinfo JSON.

"metadata": {
  "actor": "https://enigmatick.social/user/system",
  "adminActors": "https://enigmatick.social/actors",
  "adminInstances": "https://enigmatick.social/instances",
  "domain": "enigmatick.social",
  "url": "https://enigmatick.social"
}

Final Thoughts

As I'm reading through this, I see some opportunities for refinement. I should probably be using OrderedCollectionPage instead of OrderedCollection for my collection endpoints. I'm sure there are other tweaks to be made.

# orderedItems[].object.source.content
From its conception, #Enigmatick has leaned heavily on the `/inbox` and `/outbox` endpoints for client operations. There are some `/api` endpoints, but I avoid that were I can shoehorn operations into the #ActivityPub specification and #ActivityStreams vocabulary.

While typical operational activities are fairly well accounted for, administration is a weak point. For example: I haven't identified a clear way to use the currently described mechanisms for an administrative user to pull up and manage instances or actors on a server.

I've relied on CLI tools (e.g., `./enigmatick --help`) to manage some of that. And in some cases, I know how to manipulate data in my database, so I haven't worried too much about building tooling. But I'd like to _ship_ something that other folks can use to share in my efforts, so I've been thinking about how to model those activities in an ActivityPub-esque way to use in the Svelte UI.

## ActivityPub Messages

To that end, I'm now using `Block` and `Delete` activities sent from the client to the server `outbox` to manage the blocking of instances and purging of data.

```json
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "ek": "https://enigmatick.social/ns#",
      "Instance": "ek:Instance"
    }
  ],
  "id": "https://enigmatick.social/activities/550e8400-e29b-41d4-a716-446655440000",
  "type": "Block",
  "actor": "https://enigmatick.social/user/system",
  "object": {
    "type": "Instance",
    "id": "https://spammy-instance.example"
  }
}
```

In practice, my client does not generate the `id`, but that attribute is generated by the server and the `Activity` is stored alongside other typically federated activities. These local `Block` activities are not federated out to other servers; they are intended solely for local server management.

The `Block` activity is sent as a message signed at the client by a user with administrative privileges on the server. Enigmatick's user authentication is unique (i.e., I use a separate set of encryption keys for client-signing executed by a `wasm` module in the browser). That can be a topic for a future article.

That the `actor` is defined as the system `Application` user is important. That's used by the server to establish the scope of this action as system-wide, not just for a single user. The system actor is discoverable in the `nodeinfo` metadata.

I'm using a typed object rather than just an `id` reference. This is so that I can use this same flow for blocking and purging `Actor` objects (i.e., the `type` would be `Person`, `Service`, or `Application`).

The purge action is similar, using the `Delete` activity.

```json
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "ek": "https://enigmatick.social/ns#",
      "Instance": "ek:Instance"
    }
  ],
  "id": "https://enigmatick.social/activities/550e8400-e29b-41d4-a716-446655440000",
  "type": "Delete",
  "actor": "https://enigmatick.social/user/system",
  "object": {
    "type": "Instance",
    "id": "https://spammy-instance.example"
  }
}
```
The term, "delete" is a bit of a misnomer in this case as it applies to the instance specifically. The instance will remain, but the `objects`, `activities`, and `actors` associated with that instance will be fully deleted (i.e., not set to `Tombstone`).

## Collection Endpoints

To facilitate the UI operations, I've created two new collection endpoints on my server: `/instances` and `/actors`. These endpoints provide typical ActivityPub `Collection` objects.

```json
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "Instance": "ek:Instance",
      "activitiesCount": "ek:activitiesCount",
      "actorsCount": "ek:actorsCount",
      "blocked": "ek:blocked",
      "ek": "https://enigmatick.social/ns#",
      "lastMessageAt": "ek:lastMessageAt",
      "objectsCount": "ek:objectsCount"
    }
  ],
  "type": "OrderedCollection",
  "id": "https://enigmatick.social/instances",
  "totalItems": 7702,
  "orderedItems": [
    {
      "type": "Instance",
      "id": "https://example-instance.name",
      "blocked": false,
      "created": "2025-12-16T16:56:33Z",
      "lastMessageAt": "2025-12-16T16:56:33Z",
      "actorsCount": 0,
      "objectsCount": 1,
      "activitiesCount": 0
    }
  ],
  "first": "https://enigmatick.social/instances?max=9223372036854775807",
  "last": "https://enigmatick.social/instances?min=0",
  "next": "https://enigmatick.social/instances?max=1765657395402834"
}
```
I've added some extensions in the `@context` to account for a few non-standard attributes.

That collection is used by the UI.

![The Enigmatick instances UI showing the most recently discovered instances from the enigmatick.social server](https://enigmatick.social/media/uploads/3c327280-2358-468a-bea9-b77d9f016ebb.png)

## Collection Discovery

`nodeinfo` is a common protocol used for discovering information about ActivityPub-speaking servers. I've extended my use of that to facilitate client-discovery of these new endpoints using the `metadata` object contained in the `nodeinfo` JSON.

```json
"metadata": {
  "actor": "https://enigmatick.social/user/system",
  "adminActors": "https://enigmatick.social/actors",
  "adminInstances": "https://enigmatick.social/instances",
  "domain": "enigmatick.social",
  "url": "https://enigmatick.social"
}
```
## Final Thoughts

As I'm reading through this, I see some opportunities for refinement. I should probably be using `OrderedCollectionPage` instead of `OrderedCollection` for my collection endpoints. I'm sure there are other tweaks to be made.

# orderedItems[].object.attachment[].name
The Enigmatick instances UI showing the most recently discovered instances from the enigmatick.social server

# orderedItems[].object.content
1/

[Fediverse BackUp]

Could an ActivityPub / ActivityStreams file be a "good" format for backing up a post?

(I.e., what I call an "Activity File". I.e., the file that has a media-type of "application/activity+json".)

...

#ActivityPub #ActivityStreams #BackUp #BackUps #FediBackUp #FediDev #FediDevs #Fediverse

# orderedItems[].object.content
If you're trying to dereference all RDF namespaces found in the #ActivityStreams JSON-LD document you must first download the internet.

Now downloading google.com...

#ActivityPub #ActivityPubDev

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

I have a bunch of stuff #bookmarked; 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.

# orderedItems[].object.content
"＠context": [
"https://www. w3.org/ns/activitystreams",
{
"Quotation": "as:Quotation",
"citation": "as:citation",
"quotation": "as:quotation"
},
],

#ActivityPub #ActivityStreams #FediDev #Fediverse #JSONLD #ObjectTypeQuotation #retejo

# orderedItems[].object.ephemeral.metadata[].description
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.