Pane
If you have ever built a user interface for a Minecraft mod, you know the pain. The vanilla screen API is verbose, version-fragile, and strictly modal. You write hundreds of lines of boilerplate just to place a button, and then a Minecraft update breaks everything. Alternative libraries often bring native code, bundled renderers, and platform-specific jars that fight with other mods for cursor control. There had to be a better way, and now there is: Pane.
Pane is a GUI library for Fabric mods that feels like building for the web, but it is rendered entirely through Minecraft's own pipeline. It uses the same DrawContext the game itself uses, meaning no natives, no external renderers, and nothing to conflict with your other mods. It is a modern retained component tree with flex layout, two-way data binding, and CSS-style theming. In short, it is the library that makes creating complex, editor-style tools in Minecraft feel natural.
Why Pane Stands Out from the Crowd
Most Minecraft UI libraries force you to choose between the clunky vanilla API or heavy native alternatives. Pane takes a third path. It was originally built to power Luminary's editor, which runs three tool windows, a keyframe timeline, and a gobo designer live in a 150-mod pack alongside Axiom and Flashback. That real-world stress test proved Pane is stable, performant, and ready for production use.
Overlay Windows vs. Classic Screens
Pane offers two distinct ways to show UI. The first is overlay windows. These float over the game while it keeps running. They are draggable, resizable from every edge, support body scrolling, and use hardware resize cursors. One key frees the mouse, and clicking the world puts you back in the game. This mode is perfect for editor-style tools that need to coexist with gameplay.
The second mode is classic screens. These are modal menus built from the same widgets but hosted in a vanilla Screen. They pause the game, tab-complete, and close exactly like any other menu because they are one. You get the power of Pane without breaking vanilla expectations.
Widgets That Cover Real Tools
Pane ships with twenty-one widgets, covering nearly every UI need. You get buttons, checkboxes, sliders, dropdowns, text fields, number fields you can drag to nudge, color pickers, progress bars, tabs, scroll containers, tables, multi-select list views with drag-reorder, keybind capture fields, right-click context menus, confirm dialogs, and toasts. All of them follow a single, simple factory pattern:
Window win = Window.of("My Tool").at(40, 40);
win.add(Label.of("Target"));
win.add(TextInput.of(name));
win.add(Slider.of(speed, 0f, 2f));
win.add(Button.of("Apply").onClick(() -> apply()));
PaneOverlay.addWindow(win);
That is the entire setup. No layout managers, no coordinate math, just a clean, declarative flow.
Data Binding, Not Callbacks Everywhere
One of Pane's most powerful features is its State<T> primitive. It connects widgets to your data in both directions. Bind the same state to a slider and a number field, and they stay in step for free. When the state changes, the UI updates, and when the user interacts with the UI, the state updates. You no longer need to wire up dozens of listeners manually.
State<Float> radius = State.of(16f);
Slider.of(radius, 0f, 256f);
NumberField.of(radius, 0f, 256f);
radius.onChange(v -> sendToServer(v));
This two-way binding dramatically reduces boilerplate and makes your code easier to reason about.
Author in Markup, Restyle in CSS
For larger layouts, Pane lets you write declaratively in PML (Pane Markup Language) and style it with PSS (Pane Style Sheets). You get selectors, specificity, and #AARRGGBB colors. If you have ever written CSS, you will feel right at home. For example:
button { bg: #292A31; padding: 3; }
.warn { fg: #FF5555; }
#saveBtn { border-color: #4FA3FF; }
This separation of structure and style makes maintaining complex interfaces significantly easier.
Themes Out of the Box
Eight tokens drive every widget in Pane. Three built-in themes ship with it: Studio (dark), Paper (light), and Vanilla (which blends seamlessly with the game's own menus). Creating a custom theme is a single record away, and toggling between dark and light is a one-line call. This flexibility ensures your mod can match any aesthetic.
Headless by Design and Version Agnostic
One of the most impressive technical achievements of Pane is that its core and every widget have zero Minecraft imports. The entire widget layer compiles and runs its test suite on a bare JVM. This is why the same widgets ship unchanged across Minecraft versions; only a thin runtime layer differs per version. Pane currently supports recent Fabric versions for Minecraft, ensuring you can use it without waiting for lengthy porting efforts.
How to Install Pane
Getting started is straightforward. To download Pane, head to its official Modrinth page, which is coming soon. The add-on is distributed as a standard Fabric mod jar. To learn how to install, simply place the jar in your mods folder alongside Fabric API. Pane is a library, so you will also want to add it as a dependency in your own mod's fabric.mod.json.
If you are looking for a seamless way to manage your mods, the foxygame.net launcher offers a curated add-on catalog where you can find and install Pane with a single click, automatically handling version compatibility checks for your Minecraft setup. This removes the guesswork from dependency management and lets you focus on building.
Conclusion
Pane represents a significant leap forward for Minecraft mod GUI development. It combines the familiarity of web development with the performance and integration of a native Minecraft library. Whether you are building a simple config screen or a complex editor with multiple floating tool windows, Pane provides the tools you need without the usual headaches. Its headless core, data binding, and CSS-style theming make it a joy to use. Pane for Minecraft is not just another library; it is the library that makes complex UI development feel simple again. Give it a try on your next Fabric mod project, and you will wonder how you ever lived without it.