Configuration reference
File location, load rules, normalization, and key reference for config.json.
Use this as a reference for config.json.
Defaults and normalization come from cw_platform/config_base.py.
Need the raw, generated default JSON blocks? See Default config values.
config.json contains credentials, account identifiers, webhook route IDs, password hashes, and other sensitive configuration.
Sensitive values are encrypted when CW saves the configuration.
Encrypted values use the enc:v1: prefix.
CW obtains the encryption key from one of these locations, in priority order:
CW_CONFIG_KEYCROSSWATCH_CONFIG_KEY<CONFIG_BASE>/.cw_master_key
Back up .cw_master_key together with config.json.
An encrypted config cannot be recovered without the matching key.
Do not share config.json, .cw_master_key, provider tokens, or unredacted config output.
See Config encryption for the complete key management and recovery process.
Use this page as a reference, not as a setup checklist.
Related config docs
At a glance
Config file
<CONFIG_BASE>/config.json
Created if missing.
Docker default
/config/config.json
Used when /app exists.
Manual edits
Avoid
UI covers most settings.
Secrets
Tokens and password hashes
Redact before sharing.
Config file location
CW chooses the config base directory in this order.
1
CONFIG_BASE env var is set
CONFIG_BASE value
2
Running in Docker image (/app exists)
/config
3
Running from source
Project root (one level above cw_platform/)
The file path is always:
<CONFIG_BASE>/config.json
Load and save behavior
CW loads config.json, normalizes it, and rewrites managed values when needed.
Defaults and deep merge
CW loads config.json and deep merges it over DEFAULT_CFG.
Dictionary values merge recursively.
Other values replace their defaults.
Unknown keys are retained.
Missing default keys are restored during loading.
Version stamping
version is managed by CW and rewritten during save operations.
The value is selected in this order:
api.versionAPI.CURRENT_VERSIONAPP_VERSIONFallback
v0.7.0
A leading v is removed before the value is stored.
Secret encryption
Sensitive string values are encrypted before CW writes the config to disk.
Encrypted values use the enc:v1: prefix.
Values are decrypted in memory when CW loads the file.
Sensitive fields include:
API keys
Access and refresh tokens
Client secrets
Plex tokens and home PINs
Session IDs and token hashes
Password hashes and salts
Device and request tokens
Webhook secrets and webhook route IDs
Atomic saves
CW writes a temporary JSON file, then replaces config.json.
This reduces the chance of a partial write after an interrupted save.
Runtime normalization
Config values are normalized during load and save.
The normalized result can differ from the value originally written to config.json.
Webhook route IDs
CW generates a new route ID when one of these values is missing, is not a string, or has fewer than 16 characters:
security.webhook_ids.plextraktsecurity.webhook_ids.jellyfintraktsecurity.webhook_ids.embytraktsecurity.webhook_ids.plexwatcher
Generated values use token_urlsafe(24).
Scheduling
scheduling.mode is normalized to one of:
disabledhourlyevery_n_hoursdaily_timecustom_interval
When every_n_hours is 1 or lower, the mode is changed to hourly.
scheduling.daily_time falls back to 03:30 when it is not a valid 24 hour HH:MM value.
scheduling.custom_interval_minutes has a minimum value of 15.
Anime ID Mapping
anime_mapping.refresh_hours has a minimum value of 1.
anime_mapping.stale_after_days has a minimum value of 1.
An invalid anime_mapping.release_tag is replaced with v3.
Empty or invalid provider and feature lists are restored to:
PublicMetaDB
PublicMetaDB page sizes, page limits, contribution limits, and request limits are clamped to supported ranges.
The default request limits are:
User interface
ui.theme is normalized to:
flat-darkflat-lightoriginal
Recent Activity and Recent Sync display values support:
count:3count:4count:5hours:24hours:48hours:72
ui.protocol is normalized to http or https.
ui.tls.valid_days is clamped to 1 through 3650.
UI authentication
UI authentication is mandatory.
app_auth.enabled is normalized to true, even when the raw default or a manually edited configuration contains false.
app_auth.remember_session_days is clamped to 1 through 365.
When reset_required is enabled, active sessions and the previous login timestamp are cleared.
Pair feature normalization
Feature configuration should use an object:
When a feature object omits these fields, CW uses:
A non-object feature value is treated as invalid and normalized to:
Do not use true or false as the complete feature value in config.json.
Ratings feature fields
Allowed values are movies, shows, seasons, and episodes.
The value all expands to all four types.
An empty or invalid list falls back to movies and shows.
Allowed values are:
only_newfrom_dateall
Used when mode is from_date.
It is cleared for other modes.
AniList feature fields
Watchlist and Ratings features on pairs containing AniList can contain:
use_anime_mapping
Uses the local AniBridge mapping index to enrich identifiers before comparison and writes.
Enabling it in the pair editor also enables the global Anime ID Mapping service.
anime_only_sync
This requires use_anime_mapping.
When AniList receives data, only items with a usable AniList or MyAnimeList ID are accepted.
Items that would require AniList title search are skipped.
The option is forced to false when Anime ID Mapping is disabled for the feature.
Example:
More detail: AniList pair options.
Redaction
redact_config(cfg) replaces sensitive values with ••••••••.
Redaction covers provider credentials in both the default provider block and provider profiles under instances.
Redacted provider values include credentials for:
Plex
Trakt
SIMKL
AniList
MDBList
PublicMetaDB
Tautulli
Jellyfin
Emby
TMDb
TMDb Sync
The following local authentication values are also redacted:
app_auth.password.hashapp_auth.password.saltapp_auth.session.token_hashToken hashes inside
app_auth.sessions[]All values under
security.webhook_ids
Key reference
Top-level
version
string
Managed by the app.
security
object
Runtime-generated webhook IDs.
pairs
array
Pair definitions created in the UI.
plex, trakt, …
object
Provider connection and tuning.
nuvio
object
Nuvio request pacing.
publicmetadb
object
PublicMetaDB auth and sync tuning.
sync
object
Global orchestrator defaults.
runtime
object
Logging and guardrails.
metadata
object
TMDb metadata lookup settings.
anime_mapping
object
Anime ID Mapping settings.
scrobble
object
Real-time progress forwarding.
scheduling
object
Periodic runs.
ui
object
UI toggles.
app_auth
object
Mandatory UI authentication.
Security (security)
This node stores webhook route IDs.
CW can auto-generate them.
security.webhook_ids.plextrakt
string
Plex webhook path ID.
security.webhook_ids.jellyfintrakt
string
Jellyfin webhook path ID.
security.webhook_ids.embytrakt
string
Emby webhook path ID.
security.webhook_ids.plexwatcher
string
Plex Watcher/webhook path id.
If you change these IDs, update your webhook URLs.
Restart CW after edits.
Providers
plex
server URL, token, tuning
Sync + scrobble source
jellyfin / emby
server URL, token, tuning
Sync + scrobble source
trakt / simkl
OAuth/API keys
Tracker targets and sources
nuvio
Request pacing
Nuvio provider requests
anilist
OAuth/API keys
Bidirectional watchlist + ratings
mdblist
Device Code or API key auth
Watchlist, ratings, and history
publicmetadb
API key and sync tuning
Watchlist, ratings, history, progress
tmdb
API key
Matching support
tmdb_sync
API key + session
TMDb account sync
tautulli
URL + API key
History import
crosswatch
local paths + snapshot rules
Local backup provider
Provider profiles
Most providers can store multiple profiles under an instances map (config key name).
The implicit profile id is
default.Additional profile ids are named like
PLEX-P01,TRAKT-P02, etc.
Profiles are used by:
sync pairs (
source_instance,target_instance)Watcher routes (
provider_instance,sink_instance)
Guide: Profiles