dev.roe.ama

danielroe.dev

Schema Diff

+3 -3

From

CID
bafyreiey3yimxla...
Indexed At
2026-07-29 22:37 UTC
View this version

To

CID
bafyreifhzf4nanb...
Indexed At
2026-08-26 13:09 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

3 breaking changes, 3 non-breaking changes.

Breaking Changes (3)
  • RemovedVertex RemovedVertex { vertex_id: "dev.roe.defs#aspectRatio" }
  • RemovedEdge RemovedEdge { src: "dev.roe.ama:body.imageDimensions", tgt: "dev.roe.defs#aspectRatio", kind: "ref", name: None }
  • ConstraintTightened ConstraintTightened { vertex_id: "dev.roe.ama:body.imageDimensions", sort: "ref", old_value: "dev.roe.defs#aspectRatio", new_value: "community.lexicon.app.defs#aspectRatio" }
Non-Breaking Changes (3)
  • AddedVertex AddedVertex { vertex_id: "community.lexicon.app.defs#aspectRatio" }
  • AddedEdge AddedEdge { src: "dev.roe.ama:body.imageDimensions", tgt: "community.lexicon.app.defs#aspectRatio", kind: "ref", name: None }
  • ConstraintRelaxed ConstraintRelaxed { vertex_id: "dev.roe.ama:body.backgroundStyle", sort: "maxLength", old_value: "64", new_value: "128" }

Migration Guidance

Removed Elements

  • RemovedVertex { vertex_id: "dev.roe.defs#aspectRatio" }

Added Elements

  • AddedVertex { vertex_id: "community.lexicon.app.defs#aspectRatio" }

Constraint Changes

  • ConstraintTightened ConstraintTightened { vertex_id: "dev.roe.ama:body.imageDimensions", sort: "ref", old_value: "dev.roe.defs#aspectRatio", new_value: "community.lexicon.app.defs#aspectRatio" }
  • ConstraintRelaxed ConstraintRelaxed { vertex_id: "dev.roe.ama:body.backgroundStyle", sort: "maxLength", old_value: "64", new_value: "128" }

Additional Notes

  • Breaking: RemovedEdge { src: "dev.roe.ama:body.imageDimensions", tgt: "dev.roe.defs#aspectRatio", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "dev.roe.ama:body.imageDimensions", tgt: "community.lexicon.app.defs#aspectRatio", kind: "ref", name: None }
1 1
{
2 2
  "id": "dev.roe.ama",
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
          "status",
11 11
          "createdAt"
12 12
        ],
13 13
        "properties": {
14 14
          "image": {
15 15
            "type": "blob",
16 16
            "accept": [
17 17
              "image/*"
18 18
            ],
19 19
            "maxSize": 5000000
20 20
          },
21 21
          "posts": {
22 22
            "type": "array",
23 23
            "items": {
24 24
              "ref": "#post",
25 25
              "type": "ref"
26 26
            },
27 27
            "maxLength": 16,
28 28
            "description": "Thread of response posts. Each post is the body of one Bluesky-thread item (and one Mastodon status, one LinkedIn comment chain entry, etc)."
29 29
          },
30 30
          "status": {
31 31
            "type": "string",
32 32
            "knownValues": [
33 33
              "unanswered",
34 34
              "answered"
35 35
            ]
36 36
          },
37 37
          "question": {
38 38
            "type": "string",
39 39
            "maxLength": 500000,
40 40
            "description": "Plaintext question. Present iff status=answered; the editor decrypts encryptedQuestion at publish time and writes it here so the record is self-contained going forward.",
41 41
            "maxGraphemes": 50000
42 42
          },
43 43
          "createdAt": {
44 44
            "type": "string",
45 45
            "format": "datetime"
46 46
          },
47 47
          "platforms": {
48 48
            "ref": "#platforms",
49 49
            "type": "ref",
50 50
            "description": "Which platforms the editor enabled when publishing."
51 51
          },
52 52
          "answeredAt": {
53 53
            "type": "string",
54 54
            "format": "datetime"
55 55
          },
56 56
          "publishedLinks": {
57 57
            "ref": "#publishedLinks",
58 58
            "type": "ref",
59 59
            "description": "Resolved per-platform URLs after publish."
60 60
          },
61 61
          "backgroundStyle": {
62 62
            "type": "string",
63 -
            "maxLength": 64,
64 -
            "description": "ID of the background style used to render the image. The set of styles is internal to roe.dev."
63 +
            "maxLength": 128,
64 +
            "description": "ID of the background style used to render the image, either a preset name or a serialised custom emoji-and-gradient id. The set of styles is internal to roe.dev."
65 65
          },
66 66
          "imageDimensions": {
67 -
            "ref": "dev.roe.defs#aspectRatio",
67 +
            "ref": "community.lexicon.app.defs#aspectRatio",
68 68
            "type": "ref",
69 69
            "description": "Pixel dimensions of `image`. Stored alongside because PDS blobs don't carry intrinsic dimensions and Bluesky's image embed needs `aspectRatio`."
70 70
          },
71 71
          "encryptedQuestion": {
72 72
            "type": "string",
73 73
            "maxLength": 500000,
74 74
            "description": "AES-256-GCM envelope holding the raw question text. Present iff status=unanswered."
75 75
          }
76 76
        }
77 77
      },
78 78
      "description": "An anonymous question, optionally with a published answer. While unanswered the question text is encrypted server-side (private to roe.dev). Once published, the question is rewritten in plaintext alongside the answer and per-platform URLs."
79 79
    },
80 80
    "post": {
81 81
      "type": "object",
82 82
      "required": [
83 83
        "text"
84 84
      ],
85 85
      "properties": {
86 86
        "text": {
87 87
          "type": "string",
88 88
          "maxLength": 500000,
89 89
          "description": "Body text. Plain text with `@<entity-rkey>` placeholders for entity mentions (e.g. `Thanks @abc123def456 for the help`). The placeholder syntax is internal; the publisher swaps them for the right per-platform handle.",
90 90
          "maxGraphemes": 50000
91 91
        },
92 92
        "mentions": {
93 93
          "type": "array",
94 94
          "items": {
95 95
            "ref": "com.atproto.repo.strongRef",
96 96
            "type": "ref"
97 97
          },
98 98
          "maxLength": 32,
99 99
          "description": "Strong-refs to dev.roe.entity records. The rkey of each referenced record is the placeholder token used in `text`."
100 100
        }
101 101
      },
102 102
      "description": "One post in the response thread. Mentions reference dev.roe.entity records by AT URI so the publisher can rewrite per-platform handles at publish time."
103 103
    },
104 104
    "platforms": {
105 105
      "type": "object",
106 106
      "properties": {
107 107
        "bluesky": {
108 108
          "type": "boolean",
109 109
          "default": true
110 110
        },
111 111
        "linkedin": {
112 112
          "type": "boolean",
113 113
          "default": true
114 114
        },
115 115
        "mastodon": {
116 116
          "type": "boolean",
117 117
          "default": true
118 118
        },
119 119
        "youtubeShorts": {
120 120
          "type": "boolean",
121 121
          "default": false
122 122
        }
123 123
      }
124 124
    },
125 125
    "publishedLinks": {
126 126
      "type": "object",
127 127
      "properties": {
128 128
        "bluesky": {
129 129
          "type": "string",
130 130
          "format": "uri"
131 131
        },
132 132
        "linkedin": {
133 133
          "type": "string",
134 134
          "format": "uri"
135 135
        },
136 136
        "mastodon": {
137 137
          "type": "string",
138 138
          "format": "uri"
139 139
        },
140 140
        "youtubeShorts": {
141 141
          "type": "string",
142 142
          "format": "uri"
143 143
        }
144 144
      }
145 145
    }
146 146
  },
147 147
  "$type": "com.atproto.lexicon.schema",
148 148
  "lexicon": 1
149 149
}

Compare Other Versions

Lexicon Garden

@