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
| Field | Type | Required | Description |
|---|---|---|---|
addonium | String | Yes | Spec version this manifest targets, e.g. "1.0". Hosts should reject manifests with a major version they don't understand. |
id | String | Yes | Reverse-domain unique identifier, e.g. com.example.myaddon. Stable across versions - this is the addon's identity, not its display name. |
name | String | Yes | Display name. |
version | String | Yes | SemVer (MAJOR.MINOR.PATCH). |
description | String | No | Short description. |
author | Object | String | No | { name, url, contact } or a plain string. |
icon | String | No | Square icon URL (PNG/JPEG/SVG), ≥128×128 recommended. |
contentType | String | No | "music" (default), "audiobook", "podcast", "video", "generic". Drives host player-UI mode. |
types | Array<String> | No | Content types the addon can return: track, album, artist, playlist, episode, file. |
resources | Array<String> | No | Capabilities implemented - see §8/§18. |
baseUrl | String | Conditional | Root 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). |
distribution | Array<String> | No | Which formats this addon ships as: any of "manifest", "module". Defaults to ["manifest"]. |
type | String | Yes | "open" or "locked". Determines whether auth is meaningful. |
auth | Object | null | Conditional | Required (non-null) when type is "locked". See §6. |
clients | Object | null | No | Allowlist configuration. See §10. Optional for both addon types. |
storesData | Boolean | No | Whether the addon persists any per-user data server-side. Defaults to false. |
update | Object | No | { manifestUrl, checkInterval } - where a host can re-fetch the latest manifest and how often (seconds). See §12. |
settings | Array | No | User-configurable fields, forwarded as query params on every call. Same shape as Eclipse's settings (see §8.8). |
catalogs | Array | No | Declared home/browse rows. See §8.9. |
repository / homepage / license | String | No | Metadata 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.