pics.2bit.challenge.list

2bit.pics

Documentation

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.

main record

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.

Record Key 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 graphemes
endsAt 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 bytes
name string Required

Display name, e.g. "GBCamtober 2026".

maxLength: 640 bytesminLength: 1 bytesmaxGraphemes: 64 graphemes
prompts array of ref #prompt Required

The prompts, in display order. Keys must be unique within the list.

maxLength: 64 itemsminLength: 1 items
startsAt 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"
}
prompt object

No description available.

Properties

key string Required

Stable identifier that entries point at, e.g. `6`. Letters, digits, `-` and `_` only - this app's AppView skips a list with any other key. No padding is needed for order: the array order is the display order, and numeric keys compare naturally. Keep keys fixed once entries exist; titles can change freely.

maxLength: 32 bytesminLength: 1 bytes
title string Required

The prompt as shown, e.g. "Duck".

maxLength: 640 bytesminLength: 1 bytesmaxGraphemes: 64 graphemes
View raw schema
{
  "properties": {
    "key": {
      "description": "Stable identifier that entries point at, e.g. `6`. Letters, digits, `-` and `_` only - this app's AppView skips a list with any other key. No padding is needed for order: the array order is the display order, and numeric keys compare naturally. Keep keys fixed once entries exist; titles can change freely.",
      "maxLength": 32,
      "minLength": 1,
      "type": "string"
    },
    "title": {
      "description": "The prompt as shown, e.g. \"Duck\".",
      "maxGraphemes": 64,
      "maxLength": 640,
      "minLength": 1,
      "type": "string"
    }
  },
  "required": [
    "key",
    "title"
  ],
  "type": "object"
}

Lexicon Garden

@