Caputchin
Custom game development

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:

AxisWhat it customizesSchema
LocaleThe game's translated strings.Implicit: locale fields are always plain text, so there is nothing to declare; you author string presets directly.
SkinColors, visual assets, and presentation knobs.You declare the color, asset, and scalar (toggle / number / range / choice) fields a skin preset may set.
ConfigurationGameplay 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:

TypeValue
stringFree text.
booleantrue or false.
numberAny finite number.
rangeA number within a min and max.
listOne of a fixed set of options.
linkAn http/https URL.
colorA hex or rgb() color.
imageAn image URL or upload.
audioAn audio URL or upload.
videoA 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

On this page