settings.json, its default when absent, and what it does. The loader keeps all of its configuration in this one file.
File location
settings.json is in the Unbound folder inside the app’s documents directory. On iOS, open it in the Files app at On My iPhone -> <App Name> -> Unbound, as described on the iOS page.
If the file doesn’t exist when the loader starts, the loader creates it with the contents {}.
Structure
The root of the file is an object of stores. Each store is a namespace. The loader reads only from the store namedunbound.
Each addon gets its own store, keyed by its id, so an addon’s storage can never collide with the loader’s keys. See storage for how addons use the same file.
Inside a store, keys are dot-paths that map to nested objects. For example, loader.update.url is stored as:
settings.json
The native loader and Unbound’s JavaScript settings share the
unbound store. Keys the loader doesn’t recognise, such as staff-mode or toasts.*, belong to the client. They are documented with the features that use them.Keys
All keys below are inside theunbound store.
boolean
default:"true"
Turns the whole loader on or off. When it is
false, the loader logs Loader is disabled. Aborting. and hands the bundle load straight back to Discord. No plugins, themes, fonts, updater, or hot reload run.This is the only key that is on by default. It is also the main way to recover a broken app. See disabling the loader.boolean
default:"false"
Evaluates the bundled DevTools script in the JavaScript runtime before the main bundle. This is what lets React DevTools attach. Leave it off unless you are actively debugging.
object
Controls where the JavaScript bundle is downloaded from and when it is refetched.
boolean
default:"false"
Turns on recovery mode. When it is on:
- The loader skips swizzling semantic colors, so themes stop being applied.
- The client starts addons with an empty no-op instance instead of evaluating their bundles.
- Addon cards still appear in the UI, but you can’t interact with them.
object
default:"{}"
Maps a font state name to the name of the font that replaces it. The native font layer looks up each override in both your installed custom fonts and the system fonts. If an override’s font isn’t loaded, it logs an error and leaves that state unchanged.Unbound’s font settings normally manage this key for you. See theme types and the addon manifest for how fonts are declared.
External edits apply without a restart
You can editsettings.json from the Files app, over SSH, or with any other tool, and the new values take effect without restarting the app. The loader watches the file for changes and reloads it in place.
On each change, the loader reparses the file and posts an internal change notification that the rest of the loader listens for.
Live reload updates the values the loader holds, but it doesn’t re-run work that already happened at startup. Keys read once during launch, such as
loader.enabled and loader.devtools, still need an app restart to take effect.Corrupt files are backed up
Ifsettings.json fails to parse, or parses into anything other than a JSON object, the loader doesn’t crash the app. Instead it:
- Copies the file to
settings.json.corrupt-<timestamp>in the same directory.<timestamp>is the Unix time in whole seconds. - Resets
settings.jsonto{}. - Continues starting up.
Disabling the loader
Setloader.enabled to false to turn Unbound off without uninstalling anything. The check runs before any plugin, theme, or bundle work, so the loader does nothing and you get a stock app.
settings.json
recovery instead, which changes less. For the full list of flags you can combine here, see configuration.