1
0
mirror of https://codeberg.org/fediverse/fep.git synced 2026-08-08 13:35:51 +00:00
Files
fep/fep/de8d/fep-de8d.md
T
2026-07-21 18:55:48 +00:00

7.8 KiB

slug, authors, status, discussionsTo, dateReceived, trackingIssue
slug authors status discussionsTo dateReceived trackingIssue
de8d Reese Armstrong <me@reeseric.ci> DRAFT https://socialhub.activitypub.rocks/t/fep-de8d-emoji-catalogs/8825 2026-07-19 https://codeberg.org/fediverse/fep/issues/891

FEP-de8d: Emoji Catalogs

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.

Summary

Emoji Catalogs provide a way for both clients and servers to publish and discover custom emoji.

Motivation

ActivityPub implementations, including Mastodon, commonly support custom emoji. FEP-9098 defines how an Emoji is embedded in an Activity Streams object, but it does not define how a client discovers the emoji available for use when composing new content.

This leads to ActivityPub clients relying on implementation-specific APIs such as the Mastodon custom emoji endpoint.

A standardized emoji catalog allows a C2S client to:

  • Populate an emoji picker.
  • Determine which emoji the authenticated actor may use.
  • Retrieve emoji categories and static previews.
  • Update its local cache when the catalog changes.

Additionally, a standardized emoji catalog allows servers to publish custom emoji that other ActivityPub implementations can discover reliably.

Vocabulary

emojiCatalog

  • URI: https://w3id.org/fep/de8d#emojiCatalog
  • Domain: ActivityPub actor endpoints
  • Range: IRI

The emojiCatalog property identifies an Activity Streams collection containing the custom emoji catalog for an actor.

emojiCategory

  • URI: https://w3id.org/fep/de8d#emojiCategory
  • Domain: Emoji
  • Range: string

The optional emojiCategory property identifies the user-facing category in which a client may display an emoji.

Discovery

An ActivityPub actor MAY advertise an emoji catalog using the emojiCatalog property under its endpoints property.

{
  "@context": ["https://www.w3.org/ns/activitystreams", "https://w3id.org/fep/de8d"],
  "id": "https://social.example.com/users/alice",
  "type": "Person",
  "inbox": "https://social.example.com/users/alice/inbox",
  "outbox": "https://social.example.com/users/alice/outbox",
  "endpoints": {
    "emojiCatalog": "https://social.example.com/users/alice/emojis"
  }
}

The value MUST be an IRI which identifies an Activity Streams Collection.

C2S clients MUST prefer the catalog advertised by the authenticated actor over a catalog advertised by a server-level actor.

Server-Level Catalogs

An Application or Service actor MAY advertise an emojiCatalog containing emoji that the publisher makes publicly available for discovery and reference in newly created content.

Receiving implementations MAY apply their own policies when deciding whether actors may use emoji discovered through a server-level catalog.

Consumers SHOULD cache emoji objects and media in accordance with HTTP caching semantics and any applicable usage rights.

Catalog

The emoji catalog MUST be represented as an Activity Streams Collection, which contains FEP-9098 Emoji objects.

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://w3id.org/fep/9098",
    "https://w3id.org/fep/de8d"
  ],
  "id": "https://social.example.com/users/alice/emojis",
  "type": "Collection",
  "attributedTo": "https://social.example.com/server",
  "updated": "2026-07-18T16:00:00Z",
  "totalItems": 2,
  "items": [
    {
      "id": "https://social.example.com/emojis/blobcat",
      "type": "Emoji",
      "name": ":blobcat:",
      "emojiCategory": "Animals",
      "icon": {
        "type": "Image",
        "mediaType": "image/png",
        "url": "https://social.example.com/media/blobcat.png"
      }
    },
    {
      "id": "https://social.example.com/emojis/party-parrot",
      "type": "Emoji",
      "name": ":party_parrot:",
      "emojiCategory": "Party",
      "icon": {
        "type": "Image",
        "mediaType": "image/gif",
        "url": "https://social.example.com/media/party-parrot.gif"
      },
      "preview": {
        "type": "Image",
        "mediaType": "image/png",
        "url": "https://social.example.com/media/party-parrot-static.png"
      }
    }
  ]
}

Membership

An actor-specific catalog MUST exclusively contain emoji that the actor is permitted to use in newly created content.

A server-level catalog MUST exclusively contain emoji that the publisher makes publicly available for discovery and reference in newly created content.

Receiving implementations MAY apply additional policies when deciding whether their actors may use emoji from a server-level catalog.

Absence from a catalog does not imply that an emoji is invalid or must not be rendered.

In particular, clients MUST continue to render an FEP-9098 Emoji embedded in existing or incoming content even when that emoji is absent from the authenticated actor's catalog.

Catalogs MAY include emoji whose object IDs have a different origin from the catalog.

Updates

Adding an emoji to an actor-specific catalog means that the emoji is available for use by that actor in newly created content.

Removing an emoji from an actor-specific catalog means that the emoji is no longer available for use by that actor in newly created content.

Adding an emoji to a server-level catalog means that the publisher makes the emoji publicly available for discovery and reference in newly created content.

Removing an emoji from a server-level catalog means that the publisher no longer makes the emoji publicly available for discovery and reference in newly created content.

Removing an emoji from a catalog MUST NOT invalidate existing content containing that emoji.

Filtering

This section is non-normative.

In keeping with FEP-34c1, a catalog may advertise a filtering endpoint, which may support the following properties as filtering targets:

  • https://www.w3.org/ns/activitystreams#name
  • https://www.w3.org/ns/activitystreams#updated
  • https://w3id.org/fep/de8d#emojiCategory

Items

Names

Emoji included in a catalog MUST have a name, which MUST be unique within a catalog.

Name uniqueness MUST be determined using exact string comparison.

A client encountering duplicate names MAY retain one item and ignore other items with the same name.

Categories

An emoji MAY have an emojiCategory label. Category labels do not have global semantic meaning.

Clients MAY use emojiCategory to group emoji for presentation.

Clients MUST NOT discard emoji that do not have an emojiCategory.

Static Previews

An emoji MAY use the Activity Streams preview property to identify a non-animated representation of its icon.

References

CC0 1.0 Universal (CC0 1.0) Public Domain Dedication

To the extent possible under law, the authors of this Fediverse Enhancement Proposal have waived all copyright and related or neighboring rights to this work.