tech.tokimeki.forum.thread
Schema Diff
+69 -2
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
}