$38
One of the unsolved problems in the Fediverse is capability discovery: how does a server know what extensions, custom types, or features a remote server supports? If Manyfold sends a 3D model activity to Mastodon, Mastodon discards it silently. If Lemmy receives a Like from Mastodon, it creates unnecessary traffic because Lemmy uses voting, not Like.
Several Fediverse Enhancement Proposals have attempted to solve this by extending NodeInfo — the existing server metadata protocol — with extension and capability declarations. The most notable was FEP-6481 (authored by James Smith / "Floppy," received 2024-03-12, WITHDRAWN 2024-10-31), which proposed a simple IRI list in NodeInfo metadata. It was withdrawn in favor of FEP-9fde, which takes a broader approach.
This is an active area of development with no FINAL-status solution.
NodeInfo is a protocol for servers to publish metadata about themselves. It originated in the Diaspora project (predating ActivityPub) and is formalized in the Fediverse by FEP-f1d5 (status FINAL, revised as FEP-0151 in 2025).
Servers expose /.well-known/nodeinfo containing a JRD document:
{
"links": [
{
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.1",
"href": "https://example.social/nodeinfo/2.1"
}
]
}
| Property | Description |
|---|---|
software | Name, version, homepage, repository |
protocols | Supported protocols (e.g., ["activitypub"]) |
services | Inbound and outbound service integrations |
openRegistrations | Whether new accounts can be created |
usage | User counts, local post count |
metadata | Free-form key-value pairs — the extension point |
The metadata field is deliberately unstructured. The spec says: "Clients
should not rely on any specific key present." This is where extension
discovery proposals place their data.
FEP-6481 proposed the simplest approach: an array of IRIs in NodeInfo metadata declaring which ActivityPub extensions a server supports.
{
"version": "2.1",
"protocols": ["activitypub"],
"metadata": {
"activitypub": {
"extensions": [
"https://w3id.org/manyfold/3dModel#v1",
"https://joinbookwyrm.org/ns/activitypub#Review"
]
}
}
}
#v1)James Smith ("Floppy") created Manyfold, a federated 3D model manager
that extends ActivityPub with the f3di namespace
(http://purl.org/f3di/ns#). When Manyfold sends activities with custom 3D
model types, servers like Mastodon silently discard them. There was no way
to discover in advance whether a remote server would understand the custom
types.
Floppy withdrew FEP-6481 on 2024-10-31 in favor of FEP-9fde (by nikclayton), which covers the same use case with broader scope. FEP-9fde can express everything FEP-6481 proposed while also addressing client APIs, federation features, and arbitrary server operations.
nightpool's strong objection: "I strongly, strongly object to this FEP." The argument:
Review, Manyfold's 3D model types) break
graceful degradation because standard servers discard unrecognized types
entirelystevebate's concerns: the definition of "extension" was too vague;
fragment-based URI versioning (#v1) doesn't work with HTTP (fragments
aren't sent to servers); dereferenceable URIs should use path or query
parameter versioning instead.
nutomic's reinterpretation: saw it as a traffic filtering mechanism — Lemmy could use it to tell servers "don't send me Like activities, I use voting."
FEP-9fde (by nikclayton, DRAFT) extends NodeInfo with a standardized
operations property using reverse-FQDN identifiers and semantic
versioning.
{
"operations": {
"org.joinmastodon.api.statuses.post": ["1.0.0", "1.1.0", "2.0.0"],
"app.manyfold.activitypub.accept.3dmodel": ["1.0.0"],
"io.github.glitch-soc.api.statuses.bookmark": ["1.0.0"]
}
}
| Aspect | FEP-6481 | FEP-9fde |
|---|---|---|
| Scope | ActivityPub extensions only | Any server operation |
| Identifiers | IRIs with fragment versioning | Reverse-FQDN strings |
| Versioning | Fragment identifiers (#v1) | Semver arrays (["1.0.0"]) |
| Location | metadata.activitypub.extensions | operations property |
| Granularity | Per-extension | Per-operation |
| Status | WITHDRAWN | DRAFT |
FEP-9fde explicitly rejects several alternatives:
Multiple proposals address the same fundamental problem:
Lists which Activity and Object types a server handles:
{
"activities": ["Create", "Update", "Delete", "Like", "Announce"],
"objects": ["Note", "Article"],
"properties": {}
}
Focuses on describing the standard ActivityStreams vocabulary a server supports, rather than arbitrary extensions or operations.
Instead of using NodeInfo, attaches capability information to the ActivityPub application actor itself. Based on FEP-aaa3 (listing implemented specifications on the application actor). This keeps capability data within the ActivityPub protocol rather than relying on the external NodeInfo protocol.
A human-readable approach: servers include a FEDERATION.md file
documenting their federation behavior. Status FINAL. This solves the
documentation problem but not machine-readable discovery.
| FEP | Approach | Machine-readable? | Status |
|---|---|---|---|
| FEP-6481 | IRI list in NodeInfo metadata | Yes | WITHDRAWN |
| FEP-9fde | Reverse-FQDN operations in NodeInfo | Yes | DRAFT |
| FEP-eb22 | Type lists in NodeInfo | Yes | DRAFT |
| FEP-844e | Capability URIs on AP actors | Yes | DRAFT |
| FEP-67ff | FEDERATION.md documentation | No (human only) | FINAL |
A fundamental philosophical question underlies all extension discovery