Documentation

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.

Overview

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.

Leaf Client is currently in beta. Features are actively being developed and improved. Join the Discord to follow updates and report issues.
  • 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

Setup

Getting Started

Get up and running in under a minute. All you need is Windows, Java, and a valid Minecraft Java Edition account.

  1. Download the Launcher

    Head to the Download page and grab the latest Windows installer. Run the .exe — no additional setup required.

  2. 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.

  3. 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.

  4. Hit Launch

    Press the launch button. The launcher will download all required files on first run, then open the game. Subsequent launches are instant.

  5. 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.


Requirements

System Requirements

Requirement Minimum Recommended
OSWindows 10 (64-bit)Windows 11
JavaJava 17Java 21
RAM4 GB system RAM8 GB+
GPUOpenGL 4.5 capableDedicated GPU
MinecraftJava Edition (any)Java Edition 1.21+
Disk2 GB free space4 GB+ free space
macOS and Linux are not yet supported. They are planned for a future release.

Launcher

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

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

SettingDescription
mc_versionMinecraft version this profile launches
mod_presetWhich bundled mods are active (Sodium + Lithium always included)
jvm_argsCustom JVM flags appended to the launch command
ram_min / ram_maxMinimum and maximum heap memory allocation
quick_joinServer address to connect to automatically on load
resolutionGame window width and height
Settings

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:

JVM Flags (applied automatically)
-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.


Mods

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

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

HUD

Displays 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

HUD

Shows 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

HUD

Displays 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

HUD

Shows 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

HUD

Displays 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

HUD

Shows real-time WASD, jump, and mouse key presses on screen. Configurable colors, scale, and animations.

Item Counter

HUD

Tracks 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

HUD

Displays 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

HUD

Shows 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

HUD

Renders 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

HUD

Displays 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

HUD

Shows 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.

Mechanics

Mechanic Mods

These mods change how you interact with the game — movement, camera, and visibility.

Spectate

Mechanic

Press 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

Mechanic

Sprint and sneak by toggling instead of holding. Supports fly speed boost when sprinting in creative mode.

Zoom

Mechanic

Hold C to zoom in. Scroll the mouse wheel while zooming to adjust the zoom level. Smooth cinematic zoom transitions included.

FullBright

Mechanic

Maximizes 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

Mechanic

Adds 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

Mechanic

Held 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

Mechanic

Enables 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

Visual Mods

Custom Crosshair

Visual

Replace the default crosshair with a fully customizable one. Adjust size, gap, dot visibility, and color.

Custom Hit Color

Visual

Changes 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

Visual

Overrides 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

Visual

Resizes 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

Visual

Applies 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

Server Mods

Waypoints

Server

Create 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

Server

Bind 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

Server

Shows 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.


For Server Operators

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.

This system is per-session. Features are re-enabled when the player disconnects and reconnects. Servers should send the disable payload on player join.

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.

JSON — leafclient:control payload
{ "disabled": ["spectate", "freelook", "fullbright"] }
Mod IDWhat it disables
spectateFree-camera detach mode (Left Alt)
freelookThird-person orbit camera
fullbrightMaximum brightness override
minimapReal-time minimap HUD
zoomScroll-wheel zoom (C key)
fastbuilderSchematic 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.

Java — Paper, detect Leaf Client on join
@EventHandler
public void onJoin(PlayerJoinEvent e) {
    if (e.getPlayer().getListeningPluginChannels().contains("leafclient:control")) {
        // player is running Leaf Client
    }
}
Plugin Channel Reference

Plugin Channel Reference

Channel details

PropertyValue
channelleafclient:control
directionServer → Client (S2C only)
payload encodingUTF-8 JSON string
payload schema{"disabled": ["mod_id", ...]}
timingSend on player join (PlayerJoinEvent / PostLoginEvent)
persistenceSession only — resets on disconnect
safe to send to all playersYes — vanilla clients silently ignore it
This channel only works with Leaf Client. Vanilla clients and other modpacks will simply ignore the packet. It is safe to broadcast to every player on join without checking first.

plugin.yml declaration

Your Bukkit/Spigot/Paper plugin must declare the outgoing channel in plugin.yml before it can send plugin messages.

YAML — plugin.yml
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.

Java — PaperMC plugin (full example)
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);
    }
}
To disable multiple mods at once, extend the JSON array: {"disabled":["spectate","freelook","fullbright"]}. A single packet handles all of them — no need to send multiple messages.

Spectate Control

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

Java — Bukkit plugin
@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

Java — Velocity plugin
@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

Java — BungeeCord plugin
@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)

Java — Fabric server mod
Identifier channel = Identifier.of("leafclient", "disable");
PayloadTypeRegistry.playS2C().register(channel, ...);

// On player join event:
ServerPlayNetworking.send(player, new CustomPayload("spectate"));
Plugin messaging is part of the base Minecraft protocol — it is not Bukkit-specific. Any server software that implements the Minecraft protocol can send plugin messages.

Freelook Control

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.

Freelook is session-scoped. It is automatically re-enabled when the player disconnects and reconnects. Send the disable packet every time a player joins.

Bukkit / Spigot / Paper / Purpur

Java — Bukkit plugin
@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

Java — Velocity plugin
@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

Java — BungeeCord plugin
@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

PropertyValue
channelleafclient:disable
directionServer → Client (S2C only)
payloadUTF-8 string: "freelook"
timingSend on player join
persistenceSession only — resets on disconnect
safe to send to all playersYes — vanilla clients silently ignore it
The leafclient:disable channel is unified — send "spectate", "freelook", or "fullbright" as separate packets on the same channel to disable multiple features at once.

FullBright Control

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.

FullBright is session-scoped. It is automatically re-enabled when the player disconnects and reconnects. Send the disable packet every time a player joins.

Bukkit / Spigot / Paper / Purpur

Java — Bukkit plugin
@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

Java — Velocity plugin
@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

PropertyValue
channelleafclient:disable
directionServer → Client (S2C only)
payloadUTF-8 string: "fullbright"
timingSend on player join
persistenceSession only — resets on disconnect
safe to send to all playersYes — vanilla clients silently ignore it
The 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.

Fast Builder Control

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.

Fast Builder is session-scoped. It is automatically re-enabled when the player disconnects and reconnects. Send the disable packet every time a player joins.

Bukkit / Spigot / Paper / Purpur

Java — Bukkit plugin
@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

Java — Velocity plugin
@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

PropertyValue
channelleafclient:disable
directionServer → Client (S2C only)
payloadUTF-8 string: "fastbuilder"
timingSend on player join
persistenceSession only — resets on disconnect
safe to send to all playersYes — vanilla clients silently ignore it
The 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.