Skip to content

Runtime Paths and User Data Locations

Anomaly uses three main storage roots:

RootWhat lives there
%APPDATA%/Anomaly/Shared identity, launcher metadata, asset cache, crash reports, and platform/cache files.
GameRoot/Installed SCP:SL builds, catalog mod cache, loadouts, materialized runtime folders, and Linux Wine prefixes.
<MelonLoader UserData>/Per-launch MelonLoader data exposed to the running game, including Anomaly overrides, input bindings, skins, translations, and MelonPreferences.

On Windows, %APPDATA%/Anomaly/ usually means C:\Users\<you>\AppData\Roaming\Anomaly\.

On Linux through Wine or Proton, the in-game %APPDATA% path lives inside the Wine prefix. The native Launcher may also have a native Linux config location, but the modded game sees the Wine/Proton path.

%APPDATA%/Anomaly/
|-- user.json
|-- launch_args.txt
|-- installed_mods.json
|-- game_builds_cache.json
|-- catalog_cache.json
|-- platform.json
|-- FileCache/
|-- cache/
|-- install-staging/
`-- CrashReports/

Stores your local Anomaly profile, identity, and Launcher-level preferences such as the selected GameRoot. Treat this file as sensitive. Anyone with a copy can impersonate that Anomaly identity.

Back it up if you want to keep the same @anomaly ID across machines or clean OS installs.

Optional Launcher-saved arguments passed to the modded game when you launch it.

Legacy install-state file used during migration from the old single-install layout. The loadout-aware Launcher stores active mod selections in each loadouts/<name>/loadout.json.

Caches the game-version list used by the Launcher’s Game Versions tab so the UI can still show known builds if the online catalog is temporarily unavailable.

Launcher catalog cache for the public repository UI.

Optional Launcher platform override. Most users should not create this file. Developers can use it to point the Launcher at a non-production mod platform while testing.

Shared cache for assets downloaded from Anomaly servers. Do not edit files here directly; Anomaly manages cache entries and mods access them through public asset APIs.

Launcher and installer workspaces for verified install resources and temporary install operations. They should be cleaned automatically after install attempts.

JSON crash reports produced by the modded client. See Logs and Crash Reports.

GameRoot/
|-- games/<gameVersion>/
| |-- SCPSL.exe
| |-- SCPSL_Data/
| |-- version.dll
| |-- MelonLoader/
| `-- .anomaly_links.json
|-- mods-cache/<modId>-<version>/
| |-- package.json
| |-- Mods/
| |-- UserLibs/
| `-- UserData/
|-- loadouts/<name>/
| |-- loadout.json
| |-- runtime/
| | |-- Mods/
| | |-- UserLibs/
| | `-- UserData/
| `-- local/
| |-- Mods/
| |-- UserLibs/
| `-- UserData/
`-- wineprefixes/<loadout>/

One full SCP:SL install per game build. When a loadout starts, the Launcher links that loadout’s runtime Mods/, UserLibs/, and UserData/ into this folder for the lifetime of the game process.

.anomaly_links.json records the active links so the Launcher can clean them up after exit or on the next launch if the previous process crashed.

One extracted platform package per mod version. Multiple loadouts can reference the same cached package.

The loadout definition:

{
"gameVersion": "14.2.6",
"enabledMods": [],
"trackAnomalyClient": true
}

Materialized active view for one loadout. LoadoutMaterializer rebuilds Mods/, UserLibs/, and package-managed UserData/Anomaly/ before launch, then the Launcher links these folders into the selected games/<version>/.

User-owned local overrides for that loadout. Put dev DLLs in local/Mods/, shared libraries in local/UserLibs/, and loadout-specific files under local/UserData/.

See Local and Dev Mods.

Native Linux Launcher only. Each loadout gets its own Wine prefix when launched through umu-run.

This is the UserData folder that MelonLoader exposes to the running game. Under the loadout model it is normally the active loadout runtime UserData/ linked into games/<version>/.

<MelonLoader UserData>/
|-- MelonPreferences.cfg
|-- Loader.cfg
|-- Skins/
|-- i18n/
| |-- anomaly/
| `-- <modNamespace>/
`-- Anomaly/
|-- bindings.json
`-- Overrides/
|-- AudioClip/
|-- Texture2D/
|-- Sprite/
`-- Mesh/

MelonLoader preferences file. Anomaly’s own preferences include category anomaly, entry locale, and category anomaly, entry class_d_favorite_color.

ClientConfig.For(modId) and ClientPersistence.For(modId) are compatibility facades backed by MelonPreferences categories. Their values are stored as JSON strings in preferences entries, not as per-mod config.json / data.json files.

MelonLoader loader preferences. Package-provided Loader.cfg files are skipped by the loadout materializer because this file is user-owned.

Local UI skin files. Skins/logo.png replaces the main-menu logo when present. Package-provided UserData/Skins/ is skipped because skins are user-owned.

Anomaly and mod translation files:

i18n/
|-- anomaly/
| `-- en.yaml
`-- mymod/
`-- en.yaml

Tr.RegisterMod("mymod") resolves <MelonLoader UserData>/i18n/mymod/ automatically. Tr.RegisterMod("mymod", customDir) remains available for custom locations.

User keybinding overrides registered through Anomaly input APIs.

Local user asset overrides. The generated catalogs show supported paths.

Overrides/
|-- AudioClip/
|-- Texture2D/
|-- Sprite/
`-- Mesh/

Audio overrides are supported today. Texture and mesh support depends on the specific catalog and runtime support for that asset kind.

  • user.json survives because it lives in %APPDATA%/Anomaly/.
  • Server asset cache survives because it lives in %APPDATA%/Anomaly/FileCache/.
  • Crash reports survive until deleted.
  • Loadout definitions and local dev files survive ordinary game-version reinstall flows because they live under GameRoot/loadouts/.
  • Cached catalog packages survive ordinary game-version reinstall flows because they live under GameRoot/mods-cache/.
  • Deleting the whole GameRoot removes installed builds, loadouts, local dev files, and cached catalog packages unless you back them up first.

The native Launcher and the Wine/Proton game process can resolve user-data paths differently. If the Launcher and game disagree about identity or cache state, check both the native Linux config location and the Wine prefix’s mapped %APPDATA% folder.

Native Linux loadout launches use GameRoot/wineprefixes/<loadout>/ through umu-run. Steam Deck Gaming Mode and other Windows-launcher-under-Proton setups use Steam’s Proton prefix instead.

Logs and Crash Reports.