space.opendeck.profile

opendeck.space

Schema Diff

+161 -0

From

CID
bafyreiamv4vxrkt...
Indexed At
2026-09-23 21:36 UTC
View this version

To

CID
bafyreiamdzwko7m...
Indexed At
2026-09-30 09:09 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

7 breaking changes, 43 non-breaking changes.

Breaking Changes (7)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.opendeck.profile#publicStats", src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.secondsStudied", kind: "prop", name: Some("secondsStudied") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.opendeck.profile#publicStats", src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.activity", kind: "prop", name: Some("activity") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.opendeck.profile#publicStats", src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.updatedAt", kind: "prop", name: Some("updatedAt") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.opendeck.profile#publicStats", src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.repetitions", kind: "prop", name: Some("repetitions") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.opendeck.profile#publicStats", src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.learned", kind: "prop", name: Some("learned") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.opendeck.profile#publicStats", src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.learning", kind: "prop", name: Some("learning") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.opendeck.profile#publicStats", src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.activityEnd", kind: "prop", name: Some("activityEnd") }
Non-Breaking Changes (43)
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile#publicStats" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile#publicStats.activity" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile#publicStats.activity:items" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile#publicStats.activityEnd" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile#publicStats.firstStudiedOn" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile#publicStats.lastStudiedAt" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile#publicStats.learned" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile#publicStats.learning" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile#publicStats.repetitions" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile#publicStats.retention" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile#publicStats.secondsStudied" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile#publicStats.updatedAt" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile:body.breakReminders" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile:body.creditStyle" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile:body.publicStats" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile:body.showCredits" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile:body.showMotivation" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile:body.showStats" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile:body.showTier" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile:body.studyDays" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile:body.studyDays:items" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile:body.studyDaysEnd" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile:body.studyTier" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile:body.studyTierAt" }
  • AddedVertex AddedVertex { vertex_id: "space.opendeck.profile:body.tierStyle" }
  • AddedEdge AddedEdge { src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.firstStudiedOn", kind: "prop", name: Some("firstStudiedOn") }
  • AddedEdge AddedEdge { src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.lastStudiedAt", kind: "prop", name: Some("lastStudiedAt") }
  • AddedEdge AddedEdge { src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.retention", kind: "prop", name: Some("retention") }
  • AddedEdge AddedEdge { src: "space.opendeck.profile#publicStats.activity", tgt: "space.opendeck.profile#publicStats.activity:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.breakReminders", kind: "prop", name: Some("breakReminders") }
  • AddedEdge AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.creditStyle", kind: "prop", name: Some("creditStyle") }
  • AddedEdge AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.publicStats", kind: "prop", name: Some("publicStats") }
  • AddedEdge AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.showCredits", kind: "prop", name: Some("showCredits") }
  • AddedEdge AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.showMotivation", kind: "prop", name: Some("showMotivation") }
  • AddedEdge AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.showStats", kind: "prop", name: Some("showStats") }
  • AddedEdge AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.showTier", kind: "prop", name: Some("showTier") }
  • AddedEdge AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.studyDays", kind: "prop", name: Some("studyDays") }
  • AddedEdge AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.studyDaysEnd", kind: "prop", name: Some("studyDaysEnd") }
  • AddedEdge AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.studyTier", kind: "prop", name: Some("studyTier") }
  • AddedEdge AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.studyTierAt", kind: "prop", name: Some("studyTierAt") }
  • AddedEdge AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.tierStyle", kind: "prop", name: Some("tierStyle") }
  • AddedEdge AddedEdge { src: "space.opendeck.profile:body.publicStats", tgt: "space.opendeck.profile#publicStats", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "space.opendeck.profile:body.studyDays", tgt: "space.opendeck.profile:body.studyDays:items", kind: "items", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "space.opendeck.profile#publicStats" }
  • AddedVertex { vertex_id: "space.opendeck.profile#publicStats.activity" }
  • AddedVertex { vertex_id: "space.opendeck.profile#publicStats.activity:items" }
  • AddedVertex { vertex_id: "space.opendeck.profile#publicStats.activityEnd" }
  • AddedVertex { vertex_id: "space.opendeck.profile#publicStats.firstStudiedOn" }
  • AddedVertex { vertex_id: "space.opendeck.profile#publicStats.lastStudiedAt" }
  • AddedVertex { vertex_id: "space.opendeck.profile#publicStats.learned" }
  • AddedVertex { vertex_id: "space.opendeck.profile#publicStats.learning" }
  • AddedVertex { vertex_id: "space.opendeck.profile#publicStats.repetitions" }
  • AddedVertex { vertex_id: "space.opendeck.profile#publicStats.retention" }
  • AddedVertex { vertex_id: "space.opendeck.profile#publicStats.secondsStudied" }
  • AddedVertex { vertex_id: "space.opendeck.profile#publicStats.updatedAt" }
  • AddedVertex { vertex_id: "space.opendeck.profile:body.breakReminders" }
  • AddedVertex { vertex_id: "space.opendeck.profile:body.creditStyle" }
  • AddedVertex { vertex_id: "space.opendeck.profile:body.publicStats" }
  • AddedVertex { vertex_id: "space.opendeck.profile:body.showCredits" }
  • AddedVertex { vertex_id: "space.opendeck.profile:body.showMotivation" }
  • AddedVertex { vertex_id: "space.opendeck.profile:body.showStats" }
  • AddedVertex { vertex_id: "space.opendeck.profile:body.showTier" }
  • AddedVertex { vertex_id: "space.opendeck.profile:body.studyDays" }
  • AddedVertex { vertex_id: "space.opendeck.profile:body.studyDays:items" }
  • AddedVertex { vertex_id: "space.opendeck.profile:body.studyDaysEnd" }
  • AddedVertex { vertex_id: "space.opendeck.profile:body.studyTier" }
  • AddedVertex { vertex_id: "space.opendeck.profile:body.studyTierAt" }
  • AddedVertex { vertex_id: "space.opendeck.profile:body.tierStyle" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "space.opendeck.profile#publicStats", src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.secondsStudied", kind: "prop", name: Some("secondsStudied") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.opendeck.profile#publicStats", src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.activity", kind: "prop", name: Some("activity") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.opendeck.profile#publicStats", src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.updatedAt", kind: "prop", name: Some("updatedAt") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.opendeck.profile#publicStats", src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.repetitions", kind: "prop", name: Some("repetitions") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.opendeck.profile#publicStats", src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.learned", kind: "prop", name: Some("learned") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.opendeck.profile#publicStats", src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.learning", kind: "prop", name: Some("learning") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.opendeck.profile#publicStats", src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.activityEnd", kind: "prop", name: Some("activityEnd") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.firstStudiedOn", kind: "prop", name: Some("firstStudiedOn") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.lastStudiedAt", kind: "prop", name: Some("lastStudiedAt") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile#publicStats", tgt: "space.opendeck.profile#publicStats.retention", kind: "prop", name: Some("retention") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile#publicStats.activity", tgt: "space.opendeck.profile#publicStats.activity:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.breakReminders", kind: "prop", name: Some("breakReminders") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.creditStyle", kind: "prop", name: Some("creditStyle") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.publicStats", kind: "prop", name: Some("publicStats") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.showCredits", kind: "prop", name: Some("showCredits") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.showMotivation", kind: "prop", name: Some("showMotivation") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.showStats", kind: "prop", name: Some("showStats") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.showTier", kind: "prop", name: Some("showTier") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.studyDays", kind: "prop", name: Some("studyDays") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.studyDaysEnd", kind: "prop", name: Some("studyDaysEnd") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.studyTier", kind: "prop", name: Some("studyTier") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.studyTierAt", kind: "prop", name: Some("studyTierAt") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile:body", tgt: "space.opendeck.profile:body.tierStyle", kind: "prop", name: Some("tierStyle") }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile:body.publicStats", tgt: "space.opendeck.profile#publicStats", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "space.opendeck.profile:body.studyDays", tgt: "space.opendeck.profile:body.studyDays:items", kind: "items", name: None }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 4
    "main": {
5 5
      "description": "OpenDeck profile and synced preferences.",
6 6
      "key": "literal:self",
7 7
      "record": {
8 8
        "properties": {
9 9
          "accentColor": {
10 10
            "description": "Hex accent color, e.g. #3b82f6.",
11 11
            "maxGraphemes": 9,
12 12
            "maxLength": 90,
13 13
            "type": "string"
14 14
          },
15 15
          "bio": {
16 16
            "maxGraphemes": 2000,
17 17
            "maxLength": 20000,
18 18
            "type": "string"
19 19
          },
20 +
          "breakReminders": {
21 +
            "description": "Suggest breaks after long study sessions or days; absent means on.",
22 +
            "type": "boolean"
23 +
          },
24 +
          "creditStyle": {
25 +
            "description": "How shown credit roles look: theme styles the whole profile, badges only lists them; absent means theme.",
26 +
            "enum": [
27 +
              "theme",
28 +
              "badges"
29 +
            ],
30 +
            "type": "string"
31 +
          },
20 32
          "defaultVisibility": {
21 33
            "enum": [
22 34
              "public",
23 35
              "private"
24 36
            ],
25 37
            "type": "string"
26 38
          },
39 +
          "publicStats": {
40 +
            "description": "Summary of your study stats without deck or card details; only present while showStats is everyone.",
41 +
            "ref": "space.opendeck.profile#publicStats",
42 +
            "type": "ref"
43 +
          },
27 44
          "reminderDays": {
28 45
            "description": "Weekdays 0-6 (Sun-Sat); absent means Monday to Friday.",
29 46
            "items": {
30 47
              "maximum": 6,
31 48
              "minimum": 0,
32 49
              "type": "integer"
33 50
            },
34 51
            "maxLength": 7,
35 52
            "type": "array"
36 53
          },
37 54
          "reminderEnabled": {
38 55
            "type": "boolean"
39 56
          },
40 57
          "reminderHour": {
41 58
            "description": "Local hour (0-23) of the study reminder; absent means 19.",
42 59
            "maximum": 23,
43 60
            "minimum": 0,
44 61
            "type": "integer"
45 62
          },
46 63
          "shortTermIntervals": {
47 64
            "description": "Default short-term intervals preset; absent means auto.",
48 65
            "enum": [
49 66
              "auto",
50 67
              "quick",
51 68
              "balanced",
52 69
              "relaxed",
53 70
              "spaced"
54 71
            ],
55 72
            "type": "string"
56 73
          },
57 74
          "showActivityOnProfile": {
58 75
            "type": "boolean"
59 76
          },
77 +
          "showCredits": {
78 +
            "description": "Who sees your OpenDeck credit roles on your profile; absent means everyone.",
79 +
            "enum": [
80 +
              "nobody",
81 +
              "me",
82 +
              "everyone"
83 +
            ],
84 +
            "type": "string"
85 +
          },
60 86
          "showDecksOnProfile": {
61 87
            "type": "boolean"
62 88
          },
63 89
          "showFollowsOnProfile": {
64 90
            "type": "boolean"
65 91
          },
92 +
          "showMotivation": {
93 +
            "description": "Who sees tier progress boxes: nobody hides them, me shows them on the home, study and profile pages, everyone also shows the profile box to visitors (only while showTier is everyone); absent means me.",
94 +
            "enum": [
95 +
              "nobody",
96 +
              "me",
97 +
              "everyone"
98 +
            ],
99 +
            "type": "string"
100 +
          },
66 101
          "showProgressOnProfile": {
67 102
            "type": "boolean"
68 103
          },
104 +
          "showStats": {
105 +
            "description": "Who sees your study stats on your profile; absent means me.",
106 +
            "enum": [
107 +
              "nobody",
108 +
              "me",
109 +
              "everyone"
110 +
            ],
111 +
            "type": "string"
112 +
          },
113 +
          "showTier": {
114 +
            "description": "Who sees your study tier on your profile, and with everyone also in battles; absent means me.",
115 +
            "enum": [
116 +
              "nobody",
117 +
              "me",
118 +
              "everyone"
119 +
            ],
120 +
            "type": "string"
121 +
          },
122 +
          "studyDays": {
123 +
            "description": "Study sessions per day (capped at 3) for the 84 days up to studyDaysEnd, oldest first; only present while the motivation box is public.",
124 +
            "items": {
125 +
              "maximum": 3,
126 +
              "minimum": 0,
127 +
              "type": "integer"
128 +
            },
129 +
            "maxLength": 84,
130 +
            "type": "array"
131 +
          },
132 +
          "studyDaysEnd": {
133 +
            "description": "Local date (YYYY-MM-DD) of the last entry in studyDays.",
134 +
            "maxGraphemes": 10,
135 +
            "maxLength": 100,
136 +
            "type": "string"
137 +
          },
138 +
          "studyTier": {
139 +
            "description": "Study tier from the days studied in the last four weeks; only present while it is shown publicly.",
140 +
            "enum": [
141 +
              "bronze",
142 +
              "silver",
143 +
              "gold",
144 +
              "platinum",
145 +
              "diamond",
146 +
              "champion",
147 +
              "grandChampion",
148 +
              "supernova"
149 +
            ],
150 +
            "type": "string"
151 +
          },
152 +
          "studyTierAt": {
153 +
            "description": "When studyTier was last computed.",
154 +
            "format": "datetime",
155 +
            "type": "string"
156 +
          },
157 +
          "tierStyle": {
158 +
            "description": "How a shown tier looks: theme styles the whole profile, badge only adds a badge; absent means theme.",
159 +
            "enum": [
160 +
              "theme",
161 +
              "badge"
162 +
            ],
163 +
            "type": "string"
164 +
          },
69 165
          "uiLanguage": {
70 166
            "description": "BCP-47 language tag for the OpenDeck interface.",
71 167
            "maxGraphemes": 20,
72 168
            "maxLength": 200,
73 169
            "type": "string"
74 170
          },
75 171
          "updatedAt": {
76 172
            "format": "datetime",
77 173
            "type": "string"
78 174
          }
79 175
        },
80 176
        "type": "object"
81 177
      },
82 178
      "type": "record"
179 +
    },
180 +
    "publicStats": {
181 +
      "properties": {
182 +
        "activity": {
183 +
          "description": "Repetitions per day for the days up to activityEnd, oldest first.",
184 +
          "items": {
185 +
            "minimum": 0,
186 +
            "type": "integer"
187 +
          },
188 +
          "maxLength": 371,
189 +
          "type": "array"
190 +
        },
191 +
        "activityEnd": {
192 +
          "description": "Local date (YYYY-MM-DD) of the last entry in activity.",
193 +
          "maxGraphemes": 10,
194 +
          "maxLength": 100,
195 +
          "type": "string"
196 +
        },
197 +
        "firstStudiedOn": {
198 +
          "description": "Local date (YYYY-MM-DD) of the first study day.",
199 +
          "maxGraphemes": 10,
200 +
          "maxLength": 100,
201 +
          "type": "string"
202 +
        },
203 +
        "lastStudiedAt": {
204 +
          "format": "datetime",
205 +
          "type": "string"
206 +
        },
207 +
        "learned": {
208 +
          "description": "Cards in review.",
209 +
          "type": "integer"
210 +
        },
211 +
        "learning": {
212 +
          "description": "Cards in learning or relearning.",
213 +
          "type": "integer"
214 +
        },
215 +
        "repetitions": {
216 +
          "description": "All ratings ever given.",
217 +
          "type": "integer"
218 +
        },
219 +
        "retention": {
220 +
          "description": "Percent of ratings in the last 30 days that were not again.",
221 +
          "maximum": 100,
222 +
          "minimum": 0,
223 +
          "type": "integer"
224 +
        },
225 +
        "secondsStudied": {
226 +
          "description": "Active study time in the last 365 days.",
227 +
          "type": "integer"
228 +
        },
229 +
        "updatedAt": {
230 +
          "format": "datetime",
231 +
          "type": "string"
232 +
        }
233 +
      },
234 +
      "required": [
235 +
        "learned",
236 +
        "learning",
237 +
        "repetitions",
238 +
        "secondsStudied",
239 +
        "activity",
240 +
        "activityEnd",
241 +
        "updatedAt"
242 +
      ],
243 +
      "type": "object"
83 244
    }
84 245
  },
85 246
  "id": "space.opendeck.profile",
86 247
  "lexicon": 1
87 248
}

Compare Other Versions

Lexicon Garden

@