Custom game dashboard schema
A marketplace game ships a caputchin.json manifest that declares which fields each customization preset may set. A custom game has no manifest, so you declare that field schema on the dashboard instead. You define it once per custom game, per axis, and then author presets against it; from there it resolves and applies exactly like a marketplace game on the same plan tiers.
This page is the reference for that schema. For authoring the game itself, see build a self-hosted game; for the customer-side registration flow, see custom games.
One schema per axis
A custom game's schema is declared per axis, and the three axes are independent:
| Axis | What it customizes | Schema |
|---|---|---|
| Locale | The game's translated strings. | Implicit: locale fields are always plain text, so there is nothing to declare; you author string presets directly. |
| Skin | Colors, visual assets, and presentation knobs. | You declare the color, asset, and scalar (toggle / number / range / choice) fields a skin preset may set. |
| Configuration | Gameplay options (difficulty, counts, toggles). | You declare the option fields a configuration preset may set. |
You define a schema only for the axes your game actually uses. An axis with no schema simply has no customizable fields of that kind.
Field types
A schema is a set of named fields, each with a type. The field types are the same set the rest of customization uses; the customization schema reference is the authoritative description of every type and the values it accepts. In brief:
| Type | Value |
|---|---|
string | Free text. |
boolean | true or false. |
number | Any finite number. |
range | A number within a min and max. |
list | One of a fixed set of options. |
link | An http/https URL. |
color | A hex or rgb() color. |
image | An image URL or upload. |
audio | An audio URL or upload. |
video | A video URL or upload. |
Locale uses string only (and the resolver does not validate a locale schema at all). Skin and configuration validate authored values against the schema you declare and drop values that do not fit their type.
Scope: where a schema lives
A custom-game schema is set at a scope, troop or site key, the same scope model as overrides. When both a troop and one of its site keys declare a schema for the same game and axis, the site key's schema replaces the troop's for that axis (a whole-axis replace, not a field-by-field merge). This mirrors how the rest of customization resolves most-specific-wins.
Assets are absolute
Because you host the playable game yourself, there is no platform bundle to resolve a relative asset path against. Any image, audio, or video value in a skin preset must be an absolute URL. (A marketplace game can use bundle-relative paths; a custom game cannot.)
How a preset reaches the game
Once the schema and presets exist, Caputchin resolves one preset per axis for each visitor (most-specific-wins across site key, troop, and your defaults) and delivers the resolved values to your game through the game factory's context: ctx.locale, ctx.skin, ctx.config. Your game reads its own field names off those objects. The schema is what makes the dashboard editor show the right inputs and what validates the values before they ever reach a visitor.
See also
- Customization schema reference: every field type and its accepted values, in full.
- Custom games: registering a custom game and defining its schema.
- Build a self-hosted game: reading the resolved presets from the factory context.
- Troop overrides: the scope model the schema follows.