A photo challenge: a named set of prompts, published by its organizer, that anyone can enter by writing a pics.2bit.challenge.entry for one of their own photos. The record key is a short readable slug (e.g. `gbcamtober-2026`) and is only unique within the organizer's repo, so a challenge is always named by organizer and key together - in URLs as `<organizer handle>/<rkey>`, in records by its at-uri.
any
Any valid record key
Properties
createdAt
string
datetime
Required
An RFC 3339 formatted timestamp.
description
string
Optional
The rules or intro text, shown on the challenge page.
maxLength: 10000 bytesmaxGraphemes: 1000 graphemesendsAt
string
datetime
Required
When the challenge closes, exclusive. Must be after `startsAt`.
hashtag
string
Optional
The challenge's hashtag, without the leading `#`, e.g. `GBCamtober2026`. Clients add it to the caption of a photo entered into the challenge, so entries also reach the tag's page and feed. Must be a tag under this app's hashtag grammar (see pics.2bit.feed.photo#caption); a list whose hashtag isn't one is indexed as if it had none.
maxLength: 64 bytesname
string
Required
Display name, e.g. "GBCamtober 2026".
maxLength: 640 bytesminLength: 1 bytesmaxGraphemes: 64 graphemesprompts
array
of
ref
#prompt
Required
The prompts, in display order. Keys must be unique within the list.
maxLength: 64 itemsminLength: 1 itemsstartsAt
string
datetime
Required
When the challenge opens. Together with `endsAt` this decides whether the challenge is active and which prompt is today's; it never limits when an entry can be written - entering late is allowed.
View raw schema
{
"description": "A photo challenge: a named set of prompts, published by its organizer, that anyone can enter by writing a pics.2bit.challenge.entry for one of their own photos. The record key is a short readable slug (e.g. `gbcamtober-2026`) and is only unique within the organizer's repo, so a challenge is always named by organizer and key together - in URLs as `<organizer handle>/<rkey>`, in records by its at-uri.",
"key": "any",
"record": {
"properties": {
"createdAt": {
"format": "datetime",
"type": "string"
},
"description": {
"description": "The rules or intro text, shown on the challenge page.",
"maxGraphemes": 1000,
"maxLength": 10000,
"type": "string"
},
"endsAt": {
"description": "When the challenge closes, exclusive. Must be after `startsAt`.",
"format": "datetime",
"type": "string"
},
"hashtag": {
"description": "The challenge's hashtag, without the leading `#`, e.g. `GBCamtober2026`. Clients add it to the caption of a photo entered into the challenge, so entries also reach the tag's page and feed. Must be a tag under this app's hashtag grammar (see pics.2bit.feed.photo#caption); a list whose hashtag isn't one is indexed as if it had none.",
"maxLength": 64,
"type": "string"
},
"name": {
"description": "Display name, e.g. \"GBCamtober 2026\".",
"maxGraphemes": 64,
"maxLength": 640,
"minLength": 1,
"type": "string"
},
"prompts": {
"description": "The prompts, in display order. Keys must be unique within the list.",
"items": {
"ref": "#prompt",
"type": "ref"
},
"maxLength": 64,
"minLength": 1,
"type": "array"
},
"startsAt": {
"description": "When the challenge opens. Together with `endsAt` this decides whether the challenge is active and which prompt is today's; it never limits when an entry can be written - entering late is allowed.",
"format": "datetime",
"type": "string"
}
},
"required": [
"name",
"startsAt",
"endsAt",
"prompts",
"createdAt"
],
"type": "object"
},
"type": "record"
}