Skip to main content
LiquidLauncher provides extensive configuration options to customize your experience. Settings are stored in options.json and can be managed through Tauri commands.

Settings Structure

Settings are organized into four main categories:
// From: src-tauri/src/app/options.rs:30
pub(crate) struct Options {
    #[serde(rename = "start")]
    pub start_options: StartOptions,
    #[serde(rename = "version")]
    pub version_options: VersionOptions,
    #[serde(rename = "launcher")]
    pub launcher_options: LauncherOptions,
    #[serde(rename = "premium")]
    pub premium_options: PremiumOptions,
}

Start Options

Account, memory, Java, and JVM settings

Version Options

Branch, build, and mod state configuration

Launcher Options

UI behavior and download settings

Premium Options

Premium account and features

Start Options

Configure how games are launched:
// From: src-tauri/src/app/options.rs:42
pub(crate) struct StartOptions {
    #[serde(rename = "account")]
    pub minecraft_account: Option<MinecraftAccount>,
    #[serde(rename = "customDataPath", default)]
    pub custom_data_path: String,
    #[serde(rename = "javaDistribution", default)]
    pub java_distribution: DistributionSelection,
    #[serde(rename = "jvmArgs", default)]
    pub jvm_args: Option<Vec<String>>,
    #[serde(rename = "memory", default = "default_memory")]
    pub memory: u64,
}

Account Configuration

minecraft_account
MinecraftAccount | null
The currently selected Minecraft account (Microsoft or Offline)
Accounts can be:
  • MsaAccount: Microsoft authenticated account
  • LegacyMsaAccount: Legacy Microsoft account
  • OfflineAccount: Offline/local account
See Account Management for details.

Memory Allocation

memory
u64
default:"4096"
Memory allocation in megabytes (MB)
Default memory allocation is 4096 MB (4 GB). Increase this if you experience lag or crashes.
Use CaseRecommended RAM
Vanilla/Light Mods2-4 GB
Moderate Mods4-6 GB
Heavy Modpacks6-8 GB
Ultra Modded8-12 GB+

Java Distribution

java_distribution
DistributionSelection
Java runtime selection strategy
// From: src-tauri/src/minecraft/java/distribution.rs:6
pub enum DistributionSelection {
    Automatic(String),  // Let launcher choose
    Custom(String),     // Custom Java path
    Manual(JavaDistribution),  // Specific distribution
}

Available Distributions

Eclipse Temurin from Adoptium
  • ✅ Supports all Java versions (8, 11, 17, 21+)
  • ✅ Excellent compatibility
  • ✅ Open source
  • ✅ Regular updates
Download URL Pattern:
https://api.adoptium.net/v3/binary/latest/{version}/ga/{os}/{arch}/jre/hotspot/normal/eclipse
GraalVM only supports Java 17 and newer. If you need Java 8 or 11, use Temurin or Zulu.

Custom Data Path

custom_data_path
string
default:""
Custom directory for game data. Empty string uses default location.
When set, game data is stored in:
{custom_data_path}/
├── assets/
├── gameDir/
├── libraries/
├── mod_cache/
├── custom_mods/
├── natives/
├── runtimes/
└── versions/
You can get the default data folder path using the default_data_folder_path command.

JVM Arguments

jvm_args
Vec<String> | null
Custom JVM arguments passed to Java

Common JVM Arguments

// Garbage Collection
-XX:+UseG1GC                    // Use G1 garbage collector
-XX:+ParallelRefProcEnabled      // Enable parallel reference processing
-XX:MaxGCPauseMillis=200         // Target max GC pause time

// Performance
-XX:+UnlockExperimentalVMOptions // Unlock experimental options
-XX:+DisableExplicitGC           // Disable explicit GC calls
-XX:+AlwaysPreTouch              // Pre-touch memory pages

// Memory
-Xms4G                           // Initial heap size
-Xmx8G                           // Maximum heap size

// Debugging
-XX:+PrintGCDetails              // Print GC details
-Xlog:gc*:file=gc.log            // Log GC to file
Invalid JVM arguments can prevent the game from launching. Test carefully!

Version Options

Manage branch and build selection:
// From: src-tauri/src/app/options.rs:56
pub(crate) struct VersionOptions {
    #[serde(rename = "branchName")]
    pub branch_name: Option<String>,
    #[serde(rename = "buildId", default)]
    pub build_id: i32,
    #[serde(rename = "options", default)]
    pub options: HashMap<String, BranchOptions>,
}
branch_name
string | null
Selected branch. null uses recommended branch.
build_id
i32
default:"-1"
Selected build ID. -1 uses latest build.
options
HashMap<String, BranchOptions>
Per-branch configuration including mod states

Branch Options

// From: src-tauri/src/app/options.rs:88
pub(crate) struct BranchOptions {
    #[serde(rename = "modStates", default)]
    pub mod_states: HashMap<String, bool>,
    #[serde(rename = "customModStates", default)]
    pub custom_mod_states: HashMap<String, bool>,
}
Each branch maintains separate mod state configurations:
  • mod_states: Loader mods from API
  • custom_mod_states: Custom JAR mods

Launcher Options

Configure launcher behavior:
// From: src-tauri/src/app/options.rs:66
pub(crate) struct LauncherOptions {
    #[serde(rename = "firstRun", default)]
    pub first_run: bool,
    #[serde(rename = "showNightlyBuilds")]
    pub show_nightly_builds: bool,
    #[serde(rename = "concurrentDownloads")]
    pub concurrent_downloads: u32,
    #[serde(rename = "keepLauncherOpen")]
    pub keep_launcher_open: bool,
    #[serde(rename = "sessionToken", default = "random_token")]
    pub session_token: String,
}

UI and Behavior Settings

first_run
boolean
default:"true"
Whether this is the first time running the launcher
show_nightly_builds
boolean
default:"false"
Show nightly/development builds in addition to releases
keep_launcher_open
boolean
default:"false"
Keep launcher window open after game starts
When keep_launcher_open is false, the launcher window hides automatically and the process exits when the game closes.

Download Settings

concurrent_downloads
u32
default:"10"
Number of simultaneous downloads for assets and libraries
Connection SpeedRecommended Value
Slow (<10 Mbps)5-8
Medium (10-50 Mbps)10-15
Fast (50-100 Mbps)15-20
Very Fast (>100 Mbps)20-30
Setting this too high may cause connection timeouts or rate limiting.

Session Token

session_token
string
Unique session identifier (auto-generated 16 character alphanumeric)
// From: src-tauri/src/app/options.rs:206
fn random_token() -> String {
    Alphanumeric.sample_string(&mut rand::rng(), 16)
}

Premium Options

Configure premium features:
// From: src-tauri/src/app/options.rs:80
pub(crate) struct PremiumOptions {
    #[serde(rename = "account")]
    pub account: Option<ClientAccount>,
    #[serde(rename = "skipAdvertisement", default)]
    pub skip_advertisement: bool,
}
account
ClientAccount | null
LiquidBounce client account for premium features
skip_advertisement
boolean
default:"false"
Skip advertisements (requires premium account)
Advertisement skipping only works if you have a premium client account.

Managing Settings

Loading Options

// From: src-tauri/src/app/gui/commands/data.rs:26
#[tauri::command]
pub(crate) async fn get_options() -> Result<Options, String> {
    let config_dir = LAUNCHER_DIRECTORY.config_dir();
    let options = Options::load(config_dir).await.unwrap_or_default();
    Ok(options)
}
Options are loaded from {config_dir}/options.json. If the file doesn’t exist or is invalid, default options are used.

Storing Options

// From: src-tauri/src/app/gui/commands/data.rs:33
#[tauri::command]
pub(crate) async fn store_options(options: Options) -> Result<(), String> {
    let config_dir = LAUNCHER_DIRECTORY.config_dir();
    options
        .store(config_dir)
        .await
        .map_err(|e| format!("unable to store config data: {:?}", e))?;
    Ok(())
}
Call this command after modifying options to persist changes.

Example: Updating Settings

// Load current options
const options = await invoke('get_options');

// Modify settings
options.start.memory = 8192;  // 8 GB
options.launcher.concurrent_downloads = 15;
options.launcher.keep_launcher_open = true;

// Save changes
await invoke('store_options', { options });

System Information

Getting System Memory

Check available system memory:
// From: src-tauri/src/app/gui/commands/system.rs:52
#[tauri::command]
pub(crate) fn sys_memory() -> u64 {
    utils::sys_memory() / (1024 * 1024)
}
Returns total system memory in megabytes.
Use this to determine maximum safe memory allocation for the game.

Getting Launcher Version

// From: src-tauri/src/app/gui/commands/system.rs:24
#[tauri::command]
pub(crate) async fn get_launcher_version() -> Result<String, String> {
    Ok(LAUNCHER_VERSION.to_string())
}

Data Management

Clearing Data

Remove downloaded game files to free space:
// From: src-tauri/src/app/gui/commands/data.rs:43
#[tauri::command]
pub(crate) async fn clear_data(options: Options) -> Result<(), String> {
    let data_directory = if !options.start_options.custom_data_path.is_empty() {
        Some(options.start_options.custom_data_path)
    } else {
        None
    }
        .map(|x| x.into())
        .unwrap_or_else(|| LAUNCHER_DIRECTORY.data_dir().to_path_buf());

    [
        "assets",
        "gameDir",
        "libraries",
        "mod_cache",
        "natives",
        "runtimes",
        "versions",
    ]
        .iter()
        .map(|dir| data_directory.join(dir))
        .filter(|dir| dir.exists())
        .map(std::fs::remove_dir_all)
        .collect::<Result<Vec<_>, _>>()?;
    Ok(())
}
This removes:
  • assets: Game assets (sounds, textures, etc.)
  • gameDir: World saves and game data
  • libraries: Downloaded libraries
  • mod_cache: Cached mods
  • natives: Native libraries
  • runtimes: Java runtimes
  • versions: Version manifests and JARs
Clearing data will delete your world saves and require re-downloading all game files. Back up important data first!

Getting Default Data Folder

// From: src-tauri/src/app/gui/commands/data.rs:71
#[tauri::command]
pub(crate) async fn default_data_folder_path() -> Result<String, String> {
    let data_directory = LAUNCHER_DIRECTORY.data_dir().to_str();

    match data_directory {
        None => Err("unable to get data folder path".to_string()),
        Some(path) => Ok(path.to_string()),
    }
}

Legacy Options Support

The launcher supports migrating from legacy option formats:
// From: src-tauri/src/app/options.rs:96
impl Options {
    pub async fn load(app_data: &Path) -> Result<Self> {
        let file_content = fs::read(app_data.join("options.json")).await?;

        // Try modern format first
        if let Ok(options) = serde_json::from_slice::<Self>(&file_content) {
            return Ok(options);
        }

        // Fall back to legacy format
        if let Ok(legacy) = serde_json::from_slice::<LegacyOptions>(&file_content) {
            return Ok(Self::from_legacy(legacy));
        }

        Ok(serde_json::from_slice::<Self>(&file_content)?)
    }
}
When loading legacy options, the launcher automatically:
  • Maps customDataPath to custom_data_path
  • Converts memoryPercentage to fixed memory value (defaults to 4GB)
  • Migrates keepLauncherOpen to new structure
  • Preserves branch options and mod states
  • Generates new session_token
Legacy options are immediately saved in the new format.

Configuration Files

File Locations

FileLocationPurpose
options.json{config_dir}/All launcher settings
World saves{data_dir}/gameDir/{branch}/Game worlds
Custom mods{data_dir}/custom_mods/Installed mod JARs

Backup Recommendations

1

Backup Settings

# Copy options.json
cp {config_dir}/options.json ~/options-backup.json
2

Backup Game Data

# Backup worlds
tar -czf worlds-backup.tar.gz {data_dir}/gameDir/
3

Backup Custom Mods

# Backup mods
tar -czf mods-backup.tar.gz {data_dir}/custom_mods/

Troubleshooting

  • Ensure you call store_options after modifications
  • Check file permissions on config directory
  • Verify disk space availability
  • Check for JSON syntax errors
This happens when:
  • options.json is corrupted
  • JSON parsing fails
  • File doesn’t exist
Restore from backup or reconfigure manually.
  • Ensure the path exists and is writable
  • Use absolute paths, not relative
  • Check for special characters in path
  • Verify the path is not read-only
  • Don’t allocate more than 80% of system RAM
  • Ensure you have sufficient free memory
  • Close other applications
  • Check system memory with sys_memory command

Next Steps

Account Management

Configure your Minecraft accounts

Launching Games

See how settings affect game launching

Build docs developers (and LLMs) love