← Addonium

5. The Manifest

Every addon - Open or Locked, HTTP or compiled - has exactly one canonical manifest. For HTTP addons it is served at GET /manifest.json (or GET /{token}/manifest.json for tokenized addons). For compiled modules it is embedded as the manifest export (§9.2) and, ideally, also published standalone so hosts can preview before importing the module file.

{
  "addonium": "1.0",
  "id": "club.example.myaddon",
  "name": "My Content Source",
  "version": "1.4.2",
  "description": "Streams episodes from Example Network.",
  "author": {
    "name": "Jane Author",
    "url": "https://example.com",
    "contact": "jane@example.com"
  },
  "icon": "https://example.com/icon.png",
  "contentType": "music",
  "types": ["track", "album", "artist", "playlist"],
  "resources": ["search", "stream", "catalog", "lyrics", "settings", "resolve"],
  "baseUrl": "https://api.example.com/v1",
  "distribution": ["manifest", "module"],
  "type": "open",
  "auth": null,
  "clients": null,
  "storesData": false,
  "update": {
    "manifestUrl": "https://example.com/.well-known/addonium/manifest.json",
    "checkInterval": 86400
  },
  "repository": "https://github.com/example/myaddon",
  "license": "MIT"
}

5.1 Core fields

FieldTypeRequiredDescription
addoniumStringYesSpec version this manifest targets, e.g. "1.0". Hosts should reject manifests with a major version they don't understand.
idStringYesReverse-domain unique identifier, e.g. com.example.myaddon. Stable across versions - this is the addon's identity, not its display name.
nameStringYesDisplay name.
versionStringYesSemVer (MAJOR.MINOR.PATCH).
descriptionStringNoShort description.
authorObject | StringNo{ name, url, contact } or a plain string.
iconStringNoSquare icon URL (PNG/JPEG/SVG), ≥128×128 recommended.
contentTypeStringNo"music" (default), "audiobook", "podcast", "video", "generic". Drives host player-UI mode.
typesArray<String>NoContent types the addon can return: track, album, artist, playlist, episode, file.
resourcesArray<String>NoCapabilities implemented - see §8/§18.
baseUrlStringConditionalRoot URL for HTTP addons. Required unless distribution is ["module"] only. May include a token segment for Locked addons (§7) - either an already-tokenized URL or a URI template with a {token} placeholder (see §17.2).
distributionArray<String>NoWhich formats this addon ships as: any of "manifest", "module". Defaults to ["manifest"].
typeStringYes"open" or "locked". Determines whether auth is meaningful.
authObject | nullConditionalRequired (non-null) when type is "locked". See §6.
clientsObject | nullNoAllowlist configuration. See §10. Optional for both addon types.
storesDataBooleanNoWhether the addon persists any per-user data server-side. Defaults to false.
updateObjectNo{ manifestUrl, checkInterval } - where a host can re-fetch the latest manifest and how often (seconds). See §12.
settingsArrayNoUser-configurable fields, forwarded as query params on every call. Same shape as Eclipse's settings (see §8.8).
catalogsArrayNoDeclared home/browse rows. See §8.9.
repository / homepage / licenseStringNoMetadata for registries and humans.

5.2 resources values

search · stream · catalog · lyrics · library · isrc · resolve · settings · video - see the full capability matrix. An addon implements only what it wants; unimplemented resources are simply absent from the array, and hosts fall back to other installed addons or built-in providers.