Manifest ReferenceExtras

Extras

Reference for Extras, ExtraBlock, and ExtraCharacterSheet — covers, character sheets, bonus art, interviews, and gated bonus content.

The optional top-level extras section holds bonus content around the story itself: covers, character sheets, author information and interviews, bonus/fan art, and behind-the-scenes material. Extras can be opened from hotspots via the openExtras action, listed in the player UI, and gated behind a paywall.

Extras

Defined as $defs/Extras. All properties are optional; single blocks vs. arrays as noted:

PropertyTypeDescription
coverExtraBlockThe work's cover presentation.
alt_coverExtraBlock or ExtraBlock[]One alternate cover, or a non-empty array of them (array form added within 1.6.0).
character_sheetsExtraCharacterSheet[]Character sheets, each linked to one or more characters.
author_infoExtraBlockAbout the author(s).
author_interviewsExtraBlock[]Interview blocks.
bonus_artExtraBlock[]Bonus artwork.
fan_artExtraBlock[]Fan artwork.
behind_the_scenesExtraBlock[]Making-of material.

Read alt_cover as "one or many": exporters write the single-object form when there is exactly one alternate cover and an array when there are several. @panelwave/player accepts both from the release after 1.2.0 (not yet published at the time of writing); 1.2.0 and earlier show only the single-object form.

ExtraBlock

Defined as $defs/ExtraBlock — the generic bonus-content unit. All properties are optional.

PropertyTypeDefaultDescription
idIdentifier—Block ID (referenced by openExtras hotspot actions).
titleLocalizedString—Block title.
textLocalizedString—Body text.
imagesarray—Image entries: { "assetId": Identifier, "caption": LocalizedString }.
audioAudioTrack[]—Attached audio — see Audio.
videoVideoLayer[]—Attached video — see Video.
shareablebooleantrueWhether the block may be shared.
gatedbooleanfalseWhether the block sits behind a paywall/entitlement.
contentTypeenum—Primary media type: image, video, audio, pdf, text.
urlstring—Direct URL for the content (alternative to catalog assets).
thumbnailstring—Thumbnail URL.
widthinteger ≥ 0—Media width in pixels.
heightinteger ≥ 0—Media height in pixels.
durationMsnumber ≥ 0—Media duration in milliseconds.
mimeTypestring—MIME type of the content.
downloadablebooleanfalseWhether readers may download the content.
requiredTierstring—Subscription tier required to view (used with gated).

ExtraBlock is intentionally an open object — the schema does not set additionalProperties: false here, so tools may attach additional fields. ExtraCharacterSheet, by contrast, is closed (unevaluatedProperties: false), but since format 1.7 both accept x- extension fields (^x- pattern properties).

Gating semantics

Two fields cooperate with monetization:

  • gated: true marks the block as locked content; pair it with a PaywallRule of scope extras whose refId is the block's id (see Paywall).
  • requiredTier names the subscription tier that unlocks it.

ExtraCharacterSheet

Defined as $defs/ExtraCharacterSheet — an ExtraBlock plus a required character link:

PropertyTypeRequiredDescription
(all ExtraBlock properties)——Inherited via allOf.
characterIdIdentifierOne of the twoThe character from meta.characters this sheet belongs to.
characterIdsIdentifier[] (unique, at least one)One of the twoAll characters on an ensemble sheet, in display order (added within 1.6.0).

At least one of characterId and characterIds is required. When characterIds is present it is the authoritative list; exporters also keep characterId set to its first entry, so consumers that only read the single id still find a character.

Unlike the base block, no properties beyond ExtraBlock + characterId / characterIds are allowed.

Example

{
  "extras": {
    "cover": {
      "id": "ex-cover",
      "title": { "en-US": "Cover", "de-DE": "Umschlag" },
      "images": [
        {
          "assetId": "img-cover",
          "caption": { "en-US": "City Noir cover", "de-DE": "Stadt Noir Umschlag" }
        }
      ],
      "shareable": true,
      "gated": false
    },
    "character_sheets": [
      {
        "id": "ex-sheet-mira",
        "characterId": "char-mira",
        "title": { "en-US": "Mira — Character Sheet" },
        "text": { "en-US": "Early concept notes and turnarounds for Mira." },
        "images": [
          { "assetId": "img-mira-turnaround", "caption": { "en-US": "Turnaround" } }
        ],
        "gated": true,
        "requiredTier": "premium"
      }
    ],
    "behind_the_scenes": [
      {
        "id": "ex-bts-inks",
        "title": { "en-US": "Inking process" },
        "contentType": "video",
        "url": "https://cdn.example.com/extras/inking-timelapse.mp4",
        "thumbnail": "https://cdn.example.com/extras/inking-thumb.jpg",
        "mimeType": "video/mp4",
        "durationMs": 120000,
        "downloadable": false,
        "gated": true
      }
    ]
  }
}
  • Paywall — gating extras with scope: "extras" rules
  • Hotspots — the openExtras action
  • Meta — characters referenced by characterId / characterIds
  • CMS Extras — authoring extras in the CMS