# tech.tokimeki.forum.thread

> Published by [tokimeki.blue](https://lexicon.garden/identity/did:plc:4tr5dqti7nmu6g2czpthntak)

✓ This is the authoritative definition for this NSID.

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:4tr5dqti7nmu6g2czpthntak/tech.tokimeki.forum.thread)
- [Documentation](https://lexicon.garden/lexicon/did:plc:4tr5dqti7nmu6g2czpthntak/tech.tokimeki.forum.thread/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:4tr5dqti7nmu6g2czpthntak/tech.tokimeki.forum.thread/examples)

## Definitions

### `tech.tokimeki.forum.thread`

**Type**: `record`

A thread (topic) opened in a forum-kind channel. Written into the opener's own repo within the space. The thread carries its own body; comments are tech.tokimeki.forum.message records referencing it.

**Key**: `tid`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `tags` | `array` | No |  |
| `text` | `string` | No |  |
| `blobs` | `array` | No | Images placed inline in `content`. Uploaded with com.atproto.repo.uploadBlob to the author's PDS; each `content` image node carries the cid of one of these blobs. |
| `embed` | `union` | No |  |
| `langs` | `array` | No | Languages of the title and text (BCP-47). |
| `title` | `string` | Yes |  |
| `facets` | `array` | No |  |
| `labels` | `union` | No | Self-applied labels, e.g. for adult content. |
| `channel` | `string` (at-uri) | Yes | Space record URI of the tech.tokimeki.forum.channel this thread belongs to. A channel is a mutable container, so it is referenced by URI alone (like app.bsky.graph.listitem). |
| `content` | `ref` → `#richContent` | No | Rich body as a ProseMirror/TipTap document tree: paragraphs, headings (2-4), lists, task lists, quotes, code blocks, tables, callouts, toggles, link cards, mentions and images. Image nodes reference an entry of `blobs` by cid. When present, `text` is the plain-text projection of this tree for search, previews and text-only clients. |
| `editedAt` | `string` (datetime) | No | Set when the thread was edited in place (putRecord with the same rkey). |
| `createdAt` | `string` (datetime) | Yes |  |

### `tech.tokimeki.forum.thread#richContent`

**Type**: `object`

A ProseMirror/TipTap document node (recursive). Consumers validate against the node whitelist in the app; unknown node types are ignored.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `text` | `string` | No | Text of a text node. |
| `type` | `string` | Yes | Node type (doc, paragraph, heading, text, hardBreak, mention, bulletList, orderedList, listItem, taskList, taskItem, blockquote, codeBlock, horizontalRule, image, table, tableRow, tableCell, tableHeader, callout, details, linkCard). |
| `attrs` | `unknown` | No | Node attributes (heading level, image cid/alt/size, link card url…). |
| `marks` | `array` | No | Inline marks on a text node: bold, italic, strike, underline, code, link{href}. |
| `content` | `array` | No | Child nodes. |

## Raw Schema

```json
{
  "id": "tech.tokimeki.forum.thread",
  "defs": {
    "main": {
      "key": "tid",
      "type": "record",
      "record": {
        "type": "object",
        "required": [
          "channel",
          "title",
          "createdAt"
        ],
        "properties": {
          "tags": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 320,
              "maxGraphemes": 32
            },
            "maxLength": 8
          },
          "text": {
            "type": "string",
            "maxLength": 40000,
            "maxGraphemes": 5000
          },
          "blobs": {
            "type": "array",
            "items": {
              "ref": "tech.tokimeki.forum.defs#image",
              "type": "ref"
            },
            "maxLength": 20,
            "description": "Images placed inline in `content`. Uploaded with com.atproto.repo.uploadBlob to the author's PDS; each `content` image node carries the cid of one of these blobs."
          },
          "embed": {
            "refs": [
              "tech.tokimeki.forum.defs#images"
            ],
            "type": "union"
          },
          "langs": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "language"
            },
            "maxLength": 3,
            "description": "Languages of the title and text (BCP-47)."
          },
          "title": {
            "type": "string",
            "maxLength": 1280,
            "maxGraphemes": 128
          },
          "facets": {
            "type": "array",
            "items": {
              "ref": "app.bsky.richtext.facet",
              "type": "ref"
            }
          },
          "labels": {
            "refs": [
              "com.atproto.label.defs#selfLabels"
            ],
            "type": "union",
            "description": "Self-applied labels, e.g. for adult content."
          },
          "channel": {
            "type": "string",
            "format": "at-uri",
            "description": "Space record URI of the tech.tokimeki.forum.channel this thread belongs to. A channel is a mutable container, so it is referenced by URI alone (like app.bsky.graph.listitem)."
          },
          "content": {
            "ref": "#richContent",
            "type": "ref",
            "description": "Rich body as a ProseMirror/TipTap document tree: paragraphs, headings (2-4), lists, task lists, quotes, code blocks, tables, callouts, toggles, link cards, mentions and images. Image nodes reference an entry of `blobs` by cid. When present, `text` is the plain-text projection of this tree for search, previews and text-only clients."
          },
          "editedAt": {
            "type": "string",
            "format": "datetime",
            "description": "Set when the thread was edited in place (putRecord with the same rkey)."
          },
          "createdAt": {
            "type": "string",
            "format": "datetime"
          }
        }
      },
      "description": "A thread (topic) opened in a forum-kind channel. Written into the opener's own repo within the space. The thread carries its own body; comments are tech.tokimeki.forum.message records referencing it."
    },
    "richContent": {
      "type": "object",
      "required": [
        "type"
      ],
      "properties": {
        "text": {
          "type": "string",
          "description": "Text of a text node."
        },
        "type": {
          "type": "string",
          "description": "Node type (doc, paragraph, heading, text, hardBreak, mention, bulletList, orderedList, listItem, taskList, taskItem, blockquote, codeBlock, horizontalRule, image, table, tableRow, tableCell, tableHeader, callout, details, linkCard)."
        },
        "attrs": {
          "type": "unknown",
          "description": "Node attributes (heading level, image cid/alt/size, link card url…)."
        },
        "marks": {
          "type": "array",
          "items": {
            "type": "unknown"
          },
          "description": "Inline marks on a text node: bold, italic, strike, underline, code, link{href}."
        },
        "content": {
          "type": "array",
          "items": {
            "type": "unknown"
          },
          "description": "Child nodes."
        }
      },
      "description": "A ProseMirror/TipTap document node (recursive). Consumers validate against the node whitelist in the app; unknown node types are ignored."
    }
  },
  "$type": "com.atproto.lexicon.schema",
  "lexicon": 1
}
```
