tech.tokimeki.forum.thread

tokimeki.blue

Schema Diff

+49 -0

From

CID
bafyreieqxery4sj...
Indexed At
2026-08-25 13:18 UTC
View this version

To

CID
bafyreigpaub35p7...
Indexed At
2026-08-28 16:52 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

1 breaking change, 23 non-breaking changes.

Breaking Changes (1)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "tech.tokimeki.forum.thread#richContent", src: "tech.tokimeki.forum.thread#richContent", tgt: "tech.tokimeki.forum.thread#richContent.type", kind: "prop", name: Some("type") }
Non-Breaking Changes (23)
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.defs#image" }
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent" }
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent.attrs" }
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent.content" }
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent.content:items" }
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent.marks" }
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent.marks:items" }
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent.text" }
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent.type" }
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.thread:body.blobs" }
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.thread:body.blobs:items" }
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.thread:body.content" }
  • AddedEdge AddedEdge { src: "tech.tokimeki.forum.thread#richContent", tgt: "tech.tokimeki.forum.thread#richContent.attrs", kind: "prop", name: Some("attrs") }
  • AddedEdge AddedEdge { src: "tech.tokimeki.forum.thread#richContent", tgt: "tech.tokimeki.forum.thread#richContent.content", kind: "prop", name: Some("content") }
  • AddedEdge AddedEdge { src: "tech.tokimeki.forum.thread#richContent", tgt: "tech.tokimeki.forum.thread#richContent.marks", kind: "prop", name: Some("marks") }
  • AddedEdge AddedEdge { src: "tech.tokimeki.forum.thread#richContent", tgt: "tech.tokimeki.forum.thread#richContent.text", kind: "prop", name: Some("text") }
  • AddedEdge AddedEdge { src: "tech.tokimeki.forum.thread#richContent.content", tgt: "tech.tokimeki.forum.thread#richContent.content:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "tech.tokimeki.forum.thread#richContent.marks", tgt: "tech.tokimeki.forum.thread#richContent.marks:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "tech.tokimeki.forum.thread:body", tgt: "tech.tokimeki.forum.thread:body.blobs", kind: "prop", name: Some("blobs") }
  • AddedEdge AddedEdge { src: "tech.tokimeki.forum.thread:body", tgt: "tech.tokimeki.forum.thread:body.content", kind: "prop", name: Some("content") }
  • AddedEdge AddedEdge { src: "tech.tokimeki.forum.thread:body.blobs", tgt: "tech.tokimeki.forum.thread:body.blobs:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "tech.tokimeki.forum.thread:body.blobs:items", tgt: "tech.tokimeki.forum.defs#image", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "tech.tokimeki.forum.thread:body.content", tgt: "tech.tokimeki.forum.thread#richContent", kind: "ref", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "tech.tokimeki.forum.defs#image" }
  • AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent" }
  • AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent.attrs" }
  • AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent.content" }
  • AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent.content:items" }
  • AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent.marks" }
  • AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent.marks:items" }
  • AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent.text" }
  • AddedVertex { vertex_id: "tech.tokimeki.forum.thread#richContent.type" }
  • AddedVertex { vertex_id: "tech.tokimeki.forum.thread:body.blobs" }
  • AddedVertex { vertex_id: "tech.tokimeki.forum.thread:body.blobs:items" }
  • AddedVertex { vertex_id: "tech.tokimeki.forum.thread:body.content" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "tech.tokimeki.forum.thread#richContent", src: "tech.tokimeki.forum.thread#richContent", tgt: "tech.tokimeki.forum.thread#richContent.type", kind: "prop", name: Some("type") }
  • Non-breaking: AddedEdge { src: "tech.tokimeki.forum.thread#richContent", tgt: "tech.tokimeki.forum.thread#richContent.attrs", kind: "prop", name: Some("attrs") }
  • Non-breaking: AddedEdge { src: "tech.tokimeki.forum.thread#richContent", tgt: "tech.tokimeki.forum.thread#richContent.content", kind: "prop", name: Some("content") }
  • Non-breaking: AddedEdge { src: "tech.tokimeki.forum.thread#richContent", tgt: "tech.tokimeki.forum.thread#richContent.marks", kind: "prop", name: Some("marks") }
  • Non-breaking: AddedEdge { src: "tech.tokimeki.forum.thread#richContent", tgt: "tech.tokimeki.forum.thread#richContent.text", kind: "prop", name: Some("text") }
  • Non-breaking: AddedEdge { src: "tech.tokimeki.forum.thread#richContent.content", tgt: "tech.tokimeki.forum.thread#richContent.content:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "tech.tokimeki.forum.thread#richContent.marks", tgt: "tech.tokimeki.forum.thread#richContent.marks:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "tech.tokimeki.forum.thread:body", tgt: "tech.tokimeki.forum.thread:body.blobs", kind: "prop", name: Some("blobs") }
  • Non-breaking: AddedEdge { src: "tech.tokimeki.forum.thread:body", tgt: "tech.tokimeki.forum.thread:body.content", kind: "prop", name: Some("content") }
  • Non-breaking: AddedEdge { src: "tech.tokimeki.forum.thread:body.blobs", tgt: "tech.tokimeki.forum.thread:body.blobs:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "tech.tokimeki.forum.thread:body.blobs:items", tgt: "tech.tokimeki.forum.defs#image", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "tech.tokimeki.forum.thread:body.content", tgt: "tech.tokimeki.forum.thread#richContent", kind: "ref", name: None }
1 1
{
2 2
  "id": "tech.tokimeki.forum.thread",
3 3
  "defs": {
4 4
    "main": {
5 5
      "key": "tid",
6 6
      "type": "record",
7 7
      "record": {
8 8
        "type": "object",
9 9
        "required": [
10 10
          "channel",
11 11
          "title",
12 12
          "createdAt"
13 13
        ],
14 14
        "properties": {
15 15
          "tags": {
16 16
            "type": "array",
17 17
            "items": {
18 18
              "type": "string",
19 19
              "maxLength": 320,
20 20
              "maxGraphemes": 32
21 21
            },
22 22
            "maxLength": 8
23 23
          },
24 24
          "text": {
25 25
            "type": "string",
26 26
            "maxLength": 40000,
27 27
            "maxGraphemes": 5000
28 28
          },
29 +
          "blobs": {
30 +
            "type": "array",
31 +
            "items": {
32 +
              "ref": "tech.tokimeki.forum.defs#image",
33 +
              "type": "ref"
34 +
            },
35 +
            "maxLength": 20,
36 +
            "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."
37 +
          },
29 38
          "embed": {
30 39
            "refs": [
31 40
              "tech.tokimeki.forum.defs#images"
32 41
            ],
33 42
            "type": "union"
34 43
          },
35 44
          "langs": {
36 45
            "type": "array",
37 46
            "items": {
38 47
              "type": "string",
39 48
              "format": "language"
40 49
            },
41 50
            "maxLength": 3,
42 51
            "description": "Languages of the title and text (BCP-47)."
43 52
          },
44 53
          "title": {
45 54
            "type": "string",
46 55
            "maxLength": 1280,
47 56
            "maxGraphemes": 128
48 57
          },
49 58
          "facets": {
50 59
            "type": "array",
51 60
            "items": {
52 61
              "ref": "app.bsky.richtext.facet",
53 62
              "type": "ref"
54 63
            }
55 64
          },
56 65
          "labels": {
57 66
            "refs": [
58 67
              "com.atproto.label.defs#selfLabels"
59 68
            ],
60 69
            "type": "union",
61 70
            "description": "Self-applied labels, e.g. for adult content."
62 71
          },
63 72
          "channel": {
64 73
            "type": "string",
65 74
            "format": "at-uri",
66 75
            "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)."
67 76
          },
77 +
          "content": {
78 +
            "ref": "#richContent",
79 +
            "type": "ref",
80 +
            "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."
81 +
          },
68 82
          "editedAt": {
69 83
            "type": "string",
70 84
            "format": "datetime",
71 85
            "description": "Set when the thread was edited in place (putRecord with the same rkey)."
72 86
          },
73 87
          "createdAt": {
74 88
            "type": "string",
75 89
            "format": "datetime"
76 90
          }
77 91
        }
78 92
      },
79 93
      "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."
94 +
    },
95 +
    "richContent": {
96 +
      "type": "object",
97 +
      "required": [
98 +
        "type"
99 +
      ],
100 +
      "properties": {
101 +
        "text": {
102 +
          "type": "string",
103 +
          "description": "Text of a text node."
104 +
        },
105 +
        "type": {
106 +
          "type": "string",
107 +
          "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)."
108 +
        },
109 +
        "attrs": {
110 +
          "type": "unknown",
111 +
          "description": "Node attributes (heading level, image cid/alt/size, link card url…)."
112 +
        },
113 +
        "marks": {
114 +
          "type": "array",
115 +
          "items": {
116 +
            "type": "unknown"
117 +
          },
118 +
          "description": "Inline marks on a text node: bold, italic, strike, underline, code, link{href}."
119 +
        },
120 +
        "content": {
121 +
          "type": "array",
122 +
          "items": {
123 +
            "type": "unknown"
124 +
          },
125 +
          "description": "Child nodes."
126 +
        }
127 +
      },
128 +
      "description": "A ProseMirror/TipTap document node (recursive). Consumers validate against the node whitelist in the app; unknown node types are ignored."
80 129
    }
81 130
  },
82 131
  "$type": "com.atproto.lexicon.schema",
83 132
  "lexicon": 1
84 133
}

Compare Other Versions

Lexicon Garden

@