-
Notifications
You must be signed in to change notification settings - Fork 8
Authoring Settings
settings.json is an optional file at the root of your pack that carries a handful of runtime settings — window resize behavior, default disabled-image filter, pack-wide chest art, and a few others. Unlike manifest.json, it isn't required — omit the file entirely and EmoTracker accepts all the defaults. When it exists, the runtime reads it immediately after loading the manifest, via Tracker.LoadPackageSettings.
This page documents every field the parser reads and when to set each one.
See Authoring a Manifest for the required
manifest.json, Packaging Your Pack for wheresettings.jsongoes in the pack directory layout, and Image Filters for the syntax used bydisabled_image_filter.
settings.json must be at the root of the pack, next to manifest.json:
my_pack/
├── manifest.json
├── settings.json ← THIS FILE (optional)
├── scripts/
├── items/
├── locations/
└── layouts/
EmoTracker reads settings.json on every pack load — including after you press F5 to refresh while authoring — so you can iterate on its fields without restarting.
If the file is missing, EmoTracker logs a warning and falls back to reading the same fields from a legacy tracker_layout.json at the pack root. New packs should use settings.json; tracker_layout.json only exists for backwards compatibility.
The smallest useful settings.json sets just the fields you need:
{
"allow_resize": false,
"disabled_image_filter": "saturation|0.2|BT709, brightness|0.6"
}Every field is optional — you only include what you want to override.
The canonical JSON schema is published at EmoTracker-Service/sdk/schema/settings.json. Wire it up in VS Code along with the other pack schemas (see Developer Setup → Configuring JSON schema validation) so you get autocomplete and validation for every field while authoring:
Parsed in EmoTracker.Data/Tracker.cs:LoadPackageSettings (with chest-image fields delegated to LocationDatabase.ParseLocationVisualProperties).
| Field | Type | Default | Description |
|---|---|---|---|
allow_resize |
boolean | true |
Whether the user is allowed to resize the main tracker window while this pack is loaded. Set to false to pin the window to whatever size your layout is designed for — useful for packs with pixel-exact layouts or streaming overlays. |
| Field | Type | Default | Description |
|---|---|---|---|
disabled_image_filter |
string | "grayscale, dim" |
The image filter spec used as the pack-wide default for inactive/disabled icons. When an item needs an "off" state and no explicit disabled_img is supplied, EmoTracker derives one by applying this filter to the base icon. |
This is the supported authoring path for setting a custom pack-wide disabled look. The resolution chain when an item needs an inactive icon:
- If the item's
disabled_img_modsfield is set, use that filter spec - Otherwise, if the item's
disabled_image_filterbase field is set, use that - Otherwise, if
disabled_image_filteris set insettings.json, use that - Otherwise, fall back to the tracker default:
"grayscale, dim"
Don't set
Tracker.DisabledImageFilterSpecfrom Lua. The underlying property is technically settable, but the supported authoring path is thissettings.jsonfield — Lua-set values get reset to the tracker default on every reload. See Image Filters → The default disabled filter for more.
| Field | Type | Default | Description |
|---|---|---|---|
chest_opened_img |
string | built-in | Pack-relative path to the image used for open (cleared) chest slots in the location-popup chest list. Cascades down to every location and section unless they override it individually. |
chest_unopened_img |
string | built-in | Pack-relative path to the image used for unopened (unchecked) chest slots. Cascades the same way. |
These override the built-in chest art pack-wide. Individual locations and sections can still override them via their own chest_opened_img / chest_unopened_img fields — see Authoring Locations → Visual properties (chest icons).
| Field | Type | Default | Description |
|---|---|---|---|
always_allow_chest_manipulation |
boolean | false |
Pack-wide default for whether the user can click chests even when the containing section isn't normally reachable. Individual locations and sections can still override this per-section. Useful for packs where chest manipulation should always work regardless of access logic — typically beginner-friendly packs or "manual tracking only" variants. |
| Field | Type | Default | Description |
|---|---|---|---|
enable_accessibility_rule_caching |
boolean | true |
Whether the runtime caches rule-evaluation results across an accessibility refresh. Leave at the default unless you're debugging a logic issue and need to force every rule to re-evaluate from scratch on every lookup. |
Turning caching off is almost always a mistake in production — every accessibility refresh becomes O(rules × codes) rather than O(unique-codes), which can tank performance on large packs. Set it to false only temporarily, while you're hunting down a rule whose result is getting cached when you expect it not to.
{
"allow_resize": false,
"disabled_image_filter": "saturation|0.15|BT709, brightness|0.55"
}Pins the window at the layout's natural size and gives inactive icons a softer "washed out" look instead of the default harsh grayscale — nice for streaming overlays.
{
"chest_opened_img": "images/ui/chest_open.png",
"chest_unopened_img": "images/ui/chest_closed.png"
}Sets the chest icons pack-wide. Every location and section inherits these unless they explicitly override them.
{
"always_allow_chest_manipulation": true
}Lets the user click any chest in any section at any time, regardless of whether the access logic considers the section reachable. Useful for packs where the logic is aspirational (hints the player to the intended path) rather than prescriptive.
- Every field is optional. If you don't need to override anything, don't create the file.
-
Reload (
F5) picks up changes tosettings.json— unlikemanifest.json, which requires a full restart. See Packaging Your Pack → Reloading after edits. -
Set
disabled_image_filterhere, not from Lua. The Lua property exists but is reset on every reload; this field is the supported place. -
chest_opened_img/chest_unopened_imgare pack-wide defaults, not hard overrides. Locations and sections can still override them. Set the art you want as the common case here, then override individually when you need something different. -
Don't set
auto_unpin_on_clearinsettings.json. Although the parser reads it when processing location visual properties, the function explicitly skips that field when applied to the root location, so setting it at the top level ofsettings.jsonhas no effect. Set it on individual locations or sections instead — see Authoring Locations. -
Validate the JSON. EmoTracker logs the exception if
settings.jsonfails to parse, but your pack still loads with every default in place. A JSON linter (or VS Code with the schema wired up) catches problems earlier.
-
Authoring a Manifest — the
manifest.jsonreference (required) -
Packaging Your Pack — where
settings.jsonfits in the pack layout and how it reloads -
Authoring — Image Filters — full syntax for the
disabled_image_filterfield -
Authoring Locations — per-location overrides of
chest_opened_img/chest_unopened_img/always_allow_chest_manipulation -
settings.jsonschema — the canonical JSON schema
- Installation
- Installing and Loading Packages
- Item Types and Mouse Controls
- Map Locations
- Map Location Colors
- Saving and Loading
- Multi-Tab and Window
- Autotracking
- NDI Broadcasting
- Twitch Chat HUD
- Note Taking
- Voice Control
- Keyboard Shortcuts