tech.tokimeki.forum.thread

tokimeki.blue

Schema Diff

+69 -2

From

CID
bafyreibzysbyp4o...
Indexed At
2026-08-25 12:27 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, 33 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 (33)
  • AddedVertex AddedVertex { vertex_id: "com.atproto.label.defs#selfLabels" }
  • 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" }
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.thread:body.labels" }
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.thread:body.labels:variant0" }
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.thread:body.langs" }
  • AddedVertex AddedVertex { vertex_id: "tech.tokimeki.forum.thread:body.langs:items" }
  • 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", tgt: "tech.tokimeki.forum.thread:body.labels", kind: "prop", name: Some("labels") }
  • AddedEdge AddedEdge { src: "tech.tokimeki.forum.thread:body", tgt: "tech.tokimeki.forum.thread:body.langs", kind: "prop", name: Some("langs") }
  • 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 }
  • AddedEdge AddedEdge { src: "tech.tokimeki.forum.thread:body.labels", tgt: "tech.tokimeki.forum.thread:body.labels:variant0", kind: "variant", name: Some("com.atproto.label.defs#selfLabels") }
  • AddedEdge AddedEdge { src: "tech.tokimeki.forum.thread:body.labels:variant0", tgt: "com.atproto.label.defs#selfLabels", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "tech.tokimeki.forum.thread:body.langs", tgt: "tech.tokimeki.forum.thread:body.langs:items", kind: "items", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "com.atproto.label.defs#selfLabels" }
  • 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" }
  • AddedVertex { vertex_id: "tech.tokimeki.forum.thread:body.labels" }
  • AddedVertex { vertex_id: "tech.tokimeki.forum.thread:body.labels:variant0" }
  • AddedVertex { vertex_id: "tech.tokimeki.forum.thread:body.langs" }
  • AddedVertex { vertex_id: "tech.tokimeki.forum.thread:body.langs:items" }

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", tgt: "tech.tokimeki.forum.thread:body.labels", kind: "prop", name: Some("labels") }
  • Non-breaking: AddedEdge { src: "tech.tokimeki.forum.thread:body", tgt: "tech.tokimeki.forum.thread:body.langs", kind: "prop", name: Some("langs") }
  • 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 }
  • Non-breaking: AddedEdge { src: "tech.tokimeki.forum.thread:body.labels", tgt: "tech.tokimeki.forum.thread:body.labels:variant0", kind: "variant", name: Some("com.atproto.label.defs#selfLabels") }
  • Non-breaking: AddedEdge { src: "tech.tokimeki.forum.thread:body.labels:variant0", tgt: "com.atproto.label.defs#selfLabels", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "tech.tokimeki.forum.thread:body.langs", tgt: "tech.tokimeki.forum.thread:body.langs:items", kind: "items", 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
          },
44 +
          "langs": {
45 +
            "type": "array",
46 +
            "items": {
47 +
              "type": "string",
48 +
              "format": "language"
49 +
            },
50 +
            "maxLength": 3,
51 +
            "description": "Languages of the title and text (BCP-47)."
52 +
          },
35 53
          "title": {
36 54
            "type": "string",
37 55
            "maxLength": 1280,
38 56
            "maxGraphemes": 128
39 57
          },
40 58
          "facets": {
41 59
            "type": "array",
42 60
            "items": {
43 61
              "ref": "app.bsky.richtext.facet",
44 62
              "type": "ref"
45 63
            }
46 64
          },
65 +
          "labels": {
66 +
            "refs": [
67 +
              "com.atproto.label.defs#selfLabels"
68 +
            ],
69 +
            "type": "union",
70 +
            "description": "Self-applied labels, e.g. for adult content."
71 +
          },
47 72
          "channel": {
48 73
            "type": "string",
49 -
            "format": "at-uri"
74 +
            "format": "at-uri",
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)."
50 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 +
          },
51 82
          "editedAt": {
52 83
            "type": "string",
53 -
            "format": "datetime"
84 +
            "format": "datetime",
85 +
            "description": "Set when the thread was edited in place (putRecord with the same rkey)."
54 86
          },
55 87
          "createdAt": {
56 88
            "type": "string",
57 89
            "format": "datetime"
58 90
          }
59 91
        }
60 92
      },
61 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."
62 129
    }
63 130
  },
64 131
  "$type": "com.atproto.lexicon.schema",
65 132
  "lexicon": 1
66 133
}

Compare Other Versions

Lexicon Garden

@