Settings Reference
Every key the loader reads from settings.json.
Every key the loader reads or writes in settings.json, with its default. The loader keeps all its configuration in this file.
File Location
| Platform | Path |
|---|---|
| iOS | Files app: On My iPhone → <App Name> → Unbound. See iOS Loader. |
| Android | files/Unbound in Discord's data directory. See Android Loader. |
If the file is missing at startup, the loader creates it as {}.
Each time settings.json loads cleanly, the loader keeps a copy as settings.json.good. If the file is ever corrupt, the loader saves it as settings.json.corrupt-<timestamp>, keeping the newest three, and restores settings.json.good. It resets to {} only when there is no good copy.
Structure
The root is an object of stores. The loader reads the unbound store, and the applied theme's id from applied in the themes store. Each addon gets its own store keyed by its id; see storage.
Keys are dot-paths into nested objects. loader.update.url is stored as:
{
"unbound": {
"loader": {
"update": {
"url": "http://localhost:4040/unbound.bundle"
}
}
}
}Keys
All keys are in the unbound bucket.
Turns the loader on or off. When false, it logs Loader is disabled. Aborting. and hands the bundle load back to Discord: no plugins, themes, fonts, updater or hot reload. See Disabling the Loader.
Runs the bundled React DevTools backend before the main bundle. The DevTools app reaches it over the debugger. See React DevTools.
Answers Discord's own analytics requests (/api/v*/science and /api/v*/metrics on discord.com) locally with 204 No Content, so they never leave the device. This backs up the client's tracking builtin for requests that run before it or around it.
Where the bundle downloads from and when it is refetched.
Recovery Mode. When on, the loader skips the native theme, and the client starts addons as empty no-ops; addon cards show but can't be used. The toolbox toggles it and reloads. See Troubleshooting.
The loader turns it on by itself after Discord closes during startup three launches in a row; a launch counts once Discord's first screen has been up for 3 seconds, Discord has run for 15 seconds, or gone to the background. Once Unbound's bundle has run, the first screen decides: a launch with no first screen after 15 seconds is frozen and counts even if it is then swiped away. On Android 11 and later, a launch that ended without a crash (swiped away, force-stopped or closed by the system) does not count and ends the streak. After two such launches, it first goes back to the bundle its last update replaced.
Legacy font overrides. On first launch the loader moves overrides naming an installed font file into Fonts/state.json, drops ones naming a system font, and Unbound removes this key.
Opens the toolbox when you shake the device.
Opens the toolbox when you hold three fingers on the screen. Turning one gesture off turns the other on, so you can't lock yourself out.
Set by the loader. Where you dragged the dev overlay button, as x and y fractions of the screen.
Live Edits
Edits from the Files app, SSH or any tool apply without a restart: the loader watches and reparses the file.
- Keys read once at launch, such as
loader.enabledandloader.devtools, still need a restart. - In-app writes are debounced by 300ms, so a burst of changes is one write.
Corrupt Files
If the file fails to parse, or isn't a JSON object, the loader:
- Copies it to
settings.json.corrupt-<timestamp>(Unix seconds), for examplesettings.json.corrupt-1753488000. - Resets
settings.jsonto{}. - Keeps starting up.
Disabling the Loader
Set loader.enabled to false to get a stock app without uninstalling. The check runs before any plugin, theme or bundle work.
{
"unbound": {
"loader": {
"enabled": false
}
}
}Use it when a bad bundle or addon blocks the UI. To only sideline addons, use recovery instead; it changes less.