Skip to content

Settings files

Both files are plain JSON and can be edited by hand while the program that owns them is closed. Both are forgiving: a bad value falls back to its default or is clamped into range, and a file that cannot be read is set aside, never deleted.

Launcher settings

launcher.json in the data folder. Written atomically.

{
  "schema": 1,
  "selected": { "minecraft": "1.8.9", "kind": "xol" },
  "preset": "balanced",
  "memoryMiB": null,
  "javaPath": null,
  "javaRuntime": "auto",
  "width": 1280,
  "height": 720,
  "fullscreen": false,
  "extraJvmArgs": [],
  "instanceIds": {},
  "sharedResourcePacks": true,
  "diagnosticsConsent": false,
  "autoUpdate": true,
  "showOnline": true,
  "discordPresence": true,
  "discordServerName": true,
  "testSignIn": false,
  "addons": {},
  "optifineHint": true,
  "optifineAsked": [],
  "optifineOffered": {},
  "smartJvmArgs": true,
  "highPerformanceGpu": true,
  "legalAccepted": null
}

These are the defaults. A field that an older launcher did not write takes its default.

Field Type Default Allowed Set in
schema number 1 1
selected.minecraft text "1.8.9" A Minecraft version that has a profile Main screen
selected.kind text "xol" xol. The values optifine, forge and forge-optimized are still read from a 0.2.x file and carried over into addons. Main screen
preset text "balanced" max-fps, balanced, quality, battery Main screen
memoryMiB number or null null null means "use the recommendation". Otherwise whole MiB from 512 up. When set in the launcher it is clamped to 75% of installed memory. Settings ▸ Game
javaPath text or null null An absolute path of at most 1,024 characters. null means the managed runtime. Settings ▸ Java
javaRuntime text "auto" auto, native or rosetta: which Java starts Minecraft 1.8.9 and 1.7.10 on an Apple Silicon Mac. Any other value counts as auto. The field is written on every system and means something on Apple Silicon only; a custom javaPath overrides it. See Apple Silicon. Settings ▸ Java, on Apple Silicon Macs only
width number 1280 640 to 7680 Settings ▸ Game
height number 720 480 to 4320 Settings ▸ Game
fullscreen true or false false "Start in fullscreen" Settings ▸ Game
extraJvmArgs list of text [] At most 32 flags, each starting with -, without spaces, at most 512 characters. Flags that load code are refused at launch. Settings ▸ Java
instanceIds object {} Maps a profile identifier to the instance to use for it, for example {"xol-1.8.9": "xol-1.8.9-custom"}. At most 64 entries. A profile that is not listed uses its default instance. Settings ▸ Instance
sharedResourcePacks true or false true Resource packs come from your normal Minecraft folder. On unless it is a literal false. Settings ▸ Instance ▸ Resource packs
diagnosticsConsent true or false false Only a literal true counts as consent. Anything else, including a missing field, is "no". Settings ▸ Support
autoUpdate true or false true Kept for older launchers and no longer read. Since 0.3.1 updates are always automatic.
showOnline true or false true The online heartbeat. On unless it is a literal false. Settings ▸ Service
discordPresence true or false true "Show what I'm playing on Discord". On unless it is a literal false. Settings ▸ Discord
discordServerName true or false true "Show the server name" in that Discord activity. On unless it is a literal false. Settings ▸ Discord
testSignIn true or false false The temporary test sign-in. Only a literal true counts, and it means something in development builds only; a beta or stable build refuses to store it. Settings ▸ Service
addons object {} The add-on switches per Minecraft version, for example {"1.8.9": {"optifine": true, "mods": false}}. At most 64 versions. A version or add-on that is not listed uses the profile's default: OptiFine on for 1.8.9 and off for 1.7.10, Forge mods off. Main screen, Settings ▸ Instance
optifineHint true or false true Whether the main screen suggests Add OptiFine for better performance. On unless it is a literal false, which the close button beside the suggestion writes. Main screen
optifineAsked list of text [] The Minecraft versions for which Xol has already opened the OptiFine download page by itself. A version in this list is not asked about again. At most 64. Written by the launcher
optifineOffered object {} Minecraft version to the newest OptiFine build already suggested as an update, so each build is suggested once. At most 64 entries. Written by the launcher
smartJvmArgs true or false true "Automatic Java arguments": Xol works out the Java arguments the instance needs. Off means only the arguments you typed are used. On unless it is a literal false. Settings ▸ Java
highPerformanceGpu true or false true "Use the high-performance graphics card": on computers with two graphics cards, Minecraft runs on the faster one unless you chose otherwise in Windows graphics settings. On unless it is a literal false. Settings ▸ Game, on Windows only
legalAccepted text or null null The version of the first-start notice (Terms, Privacy policy, Minecraft EULA) you agreed to, as a date such as 2026-09-21. null until you agree. The first-start notice

A launcher.json from 0.2.x may also contain optifineOff, the profiles whose Use OptiFine switch was off. It is read once and carried over into addons, per Minecraft version.

The file contains no credentials. Sign-ins are in accounts.json; see Sign-in and accounts.

How a damaged or foreign file is handled

Situation Result
One field has a bad value That field alone falls back to its default
The file is not readable, or has no valid schema Defaults are used. The old file is first copied to launcher.json.bak-<number>. The launcher shows "Settings were reset".
The file was written by a newer Xol (schema higher than this build knows) The same: defaults, a backup copy, a notice. A newer file is never overwritten in place.

Client settings

xol/config.json inside each Xol instance. Schema 5. Saved when a Xol screen closes. Since 0.3.0 the launcher keeps this file the same in every Xol instance, for both Minecraft versions, through a shared copy in the data folder's shared folder.

{
  "schema": 5,
  "activeLayout": "Default",
  "modules": {
    "<module id>": { "enabled": false, "settings": { "<setting id>": "<value>" } }
  },
  "layouts": [
    { "name": "Default", "modules": { "<module id>": { "anchor": "TOP_LEFT", "x": 4.0, "y": 4.0, "scale": 1.0 } } }
  ]
}

The module identifiers are listed in the module review by name. Setting identifiers are not listed here: client 0.3.5 has 50 modules plus the settings groups under the gear, and the Right Shift menu shows every setting with its label, range and default. Change settings there rather than in the file.

Value formats

Setting type Stored as Example
On or off true or false "background": true
Whole number A number, clamped to the setting's range on load "size": 4
Decimal number A number, clamped and snapped to the setting's step "divisor": 4.0
Choice The option's name, so reordering options in a later version never changes a saved choice "shape": "Cross"
Color Eight hex digits, alpha first. A color that cycles through the rainbow ends in :chroma. "color": "FFFFFFFF"
Key The game's key code. 0 is none. Mouse buttons are the button number minus 100, as vanilla stores its own bindings. Valid range -100 to 255. "key": 46
Text A string, cut to the setting's maximum length. Control characters and the section sign are removed. "name": ""

A few settings are marked local, such as the Nick Hider name. They are saved in config.json but never written into an export. The favourite resource packs are one of them: pack-favourites under menu-theme, a list of pack names with no row in the menu.

Layout entries

Field Allowed Default
anchor TOP_LEFT, TOP_CENTER, TOP_RIGHT, MIDDLE_LEFT, MIDDLE_CENTER, MIDDLE_RIGHT, BOTTOM_LEFT, BOTTOM_CENTER, BOTTOM_RIGHT The module's default anchor
x, y Offsets in GUI pixels, pointing inward from the anchor. Held within ±10,000. The module's default offset
scale 0.5 to 3.0 1.0

Layout rules (1 to 16 layouts, names of 1 to 24 characters, unique ignoring case) are on Layouts, export and import.

How a damaged or older file is handled

Situation Result
Schema 1 (client 0.1.0), which kept position and appearance flat on each module Positions move into a layout named "Default", appearance moves into settings
Schema 2 The text shadow of FPS, CPS, Ping, Playtime and Pack display becomes a choice: true becomes "On", false becomes "Off"
Schema 3 The old hurt camera module becomes No Hurt Cam, and the fullbright row of the Performance group becomes the Fullbright module's switch
Schema 4 (client 0.3.4 and earlier) The player-info module becomes the Player info section of the hypixel module. Each of its settings keeps its value, with pinfo- in front of its identifier, and its switch becomes the section's Show player info row (pinfo). If Player info was on and Hypixel was off, Hypixel is switched on with its other features off, so what you see stays the same.
Unknown modules, settings or fields Ignored
Out-of-range numbers Clamped
The file cannot be read, or was written by a newer client Renamed to config.json.invalid-<number> in the same folder; the client starts with defaults

The export file

xol/xol-settings.json has the same shape as config.json plus "kind": "xol-settings-export". It contains no local settings. See Layouts, export and import.