archipelago.json schema reference¶
Every APWorld must have worlds/<apworld>/archipelago.json. This file is the
single source of truth for the world's identity. The build workflow reads it,
the Index manifest records it, and MultiworldGG reads it at load time.
The schema below covers the fields as they appear in your source-repo
archipelago.json (not the Index manifest, which adds module_location and
other Index-controlled fields — see Index-controlled fields below).
Full schema source: schema/world_manifest.schema.json
Required fields¶
game¶
| Type | string |
| Required | yes |
| Written by | Author |
| Example | "My Cool Game" |
The display name of the game shown to players. This is the lookup key the
MultiworldGG launcher and generator use. It must match the game attribute on
your World class.
The game value (lowercased, spaces replaced with underscores) becomes the
apworld name — the filename stem of your worlds/<apworld>.json manifest and
the name of your wheel package (worlds.<apworld>).
world_version¶
| Type | string, semver shape |
| Required | yes |
| Written by | Author |
| Example | "1.2.0" |
Version of the world implementation. Must follow major.minor.patch format
(e.g. "1.0.0"). Used as the Python wheel version. Must match the version
portion of your release tag (e.g. tag myclgm-1.2.0 requires
world_version: "1.2.0").
The version comparison rule: if both an .apworld file and a wheel are
available for the same world, the higher world_version wins. Tiebreaker:
the installed wheel takes precedence over the .apworld.
module_location¶
| Type | string (URI) |
| Required | yes in the Index manifest |
| Written by | Oliver (never the author directly) |
| Example | "https://github.com/you/your-repo/releases/download/myclgm-1.2.0/worlds.myclgm-1.2.0-py3-none-any.whl#sha256=<hex>" |
The pip-installable URL for the world's wheel, including a #sha256=<hex>
hash fragment that pip verifies at install time.
Do not put this field in your source-repo archipelago.json. Oliver writes
it into the Index manifest when opening the PR. If you hand-write it, Oliver
will overwrite it.
Optional fields¶
minimum_ap_version¶
| Type | string, semver shape |
| Required | no |
| Written by | Author |
| Example | "0.6.4" |
Oldest MultiworldGG version your world supports. MultiworldGG will refuse to load your world below this version.
maximum_ap_version¶
| Type | string, semver shape |
| Required | no |
| Written by | Author |
| Example | "0.6.99" |
Newest MultiworldGG version your world supports. Rarely needed; omit unless you know your world breaks on a specific future version.
authors¶
| Type | array of strings |
| Required | no |
| Written by | Author |
| Example | ["TreZc0", "DelilahIsDidi"] |
List of author names shown in user-facing places (launcher, web host, package metadata). At least one author is strongly recommended.
compatible_version and version¶
| Type | integer |
| Required | only inside .apworld zip |
| Written by | Launcher's "Build APWorlds" component |
APContainer packaging version fields. Written automatically by
Launcher.py "Build APWorlds" when packaging a .apworld zip. Do not
write these yourself in your source archipelago.json.
repo_url¶
| Type | string (URI) |
| Required | no |
| Written by | Author or Oliver |
| Example | "https://github.com/you/your-repo" |
URL to the world's source repository. Shown in the launcher. Karen checks that this URL responds.
Some tooling also accepts github as a deprecated alias for this field;
new manifests should use repo_url. See silasary/apworlds — MANIFEST_EXTENSIONS.md.
license¶
| Type | string |
| Required | no |
| Written by | Author |
| Example | "MIT" |
Distribution license for the world. Either a recognized license identifier
(e.g. "MIT", "GPL-3.0") or a URL pointing to the license text. Documented
in silasary/apworlds — MANIFEST_EXTENSIONS.md.
tracker¶
| Type | string (URI) |
| Required | no |
| Written by | Author |
| Example | "https://github.com/you/your-tracker" |
URL to a tracker for this game, if one exists. Karen checks that this URL responds.
igdb_id¶
| Type | integer |
| Required | no |
| Written by | Author or via Index PR |
IGDB game ID. Added by the Index's IGDB-lookup workflow after merge if it's not there already.
flags¶
| Type | array of strings |
| Required | no |
| Written by | Author |
| Example | ["in_client", "tracker_included"] |
Free-form capability flags. Unknown values are ignored by consumers. Well-known values:
in_client— world ships an in-game client component. Used by the Inno installer to decide which worlds appear in the per-world component list.tracker_included— world ships an in-tree tracker.after_dark— content rated 18+ or unrated. User-hideable in the updater.prerelease— beta version. Opt-in only for users.unready— early development. Hidden in the updater unless already installed.
Planned values (not yet acted on by any consumer):
supports_deathlinksupports_energylinksupports_ringlink
The after_dark / prerelease / unready / supports_* values are
documented in silasary/apworlds — MANIFEST_EXTENSIONS.md.
changelog¶
| Type | string |
| Required | no |
| Written by | Author |
Human-readable changelog. Can be a markdown string. Shown in user-facing places that display release notes.
Index-controlled field¶
The following field appears in the Index manifest (worlds/<apworld>.json on
main) but can't be set by the author in their source archipelago.json:
| Field | Who sets it | When |
|---|---|---|
module_location |
Oliver | When opening the Index PR |
If you put this field in your source archipelago.json, Oliver will
overwrite it - your archipelago.json is part of the SHA it stores!
Inline comment convention¶
Any field whose name matches ^_comment(_|$) (e.g. "_comment",
"_comment_2") is treated as a human-readable note and ignored by all
consumers. You can use these to document unusual field values in your manifest:
{
"game": "My Cool Game",
"world_version": "1.0.0",
"_comment": "minimum_ap_version omitted intentionally — this world works on all versions"
}