Schemas

Schema types

A schema type defines the text structure of statements. Every statement belongs to exactly one schema type, and every app is linked to one schema type. The schema determines which text parts a statement has and how they combine into full displayed text.

Structure

A schema’s structure is a JSON object with three fields:

Parts

An ordered array of named text segments. Each regular part becomes a localized text field on every statement. Parts wrapped in {} are literals – static text with fixed translations.

{
  "parts": ["title", "text"]
}
  • Regular parts (title, text) – user-editable text, localized per language
  • Literal parts (wrapped in {}, e.g. {OR}) – static connectors with pre-defined translations, not editable per statement

Join string

The character(s) used to combine parts into the full displayed text:

{
  "parts": ["title", "text"],
  "join": " "
}

With join " ", a statement with title “Never have I ever” and text “eaten a bug” renders as “Never have I ever eaten a bug”.

Literals

A map from literal part names to their translations per locale:

{
  "literals": {
    "{OR}": {
      "en": "or",
      "de": "oder",
      "es": "o",
      "fr": "ou",
      "nl": "of"
    }
  }
}

How parts map to statements

Each statement stores a LocalizedText entry for every combination of regular part + locale:

Schema: ["title", "text1", "text2"]  (would-you-rather)

Statement parts stored:
  partName: "title", locale: "en", text: "Would you rather"
  partName: "title", locale: "de", text: "Würdest du lieber"
  partName: "text1", locale: "en", text: "eat a spider"
  partName: "text1", locale: "de", text: "eine Spinne essen"
  partName: "text2", locale: "en", text: "drink spoiled milk"
  partName: "text2", locale: "de", text: "abgelaufene Milch trinken"

Full text reconstruction (English): “Would you rather” + " " + “eat a spider” + " " + “drink spoiled milk”

All schema types

There are currently 10 schema types in the system:

truth-or-dare (id: 1)

{ "parts": ["text"], "join": " " }

Example: “Do 20 push-ups right now”

Single-part schema. The mode field on the statement distinguishes truth vs. dare.

never-have-i-ever (id: 4)

{ "parts": ["title", "text"], "join": " " }

Example: title=“Never have I ever” + text=“eaten a ghost pepper”

The title is editable per statement to handle language-specific grammar variations.

5-second-battle (id: 5)

{
  "parts": ["title", "text"],
  "join": " ",
  "literals": { "OR": { "de": "oder", "en": "or" } }
}

Example: title=“Name 3” + text=“things you’d bring to a desert island”

Has a literal OR defined for connector text in certain statement variations.

charades (id: 6)

{ "parts": ["text"], "join": " " }

Example: “A cat chasing a laser pointer”

Single-part schema. The word or phrase to act out.

picoboom (id: 7)

{ "parts": ["title", "text"], "join": " " }

Example: title=“Category” + text=“Things that are red”

would-you-rather (id: 8)

{ "parts": ["title", "text1", "text2"], "join": " " }

Example: title=“Would you rather” + text1=“eat a spider” + text2=“drink spoiled milk”

Three parts: the prefix and two options. No literal connector – the app handles the “or” display.

most-likely-to (id: 9)

{ "parts": ["title", "text"], "join": " " }

Example: title=“Who is most likely to” + text=“become famous”

superbff (id: 10)

{ "parts": ["question", "answer1", "answer2", "answer3", "answer4"], "join": " " }

Example: question=“What’s your favorite season?” + answer1=“Spring” + answer2=“Summer” + answer3=“Fall” + answer4=“Winter”

Five parts: one question and four answer options. The most complex schema.

imposter (id: 11)

{ "parts": ["word", "hint"], "join": " " }

Example: word=“Elephant” + hint=“Large animal with a trunk”

Two parts: the word to guess and a hint for non-imposters.

2-truths-1-lie (id: 12)

{ "parts": ["text"], "join": " " }

Example: “I’ve been skydiving”

Single-part schema. Statements are used as prompts – players make up their own truths and lies.

Linking schemas to apps

When you create an app, you select its schema type. This is permanent – all statements imported or created for that app must follow this schema’s part structure. The schema ID is stored on the app and enforced during creation, import, and snapshot generation.

Multiple apps can share the same schema type. For example, “Truth or Dare” and “Truth or Dare Lite” can both use the same single-part schema and access the same statement pool.

Managing schemas

Go to Schema Types in the sidebar. The table shows each schema’s ID, name, parts (color-coded: blue for regular parts, orange for literals), join string, and which apps use it.

Click Create Schema to define a new one. You can edit or delete schemas that aren’t in use by any app.