Declares a round under a parent jam.
tid
Timestamp-based ID
Properties
acceptedSubmissionTypes
array
of
string
nsid
Required
NSIDs of record types that can be submitted to this round (e.g. ['fm.plyr.track']).
maxLength: 32 itemsminLength: 1 itemsassignment
string
Required
The prompt or brief participants are working against.
maxLength: 30000 bytesmaxGraphemes: 3000 graphemesclosingEvent
unknown
Optional
Optional structured closing event (e.g. a listening party, demo day). Records embedded here must include a $type discriminator.
createdAt
string
datetime
Required
An RFC 3339 formatted timestamp.
jam
ref
com.atproto.repo.strongRef
Required
Strong-ref to the parent at.atjam.jam record.
joinMode
string
Optional
How the round handles signups. Three named patterns: 'open' (default): anyone can sign up; no invitation required. 'hosted': only invitees can sign up, and only the jam organizer can invite — like a guest list. 'network': only invitees can sign up; the organizer can invite, and so can current participants (with the threshold set by networkGate) — like a friend-of-a-friend network. For 'hosted' and 'network', a signup is only valid for readers when its 'invitation' field strong-refs an at.atjam.invitation written by a valid inviter. Unknown values resolve to 'open' for forward compatibility.
maxLength: 640 bytesmaxGraphemes: 64 graphemesopen, hosted, networkmilestones
array
of
ref
#milestone
Required
Dated milestones for this round. At minimum should include a submission deadline. State is derived by comparing now() to these dates.
maxLength: 16 itemsminLength: 1 itemsname
string
Optional
Human label for this round (e.g. 'Round 26', 'December 2025'). Optional.
maxLength: 640 bytesmaxGraphemes: 64 graphemesnetworkGate
string
Optional
Only meaningful when joinMode is 'network'. Defines the threshold a participant must cross before they're allowed to extend invitations. 'signup' (default): any DID with a valid signup can invite. 'contributed': only DIDs whose valid signup is accompanied by at least one at.atjam.submission to this round can invite. Ignored when joinMode is 'open' or 'hosted'. Unknown values resolve to 'signup' for forward compatibility.
maxLength: 640 bytesmaxGraphemes: 64 graphemessignup, contributedsubject
unknown
Optional
Optional structured subject for the round. Records embedded here must include a $type discriminator. Example: a site.eptss.song record for an EPTSS round.
View raw schema
{
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"jam",
"assignment",
"acceptedSubmissionTypes",
"milestones",
"createdAt"
],
"properties": {
"jam": {
"ref": "com.atproto.repo.strongRef",
"type": "ref",
"description": "Strong-ref to the parent at.atjam.jam record."
},
"name": {
"type": "string",
"maxLength": 640,
"description": "Human label for this round (e.g. 'Round 26', 'December 2025'). Optional.",
"maxGraphemes": 64
},
"subject": {
"type": "unknown",
"description": "Optional structured subject for the round. Records embedded here must include a $type discriminator. Example: a site.eptss.song record for an EPTSS round."
},
"joinMode": {
"type": "string",
"maxLength": 640,
"description": "How the round handles signups. Three named patterns: 'open' (default): anyone can sign up; no invitation required. 'hosted': only invitees can sign up, and only the jam organizer can invite — like a guest list. 'network': only invitees can sign up; the organizer can invite, and so can current participants (with the threshold set by networkGate) — like a friend-of-a-friend network. For 'hosted' and 'network', a signup is only valid for readers when its 'invitation' field strong-refs an at.atjam.invitation written by a valid inviter. Unknown values resolve to 'open' for forward compatibility.",
"knownValues": [
"open",
"hosted",
"network"
],
"maxGraphemes": 64
},
"createdAt": {
"type": "string",
"format": "datetime"
},
"assignment": {
"type": "string",
"maxLength": 30000,
"description": "The prompt or brief participants are working against.",
"maxGraphemes": 3000
},
"milestones": {
"type": "array",
"items": {
"ref": "#milestone",
"type": "ref"
},
"maxLength": 16,
"minLength": 1,
"description": "Dated milestones for this round. At minimum should include a submission deadline. State is derived by comparing now() to these dates."
},
"networkGate": {
"type": "string",
"maxLength": 640,
"description": "Only meaningful when joinMode is 'network'. Defines the threshold a participant must cross before they're allowed to extend invitations. 'signup' (default): any DID with a valid signup can invite. 'contributed': only DIDs whose valid signup is accompanied by at least one at.atjam.submission to this round can invite. Ignored when joinMode is 'open' or 'hosted'. Unknown values resolve to 'signup' for forward compatibility.",
"knownValues": [
"signup",
"contributed"
],
"maxGraphemes": 64
},
"closingEvent": {
"type": "unknown",
"description": "Optional structured closing event (e.g. a listening party, demo day). Records embedded here must include a $type discriminator."
},
"acceptedSubmissionTypes": {
"type": "array",
"items": {
"type": "string",
"format": "nsid"
},
"maxLength": 32,
"minLength": 1,
"description": "NSIDs of record types that can be submitted to this round (e.g. ['fm.plyr.track'])."
}
}
},
"description": "Declares a round under a parent jam."
}