Skip to main content
Every addon (a plugin, theme, or icon pack) ships a manifest: a block of metadata that describes it. They all use the same shape, validated by the same manager before the addon loads. This page is the single source of truth for that shape; each addon kind documents only what’s specific to it.

Required fields

These must be present and defined, or the addon is rejected when it loads.
id
string
required
A unique identifier for the addon. Used as its key in every manager operation and as its storage namespace, so keep it stable across versions.
name
string
required
The human-readable name shown in settings.
description
string
required
A short summary of what the addon does.
authors
AddonAuthor[]
required
A non-empty array of authors. An empty array fails validation just like a missing field.
version
string
required
The addon’s version. Bump it on every release so clients can detect updates.
main
string
required
The entry point the bundle is built from.

Optional fields

Used for display and updates. Leaving them out is fine.
icon
string | { uri: string }
The addon’s icon: an asset name, or an object with a uri for a remote image.
updates
string
A URL Unbound checks to discover newer versions.
url
string
Where the addon’s bundle is hosted.

Example

manifest.json
{
	"id": "my-plugin",
	"name": "My Plugin",
	"description": "Adds something useful to Discord.",
	"authors": [{ "name": "you", "id": "1234567890" }],
	"version": "1.0.0",
	"main": "index.js"
}
The manifest is validated the moment the addon loads. Any required field that’s missing or undefined rejects it, and authors must be a non-empty array.
The id is the field you reference everywhere else: manager calls like plugins.toggle('my-plugin'), your storage store name, and the addon’s entry in the enabled-state map. Pick it once and never change it.

Per-addon details

The shape is shared, but a couple of fields carry extra meaning depending on the addon kind.
main is the entry your bundle is built from, and Unbound evaluates it into your plugin’s running instance. See Creating an Addon.
Besides identifying the theme, its id is the value stored as applied while it’s the active theme. Only one theme is applied at a time, so this is how Unbound remembers which. The theme’s actual palette and background live in its definition, not the manifest. See Theme Types.
Icon packs are still being reimplemented in the current client rewrite. They use the shared manifest above; pack-specific fields, such as how icon overrides are listed, will be documented once that surface lands.