From
bafyreihhiocqerm4umqa5wvcgs27jmcydybpvcejmq46bohexleoowzroy
indexed 2026-04-29 14:33 UTC
View this version
To
bafyreigavot2lg2ov27ku3ui5hd5ghyptdp567qpyn3jco3ulw5h2vh46y
indexed 2026-07-26 20:13 UTC
View this version
Compatibility
breaking 1 breaking change, 4 non-breaking changes.
Breaking changes (1)
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "app.gainforest.ac.audio:body", src: "app.gainforest.ac.audio:body", tgt: "app.gainforest.ac.audio:body.blob", kind: "prop", name: Some("blob") }
Non-breaking changes (4)
- AddedVertex AddedVertex { vertex_id: "app.gainforest.ac.audio:body.accessUri" }
- AddedVertex AddedVertex { vertex_id: "app.gainforest.ac.audio:body.variantLiteral" }
- AddedEdge AddedEdge { src: "app.gainforest.ac.audio:body", tgt: "app.gainforest.ac.audio:body.accessUri", kind: "prop", name: Some("accessUri") }
- AddedEdge AddedEdge { src: "app.gainforest.ac.audio:body", tgt: "app.gainforest.ac.audio:body.variantLiteral", kind: "prop", name: Some("variantLiteral") }
Migration guidance
Added
AddedVertex { vertex_id: "app.gainforest.ac.audio:body.accessUri" }AddedVertex { vertex_id: "app.gainforest.ac.audio:body.variantLiteral" }
Notes
- Breaking: RequiredEdgeRemoved { vertex_id: "app.gainforest.ac.audio:body", src: "app.gainforest.ac.audio:body", tgt: "app.gainforest.ac.audio:body.blob", kind: "prop", name: Some("blob") }
- Non-breaking: AddedEdge { src: "app.gainforest.ac.audio:body", tgt: "app.gainforest.ac.audio:body.accessUri", kind: "prop", name: Some("accessUri") }
- Non-breaking: AddedEdge { src: "app.gainforest.ac.audio:body", tgt: "app.gainforest.ac.audio:body.variantLiteral", kind: "prop", name: Some("variantLiteral") }
Changes
11
{22
"$type": "com.atproto.lexicon.schema",33
"defs": {44
"main": {55
"description": "An audio recording record with technical metadata and optional links to occurrence, deployment, and site records.",66
"key": "tid",77
"record": {88
"properties": {9
"accessUri": {10
"description": "URI to the original full-resolution audio resource (e.g. object storage URL). When present, the PDS blob is a compressed variant and this points to the archival original. Aligns with AC ac:accessURI.",11
"format": "uri",12
"maxGraphemes": 2048,13
"type": "string"14
},915
"blob": {10
"description": "The audio file blob stored on the PDS.",16
"description": "The audio file blob stored on the PDS. May be a compressed preview variant when the archival original is referenced via accessUri. At least one of blob or accessUri should be present.",1117
"ref": "app.gainforest.common.defs#audio",1218
"type": "ref"1319
},1420
"createdAt": {1521
"description": "Timestamp of record creation in the ATProto PDS.",1622
"format": "datetime",1723
"type": "string"1824
},1925
"deploymentRef": {2026
"description": "AT-URI of the ac.deployment record describing the recording device setup (device model, gain, location, schedule, etc.).",2127
"format": "at-uri",2228
"type": "string"2329
},2430
"description": {2531
"description": "A longer human-readable description of the audio recording content.",2632
"ref": "app.gainforest.common.defs#richtext",2733
"type": "ref"2834
},2935
"license": {3036
"description": "License for this recording (e.g., CC-BY-4.0, CC0-1.0). Aligns with AC dcterms:rights.",3137
"maxGraphemes": 256,3238
"type": "string"3339
},3440
"metadata": {3541
"description": "Technical audio metadata (codec, sample rate, duration, frequency bounds, etc.).",3642
"ref": "#metadata",3743
"type": "ref"3844
},3945
"name": {4046
"description": "A short human-readable name or label for this audio recording.",4147
"maxGraphemes": 256,4248
"type": "string"4349
},4450
"occurrenceRef": {4551
"description": "AT-URI of the dwc.occurrence record this audio is evidence for. Use when this recording documents a specific species detection or biodiversity observation.",4652
"format": "at-uri",4753
"type": "string"4854
},4955
"recordedBy": {5056
"description": "Name of the person or agent who made the recording. Aligns with AC dc:creator. For automated deployments, this is the person who deployed the device.",5157
"maxGraphemes": 512,5258
"type": "string"5359
},5460
"siteRef": {5561
"description": "AT-URI of the organization site record where this audio was captured.",5662
"format": "at-uri",5763
"type": "string"5864
},5965
"spectrogram": {6066
"description": "Spectrogram image of the recording (visual frequency-time representation).",6167
"ref": "app.gainforest.common.defs#spectrogram",6268
"type": "ref"6369
},6470
"tags": {6571
"description": "Freeform tags for the recording (e.g., 'dawn-chorus', 'rain', 'chainsaw', 'anthropogenic-noise'). Aligns with AC ac:tag.",6672
"items": {6773
"maxGraphemes": 64,6874
"type": "string"6975
},7076
"maxLength": 20,7177
"type": "array"7278
},7379
"thumbnail": {7480
"description": "Thumbnail image for display in list views.",7581
"ref": "app.gainforest.common.defs#imageThumbnail",7682
"type": "ref"83
},84
"variantLiteral": {85
"description": "AC variant describing the quality/size of the PDS blob relative to the archival original. Aligns with AC ac:variant.",86
"knownValues": [87
"Thumbnail",88
"Lower Quality",89
"Medium Quality",90
"Good Quality",91
"Best Quality",92
"Offline"93
],94
"maxGraphemes": 64,95
"type": "string"7796
}7897
},7998
"required": [80
"blob",8199
"metadata",82100
"createdAt"83101
],84102
"type": "object"85103
},86104
"type": "record"87105
},88106
"metadata": {89107
"description": "Technical audio metadata. These are properties of the audio file itself, not the recording context (location, weather, device). Aligns with AC Resource Creation Vocabulary and Music Ontology terms.",90108
"properties": {91109
"bitDepth": {92110
"description": "Bits per sample (e.g., 16, 24, 32).",93111
"maximum": 64,94112
"minimum": 8,95113
"type": "integer"96114
},97115
"channels": {98116
"description": "Number of audio channels (1 = mono, 2 = stereo).",99117
"minimum": 1,100118
"type": "integer"101119
},102120
"codec": {103121
"description": "Audio codec (e.g., 'PCM', 'FLAC', 'MP3', 'AAC').",104122
"maxGraphemes": 32,105123
"type": "string"106124
},107125
"duration": {108126
"description": "Duration of the recording in seconds (e.g., '300.0').",109127
"maxGraphemes": 32,110128
"type": "string"111129
},112130
"fileFormat": {113131
"description": "File format (e.g., 'WAV', 'FLAC', 'MP3'). Aligns with AC dc:format.",114132
"maxGraphemes": 32,115133
"type": "string"116134
},117135
"fileSizeBytes": {118136
"description": "File size in bytes.",119137
"minimum": 0,120138
"type": "integer"121139
},122140
"filterHighPassHz": {123141
"description": "High-pass filter cutoff frequency in Hz applied during or after recording. Aligns with AC ac:filterHighPass.",124142
"minimum": 0,125143
"type": "integer"126144
},127145
"filterLowPassHz": {128146
"description": "Low-pass filter cutoff frequency in Hz applied during or after recording. Aligns with AC ac:filterLowPass.",129147
"minimum": 0,130148
"type": "integer"131149
},132150
"maxFrequencyHz": {133151
"description": "Highest frequency present in the recording in Hz. Aligns with AC ac:freqHigh.",134152
"minimum": 0,135153
"type": "integer"136154
},137155
"minFrequencyHz": {138156
"description": "Lowest frequency present in the recording in Hz. Aligns with AC ac:freqLow.",139157
"minimum": 0,140158
"type": "integer"141159
},142160
"recordedAt": {143161
"description": "Date and time the audio was captured (start of recording). Aligns with AC xmp:CreateDate.",144162
"format": "datetime",145163
"type": "string"146164
},147165
"sampleRate": {148166
"description": "Sample rate in Hz (e.g., 44100, 48000, 384000 for ultrasonic). Aligns with AC mo:sample_rate.",149167
"minimum": 1,150168
"type": "integer"151169
},152170
"signalToNoiseRatio": {153171
"description": "Signal-to-noise ratio in dB.",154172
"maxGraphemes": 32,155173
"type": "string"156174
}157175
},158176
"required": [159177
"channels",160178
"duration",161179
"sampleRate",162180
"recordedAt"163181
],164182
"type": "object"165183
}166184
},167185
"description": "Generic audio resource record aligned with the TDWG Audiovisual Core standard (http://www.tdwg.org/standards/638). Represents a single audio recording (field recording, soundscape, species call) with its technical metadata. Links to a dwc.occurrence as evidence and optionally to an ac.deployment describing the recording device setup. Does not carry location, weather, habitat, or device fields — those belong on dwc.event, dwc.occurrence, or ac.deployment respectively.",168186
"id": "app.gainforest.ac.audio",169187
"lexicon": 1170188
}