Appearance
Deck building
Everything under deckBuilding: which formats are offered when a player builds a deck, and what legality rules apply to each. This is the part of the file read before a match starts.
deckBuilding
Everything that happens before a game starts: which formats are offered and how deck legality is enforced.
| Field | Type | Required | Description | Example |
|---|---|---|---|---|
mainFilters | [] | required | Filter names shown in the deck builder. | ["type", "cost", "aspects"] |
costCurveIgnoredTypes | [] | optional | Card types excluded from the mana/cost curve chart. | ["Land"] |
formats | [] | required | One entry per playable format. Each entry is a full object — see "formats[] entry" below. | [{ "title": "Standard", ... }] |
deckRulesets | {} | optional | Dictionary of deck-building rulesets, keyed by name and referenced by formats[].deckRuleset. Optional — a format without a matching ruleset simply has no min/max enforcement. | { "Classic": { ... } } |
json
"deckBuilding": {
"mainFilters": ["aspects", "type", "cost"],
"formats": [
{ "title": "Premier", "gameplay": "Classic" },
{ "title": "Twin Suns", "gameplay": "Classic" }
]
}A format doesn't need a ruleset
deckRuleset and deckRulesets are both optional. Star Wars Unlimited's file, for example, defines two formats that share the same gameplay block and skip deck-building restrictions entirely.
formats[] entry
Each element of deckBuilding.formats is a mode offered to the player, independent from the others.
One playable format, offered to the player when building a deck.
| Field | Type | Required | Description | Example |
|---|---|---|---|---|
title | S | required | Display name in the format picker. Give it a distinct name from the matching gameplay key to avoid confusion — e.g. "Standard format" rather than reusing "Standard". | "Standard format" |
customCategories | [] | optional | Deck categories specific to this format (e.g. a separate "Extra deck" or "Commander" slot). | ["Extra deck"] |
legalityCode | S | optional | Code used to filter which cards are legal in this format. | "COR" |
gameplay | S | required | Must match a key under the top-level gameplay object — this is what determines the game rules once the deck is built. | "Standard" |
deckRuleset | S | optional | Must match a key under deckBuilding.deckRulesets. Omit if the format has no ruleset restrictions. | "Classic" |
Reusing a gameplay block across formats
In the Magic: The Gathering example, Modern, Vintage, Standard, Legacy and Pioneer all point at the same "gameplay": "Classic" and "deckRuleset": "Classic" — only title and legalityCode differ. You don't need a new gameplay block for every format if the match rules are identical.
deckRulesets{} entry
Not an array — an object keyed by ruleset name, referenced by formats[].deckRuleset.
Construction rules referenced by one or more formats.
| Field | Type | Required | Description | Example |
|---|---|---|---|---|
checkCardLegality | B | optional | If true, checks that every card carries the format's legalityCode. | true |
general.min / max | N | optional | Total number of cards allowed in the main deck. | { "min": 60 } |
general.maxPerCard | N | optional | Maximum copies of a single card allowed. | 4 |
categories | [] | optional | Per-category rules (e.g. exactly 1 Coconut card). An array because a ruleset can constrain several categories at once. | [
{
"category": "Coconut",
"min": 1,
"max": 1
}
] |
json
"deckRulesets": {
"Coconut": {
"general": { "min": 61, "max": 61, "maxPerCard": 4 },
"categories": [
{ "category": "Coconut", "min": 1, "max": 1 }
]
}
}Continue with Gameplay → or Sections & layout →.