coworld_manifest.json is the package map. It tells Coworld tooling what to run, what the game accepts, which variants
exist, and which episode proves the package works.
Start from the
Paint Arena template.
Keep the generated
manifest schema open while
you edit.
The generated JSON Schema is the field-level source of truth. This guide explains authoring decisions and does not
reproduce every property.
Declare the live roles first
Every manifest requires one game and at least one bundled player.gamedescribes the game, its runnable, schemas, protocols, documentation, and optional replay viewer.playercontains the bundled clients used for examples, local play, and certification.reporter,grader,diagnoser, andoptimizerare optional supporting roles.
Describe the runtime config
game.config_schema validates the config the game reads at startup. It must require a tokens array of strings.
Set minItems and maxItems on that array to the game’s supported seat bounds. Tokens authenticate player slots; they
do not choose the scheduled roster size.
Do not place token values in author-owned configs:
variants[].game_configomitstokens.certification.game_configomitstokens.
players array whose items require a string name. Hosted dispatch can
then replace placeholder names with the resolved player names.
Keep game-specific seat mechanics in game-specific fields. For example, role, team, color, or spawn data can live in a
slots structure owned by your game.
Describe successful results
game.results_schema validates the JSON object written when an episode completes successfully. It must include a
numeric scores array with one value per player slot.
Add fields that help people explain those scores. Painted tiles, objectives completed, or team outcomes may be useful,
depending on the game.
The schema should reject incomplete results. Diagnostic logs are not a substitute for structured episode truth.
Link the protocols and game docs
The manifest stores inline text or public HTTP(S) references. A referenced document must remain available after upload. Provide:game.protocols.playerfor the exact observation and action exchange;game.protocols.globalfor the spectator stream; andgame.docs.readmefor rules, setup, strategy, and game-specific guidance.
game.docs.pages for optional longer material. Keep Softmax login, policy upload, league submission, and replay
retrieval in the platform guides instead of repeating them in each game repository.
Create useful variants
A variant is a named, token-free game configuration. Declare at least one. Use variants for supported ways to run the same game image, such as:- different seat counts within the schema bounds;
- shorter or longer episodes;
- alternate maps or rule toggles; or
- fixed scenarios used for comparisons.
Make certification small and complete
Thecertification fixture is the token-free config and bundled-player roster used by coworld certify and default
local episode runs.
It should:
- finish quickly enough to run during every authoring loop;
- exercise the real player protocol and game completion path;
- include every declared bundled player at least once;
- produce valid results and replay data; and
- remain deterministic enough to debug.
Keep the template buildable
Authorcoworld_manifest_template.json with image placeholders. A Compose service named my-game maps to the
placeholder {{MY_GAME_IMAGE}}.
Do not set game.version in the template. coworld build --version stamps the release version into the hydrated
manifest.
It is common for one image to implement several runnables with different commands. Pin Compose services to
linux/amd64, which matches the hosted runners.
When you add source_url, point it at the public source for that runnable. Prefer a commit SHA over a branch. Source
metadata helps people inspect provenance, but the runtime executes the recorded image and command.
Treat manifest environment as public
Uploaded manifests and bundled images are visible to users. Do not put raw credentials in runnableenv.
For game-container secrets needed during hosted episodes, upload the value with coworld secret put and use a
secret://coworld/... reference. Local runs must override that reference with a local value they can read.
See the
manifest secret contract
before adding a secret reference.
Review before building
-
gameand at least one bundledplayerare declared. -
tokensis required and has correct seat bounds. - Author-owned configs omit token values.
- Results require one numeric score per slot.
- Player and global protocols point to durable public documents.
- The game README explains rules and strategy.
- At least one valid variant exists.
- Certification seats every declared bundled player.
- Images build for
linux/amd64. - Public environment values contain no secrets.