Discussion boards are best characterized as a collection of publicly-appendable collections.

A topic is a sm:BoardTopic object, which is a subtype of Collection. A group has a sm:boardTopics collection that contains these.

All topic objects are always hosted on the same server as the group itself.

Example of a topic object with self-explanatory field names:

{
  "type": "BoardTopic",
  "id": "https://smithereen.local/topics/g0SUvfwEsQY",
  "attributedTo": "https://smithereen.local/groups/1",
  "name": "Another topic",
  "published": "2025-07-06T04:18:37Z",
  "updated": "2025-07-06T04:18:37Z",
  "url": "https://smithereen.local/topics/g0SUvfwEsQY",
  "totalItems": 1,
  "first": {
    "type": "CollectionPage",
    "id": "https://smithereen.local/topics/g0SUvfwEsQY?page=1",
    "totalItems": 1,
    "items": [
      {
        "type": "Note",
        "id": "https://smithereen.local/comments/Dw8sX4usHMc",
        "attributedTo": "https://smithereen.local/users/1",
        "content": "<p>qerqwe</p>\n",
        "published": "2025-07-06T04:18:37Z",
        "url": "https://smithereen.local/comments/Dw8sX4usHMc",
        "replies": {
          "type": "Collection",
          "id": "https://smithereen.local/comments/Dw8sX4usHMc/replies",
          "first": {
            "type": "CollectionPage",
            "items": [],
            "partOf": "https://smithereen.local/comments/Dw8sX4usHMc/replies",
            "next": "https://smithereen.local/comments/Dw8sX4usHMc/replies?page=1"
          }
        },
        "sensitive": false,
        "target": {
          "type": "BoardTopic",
          "id": "https://smithereen.local/topics/g0SUvfwEsQY",
          "attributedTo": "https://smithereen.local/groups/1"
        },
        "likes": {
          "type": "Collection",
          "id": "https://smithereen.local/comments/Dw8sX4usHMc/likes",
          "first": {
            "type": "CollectionPage",
            "items": [],
            "partOf": "https://smithereen.local/comments/Dw8sX4usHMc/likes",
            "next": "https://smithereen.local/comments/Dw8sX4usHMc/likes?page=1"
          }
        }
      }
    ],
    "partOf": "https://smithereen.local/topics/g0SUvfwEsQY"
  },
  "pinnedAt": "2026-03-09T19:23:02.360384Z",
  "isLocked": false,
  "firstComment": "https://smithereen.local/comments/Dw8sX4usHMc",
  "author": "https://smithereen.local/users/1",
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "sensitive": "as:sensitive",
      "sm": "http://smithereen.software/ns#",
      "BoardTopic": "sm:BoardTopic",
      "pinnedAt": "sm:pinnedAt",
      "isLocked": "sm:isLocked",
      "author": {
        "@id": "sm:author",
        "@type": "@id"
      },
      "firstComment": {
        "@id": "sm:firstComment",
        "@type": "@id"
      }
    }
  ]
}

Creating a topic

To create a topic in a remote group, the originating server creates a temporary topic locally and sends a sm:TopicCreationRequest activity. The activity has the following required fields:

  • id
  • actor, obviously
  • name – the topic title
  • object – the first comment in the topic (with target unset)
  • to – contains the group ID

If the server that hosts the group approves this, it creates the topic and sends back an Accept{sm:TopicCreationRequest} activity, with result containing the newly created topic. The originating server then updates its topic object with the assigned ID, making it point to the remote server. If the delivery of the sm:TopicCreationRequest activity fails for any reason, the originating server deletes the temporary topic and undoes anything else it might have done in relation to it, and displays an error to the user. It follows that only a single attempt to deliver this activity is made.

After a new topic has been created, whether remotely or locally, the group sends Create{sm:BoardTopic} to its followers.

Renaming a topic

The user who started the topic can rename it. If the topic is in a remote group, this is done by sending a sm:TopicRenameRequest activity with the new title in name. There is no Accept this time; if the rename succeeds, the group just sends an Update{sm:BoardTopic} to its followers. Same consideration as for creating a topic apply here – if the activity delivery fails, the new name should not be applied.

Group managers can also rename any topic in their group.

Deleting a topic

The user who started the topic can delete it. If the topic is in a remote group, this is done by deleting the first comment, a Delete{Note} sent to the group. The group then deletes the topic (and all comments in it) and sends a Delete{sm:BoardTopic} to its followers.

Group managers can also delete any topic in their group. When this happens, the same Delete{sm:BoardTopic} is sent to followers.

Pinning, unpinning, closing, reopening

These are just fields in the topic object. They are updated using an Update{sm:BoardTopic} activity.

As these actions can only be performed by group managers, and managing a group from a remote server is not supported at this time, there is no provision yet for performing these actions via ActivityPub.