From
bafyreifludmqq4f5uuww7lnm3y5nftm2zfbslty7sqq4djffw4oolv3uuu
indexed 2026-09-23 01:16 UTC
View this version
To
bafyreido5l2ish6z4orln6yqcgavk2rzy2gxqmkphscc2tublutlu4zwpi
indexed 2026-09-23 20:50 UTC
View this version
Compatibility
breaking 2 breaking changes, 20 non-breaking changes.
Breaking changes (2)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "town.laugh.user.list:body.itemOrder:items", src: "town.laugh.user.list:body.itemOrder:items", tgt: "town.laugh.user.list:body.itemOrder:items.item", kind: "prop", name: Some("item") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "town.laugh.user.list:body.itemOrder:items", src: "town.laugh.user.list:body.itemOrder:items", tgt: "town.laugh.user.list:body.itemOrder:items.order", kind: "prop", name: Some("order") }
Non-breaking changes (20)
- AddedVertex AddedVertex { vertex_id: "town.laugh.user.list:body.blockedContributors" }
- AddedVertex AddedVertex { vertex_id: "town.laugh.user.list:body.blockedContributors:items" }
- AddedVertex AddedVertex { vertex_id: "town.laugh.user.list:body.collab" }
- AddedVertex AddedVertex { vertex_id: "town.laugh.user.list:body.contributors" }
- AddedVertex AddedVertex { vertex_id: "town.laugh.user.list:body.contributors:items" }
- AddedVertex AddedVertex { vertex_id: "town.laugh.user.list:body.itemOrder" }
- AddedVertex AddedVertex { vertex_id: "town.laugh.user.list:body.itemOrder:items" }
- AddedVertex AddedVertex { vertex_id: "town.laugh.user.list:body.itemOrder:items.item" }
- AddedVertex AddedVertex { vertex_id: "town.laugh.user.list:body.itemOrder:items.order" }
- AddedVertex AddedVertex { vertex_id: "town.laugh.user.list:body.removedItems" }
- AddedVertex AddedVertex { vertex_id: "town.laugh.user.list:body.removedItems:items" }
- AddedEdge AddedEdge { src: "town.laugh.user.list:body", tgt: "town.laugh.user.list:body.blockedContributors", kind: "prop", name: Some("blockedContributors") }
- AddedEdge AddedEdge { src: "town.laugh.user.list:body", tgt: "town.laugh.user.list:body.collab", kind: "prop", name: Some("collab") }
- AddedEdge AddedEdge { src: "town.laugh.user.list:body", tgt: "town.laugh.user.list:body.contributors", kind: "prop", name: Some("contributors") }
- AddedEdge AddedEdge { src: "town.laugh.user.list:body", tgt: "town.laugh.user.list:body.itemOrder", kind: "prop", name: Some("itemOrder") }
- AddedEdge AddedEdge { src: "town.laugh.user.list:body", tgt: "town.laugh.user.list:body.removedItems", kind: "prop", name: Some("removedItems") }
- AddedEdge AddedEdge { src: "town.laugh.user.list:body.blockedContributors", tgt: "town.laugh.user.list:body.blockedContributors:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "town.laugh.user.list:body.contributors", tgt: "town.laugh.user.list:body.contributors:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "town.laugh.user.list:body.itemOrder", tgt: "town.laugh.user.list:body.itemOrder:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "town.laugh.user.list:body.removedItems", tgt: "town.laugh.user.list:body.removedItems:items", kind: "items", name: None }
Migration guidance
Added
AddedVertex { vertex_id: "town.laugh.user.list:body.blockedContributors" }AddedVertex { vertex_id: "town.laugh.user.list:body.blockedContributors:items" }AddedVertex { vertex_id: "town.laugh.user.list:body.collab" }AddedVertex { vertex_id: "town.laugh.user.list:body.contributors" }AddedVertex { vertex_id: "town.laugh.user.list:body.contributors:items" }AddedVertex { vertex_id: "town.laugh.user.list:body.itemOrder" }AddedVertex { vertex_id: "town.laugh.user.list:body.itemOrder:items" }AddedVertex { vertex_id: "town.laugh.user.list:body.itemOrder:items.item" }AddedVertex { vertex_id: "town.laugh.user.list:body.itemOrder:items.order" }AddedVertex { vertex_id: "town.laugh.user.list:body.removedItems" }AddedVertex { vertex_id: "town.laugh.user.list:body.removedItems:items" }
Notes
- Breaking: RequiredEdgeAdded { vertex_id: "town.laugh.user.list:body.itemOrder:items", src: "town.laugh.user.list:body.itemOrder:items", tgt: "town.laugh.user.list:body.itemOrder:items.item", kind: "prop", name: Some("item") }
- Breaking: RequiredEdgeAdded { vertex_id: "town.laugh.user.list:body.itemOrder:items", src: "town.laugh.user.list:body.itemOrder:items", tgt: "town.laugh.user.list:body.itemOrder:items.order", kind: "prop", name: Some("order") }
- Non-breaking: AddedEdge { src: "town.laugh.user.list:body", tgt: "town.laugh.user.list:body.blockedContributors", kind: "prop", name: Some("blockedContributors") }
- Non-breaking: AddedEdge { src: "town.laugh.user.list:body", tgt: "town.laugh.user.list:body.collab", kind: "prop", name: Some("collab") }
- Non-breaking: AddedEdge { src: "town.laugh.user.list:body", tgt: "town.laugh.user.list:body.contributors", kind: "prop", name: Some("contributors") }
- Non-breaking: AddedEdge { src: "town.laugh.user.list:body", tgt: "town.laugh.user.list:body.itemOrder", kind: "prop", name: Some("itemOrder") }
- Non-breaking: AddedEdge { src: "town.laugh.user.list:body", tgt: "town.laugh.user.list:body.removedItems", kind: "prop", name: Some("removedItems") }
- Non-breaking: AddedEdge { src: "town.laugh.user.list:body.blockedContributors", tgt: "town.laugh.user.list:body.blockedContributors:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "town.laugh.user.list:body.contributors", tgt: "town.laugh.user.list:body.contributors:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "town.laugh.user.list:body.itemOrder", tgt: "town.laugh.user.list:body.itemOrder:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "town.laugh.user.list:body.removedItems", tgt: "town.laugh.user.list:body.removedItems:items", kind: "items", name: None }
Changes
11
{22
"$type": "com.atproto.lexicon.schema",33
"defs": {44
"main": {55
"description": "A user-curated list of events, venues, and/or comedians. The favorites list is the one with purpose \"favorites\".",66
"key": "tid",77
"record": {88
"properties": {9
"blockedContributors": {10
"description": "DIDs the owner has blocked from contributing; applies in \"open\" mode (and harmlessly in \"invite\" mode too)",11
"items": {12
"format": "did",13
"type": "string"14
},15
"maxLength": 200,16
"type": "array"17
},918
"calendar": {1019
"description": "Show a derived calendar of upcoming shows for the list's items. Off by default.",1120
"type": "boolean"1221
},22
"collab": {23
"description": "Who can add items to this list: \"owner\" (only the list owner, the default when absent), \"invite\" (DIDs on `contributors`), or \"open\" (anyone signed in)",24
"knownValues": [25
"owner",26
"invite",27
"open"28
],29
"type": "string"30
},31
"contributors": {32
"description": "DID allowlist for collab \"invite\". Kept (but ignored) when collab is \"open\"/\"owner\", so toggling modes doesn't lose the list",33
"items": {34
"format": "did",35
"type": "string"36
},37
"maxLength": 50,38
"type": "array"39
},1340
"createdAt": {1441
"description": "Timestamp of when the list was created",1542
"format": "datetime",1643
"type": "string"1744
},1845
"description": {1946
"description": "Optional list description",2047
"maxLength": 2048,2148
"type": "string"2249
},2350
"forkedFrom": {2451
"description": "AT-URI of the town.laugh.user.list record this list was duplicated from",2552
"format": "at-uri",2653
"type": "string"2754
},55
"itemOrder": {56
"description": "Owner-set positions for contributed items only (a contributor's own listitem `order` field is ignored)",57
"items": {58
"properties": {59
"item": {60
"description": "AT-URI of the contributed town.laugh.user.listitem record",61
"format": "at-uri",62
"type": "string"63
},64
"order": {65
"description": "Fractional-index position key",66
"type": "string"67
}68
},69
"required": [70
"item",71
"order"72
],73
"type": "object"74
},75
"maxLength": 500,76
"type": "array"77
},2878
"name": {2979
"description": "Display name",3080
"maxLength": 256,3181
"type": "string"3282
},3383
"numbered": {3484
"description": "Show items as a ranked, numbered list",3585
"type": "boolean"3686
},3787
"place": {3888
"description": "laugh.town place slug (e.g. \"los-angeles\") the list is about. When set, the derived calendar is fixed to this place and its descendants; when absent, viewers pick the place themselves.",3989
"maxLength": 64,4090
"type": "string"4191
},4292
"purpose": {4393
"description": "Advisory list purpose; \"favorites\" marks the singular favorites list",4494
"knownValues": [4595
"curated",4696
"favorites"4797
],4898
"type": "string"4999
},100
"removedItems": {101
"description": "AT-URIs of town.laugh.user.listitem records the owner suppressed from a contributor's contribution",102
"items": {103
"format": "at-uri",104
"type": "string"105
},106
"maxLength": 500,107
"type": "array"108
},50109
"slug": {51110
"description": "URL slug, lowercase alphanumeric with single-hyphen separators (e.g. \"best-of-2026\"). Derived from the name at creation and frozen thereafter; unique per did.",52111
"maxLength": 64,53112
"type": "string"54113
},55114
"sort": {56115
"description": "Default item ordering for viewers; \"manual\" (the default when absent) uses each listitem's fractional order",57116
"knownValues": [58117
"manual",59118
"alpha",60119
"added",61120
"date"62121
],63122
"type": "string"64123
}65124
},66125
"required": [67126
"name",68127
"createdAt"69128
],70129
"type": "object"71130
},72131
"type": "record"73132
}74133
},75134
"id": "town.laugh.user.list",76135
"lexicon": 177136
}