at.atjam.submission

atjam.at

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "main": {
      "description": "Declares a submission by the record creator to the referenced round.",
      "key": "tid",
      "record": {
        "properties": {
          "createdAt": {
            "format": "datetime",
            "type": "string"
          },
          "note": {
            "description": "Optional caption/description from the submitter.",
            "maxGraphemes": 300,
            "maxLength": 3000,
            "type": "string"
          },
          "payload": {
            "description": "Preferred deliverable: a strong-ref to the record on its native ATProto app. The referenced record's $type SHOULD appear in the round's acceptedSubmissionTypes.",
            "ref": "com.atproto.repo.strongRef",
            "type": "ref"
          },
          "round": {
            "description": "Strong-ref to the at.atjam.round record being submitted to.",
            "ref": "com.atproto.repo.strongRef",
            "type": "ref"
          },
          "url": {
            "description": "Fallback deliverable for work not on ATProto: a plain link (itch.io build, hosted doc, etc.). Unverifiable and mutable, so prefer payload when the deliverable is a record. Ignored when payload is present.",
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "round",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    }
  },
  "description": "A participant's submission to a round. atjam does not host the deliverable; it points at it. The strong way is `payload` — a strong-ref to a record on whichever ATProto app owns the data (plyr.fm track, standard.site post, etc.), which is content-addressed, verifiable, and portable. The fallback is `url` — a plain link, for deliverables that don't live on ATProto yet (an itch.io build, a hosted doc). Prefer payload; `url` is the humble alternative. The lexicon can't express \"one-of\" across fields, so both are optional here and the \"at least one\" rule is enforced in code (Submission.getDeliverable). The submitter's DID is implicit (the record creator).",
  "id": "at.atjam.submission",
  "lexicon": 1
}

Validate Record

Validate a record against at.atjam.submission

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:b5bxdq5jyv3tvkyscu42xr7u
CID
bafyreifxahevhpjpt666fya4impg34kwqdi6obin3g3v5dh2iugywc37qi
Indexed At
2026-06-05 04:20 UTC
AT-URI
at://did:plc:b5bxdq5jyv3tvkyscu42xr7u/com.atproto.lexicon.schema/at.atjam.submission

Version History (2 versions)

Similar Lexicons

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

  • A single instance of a jam: an assignment with a deadline that participants sign up for and submit to. State (open / in-progress / closed) is derived from milestones, not stored as an enum.

  • at.atjam.jam record

    A recurring (or one-shot) creative challenge that contains rounds. Identity-bearing container: 'EPTSS-the-project' is one jam; a one-shot game jam is also a jam with a single round.

  • A declaration of intent to participate in a specific round. The participant's DID is implicit (the record creator). When the round's joinMode is 'hosted' or 'network', a signup is only valid for readers when it strong-r…

  • An invitation to participate in a round, written by an inviter on their own PDS. The inviter's DID is implicit (the record creator). Required for participation in rounds where round.joinMode is 'hosted' (only the jam or…

Lexicon Garden

@