place.birds.sighting

birds.place

Schema Diff

+17 -8

From

CID
bafyreib4m3zlmev...
Indexed At
2026-07-27 17:07 UTC
View this version

To

CID
bafyreifdudzznkx...
Indexed At
2026-07-27 20:03 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

3 breaking changes, 0 non-breaking changes.

Breaking Changes (3)
  • ConstraintAdded ConstraintAdded { vertex_id: "place.birds.sighting:body.count", sort: "maximum", value: "100000" }
  • ConstraintAdded ConstraintAdded { vertex_id: "place.birds.sighting#location.name", sort: "maxGraphemes", value: "160" }
  • ConstraintAdded ConstraintAdded { vertex_id: "place.birds.sighting#media.alt", sort: "maxGraphemes", value: "400" }

Migration Guidance

Constraint Changes

  • ConstraintAdded ConstraintAdded { vertex_id: "place.birds.sighting#location.name", sort: "maxGraphemes", value: "160" }
  • ConstraintAdded ConstraintAdded { vertex_id: "place.birds.sighting:body.count", sort: "maximum", value: "100000" }
  • ConstraintAdded ConstraintAdded { vertex_id: "place.birds.sighting#media.alt", sort: "maxGraphemes", value: "400" }
1 1
{
2 2
  "id": "place.birds.sighting",
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
          "species",
11 11
          "observedAt",
12 12
          "createdAt"
13 13
        ],
14 14
        "properties": {
15 15
          "count": {
16 16
            "type": "integer",
17 +
            "maximum": 100000,
17 18
            "minimum": 1,
18 -
            "description": "How many individuals."
19 +
            "description": "How many individuals the observer counted. Absent means one, or means they did not count."
19 20
          },
20 21
          "media": {
21 22
            "type": "array",
22 23
            "items": {
23 24
              "ref": "#media",
24 25
              "type": "ref"
25 26
            },
26 -
            "maxLength": 4
27 +
            "maxLength": 4,
28 +
            "description": "Evidence, in whatever form it was captured: a photo, a video, or a recording of the call. Ordered as the observer added it."
27 29
          },
28 30
          "notes": {
29 31
            "type": "string",
30 32
            "maxLength": 3000,
33 +
            "description": "Anything else the observer wants to say about the sighting: behaviour, plumage, who they were with.",
31 34
            "maxGraphemes": 600
32 35
          },
33 36
          "species": {
34 37
            "type": "string",
35 38
            "maxLength": 640,
36 39
            "description": "Common name as the observer said it. Free text on purpose — always present, even when no code was resolved.",
37 40
            "maxGraphemes": 160
38 41
          },
39 42
          "location": {
40 43
            "ref": "#location",
41 -
            "type": "ref"
44 +
            "type": "ref",
45 +
            "description": "Roughly where the bird was. Optional, and deliberately coarse — see #location."
42 46
          },
43 47
          "createdAt": {
44 48
            "type": "string",
45 -
            "format": "datetime"
49 +
            "format": "datetime",
50 +
            "description": "Client-declared timestamp for when this record was written."
46 51
          },
47 52
          "observedAt": {
48 53
            "type": "string",
49 54
            "format": "datetime",
50 -
            "description": "When the bird was seen. Distinct from createdAt so a sighting can be logged later."
55 +
            "description": "Client-declared timestamp for when the bird was seen. Distinct from createdAt so a sighting can be written up later. Not verified by anything."
51 56
          },
52 57
          "speciesCode": {
53 58
            "type": "string",
54 59
            "maxLength": 32,
55 60
            "description": "The observer's asserted identification as a stable eBird/Clements taxon code (e.g. `norcar`). Present when they picked from the list; absent when they just typed something. May be a `spuh` or `slash` code when the identification is honestly partial."
56 61
          }
57 62
        }
58 63
      },
59 64
      "description": "A bird sighting logged by the observer, stored in their own repository. Honor system: `species` is what the observer believes they saw, not a verified determination."
60 65
    },
61 66
    "media": {
62 67
      "type": "object",
63 68
      "required": [
64 69
        "blob"
65 70
      ],
66 71
      "properties": {
67 72
        "alt": {
68 73
          "type": "string",
69 -
          "maxLength": 2000
74 +
          "maxLength": 2000,
75 +
          "description": "Alt text describing the media for people who cannot see or hear it.",
76 +
          "maxGraphemes": 400
70 77
        },
71 78
        "blob": {
72 79
          "type": "blob",
73 80
          "accept": [
74 81
            "image/*",
75 82
            "audio/*",
76 83
            "video/*"
77 84
          ],
78 -
          "maxSize": 100000000
85 +
          "maxSize": 100000000,
86 +
          "description": "The captured file. Audio is first-class here: a bird's call is often better evidence than a photograph of a silhouette."
79 87
        }
80 88
      }
81 89
    },
82 90
    "location": {
83 91
      "type": "object",
84 92
      "required": [
85 93
        "latitude",
86 94
        "longitude"
87 95
      ],
88 96
      "properties": {
89 97
        "name": {
90 98
          "type": "string",
91 99
          "maxLength": 640,
92 -
          "description": "Free-text place name."
100 +
          "description": "Free-text place name, as the observer chose it (e.g. \"Montrose Point Bird Sanctuary, Chicago\"). Independent of the coordinates and not verified against them.",
101 +
          "maxGraphemes": 160
93 102
        },
94 103
        "latitude": {
95 104
          "type": "string",
96 105
          "maxLength": 32,
97 106
          "description": "Decimal degrees, as a string to avoid float drift. Deliberately coarse: clients should write no more than 3 decimal places (~110m). These records are public and permanent, and a bird sighting does not need a precise fix."
98 107
        },
99 108
        "longitude": {
100 109
          "type": "string",
101 110
          "maxLength": 32,
102 111
          "description": "Decimal degrees, as a string. Same precision limit as latitude."
103 112
        }
104 113
      }
105 114
    }
106 115
  },
107 116
  "$type": "com.atproto.lexicon.schema",
108 117
  "lexicon": 1
109 118
}

Compare Other Versions

Lexicon Garden

@