How icon packs work
Discord refers to each icon by name and resolves it to a bundled asset. An icon pack hooks into that step. For each icon name the pack replaces, Unbound points the asset at your image instead of Discord’s. Names you don’t override fall through to Discord’s originals, so a pack can replace a few icons or all of them. Internally, each overridden asset has aniconPackPath (where your replacement image is) and an iconPackScale (the density the image was made for). Unbound uses these to load your image at the right resolution.
An icon pack overrides icons by name. The asset names that the assets module discovers are the same names a pack targets.
What an icon pack ships
Unlike a plugin, a pack ships no code. It’s a folder of image files that mirrors Discord’s asset tree, installed underUnbound/Icons/<id>. See iOS for where that folder is on the device.
Manifest
Metadata identifying the pack: name, authors, version, plus
type and source.Assets
How Discord’s icons are named and discovered. These are the names a pack overrides.
File layout
Each image’s path mirrors the asset it replaces. To build it:- Take the asset’s location and strip the leading
assets/. - Add the asset name.
- Add the extension.
@2x and @3x suffixes. A file with no suffix is scale 1. Unbound picks the highest scale present for each asset, so shipping only an @3x file is fine. An asset with no matching file in the pack keeps Discord’s original.
How installation resolves files
Unbound installs a pack from its manifest URL. The manifest’ssource field sets how the files are downloaded. For the in-app install steps, see Managing Addons.
GitHub
GitHub
main is the repo URL. You can narrow it to a branch and folder with /tree/<branch>/<subpath>. Unbound reads the repo’s file tree and downloads every file under that path into the pack folder. If source is omitted and main is a github.com URL, this method is used.Other
Other
The pack installs through the same bundle download path as other addons.