space.remanso.recording
{
"$type": "com.atproto.lexicon.schema",
"defs": {
"credit": {
"description": "One openly licensed work used in the recording, and where its terms live.",
"properties": {
"creator": {
"maxLength": 1000,
"type": "string"
},
"license": {
"description": "The licence's short id, e.g. \"by\".",
"maxLength": 64,
"type": "string"
},
"licenseUrl": {
"format": "uri",
"type": "string"
},
"sourceUrl": {
"description": "The work's landing page at its provider.",
"format": "uri",
"type": "string"
},
"title": {
"maxLength": 1000,
"type": "string"
}
},
"required": [
"title",
"creator",
"license",
"licenseUrl",
"sourceUrl"
],
"type": "object"
},
"main": {
"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.",
"key": "tid",
"record": {
"properties": {
"audio": {
"accept": [
"audio/*",
"video/mp4",
"video/webm"
],
"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.",
"maxSize": 50000000,
"type": "blob"
},
"createdAt": {
"format": "datetime",
"type": "string"
},
"credits": {
"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.",
"items": {
"ref": "#credit",
"type": "ref"
},
"maxLength": 64,
"type": "array"
},
"durationSec": {
"description": "Playback length in seconds.",
"type": "integer"
},
"language": {
"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.",
"knownValues": [
"afr",
"ara",
"aze",
"bel",
"ben",
"bul",
"cat",
"ces",
"ckb",
"cmn",
"dan",
"deu",
"ell",
"eng",
"est",
"eus",
"fin",
"fra",
"hau",
"heb",
"hin",
"hrv",
"hun",
"hye",
"ind",
"isl",
"ita",
"jpn",
"kat",
"kaz",
"kor",
"lit",
"mar",
"mkd",
"nld",
"nob",
"pes",
"pol",
"por",
"ron",
"run",
"rus",
"slk",
"spa",
"srp",
"swe",
"tgl",
"tur",
"ukr",
"vie"
],
"maxLength": 10,
"type": "string"
},
"recordedAt": {
"description": "When the audio was originally captured — a past stream's air date, not the upload time.",
"format": "datetime",
"type": "string"
},
"title": {
"maxLength": 1000,
"type": "string"
},
"transcript": {
"ref": "#transcript",
"type": "ref"
}
},
"required": [
"audio",
"createdAt"
],
"type": "object"
},
"type": "record"
},
"transcript": {
"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.",
"properties": {
"createdAt": {
"description": "When this transcript was written, which is later than the recording's own createdAt, and is bumped on every correction.",
"format": "datetime",
"type": "string"
},
"segments": {
"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.",
"items": {
"ref": "#transcriptSegment",
"type": "ref"
},
"maxLength": 4096,
"type": "array"
},
"text": {
"description": "The transcript in reading order, paragraphs separated by a blank line. Equal to `segments` joined the same way, when segments are present.",
"maxLength": 100000,
"type": "string"
}
},
"required": [
"text",
"createdAt"
],
"type": "object"
},
"transcriptSegment": {
"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.",
"properties": {
"endMs": {
"description": "Offset from the start of the audio, in milliseconds. Never before `startMs`.",
"minimum": 0,
"type": "integer"
},
"startMs": {
"description": "Offset from the start of the audio, in milliseconds.",
"minimum": 0,
"type": "integer"
},
"text": {
"maxLength": 10000,
"type": "string"
}
},
"required": [
"startMs",
"endMs",
"text"
],
"type": "object"
}
},
"id": "space.remanso.recording",
"lexicon": 1
}
Metadata
- DID
-
did:plc:4m3kouplb7s7xozjd3whinvl - CID
-
bafyreifezcxxjyjysup7zf7kkgi7khvzhstcfiombfzbaaxfth2zzx3bsq - Indexed At
- 2026-08-06 21:00 UTC
- AT-URI
-
at://did:plc:4m3kouplb7s7xozjd3whinvl/com.atproto.lexicon.schema/space.remanso.recording
Version History (7 versions)
Similar Lexicons
Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.
-
A voice recording captured by Pebble Index: the audio as a blob plus its transcript. Blob access control is at the record layer, so the audio is only reachable by parties with access to the space.
-
tech.waow.reciteTake record
-
so.sprk.sound.audio record
A audio record referencable in a Spark record (e.g, a post)
-
live.voxport.podcast.episode record
A podcast episode belonging to a series
-
An audio file stored inside a user's private atproto space of type ch.indiemusi.alpha.audioTrack. Not stored in the public repo.