ai.syui.log.post

syui.ai

Schema Diff

+93 -16

From

CID
bafyreia355eeyh6...
Indexed At
2026-02-18 17:35 UTC
View this version

To

CID
bafyreidmxvq4tc7...
Indexed At
2026-03-12 11:16 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

11 breaking changes, 40 non-breaking changes.

Breaking Changes (11)
  • RemovedVertex RemovedVertex { vertex_id: "ai.syui.log.post:body.createdAt" }
  • RemovedVertex RemovedVertex { vertex_id: "ai.syui.log.post:body.lang" }
  • RemovedEdge RemovedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.createdAt", kind: "prop", name: Some("createdAt") }
  • RemovedEdge RemovedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.lang", kind: "prop", name: Some("lang") }
  • KindChanged KindChanged { vertex_id: "ai.syui.log.post:body.content", old_kind: "string", new_kind: "union" }
  • ConstraintAdded ConstraintAdded { vertex_id: "ai.syui.log.post#markdown.text", sort: "maxLength", value: "1000000" }
  • ConstraintAdded ConstraintAdded { vertex_id: "ai.syui.log.post#markdown.text", sort: "maxGraphemes", value: "100000" }
  • ConstraintAdded ConstraintAdded { vertex_id: "ai.syui.log.post:body.description", sort: "maxGraphemes", value: "3000" }
  • ConstraintAdded ConstraintAdded { vertex_id: "ai.syui.log.post:body.description", sort: "maxLength", value: "30000" }
  • ConstraintAdded ConstraintAdded { vertex_id: "ai.syui.log.post:body.tags:items", sort: "maxLength", value: "1280" }
  • ConstraintAdded ConstraintAdded { vertex_id: "ai.syui.log.post:body.tags:items", sort: "maxGraphemes", value: "128" }
Non-Breaking Changes (40)
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post#markdown" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post#markdown.text" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post:body.bskyPostRef" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post:body.content:variant0" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post:body.coverImage" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post:body.description" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post:body.langs" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post:body.langs:items" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post:body.parent" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post:body.path" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post:body.publishedAt" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post:body.root" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post:body.site" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post:body.tags" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post:body.tags:items" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post:body.textContent" }
  • AddedVertex AddedVertex { vertex_id: "ai.syui.log.post:body.updatedAt" }
  • AddedEdge AddedEdge { src: "ai.syui.log.post#markdown", tgt: "ai.syui.log.post#markdown.text", kind: "prop", name: Some("text") }
  • AddedEdge AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.bskyPostRef", kind: "prop", name: Some("bskyPostRef") }
  • AddedEdge AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.coverImage", kind: "prop", name: Some("coverImage") }
  • AddedEdge AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.description", kind: "prop", name: Some("description") }
  • AddedEdge AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.langs", kind: "prop", name: Some("langs") }
  • AddedEdge AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.parent", kind: "prop", name: Some("parent") }
  • AddedEdge AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.path", kind: "prop", name: Some("path") }
  • AddedEdge AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.publishedAt", kind: "prop", name: Some("publishedAt") }
  • AddedEdge AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.root", kind: "prop", name: Some("root") }
  • AddedEdge AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.site", kind: "prop", name: Some("site") }
  • AddedEdge AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.tags", kind: "prop", name: Some("tags") }
  • AddedEdge AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.textContent", kind: "prop", name: Some("textContent") }
  • AddedEdge AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.updatedAt", kind: "prop", name: Some("updatedAt") }
  • AddedEdge AddedEdge { src: "ai.syui.log.post:body.content", tgt: "ai.syui.log.post:body.content:variant0", kind: "variant", name: Some("#markdown") }
  • AddedEdge AddedEdge { src: "ai.syui.log.post:body.langs", tgt: "ai.syui.log.post:body.langs:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "ai.syui.log.post:body.tags", tgt: "ai.syui.log.post:body.tags:items", kind: "items", name: None }
  • ConstraintRelaxed ConstraintRelaxed { vertex_id: "ai.syui.log.post:body.title", sort: "maxGraphemes", old_value: "300", new_value: "500" }
  • ConstraintRelaxed ConstraintRelaxed { vertex_id: "ai.syui.log.post:body.title", sort: "maxLength", old_value: "3000", new_value: "5000" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "ai.syui.log.post:body.lang", sort: "maxLength" }
  • ConstraintRelaxed ConstraintRelaxed { vertex_id: "ai.syui.log.post#translation.title", sort: "maxLength", old_value: "3000", new_value: "5000" }
  • ConstraintRelaxed ConstraintRelaxed { vertex_id: "ai.syui.log.post#translation.title", sort: "maxGraphemes", old_value: "300", new_value: "500" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "ai.syui.log.post:body.content", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "ai.syui.log.post:body.content", sort: "maxGraphemes" }

Migration Guidance

Removed Elements

  • RemovedVertex { vertex_id: "ai.syui.log.post:body.createdAt" }
  • RemovedVertex { vertex_id: "ai.syui.log.post:body.lang" }

Added Elements

  • AddedVertex { vertex_id: "ai.syui.log.post#markdown" }
  • AddedVertex { vertex_id: "ai.syui.log.post#markdown.text" }
  • AddedVertex { vertex_id: "ai.syui.log.post:body.bskyPostRef" }
  • AddedVertex { vertex_id: "ai.syui.log.post:body.content:variant0" }
  • AddedVertex { vertex_id: "ai.syui.log.post:body.coverImage" }
  • AddedVertex { vertex_id: "ai.syui.log.post:body.description" }
  • AddedVertex { vertex_id: "ai.syui.log.post:body.langs" }
  • AddedVertex { vertex_id: "ai.syui.log.post:body.langs:items" }
  • AddedVertex { vertex_id: "ai.syui.log.post:body.parent" }
  • AddedVertex { vertex_id: "ai.syui.log.post:body.path" }
  • AddedVertex { vertex_id: "ai.syui.log.post:body.publishedAt" }
  • AddedVertex { vertex_id: "ai.syui.log.post:body.root" }
  • AddedVertex { vertex_id: "ai.syui.log.post:body.site" }
  • AddedVertex { vertex_id: "ai.syui.log.post:body.tags" }
  • AddedVertex { vertex_id: "ai.syui.log.post:body.tags:items" }
  • AddedVertex { vertex_id: "ai.syui.log.post:body.textContent" }
  • AddedVertex { vertex_id: "ai.syui.log.post:body.updatedAt" }

Constraint Changes

  • ConstraintAdded ConstraintAdded { vertex_id: "ai.syui.log.post:body.tags:items", sort: "maxLength", value: "1280" }
  • ConstraintAdded ConstraintAdded { vertex_id: "ai.syui.log.post:body.tags:items", sort: "maxGraphemes", value: "128" }
  • ConstraintAdded ConstraintAdded { vertex_id: "ai.syui.log.post:body.description", sort: "maxGraphemes", value: "3000" }
  • ConstraintAdded ConstraintAdded { vertex_id: "ai.syui.log.post:body.description", sort: "maxLength", value: "30000" }
  • ConstraintAdded ConstraintAdded { vertex_id: "ai.syui.log.post#markdown.text", sort: "maxLength", value: "1000000" }
  • ConstraintAdded ConstraintAdded { vertex_id: "ai.syui.log.post#markdown.text", sort: "maxGraphemes", value: "100000" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "ai.syui.log.post:body.lang", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "ai.syui.log.post:body.content", sort: "maxLength" }
  • ConstraintRemoved ConstraintRemoved { vertex_id: "ai.syui.log.post:body.content", sort: "maxGraphemes" }
  • ConstraintRelaxed ConstraintRelaxed { vertex_id: "ai.syui.log.post:body.title", sort: "maxLength", old_value: "3000", new_value: "5000" }
  • ConstraintRelaxed ConstraintRelaxed { vertex_id: "ai.syui.log.post:body.title", sort: "maxGraphemes", old_value: "300", new_value: "500" }
  • ConstraintRelaxed ConstraintRelaxed { vertex_id: "ai.syui.log.post#translation.title", sort: "maxLength", old_value: "3000", new_value: "5000" }
  • ConstraintRelaxed ConstraintRelaxed { vertex_id: "ai.syui.log.post#translation.title", sort: "maxGraphemes", old_value: "300", new_value: "500" }

Additional Notes

  • Breaking: RemovedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.createdAt", kind: "prop", name: Some("createdAt") }
  • Breaking: RemovedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.lang", kind: "prop", name: Some("lang") }
  • Breaking: KindChanged { vertex_id: "ai.syui.log.post:body.content", old_kind: "string", new_kind: "union" }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post#markdown", tgt: "ai.syui.log.post#markdown.text", kind: "prop", name: Some("text") }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.bskyPostRef", kind: "prop", name: Some("bskyPostRef") }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.coverImage", kind: "prop", name: Some("coverImage") }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.description", kind: "prop", name: Some("description") }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.langs", kind: "prop", name: Some("langs") }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.parent", kind: "prop", name: Some("parent") }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.path", kind: "prop", name: Some("path") }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.publishedAt", kind: "prop", name: Some("publishedAt") }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.root", kind: "prop", name: Some("root") }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.site", kind: "prop", name: Some("site") }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.tags", kind: "prop", name: Some("tags") }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.textContent", kind: "prop", name: Some("textContent") }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post:body", tgt: "ai.syui.log.post:body.updatedAt", kind: "prop", name: Some("updatedAt") }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post:body.content", tgt: "ai.syui.log.post:body.content:variant0", kind: "variant", name: Some("#markdown") }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post:body.langs", tgt: "ai.syui.log.post:body.langs:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "ai.syui.log.post:body.tags", tgt: "ai.syui.log.post:body.tags:items", kind: "items", name: None }
1 1
{
2 2
  "id": "ai.syui.log.post",
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 +
          "site",
10 11
          "title",
11 -
          "content",
12 -
          "createdAt"
12 +
          "publishedAt"
13 13
        ],
14 14
        "properties": {
15 -
          "lang": {
15 +
          "path": {
16 +
            "type": "string",
17 +
            "description": "Combine with site URL to construct a canonical URL to the post."
18 +
          },
19 +
          "root": {
20 +
            "type": "string",
21 +
            "format": "at-uri",
22 +
            "description": "AT-URI of the root message in a thread."
23 +
          },
24 +
          "site": {
16 25
            "type": "string",
17 -
            "maxLength": 10,
18 -
            "description": "Language code of the original content (e.g., 'ja', 'en')."
26 +
            "format": "uri",
27 +
            "description": "Points to a publication record (at://) or a publication URL (https://)."
28 +
          },
29 +
          "tags": {
30 +
            "type": "array",
31 +
            "items": {
32 +
              "type": "string",
33 +
              "maxLength": 1280,
34 +
              "maxGraphemes": 128
35 +
            },
36 +
            "description": "Tags to categorize the post."
19 37
          },
38 +
          "langs": {
39 +
            "type": "array",
40 +
            "items": {
41 +
              "type": "string",
42 +
              "format": "language"
43 +
            },
44 +
            "maxLength": 3,
45 +
            "description": "Indicates human language of post content."
46 +
          },
20 47
          "title": {
21 48
            "type": "string",
22 -
            "maxLength": 3000,
23 -
            "description": "The title of the post.",
24 -
            "maxGraphemes": 300
49 +
            "maxLength": 5000,
50 +
            "description": "Title of the post.",
51 +
            "maxGraphemes": 500
25 52
          },
53 +
          "parent": {
54 +
            "type": "string",
55 +
            "format": "at-uri",
56 +
            "description": "AT-URI of the parent message being replied to."
57 +
          },
26 58
          "content": {
59 +
            "refs": [
60 +
              "#markdown"
61 +
            ],
62 +
            "type": "union",
63 +
            "closed": false,
64 +
            "description": "Open union for content. Supports markdown and other formats via $type."
65 +
          },
66 +
          "updatedAt": {
27 67
            "type": "string",
28 -
            "maxLength": 1000000,
29 -
            "description": "The content of the post (markdown).",
30 -
            "maxGraphemes": 100000
68 +
            "format": "datetime",
69 +
            "description": "Timestamp of the post's last edit."
31 70
          },
32 -
          "createdAt": {
71 +
          "coverImage": {
72 +
            "type": "blob",
73 +
            "accept": [
74 +
              "image/*"
75 +
            ],
76 +
            "maxSize": 1000000,
77 +
            "description": "Cover image. Less than 1MB."
78 +
          },
79 +
          "bskyPostRef": {
80 +
            "ref": "com.atproto.repo.strongRef",
81 +
            "type": "ref",
82 +
            "description": "Strong reference to a Bluesky post."
83 +
          },
84 +
          "description": {
85 +
            "type": "string",
86 +
            "maxLength": 30000,
87 +
            "description": "A brief description or excerpt from the post.",
88 +
            "maxGraphemes": 3000
89 +
          },
90 +
          "publishedAt": {
33 91
            "type": "string",
34 92
            "format": "datetime",
35 -
            "description": "Client-declared timestamp when this post was originally created."
93 +
            "description": "Timestamp of the post's publish time."
36 94
          },
95 +
          "textContent": {
96 +
            "type": "string",
97 +
            "description": "Plaintext representation of the post content. Should not contain markdown or other formatting."
98 +
          },
37 99
          "translations": {
38 100
            "ref": "#translationMap",
39 101
            "type": "ref",
40 102
            "description": "Translations of the post in other languages."
41 103
          }
42 104
        }
43 105
      },
44 -
      "description": "Record containing a blog post."
106 +
      "description": "Record containing a blog post. Compatible with site.standard.document."
45 107
    },
108 +
    "markdown": {
109 +
      "type": "object",
110 +
      "required": [
111 +
        "text"
112 +
      ],
113 +
      "properties": {
114 +
        "text": {
115 +
          "type": "string",
116 +
          "maxLength": 1000000,
117 +
          "description": "Markdown text content.",
118 +
          "maxGraphemes": 100000
119 +
        }
120 +
      },
121 +
      "description": "Markdown content format."
122 +
    },
46 123
    "translation": {
47 124
      "type": "object",
48 125
      "properties": {
49 126
        "title": {
50 127
          "type": "string",
51 -
          "maxLength": 3000,
52 -
          "maxGraphemes": 300
128 +
          "maxLength": 5000,
129 +
          "maxGraphemes": 500
53 130
        },
54 131
        "content": {
55 132
          "type": "string",
56 133
          "maxLength": 1000000,
57 134
          "maxGraphemes": 100000
58 135
        }
59 136
      },
60 137
      "description": "A translation of a post."
61 138
    },
62 139
    "translationMap": {
63 140
      "type": "object",
64 141
      "properties": {
65 142
        "en": {
66 143
          "ref": "#translation",
67 144
          "type": "ref"
68 145
        },
69 146
        "ja": {
70 147
          "ref": "#translation",
71 148
          "type": "ref"
72 149
        }
73 150
      },
74 151
      "description": "Map of language codes to translations."
75 152
    }
76 153
  },
77 154
  "$type": "com.atproto.lexicon.schema",
78 155
  "lexicon": 1
79 156
}

Compare Other Versions

Lexicon Garden

@