at.atjam.playlist

atjam.at

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "item": {
      "properties": {
        "note": {
          "description": "Why this is here — 'the original', 'Round 30 winner'. The curator's voice, which is the part a bare list of tracks loses.",
          "maxGraphemes": 300,
          "maxLength": 3000,
          "type": "string"
        },
        "subject": {
          "description": "Any record. CID-pinned, so an item that changed under you is detectable rather than silent.",
          "ref": "com.atproto.repo.strongRef",
          "type": "ref"
        }
      },
      "required": [
        "subject"
      ],
      "type": "object"
    },
    "main": {
      "description": "An ordered list of records, authored by the repo owner. Deliberately knows nothing about music — or about any project type, which is why it lives in atjam: items are strongRefs to records of any collection, so one list can hold owned audio, an external song reference, and a record from an app that did not exist when this was written, with no schema change. A reader that does not recognise an item's collection renders the URI and moves on — that is the property that makes this infrastructure rather than an app's private format. Order is array order: one atomic write, and no ordering field to disagree about.",
      "key": "any",
      "record": {
        "properties": {
          "context": {
            "description": "What this list is about — a round, a jam, an event. Lets a page surface lists made about it without anyone registering them.",
            "ref": "com.atproto.repo.strongRef",
            "type": "ref"
          },
          "createdAt": {
            "format": "datetime",
            "type": "string"
          },
          "description": {
            "maxGraphemes": 3000,
            "maxLength": 30000,
            "type": "string"
          },
          "items": {
            "items": {
              "ref": "#item",
              "type": "ref"
            },
            "maxLength": 500,
            "minLength": 1,
            "type": "array"
          },
          "title": {
            "maxGraphemes": 512,
            "maxLength": 5120,
            "type": "string"
          }
        },
        "required": [
          "title",
          "items",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    }
  },
  "id": "at.atjam.playlist",
  "lexicon": 1
}

Validate Record

Validate a record against at.atjam.playlist

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:b5bxdq5jyv3tvkyscu42xr7u
CID
bafyreiezidclmh2xpu7py5y56zijucjksdrj2ljx5wh6avoieisz355rzy
Indexed At
2026-08-10 04:25 UTC
AT-URI
at://did:plc:b5bxdq5jyv3tvkyscu42xr7u/com.atproto.lexicon.schema/at.atjam.playlist

Similar Lexicons

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • sh.diffuse.output.playlistItemBundle recordnot from the namespace authority
  • app.bluvy.tube.playlist.item recordnot from the namespace authority

    One video's membership in a app.bluvy.tube.playlist, written to the playlist owner's own repo as a separate record (not embedded in the playlist record itself) — same shape as app.bsky.graph.listitem referencing an ap…

  • A song entry in a playlist. Holds a strong reference to the playlist it belongs to, a strong reference to the song record itself, and a denormalized copy of the song metadata so the entry can be rendered without derefer…

  • A Bluvy Tube playlist — a named, ordered-by-creation collection of videos, written to the owning user's own repo. Membership is tracked separately by app.bluvy.tube.playlist.item records referencing this record via st…

  • A declaration of a playlist.

Lexicon Garden

@