Leaf Client Docs
Everything you need to know about using, configuring, and integrating Leaf Client — from installing the launcher to controlling features on your server.
What is Leaf Client?
Leaf Client is a free, open-source Minecraft client built on Fabric. It ships with 20+ built-in mods — HUD elements, QoL mechanics, and performance optimizations — all configurable in-game or through the dedicated launcher.
- 20+ built-in mods, all toggle-able and configurable
- Dedicated Windows launcher with profile management
- Supports Minecraft 1.20.1 through 1.21.11
- Sodium & Lithium bundled by default for maximum performance
- Discord Rich Presence integration
- Cosmetics system (wings, crowns, particles)
- Server-side feature control via plugin messaging channel
Getting Started
Get up and running in under a minute. All you need is Windows, Java, and a valid Minecraft Java Edition account.
-
Download the Launcher
Head to the Download page and grab the latest Windows installer. Run the
.exe— no additional setup required. -
Sign in with Microsoft
The launcher uses Microsoft OAuth for authentication. Click Sign In, complete the browser flow, and your account will be saved for future launches.
-
Select a Minecraft version
Pick your version from the version selector. Leaf Client supports 1.20.1 through 1.21.11. Fabric, Sodium, and Lithium are installed automatically.
-
Hit Launch
Press the launch button. The launcher will download all required files on first run, then open the game. Subsequent launches are instant.
-
Open the mod menu in-game
Press Right Shift to open the Leaf Client mod menu. Toggle mods on/off and configure them per your preferences.
System Requirements
| Requirement | Minimum | Recommended |
|---|---|---|
| OS | Windows 10 (64-bit) | Windows 11 |
| Java | Java 17 | Java 21 |
| RAM | 4 GB system RAM | 8 GB+ |
| GPU | OpenGL 4.5 capable | Dedicated GPU |
| Minecraft | Java Edition (any) | Java Edition 1.21+ |
| Disk | 2 GB free space | 4 GB+ free space |
The Launcher
The Leaf Client Launcher is a standalone Windows application that manages your Minecraft installations, profiles, mods, and account — all in one place.
Key launcher features
- One-click launch — downloads Fabric, Sodium, Lithium, and the Leaf Client mod automatically
- Profile system — create multiple profiles with different versions, mods, and JVM settings
- Version selector — switch between any supported Minecraft version instantly
- JVM configurator — set custom JVM arguments or RAM allocation per profile
- Quick Join — auto-connect to a server address on launch
- Discord Rich Presence — shows what you're playing in Discord
- Auto-update — checks for launcher and mod updates on startup
Profiles
Profiles let you save different configurations — useful if you play on multiple servers or want separate setups for PvP and survival.
Creating a profile
Click the profile icon in the launcher top bar, then New Profile. Give it a name, pick a Minecraft version, and choose your mod preset. Profiles are saved locally and persist between sessions.
Profile settings
| Setting | Description |
|---|---|
| mc_version | Minecraft version this profile launches |
| mod_preset | Which bundled mods are active (Sodium + Lithium always included) |
| jvm_args | Custom JVM flags appended to the launch command |
| ram_min / ram_max | Minimum and maximum heap memory allocation |
| quick_join | Server address to connect to automatically on load |
| resolution | Game window width and height |
Launcher Settings
Performance flags
The launcher automatically applies Aikar's recommended JVM garbage collection flags to every launch. These improve GC pauses and reduce stuttering in-game:
-XX:+UseG1GC
-XX:+UnlockExperimentalVMOptions
-XX:G1NewSizePercent=20
-XX:G1ReservePercent=20
-XX:MaxGCPauseMillis=50
-XX:G1HeapRegionSize=32M
-XX:+DisableExplicitGC
-XX:+AlwaysPreTouch
-XX:+ParallelRefProcEnabled
You can add your own flags on top of these via Settings → JVM Arguments. Custom flags are appended after the defaults.
RAM allocation
Use the RAM sliders in Settings to control minimum and maximum heap size. Recommended: 2–4 GB for most setups. Allocating too much RAM can actually hurt performance due to longer GC cycles.
Built-in Mods
All mods are accessible via the in-game mod menu (Right Shift). Each mod can be toggled independently. Settings are saved automatically and persist across sessions.
HUD Mods
HUD mods display information overlays on your screen. All HUD elements can be repositioned using the HUD Editor (accessible from the mod menu).
FPS HUD
HUDDisplays your current frames per second in a configurable corner of the screen. You can choose the position, text color, and whether to show a colored indicator that turns red when FPS drops below a threshold you set. Useful for monitoring performance without opening an external tool.
CPS HUD
HUDShows clicks per second for left and right mouse buttons, tracked over a rolling one-second window. Configurable position, scale, and color — you can also choose to display one button or both. Commonly used in PvP to verify clicking technique and spot inconsistencies.
Ping HUD
HUDDisplays your current server latency in milliseconds, updated every second. Position and color are configurable, and you can optionally set color thresholds so the number turns yellow or red when latency climbs above values you define. Works on any server — reads the standard ping from the tab list.
Coordinates HUD
HUDShows your X, Y, Z coordinates and current biome name at all times. You can toggle each field independently — for example, display only X/Z for navigation while hiding Y. The direction you are facing (N/S/E/W) can also be enabled as an optional sub-label.
Armor HUD
HUDDisplays your equipped armor pieces and their remaining durability as both a numeric value and a color-coded bar. The bar transitions from green to yellow to red as durability drops, giving you an at-a-glance warning before a piece breaks. Each slot (helmet, chestplate, leggings, boots) is shown individually and can be hidden if empty.
Keystrokes
HUDShows real-time WASD, jump, and mouse key presses on screen. Configurable colors, scale, and animations.
Item Counter
HUDTracks the total count of a specific item across your entire inventory, including hotbar, main inventory, and offhand. You can pin any item type to watch — useful for tracking arrows, food, or building materials mid-session. Auto-detection mode automatically highlights the item currently in your main hand.
Performance HUD
HUDDisplays CPU usage and memory consumption so you can monitor system load without alt-tabbing. Shows used vs. allocated heap memory and overall JVM CPU time, updated every second. Useful for diagnosing lag spikes or confirming that your RAM allocation is appropriately sized for your setup.
Server Info
HUDShows the current server IP address and online player count on your HUD, pulled directly from the server connection. The player count updates in real time as people join or leave. You can configure which fields are visible and choose to display a custom label instead of the raw IP for cleaner presentation on known servers.
Minimap
HUDRenders a real-time top-down minimap that updates as you explore, built on an optimized chunk-scanning system. Size, zoom level, and screen position are all configurable. Waypoints you create are shown as labeled pins on the map, and an optional coordinates overlay displays your current position beneath the minimap frame.
Day Counter
HUDDisplays the current in-game day number, time of day as a 24-hour clock, and the current moon phase icon. Each element can be toggled independently so you only show what you need. Handy for planning nighttime activities or tracking how many days have passed in a survival world.
Leaf Logo
HUDShows the Leaf Client branding logo on your HUD. Purely cosmetic — it has no effect on gameplay. Position and scale are configurable, and you can disable it entirely if you prefer a clean screen. It is on by default as a subtle indicator that you are running Leaf Client.
Mechanic Mods
These mods change how you interact with the game — movement, camera, and visibility.
Spectate
MechanicPress Left Alt to enter spectate mode. Your camera detaches and floats freely — look and move around without affecting your character's position. Press again to return. Servers can disable this.
Toggle Sprint
MechanicSprint and sneak by toggling instead of holding. Supports fly speed boost when sprinting in creative mode.
Zoom
MechanicHold C to zoom in. Scroll the mouse wheel while zooming to adjust the zoom level. Smooth cinematic zoom transitions included.
FullBright
MechanicMaximizes in-game brightness so you can see in caves and dark areas without needing torches or night vision. It works by overriding the client-side gamma value and has no effect on the server — other players see normal lighting. Servers can disable this via the leafclient:control channel if their gameplay depends on darkness.
Motion Blur
MechanicAdds a configurable motion blur effect when panning the camera, implemented via a post-processing shader for smooth, high-quality results. Blur intensity is adjustable — lower values give a subtle cinematic feel while higher values produce a more dramatic effect. Has no performance impact on most modern GPUs since it runs entirely on the GPU pipeline.
Dynamic Lights
MechanicHeld light-emitting items — torches, glowstone, lanterns, sea lanterns, and similar blocks — cast real-time light onto nearby blocks and entities as you move. This is purely client-side and does not affect the server's lighting engine or other players. It significantly improves visibility when mining or exploring without committing to placing torches everywhere.
Performance
MechanicEnables a suite of client-side culling optimizations including entity occlusion culling, shadow distance caps, and block entity distance culling. Each optimization reduces the number of objects the renderer has to process per frame, which translates directly to higher and more stable frame rates — especially on servers with many players or complex builds nearby. Individual toggles let you enable only the optimizations that suit your hardware.
Visual Mods
Custom Crosshair
VisualReplace the default crosshair with a fully customizable one. Adjust size, gap, dot visibility, and color.
Custom Hit Color
VisualChanges the red hurt flash that appears on entities when they take damage to any RGB color you choose. Supports a chroma (rainbow cycling) mode with configurable cycle speed for a more distinctive look. The change is purely visual and client-side — it has no effect on other players or the server.
Weather Changer
VisualOverrides the client-side weather rendering so you always see clear skies, constant rain, or a perpetual thunderstorm — regardless of what the server's actual weather is. The override is local only and does not affect other players or server-side weather mechanics. Useful for screenshots, performance testing, or simply preferring a consistent visual environment.
Totem Size Changer
VisualResizes and adjusts the opacity of the totem pop overlay animation that plays when a totem of undying activates. The default overlay fills the entire screen, which some players find disorienting in high-stakes moments. You can scale it down significantly or reduce its opacity so you stay aware of your surroundings during the animation.
HUD Themes
VisualApplies global theming to all HUD elements, letting you change accent color, background opacity, and font style across every HUD mod in a single step rather than configuring each one individually. Theme presets are planned, and custom theme values can be saved and loaded. Note: full theme switching is still in development — basic color and opacity controls are available now.
Server Mods
Waypoints
ServerCreate named waypoints at any coordinate and have them displayed as floating labels in the world at their location. Waypoints are stored per-server so your markers on one server do not bleed into another. Open the waypoints list from the mod menu to edit, delete, or teleport your camera to any saved point. They also appear as pins on the Minimap if that mod is enabled.
Chat Macros
ServerBind any chat message or command to a key so you can send it instantly without typing. Each macro stores a label, a key binding, and the message text — supports server commands like /kit or /home as well as regular chat. You can define as many macros as you need and manage them all from the mod settings panel.
Smart Disconnect
ServerShows a confirmation dialog whenever you attempt to disconnect from a server, preventing accidental disconnects from a misclick or a stray key press. The dialog requires an explicit confirm before the connection is closed. You can whitelist specific servers where you want the prompt skipped if you disconnect from them frequently by choice.
Server-Side Feature Control
Leaf Client supports a plugin messaging channel that lets servers disable specific client features at runtime. This is useful if your server wants to restrict the use of Spectate mode, Minimap, or any other mod.
How it works
When a player joins your server, your plugin sends a plugin message on the leafclient:control channel. The payload is a UTF-8 encoded JSON object listing the mod IDs you want to disable.
Leaf Client receives the packet and immediately disables every listed mod for the duration of the session. The player's local settings are not permanently changed — everything returns to normal on reconnect. Players cannot override or re-enable server-disabled features while they remain connected.
This uses the standard Minecraft plugin messaging protocol and is supported by every major server platform: Bukkit, Spigot, Paper, Purpur, Velocity, BungeeCord, Sponge, Fabric server-side, and more. Vanilla clients that do not register the channel will silently ignore the packet.
Payload format
Send a single JSON object with a disabled array containing the mod IDs to restrict. You can disable one mod or several in a single packet.
{ "disabled" : ["spectate" , "freelook" , "fullbright" ] }
| Mod ID | What it disables |
|---|---|
| spectate | Free-camera detach mode (Left Alt) |
| freelook | Third-person orbit camera |
| fullbright | Maximum brightness override |
| minimap | Real-time minimap HUD |
| zoom | Scroll-wheel zoom (C key) |
| fastbuilder | Schematic printer (auto-place mode) |
Detection: is a player running Leaf Client?
Leaf Client registers the leafclient:control channel on join using the standard Minecraft channel registration handshake. You can inspect the registered channels of a connecting player to detect Leaf Client and only send the control packet to those players.
@EventHandler
public void onJoin (PlayerJoinEvent e) {
if (e.getPlayer ().getListeningPluginChannels ().contains ("leafclient:control" )) {
// player is running Leaf Client
}
}
Plugin Channel Reference
Channel details
| Property | Value |
|---|---|
| channel | leafclient:control |
| direction | Server → Client (S2C only) |
| payload encoding | UTF-8 JSON string |
| payload schema | {"disabled": ["mod_id", ...]} |
| timing | Send on player join (PlayerJoinEvent / PostLoginEvent) |
| persistence | Session only — resets on disconnect |
| safe to send to all players | Yes — vanilla clients silently ignore it |
plugin.yml declaration
Your Bukkit/Spigot/Paper plugin must declare the outgoing channel in plugin.yml before it can send plugin messages.
name: MyPlugin
version: 1.0.0
main: com.example.myplugin.MyPlugin
api-version: 1.20
channels:
- leafclient:control
Full working example — PaperMC plugin
The following is a complete, minimal PaperMC plugin that disables Freelook for every player on join. Copy it as a starting point and add or remove mod IDs from the JSON array as needed.
package com.example.leafcontrol;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
import java.nio.charset.StandardCharsets;
public class LeafControlPlugin extends JavaPlugin implements Listener {
private static final String CHANNEL = "leafclient:control" ;
/** JSON payload — add or remove mod IDs as needed */
private static final String PAYLOAD =
"{\"disabled\":[\"freelook\"]}" ;
@Override
public void onEnable () {
getServer().getMessenger ().registerOutgoingPluginChannel (this , CHANNEL);
getServer().getPluginManager ().registerEvents (this , this );
getLogger ().info ("LeafControl enabled — freelook will be disabled for all players." );
}
@Override
public void onDisable () {
getServer().getMessenger ().unregisterOutgoingPluginChannel (this , CHANNEL);
}
@EventHandler
public void onJoin (PlayerJoinEvent event) {
byte [] bytes = PAYLOAD.getBytes (StandardCharsets .UTF_8);
event.getPlayer ().sendPluginMessage (this , CHANNEL, bytes);
}
}
{"disabled":["spectate","freelook","fullbright"]}. A single packet handles all of them — no need to send multiple messages.Disabling Spectate on Your Server
If your server rules prohibit the use of Spectate (free-camera mode), you can automatically disable it for all Leaf Client users on join. The code is just a few lines regardless of which server software you use.
Bukkit / Spigot / Paper / Purpur
@Override
public void onEnable () {
getServer().getMessenger ().registerOutgoingPluginChannel (this , "leafclient:disable" );
getServer().getPluginManager ().registerEvents (new Listener () {
@EventHandler
public void onJoin (PlayerJoinEvent e) {
byte [] payload = "spectate" .getBytes (StandardCharsets .UTF_8);
e.getPlayer ().sendPluginMessage (plugin, "leafclient:disable" , payload);
}
}, this );
}
Velocity
@Subscribe
public void onPostLogin (PostLoginEvent event) {
ChannelIdentifier channel = MinecraftChannelIdentifier .from ("leafclient:disable" );
server.getChannelRegistrar ().register (channel);
byte [] payload = "spectate" .getBytes (StandardCharsets .UTF_8);
event.getPlayer ().sendPluginMessage (channel, payload);
}
BungeeCord / Waterfall
@Override
public void onEnable () {
getProxy().registerChannel ("leafclient:disable" );
getProxy().getPluginManager ().registerListener (this , new Listener () {
@EventHandler
public void onJoin (PostLoginEvent e) {
byte [] payload = "spectate" .getBytes (StandardCharsets .UTF_8);
e.getPlayer ().sendData ("leafclient:disable" , payload);
}
});
}
Fabric (server-side mod)
Identifier channel = Identifier .of ("leafclient" , "disable" );
PayloadTypeRegistry .playS2C().register (channel, ...);
// On player join event:
ServerPlayNetworking .send (player, new CustomPayload ("spectate" ));
Disabling Freelook on Your Server
If your server wants to prevent players from using Freelook (third-person orbit camera), you can disable it server-side on join. The mechanism is identical to Spectate control — a lightweight plugin message sent once on player join.
Bukkit / Spigot / Paper / Purpur
@Override
public void onEnable () {
getServer().getMessenger ().registerOutgoingPluginChannel (this , "leafclient:disable" );
getServer().getPluginManager ().registerEvents (new Listener () {
@EventHandler
public void onJoin (PlayerJoinEvent e) {
byte [] payload = "freelook" .getBytes (StandardCharsets .UTF_8);
e.getPlayer ().sendPluginMessage (plugin, "leafclient:disable" , payload);
}
}, this );
}
Velocity
@Subscribe
public void onPostLogin (PostLoginEvent event) {
ChannelIdentifier channel = MinecraftChannelIdentifier .from ("leafclient:disable" );
server.getChannelRegistrar ().register (channel);
byte [] payload = "freelook" .getBytes (StandardCharsets .UTF_8);
event.getPlayer ().sendPluginMessage (channel, payload);
}
BungeeCord
@Override
public void onEnable () {
getProxy().registerChannel ("leafclient:disable" );
getProxy().getPluginManager ().registerListener (this , new Listener () {
@EventHandler
public void onJoin (PostLoginEvent e) {
byte [] payload = "freelook" .getBytes(StandardCharsets .UTF_8);
e.getPlayer ().sendData ("leafclient:disable" , payload);
}
});
}
Channel details
| Property | Value |
|---|---|
| channel | leafclient:disable |
| direction | Server → Client (S2C only) |
| payload | UTF-8 string: "freelook" |
| timing | Send on player join |
| persistence | Session only — resets on disconnect |
| safe to send to all players | Yes — vanilla clients silently ignore it |
leafclient:disable channel is unified — send "spectate", "freelook", or "fullbright" as separate packets on the same channel to disable multiple features at once.Disabling FullBright on Your Server
FullBright bypasses Minecraft's lighting engine so the player always sees at maximum brightness. If your server has gameplay that depends on darkness (horror maps, cave exploration, etc.), you can disable it server-side on join.
Bukkit / Spigot / Paper / Purpur
@Override
public void onEnable () {
getServer().getMessenger ().registerOutgoingPluginChannel (this , "leafclient:disable" );
getServer().getPluginManager ().registerEvents (new Listener () {
@EventHandler
public void onJoin (PlayerJoinEvent e) {
byte [] payload = "fullbright" .getBytes (StandardCharsets .UTF_8);
e.getPlayer ().sendPluginMessage (plugin, "leafclient:disable" , payload);
}
}, this );
}
Velocity
@Subscribe
public void onPostLogin (PostLoginEvent event) {
ChannelIdentifier channel = MinecraftChannelIdentifier .from ("leafclient:disable" );
server.getChannelRegistrar ().register (channel);
byte [] payload = "fullbright" .getBytes (StandardCharsets .UTF_8);
event.getPlayer ().sendPluginMessage (channel, payload);
}
Channel details
| Property | Value |
|---|---|
| channel | leafclient:disable |
| direction | Server → Client (S2C only) |
| payload | UTF-8 string: "fullbright" |
| timing | Send on player join |
| persistence | Session only — resets on disconnect |
| safe to send to all players | Yes — vanilla clients silently ignore it |
leafclient:disable channel is unified — you can send "spectate", "freelook", "fullbright", and "fastbuilder" as separate packets on the same channel to disable multiple features at once.Disabling Fast Builder on Your Server
Fast Builder (the schematic printer) lets players automatically place blocks from a loaded schematic at high speed. If your server prohibits automated block-placement or construction assistance, you can disable it server-side on join.
Bukkit / Spigot / Paper / Purpur
@Override
public void onEnable () {
getServer().getMessenger ().registerOutgoingPluginChannel (this , "leafclient:disable" );
getServer().getPluginManager ().registerEvents (new Listener () {
@EventHandler
public void onJoin (PlayerJoinEvent e) {
byte [] payload = "fastbuilder" .getBytes (StandardCharsets .UTF_8);
e.getPlayer ().sendPluginMessage (plugin, "leafclient:disable" , payload);
}
}, this );
}
Velocity
@Subscribe
public void onPostLogin (PostLoginEvent event) {
ChannelIdentifier channel = MinecraftChannelIdentifier .from ("leafclient:disable" );
server.getChannelRegistrar ().register (channel);
byte [] payload = "fastbuilder" .getBytes (StandardCharsets .UTF_8);
event.getPlayer ().sendPluginMessage (channel, payload);
}
Channel details
| Property | Value |
|---|---|
| channel | leafclient:disable |
| direction | Server → Client (S2C only) |
| payload | UTF-8 string: "fastbuilder" |
| timing | Send on player join |
| persistence | Session only — resets on disconnect |
| safe to send to all players | Yes — vanilla clients silently ignore it |
leafclient:disable channel is unified — you can send "spectate", "freelook", "fullbright", and "fastbuilder" as separate packets on the same channel to disable multiple features at once.