Manifest ReferenceMeta & Characters

Meta

The Meta section of a PanelWave manifest — work identity, creators, locales, cover, character roster, content warnings, and rights info.

meta is one of the three required top-level sections. It identifies the work, declares its languages, and carries everything a library, storefront, or reader UI needs to present the work: title, description, creators, cover, characters, and content warnings.

Properties (Meta)

PropertyTypeRequiredDescription
idIdentifierYesStable unique ID of the work
titleLocalizedStringYesWork title per locale
localesLocaleCode[] (min 1, unique)YesAll locales the work provides content for
default_localeLocaleCodeYesFallback locale when the reader's locale is unavailable
descriptionLocalizedString—Work description / blurb
creatorsCreator[]—Credited people; see below
publisherstring—Publisher name
seriesstring—Series the work belongs to
issuestring—Issue label within the series (free-form, e.g. "#7", "Sample One-Shot")
release_datestring (format: date)—Release date, e.g. "2025-09-01"
age_ratingstring—Free-form age rating label, e.g. "13+", "16+", "all"
tagsstring[]—Free-form tags for discovery
coverIdentifier | Uri—Cover image. Preferred: an asset catalog ID; an absolute URI is also accepted for static bundles
charactersCharacter[] (unique)—Character roster; see below
content_warningsContentWarning[]—Declared content warnings; see below
copyrightstring—Copyright notice for the work
licensestring—License information for the work

Creator

Each entry in creators:

PropertyTypeRequiredDescription
rolestringYesFree-form role, e.g. "writer", "artist"
namestringYesDisplay name
urlUri—Link to the creator's site or profile

ContentWarning

Content warnings are declared once here and referenced from panels via Panel.contentWarnings (by id):

PropertyTypeRequiredDefaultDescription
idIdentifierYes—Warning ID referenced by panels
labelLocalizedStringYes—Reader-facing label
defaultBlurboolean—falseWhether affected panels are blurred until the reader opts in

The Character roster

Characters are defined once in meta.characters and referenced by speech bubbles (characterId) and character sheet extras.

PropertyTypeRequiredDescription
idIdentifierYesCharacter ID
nameLocalizedStringYesCharacter name per locale
descriptionLocalizedString—Character description
imagesobject (string → string)—Named image URLs, e.g. { "portrait": "https://…" }
voiceobject—TTS voice binding: provider ("elevenlabs" | "custom") and voiceId (string)
balloonConfigBalloonConfigOverride—Per-character balloon style overrides, merged onto the work-level defaults from settings.typography.balloon_config. See Speech Bubbles

Balloon styling cascades: work defaults → character balloonConfig → per-bubble balloonConfig. Only the fields you specify at each level override the parent.

Example

Adapted from the bundled samples:

{
  "meta": {
    "id": "work-sample-3pages",
    "title": {
      "en-US": "City Noir: Sample",
      "de-DE": "Stadt Noir: Beispiel"
    },
    "description": {
      "en-US": "A sample PanelWave graphic novel with 3 pages and multiple panels per page."
    },
    "creators": [
      { "role": "writer", "name": "Dana Kim" },
      { "role": "artist", "name": "Leo Park" }
    ],
    "publisher": "PanelWave Press",
    "series": "City Noir",
    "issue": "Sample One-Shot",
    "release_date": "2025-09-01",
    "age_rating": "16+",
    "tags": ["noir", "branching"],
    "locales": ["en-US", "de-DE"],
    "default_locale": "en-US",
    "cover": "img-cover",
    "characters": [
      {
        "id": "char-mira",
        "name": { "en-US": "Mira" },
        "description": { "en-US": "Night watch captain navigating dangerous choices." },
        "images": { "portrait": "https://cdn.example.com/chars/mira.png" },
        "voice": { "provider": "elevenlabs", "voiceId": "EL-12345" }
      }
    ],
    "content_warnings": [
      {
        "id": "cw-violence",
        "label": { "en-US": "Stylized violence", "de-DE": "Stilisierte Gewalt" },
        "defaultBlur": false
      }
    ],
    "copyright": "© 2025 PanelWave Press",
    "license": "All rights reserved"
  }
}

Locales and fallback

locales declares every locale the work supports; default_locale must be the one guaranteed to have complete content. When resolving a LocalizedString or a localized asset, consumers try the reader's locale first, then walk the fallback chain down to default_locale. The full resolution algorithm is described in Localization; localized assets are covered in Assets.