space.remanso.recording

apoena.dev

Schema Diff

+160 -1

From

CID
bafyreifj4rbippi...
Indexed At
2026-08-02 19:32 UTC
View this version

To

CID
bafyreifezcxxjyj...
Indexed At
2026-08-06 21:00 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

10 breaking changes, 28 non-breaking changes.

Breaking Changes (10)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.remanso.recording#credit", src: "space.remanso.recording#credit", tgt: "space.remanso.recording#credit.licenseUrl", kind: "prop", name: Some("licenseUrl") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.remanso.recording#credit", src: "space.remanso.recording#credit", tgt: "space.remanso.recording#credit.creator", kind: "prop", name: Some("creator") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.remanso.recording#credit", src: "space.remanso.recording#credit", tgt: "space.remanso.recording#credit.license", kind: "prop", name: Some("license") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.remanso.recording#credit", src: "space.remanso.recording#credit", tgt: "space.remanso.recording#credit.sourceUrl", kind: "prop", name: Some("sourceUrl") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.remanso.recording#credit", src: "space.remanso.recording#credit", tgt: "space.remanso.recording#credit.title", kind: "prop", name: Some("title") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.remanso.recording#transcript", src: "space.remanso.recording#transcript", tgt: "space.remanso.recording#transcript.createdAt", kind: "prop", name: Some("createdAt") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.remanso.recording#transcript", src: "space.remanso.recording#transcript", tgt: "space.remanso.recording#transcript.text", kind: "prop", name: Some("text") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.remanso.recording#transcriptSegment", src: "space.remanso.recording#transcriptSegment", tgt: "space.remanso.recording#transcriptSegment.endMs", kind: "prop", name: Some("endMs") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.remanso.recording#transcriptSegment", src: "space.remanso.recording#transcriptSegment", tgt: "space.remanso.recording#transcriptSegment.startMs", kind: "prop", name: Some("startMs") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.remanso.recording#transcriptSegment", src: "space.remanso.recording#transcriptSegment", tgt: "space.remanso.recording#transcriptSegment.text", kind: "prop", name: Some("text") }
Non-Breaking Changes (28)
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording#credit" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording#credit.creator" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording#credit.license" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording#credit.licenseUrl" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording#credit.sourceUrl" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording#credit.title" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording#transcript" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording#transcript.createdAt" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording#transcript.segments" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording#transcript.segments:items" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording#transcript.text" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording#transcriptSegment" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording#transcriptSegment.endMs" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording#transcriptSegment.startMs" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording#transcriptSegment.text" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording:body.credits" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording:body.credits:items" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording:body.language" }
  • AddedVertex AddedVertex { vertex_id: "space.remanso.recording:body.transcript" }
  • AddedEdge AddedEdge { src: "space.remanso.recording#transcript", tgt: "space.remanso.recording#transcript.segments", kind: "prop", name: Some("segments") }
  • AddedEdge AddedEdge { src: "space.remanso.recording#transcript.segments", tgt: "space.remanso.recording#transcript.segments:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "space.remanso.recording#transcript.segments:items", tgt: "space.remanso.recording#transcriptSegment", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "space.remanso.recording:body", tgt: "space.remanso.recording:body.credits", kind: "prop", name: Some("credits") }
  • AddedEdge AddedEdge { src: "space.remanso.recording:body", tgt: "space.remanso.recording:body.language", kind: "prop", name: Some("language") }
  • AddedEdge AddedEdge { src: "space.remanso.recording:body", tgt: "space.remanso.recording:body.transcript", kind: "prop", name: Some("transcript") }
  • AddedEdge AddedEdge { src: "space.remanso.recording:body.credits", tgt: "space.remanso.recording:body.credits:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "space.remanso.recording:body.credits:items", tgt: "space.remanso.recording#credit", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "space.remanso.recording:body.transcript", tgt: "space.remanso.recording#transcript", kind: "ref", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "space.remanso.recording#credit" }
  • AddedVertex { vertex_id: "space.remanso.recording#credit.creator" }
  • AddedVertex { vertex_id: "space.remanso.recording#credit.license" }
  • AddedVertex { vertex_id: "space.remanso.recording#credit.licenseUrl" }
  • AddedVertex { vertex_id: "space.remanso.recording#credit.sourceUrl" }
  • AddedVertex { vertex_id: "space.remanso.recording#credit.title" }
  • AddedVertex { vertex_id: "space.remanso.recording#transcript" }
  • AddedVertex { vertex_id: "space.remanso.recording#transcript.createdAt" }
  • AddedVertex { vertex_id: "space.remanso.recording#transcript.segments" }
  • AddedVertex { vertex_id: "space.remanso.recording#transcript.segments:items" }
  • AddedVertex { vertex_id: "space.remanso.recording#transcript.text" }
  • AddedVertex { vertex_id: "space.remanso.recording#transcriptSegment" }
  • AddedVertex { vertex_id: "space.remanso.recording#transcriptSegment.endMs" }
  • AddedVertex { vertex_id: "space.remanso.recording#transcriptSegment.startMs" }
  • AddedVertex { vertex_id: "space.remanso.recording#transcriptSegment.text" }
  • AddedVertex { vertex_id: "space.remanso.recording:body.credits" }
  • AddedVertex { vertex_id: "space.remanso.recording:body.credits:items" }
  • AddedVertex { vertex_id: "space.remanso.recording:body.language" }
  • AddedVertex { vertex_id: "space.remanso.recording:body.transcript" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "space.remanso.recording#transcriptSegment", src: "space.remanso.recording#transcriptSegment", tgt: "space.remanso.recording#transcriptSegment.endMs", kind: "prop", name: Some("endMs") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.remanso.recording#transcriptSegment", src: "space.remanso.recording#transcriptSegment", tgt: "space.remanso.recording#transcriptSegment.startMs", kind: "prop", name: Some("startMs") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.remanso.recording#transcriptSegment", src: "space.remanso.recording#transcriptSegment", tgt: "space.remanso.recording#transcriptSegment.text", kind: "prop", name: Some("text") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.remanso.recording#credit", src: "space.remanso.recording#credit", tgt: "space.remanso.recording#credit.licenseUrl", kind: "prop", name: Some("licenseUrl") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.remanso.recording#credit", src: "space.remanso.recording#credit", tgt: "space.remanso.recording#credit.creator", kind: "prop", name: Some("creator") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.remanso.recording#credit", src: "space.remanso.recording#credit", tgt: "space.remanso.recording#credit.license", kind: "prop", name: Some("license") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.remanso.recording#credit", src: "space.remanso.recording#credit", tgt: "space.remanso.recording#credit.sourceUrl", kind: "prop", name: Some("sourceUrl") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.remanso.recording#credit", src: "space.remanso.recording#credit", tgt: "space.remanso.recording#credit.title", kind: "prop", name: Some("title") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.remanso.recording#transcript", src: "space.remanso.recording#transcript", tgt: "space.remanso.recording#transcript.createdAt", kind: "prop", name: Some("createdAt") }
  • Breaking: RequiredEdgeAdded { vertex_id: "space.remanso.recording#transcript", src: "space.remanso.recording#transcript", tgt: "space.remanso.recording#transcript.text", kind: "prop", name: Some("text") }
  • Non-breaking: AddedEdge { src: "space.remanso.recording#transcript", tgt: "space.remanso.recording#transcript.segments", kind: "prop", name: Some("segments") }
  • Non-breaking: AddedEdge { src: "space.remanso.recording#transcript.segments", tgt: "space.remanso.recording#transcript.segments:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "space.remanso.recording#transcript.segments:items", tgt: "space.remanso.recording#transcriptSegment", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "space.remanso.recording:body", tgt: "space.remanso.recording:body.credits", kind: "prop", name: Some("credits") }
  • Non-breaking: AddedEdge { src: "space.remanso.recording:body", tgt: "space.remanso.recording:body.language", kind: "prop", name: Some("language") }
  • Non-breaking: AddedEdge { src: "space.remanso.recording:body", tgt: "space.remanso.recording:body.transcript", kind: "prop", name: Some("transcript") }
  • Non-breaking: AddedEdge { src: "space.remanso.recording:body.credits", tgt: "space.remanso.recording:body.credits:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "space.remanso.recording:body.credits:items", tgt: "space.remanso.recording#credit", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "space.remanso.recording:body.transcript", tgt: "space.remanso.recording#transcript", kind: "ref", name: None }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 +
    "credit": {
5 +
      "description": "One openly licensed work used in the recording, and where its terms live.",
6 +
      "properties": {
7 +
        "creator": {
8 +
          "maxLength": 1000,
9 +
          "type": "string"
10 +
        },
11 +
        "license": {
12 +
          "description": "The licence's short id, e.g. \"by\".",
13 +
          "maxLength": 64,
14 +
          "type": "string"
15 +
        },
16 +
        "licenseUrl": {
17 +
          "format": "uri",
18 +
          "type": "string"
19 +
        },
20 +
        "sourceUrl": {
21 +
          "description": "The work's landing page at its provider.",
22 +
          "format": "uri",
23 +
          "type": "string"
24 +
        },
25 +
        "title": {
26 +
          "maxLength": 1000,
27 +
          "type": "string"
28 +
        }
29 +
      },
30 +
      "required": [
31 +
        "title",
32 +
        "creator",
33 +
        "license",
34 +
        "licenseUrl",
35 +
        "sourceUrl"
36 +
      ],
37 +
      "type": "object"
38 +
    },
4 39
    "main": {
5 -
      "description": "An audio recording — a past stream, a podcast episode, a voice note — referenced from a Remanso note by at-uri.",
40 +
      "description": "An audio recording — a past stream, a podcast episode, a voice note. A recording at rkey R is the recording of the space.remanso.note at rkey R in the same repo: one note, at most one recording, paired by convention rather than by a field, so a reader that knows the note's did and rkey reaches the audio with a single getRecord. A recording whose rkey matches no note stands alone and belongs to nobody. Legacy path: a recording is also referenced from a note by at-uri embedded in the note's content.",
6 41
      "key": "tid",
7 42
      "record": {
8 43
        "properties": {
9 44
          "audio": {
10 45
            "accept": [
11 46
              "audio/*",
12 47
              "video/mp4",
13 48
              "video/webm"
14 49
            ],
15 50
            "description": "The recording itself. video/mp4 and video/webm are accepted alongside audio/* because a PDS sniffs the container rather than trusting the upload's Content-Type: an audio-only MP4 or M4A sniffs as video/mp4, and a sniffer that reads no further than the EBML magic calls an audio-only WebM video/webm.",
16 51
            "maxSize": 50000000,
17 52
            "type": "blob"
18 53
          },
19 54
          "createdAt": {
20 55
            "format": "datetime",
21 56
            "type": "string"
22 57
          },
58 +
          "credits": {
59 +
            "description": "Attribution for openly licensed music mixed into the recording. Only licences that require it are listed — a CC0 track is deliberately absent, because CC0 asks for nothing and an entry here would imply otherwise.",
60 +
            "items": {
61 +
              "ref": "#credit",
62 +
              "type": "ref"
63 +
            },
64 +
            "maxLength": 64,
65 +
            "type": "array"
66 +
          },
23 67
          "durationSec": {
24 68
            "description": "Playback length in seconds.",
25 69
            "type": "integer"
26 70
          },
71 +
          "language": {
72 +
            "description": "The language spoken in the recording. ISO 639-3, the same code space as space.remanso.note's `language`, so a note and its recording agree on how a language is spelled. A recording whose speech was never identified simply omits this.",
73 +
            "knownValues": [
74 +
              "afr",
75 +
              "ara",
76 +
              "aze",
77 +
              "bel",
78 +
              "ben",
79 +
              "bul",
80 +
              "cat",
81 +
              "ces",
82 +
              "ckb",
83 +
              "cmn",
84 +
              "dan",
85 +
              "deu",
86 +
              "ell",
87 +
              "eng",
88 +
              "est",
89 +
              "eus",
90 +
              "fin",
91 +
              "fra",
92 +
              "hau",
93 +
              "heb",
94 +
              "hin",
95 +
              "hrv",
96 +
              "hun",
97 +
              "hye",
98 +
              "ind",
99 +
              "isl",
100 +
              "ita",
101 +
              "jpn",
102 +
              "kat",
103 +
              "kaz",
104 +
              "kor",
105 +
              "lit",
106 +
              "mar",
107 +
              "mkd",
108 +
              "nld",
109 +
              "nob",
110 +
              "pes",
111 +
              "pol",
112 +
              "por",
113 +
              "ron",
114 +
              "run",
115 +
              "rus",
116 +
              "slk",
117 +
              "spa",
118 +
              "srp",
119 +
              "swe",
120 +
              "tgl",
121 +
              "tur",
122 +
              "ukr",
123 +
              "vie"
124 +
            ],
125 +
            "maxLength": 10,
126 +
            "type": "string"
127 +
          },
27 128
          "recordedAt": {
28 129
            "description": "When the audio was originally captured — a past stream's air date, not the upload time.",
29 130
            "format": "datetime",
30 131
            "type": "string"
31 132
          },
32 133
          "title": {
33 134
            "maxLength": 1000,
34 135
            "type": "string"
136 +
          },
137 +
          "transcript": {
138 +
            "ref": "#transcript",
139 +
            "type": "ref"
35 140
          }
36 141
        },
37 142
        "required": [
38 143
          "audio",
39 144
          "createdAt"
40 145
        ],
41 146
        "type": "object"
42 147
      },
43 148
      "type": "record"
149 +
    },
150 +
    "transcript": {
151 +
      "description": "What was said, as text. A recording is published before anything has transcribed it, so audio with no transcript is the normal starting state rather than an incomplete record — which is why this is optional and written by a later putRecord. `text` is the whole transcript in reading order and is always present; `segments` is that same text cut into timestamped spans. The two never disagree: a client renders either one without reconciling them, and a writer that edits one rewrites both.",
152 +
      "properties": {
153 +
        "createdAt": {
154 +
          "description": "When this transcript was written, which is later than the recording's own createdAt, and is bumped on every correction.",
155 +
          "format": "datetime",
156 +
          "type": "string"
157 +
        },
158 +
        "segments": {
159 +
          "description": "The transcript cut into timestamped spans, one paragraph each — the granularity a reader scans and seeks by, not the two-second slivers a speech model emits. Absent when the audio yielded no usable timestamps, which happens on very short clips.",
160 +
          "items": {
161 +
            "ref": "#transcriptSegment",
162 +
            "type": "ref"
163 +
          },
164 +
          "maxLength": 4096,
165 +
          "type": "array"
166 +
        },
167 +
        "text": {
168 +
          "description": "The transcript in reading order, paragraphs separated by a blank line. Equal to `segments` joined the same way, when segments are present.",
169 +
          "maxLength": 100000,
170 +
          "type": "string"
171 +
        }
172 +
      },
173 +
      "required": [
174 +
        "text",
175 +
        "createdAt"
176 +
      ],
177 +
      "type": "object"
178 +
    },
179 +
    "transcriptSegment": {
180 +
      "description": "One timestamped span of the transcript. Offsets are milliseconds from the start of the audio: the lexicon data model has no float, and rounding to whole seconds would land a seek target after the words the timestamp labels.",
181 +
      "properties": {
182 +
        "endMs": {
183 +
          "description": "Offset from the start of the audio, in milliseconds. Never before `startMs`.",
184 +
          "minimum": 0,
185 +
          "type": "integer"
186 +
        },
187 +
        "startMs": {
188 +
          "description": "Offset from the start of the audio, in milliseconds.",
189 +
          "minimum": 0,
190 +
          "type": "integer"
191 +
        },
192 +
        "text": {
193 +
          "maxLength": 10000,
194 +
          "type": "string"
195 +
        }
196 +
      },
197 +
      "required": [
198 +
        "startMs",
199 +
        "endMs",
200 +
        "text"
201 +
      ],
202 +
      "type": "object"
44 203
    }
45 204
  },
46 205
  "id": "space.remanso.recording",
47 206
  "lexicon": 1
48 207
}

Compare Other Versions

Lexicon Garden

@