promotional bannermobile promotional banner

KubeUI

KubeUI- A KubeJS addon that lets scripts build real, interactive Minecraft GUIs
Back to Files

KubeUI 0.3.0

File namekubeui-0.3.0.jar
Uploader
Zynora_frZynora_fr
Uploaded
Aug 7, 2026
Downloads
7
Size
429.8 KB
Mod Loaders
NeoForge
File ID
8593973
Type
R
Release
Supported game versions
  • 26.1.2

Curse Maven Snippet

NeoForge

implementation "curse.maven:kubeui-1635257:8593973"

Learn more about Curse Maven

What's new

Theming & accessibility: named theme presets ("dark"/"light"/"high-contrast", or a custom one via KubeUI.registerThemePreset(...)) that fade between each other instead of snapping; a colorblind-safe default .colorPicker() palette; .style({color, accent}) to override a single element's colors beyond the global theme; KubeUI.setFontScale(...) to enlarge text independently of box sizes; KubeUISidebar.setIconPack(...) to reskin the whole sidebar in one call; /kubeui theme preview <name>; Key-suffixed translated variants of every text-bearing widget (.buttonKey(), .toggleKey(), .textFieldKey(), .textAreaKey(), .tooltipKey(), .narrationKey(), .badgeKey()); and a visible keyboard focus outline plus full keyboard operability on every custom widget that was missing one (range slider, keybind capture field, context menus).

Update checking: the player is told in chat, on joining a world, whether they're running the latest KubeUI version - via NeoForge's own built-in update checker, sourced from the real CurseForge project (no custom network code, no API key).

Server networking: the server can now push a screen to a specific player or broadcast one to everyone (KubeUIActions.openRemote(...)/.broadcastUpdate(...), received via KubeUIRemoteScreens.register(...)); .requirePermission(gate) gates a widget behind NeoForge's real permission API (LuckPerms or equivalent can plug in); .screenId(id) lets the server know which screen a player currently has open (KubeUIActions.getOpenScreenId(...)); actions can be throttled per player (KubeUIActions.register(id, throttleMs, handler)) and schema-validated before they ever reach a handler; screen.runServerAction(..., onAck) confirms an action actually ran; and the server can show/hide a sidebar icon per player.

Config & persistence: KubeUI now has a real disk-backed config (config/kubeui-common.toml) - the personal scale/font scale/theme a player sets are remembered across restarts by default; .draggable() window positions persist across game launches, not just within a session; /kubeui export//kubeui import moves a player's KubeUI preferences between installs; KubeUIActions.playerData(player) gives a script real per-player server-side storage with no setup; and KubeUI.configScreen(schema) builds a settings screen straight from a data description instead of a hand-chained builder.

In-game script editor: /kubeui editor opens a real file manager/text editor for kubejs/client_scripts without leaving the game - list, create, open, edit and delete any .js file, then "Save & Reload" to see the change live immediately (the same reload behind /kubejs reload client-scripts). Replaces two earlier attempts (a click-to-build visual editor that didn't hold up in real play, then a single fixed canvas file meant to be edited externally) with actual in-game text editing.

Developer tooling: .when(condition, b => ...)/.repeat(count, (b, i) => ...) builder helpers; KubeUI.describe(builder) for a human-readable widget/id listing; KubeUI.lint(builder) to catch duplicate ids before a screen ever opens; KubeUI.toJson(builder)/.fromJson(json) and screen.dumpTree() for a JSON snapshot of a screen's layout (a representative widget subset); error/warning messages now name the widget type and id involved; a slow script callback (50ms+) is now logged instead of just silently making the game stutter; /kubeui profile and /kubeui stresstest for build-time timing; and a real NeoForge "Config" button next to KubeUI in the Mods list (not the Fabric-only ModMenu the idea was originally framed around).

Robustness: a runaway recursive layout helper now fails with a clear error instead of a StackOverflowError; .draggable()/persisted widget state and pending server-action acknowledgements are now capped instead of growing unboundedly for a long-running client or a server that never replies; and a player's per-action throttle state is now actually cleared on disconnect (a real gap a security-focused audit found alongside the above).

Docs & community: a TUTORIAL.md walkthrough from the first KubeUI.builder(...) to a complete server-backed screen; a templates/starter/ starter project (generatable with node scripts/create-kubeui-script.js <dir>); a bigger worked example (a quest board with real per-player server-side progress, testkubejs/*/kubeui_quest_board_example.js); and a SECURITY.md covering the project's security policy.

Recipes: KubeUI.recipeScreen(recipeTypeId) opens a screen showing every recipe of a given type (vanilla or a script's own custom one) automatically, and KubeUI.recipesFor(itemId, onResult) looks up every recipe that accepts a given item as an ingredient - both work generically across recipe types, real server-side data (not guessed or client-only), shown in a properly-sized, scrollable screen. .recipeSlot(id, itemIds, onClick) is a new JEI-style widget that cycles through a group of acceptable items instead of showing just one.

Custom recipes: /kubeui recipe-designer opens an in-game screen to define your own crafting/furnace/blast-furnace/smoker/stonecutter/smithing-table recipes - pick a kind, then arrange real items (any item from your own inventory, dragged in like the real thing) in that kind's actual vanilla interface, and left-click the result slot to save. Saving/deleting doesn't reload automatically anymore (a full data-pack reload on every click was a real lag spike) - a "Reload Recipes" button in the designer applies everything you've changed in one go.

Custom trading: /kubeui trader-designer opens an in-game screen to build a custom trader entirely without scripts - add trades in a real item-slot GUI (place the cost items and the result, left-click the result to add it), toggle whether it has AI and whether it can move, then give yourself the finished trader as a real item (using the actual villager spawn egg icon) and right-click a block to spawn it, exactly like a vanilla spawn egg. Trading with it uses the real villager trading screen too, laid out just like a real villager with a profession - a trader with several trades shows them as a real list of cost/result icons (handy since one trader having multiple trades is the common case), and picking a row pulls its cost items from your own inventory into the payment slots automatically, same as clicking an offer on a real villager - left-click the result to receive it and pay. A trader's trades are baked directly onto the spawned villager itself, so they're still there after closing and reopening the game - not lost on a server restart like an earlier build. KubeUIActions.registerTradePool(poolId, trades, condition?) still defines a weighted-random pool of trades from a script (with configurable stock/restocking and optional reputation/quest gating) for anyone who wants that lower-level control, and KubeUIActions.tagTradePool(entity, poolId) turns any entity into a trader that way instead. /kubeui villager-trades <target> inspects an entity's current trades/stock either way, and KubeUIActions.tradeHistory(player) reports what a player has already bought.

Quests: KubeUIActions.defineQuest(id, { title, description, requires, objectives, rewards }) defines a real, server-tracked quest - built-in objective types cover collecting items, killing a kind of entity, visiting a position or structure, and reaching an XP level, and any other type is a plain counter your own script bumps from whatever event it wants (KubeUIActions.incrementQuestObjective(...)), no callback registration needed. requires chains quests together (a quest only becomes available once its prerequisites are completed), and progress lives on your own player data - it's still there after closing the game entirely. KubeUI.questLog()//kubeui quest-log (also reachable as the shorter /quest) shows every quest and your progress on each, grouped by status; a small always-on-screen tracker (Track button in the log) shows your current objective without needing the log open. KubeUIActions.tagQuestGiver(entity, questIds)/ /kubeui tag-quest-giver turns any entity into a quest giver - right-clicking it opens a real Accept/Turn-in screen, server-verified on every click so nothing can be granted twice. /quest accept <questId>//quest complete <questId> do the same without needing a giver entity at all, for a server that wants quests reachable purely by id. /kubeui quest-editor composes a quest entirely in-game, no script required, and - unlike a script, which re-declares its quests every boot - saves it for real so it survives a server restart too.

Look & feel: KubeUIScreenBuilder.windowBackground(texture) gives a screen a real nine-slice panel drawn behind its whole content (not just a decorative strip) - the quest screens, recipe designer, trader designer, script editor, and recipe browser each now have their own real, custom-drawn panel texture instead of the plain default look: a dark panel with rounded corners and a soft glowing accent border, each screen's own accent color, sharing one consistent style so it's obvious at a glance which screen is open. The custom trader's trade/payment screens no longer reuse vanilla's villager trading texture either - they're now the same custom-drawn panel style, with real hand-drawn slot frames instead of texture-baked ones.

Fixes: a script's runServerAction handler is now actually wrapped in a try/catch server-side (a prior gap where a bug in one could take down the packet-handling thread); the quest board reference example now actually takes the required items from the player's inventory on completion instead of only checking a flag; a custom smelting/blasting/smoking recipe from the recipe designer now actually clears any existing recipe for the same input first, so it can't be silently shadowed by an existing one (e.g. a custom log recipe losing out to vanilla's own log-to-charcoal recipe); the trader designer's trade list and the recipe browser's ingredient arrow were sized wrong (a label with no explicit width silently claims the whole panel's width) and could overflow well past the screen on some window sizes - every built-in screen has been re-audited for the same mistake; a custom trader's trade-offer list built its menu slots in the wrong order internally, which could select the wrong offer when clicking a row in the list (not just a display glitch - the payment slots that filled in could genuinely be for a different trade than the one clicked).

Full documentation: github.com/Zynora-fr/KubeUI.

Requires KubeJS on NeoForge - see the README's Versions table for the exact Minecraft/NeoForge/KubeJS versions this build targets.

This mod has no additional files