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
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 allocation in megabytes (MB)
Default memory allocation is 4096 MB (4 GB). Increase this if you experience lag or crashes.
Recommended Memory Settings
Use Case Recommended RAM Vanilla/Light Mods 2-4 GB Moderate Mods 4-6 GB Heavy Modpacks 6-8 GB Ultra Modded 8-12 GB+
Java Distribution
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
Temurin (Default)
GraalVM
Zulu
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
Oracle GraalVM for performance
⚠️ Supports Java 17+ only
✅ Better performance
✅ Advanced optimizations
⚠️ Larger download size
Download URL Pattern: https://download.oracle.com/graalvm/{version}/latest/graalvm-jdk-{version}_{os}-{arch}_bin.{ext}
Azul Zulu community builds
✅ Supports all Java versions
✅ Community edition
✅ Good compatibility
✅ TCK certified
Fetched from Azul API: https : //api.azul.com/metadata/v1/zulu/packages/
? java_version = { version }
& os = { os }
& arch = { arch }
& java_package_type = jre
GraalVM only supports Java 17 and newer. If you need Java 8 or 11, use Temurin or Zulu.
Custom Data Path
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
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 >,
}
Selected branch. null uses recommended branch.
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
Whether this is the first time running the launcher
Show nightly/development builds in addition to releases
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
Number of simultaneous downloads for assets and libraries
Recommended Concurrent Downloads
Connection Speed Recommended 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
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 ,
}
LiquidBounce client account for premium features
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 });
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
File Location Purpose 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
Backup Settings
# Copy options.json
cp {config_dir}/options.json ~/options-backup.json
Backup Game Data
# Backup worlds
tar -czf worlds-backup.tar.gz {data_dir}/gameDir/
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
Settings reset to defaults
This happens when:
options.json is corrupted
JSON parsing fails
File doesn’t exist
Restore from backup or reconfigure manually.
Custom data path not working
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