Frostyh Plugins

Plugins / SMPForge

SMPForge Coming soon

Set your SMP's rules in game: 64 mechanic switches, item and enchant limits, potion bans, rituals.

Get SMPForge

Coming soon Not on sale yet. This page gets a buy button the day it is.

Try it live

SMPForge runs on a public demo server, set up so you can use it yourself. Join, try it, then decide.

Address: try.zeropvp.xyz:25570 (Java Edition 1.21.11)

In Minecraft: Multiplayer, Add Server, paste the address, Join. Type /demo go smpforge to land at its booth, or right-click the compass and pick it. The world resets every night.

Overview

SMPForge

Settle every SMP rules argument on one screen, live, without another plugin or a restart

Every SMP ends up with the same list of arguments. Crystals or no crystals. How many totems is too many. Should elytras exist. Mending or not. Normally each answer costs another plugin, another config file and another restart.

SMPForge puts all of it on one screen. Open the panel, flip a switch, and the server changes while people are playing.

The control panel: combat, world, player and mob rules, presets, managers.

Latest version
1.1.0
Server
Paper or Purpur, Java 21
BuiltByBit
coming soon
What changed in 1.1.0
  • New: presets. Set the whole board in one click from the new Presets button on the panel, or with /smpforge preset <name>. Built in: vanilla, friendly, lifesteal, hardcore, uhc and no-crystals. A preset sets every switch and tuning number; item rules, enchant caps, recipes and rituals are never touched.
  • Save your own board with /smpforge preset save <name> (or the field on the Presets screen) and load it again later. Saved presets keep their potion bans and live in data/presets.yml, so they can be copied to another server. /smpforge preset delete <name> removes one.
  • /smpforge preset undo puts the board back to how it was before the last preset.
  • New: PlaceholderAPI support (optional). %smpforge_combat%, %smpforge_combat_seconds%, %smpforge_vanished%, %smpforge_rule_<id>% (for example %smpforge_rule_pvp%), %smpforge_rule_<id>_raw%, %smpforge_number_<id>%, %smpforge_rules_on% and %smpforge_rules_total%.
  • New: on a fresh install, the first admin who joins gets one chat message with buttons that open the panel and the presets. It shows once and can be switched off with first-run-tip: false. Servers that already ran SMPForge do not see it.
  • Tab completion for /smpforge preset.
  • Your existing config.yml keeps working and every new message works on it. The help line in an old config.yml does not mention presets until the file is regenerated.

Features

Why server owners pick it

What makes it different

Works with

What you get: the control panel

Combat rules as switches, live at once.

Built on Minecraft's own dialog screens, not a chest full of renamed glass. Four categories with 64 switches between them, and every one takes effect the moment you click it.

Presets set every switch at once: Vanilla, Friendly SMP, Lifesteal, Hardcore, UHC, No crystal PvP.

Tuning

Numbers, not just switches: PvP damage multiplier, knockback multiplier, ender pearl cooldown, invulnerable seconds after respawn, a ceiling height for elytra flight, combat tag length, minutes before AFK protection starts, a cap on mace damage and the anti-xray engine mode. Plus and minus buttons, no decimals typed into a config.

Item manager

Item manager: a cooldown and carry limit per item.

Every item in the game on pages, each one with:

Left-click raises the cooldown, right-click raises the limit, shift lowers either. Filter with /smpforge items totem, or switch the view to only the items you have already configured.

Enchant manager

One book per enchantment with its own cap. Lower Sharpness to 3, ban Mending outright, leave the rest vanilla. Caps apply at the enchanting table, at the anvil, and to gear that is already in someone's inventory, so an old Mending pickaxe does not survive the rule change. One button puts every cap back to vanilla.

Potion bans

Pick any effect and nobody can get it from a potion, a tipped arrow or a beacon.

Custom recipes

Draw your own crafting recipe in a 3x3 editor, put the result next to it, save, and it works in every crafting table at once.

Rituals

Turn a pattern of items into an event. Drop the items around an altar block, right-click it with the trigger item, and the ritual runs whatever commands you set: give a reward, start an event, revive a player, broadcast a line.

Staff tools

/smpforge start gathers everybody and counts down on screen.

FAQ

Which servers does it run on?

Paper or Purpur 1.21.11, with Java 21.

Do I need other plugins?

No. It runs on its own.

Is there DRM or a licence key?

No. There is nothing to activate and no licence server to reach, and the code is not obfuscated.

How long does setup take?

Drop the jar into /plugins and restart. The setup guide above has 4 short steps.

Can I try it before I buy?

Yes. This page has a test server with the plugin installed.

Where do I get help?

In the active support Discord, in the discussion tab on this page, or in the documentation.

Is there a quick start for a lifesteal or hardcore SMP?

Yes. Built-in presets (vanilla, friendly, lifesteal, hardcore, uhc, no-crystals) set every switch and tuning number in one click.

Updates

Released on September 16, 2026 and updated 4 times since. The latest version is v1.2.0 (October 16, 2026). Every update is free, new Minecraft versions included.

Also by Frostyh

If this plugin helps your server, a short review on this page would mean a lot. Thank you!

Installation

Requirements

Server software
Paper, or a Paper fork such as Purpur. Spigot and CraftBukkit are not supported: the plugin uses Paper-only APIs.
Minecraft version
plugin.yml api-version 1.21; built against Paper API 1.21.11
Java
21 or newer
Required plugins
none
Optional plugins
PlaceholderAPI

Steps

  1. Download SMPForge.jar from BuiltByBit. There is no licence key to enter.
  2. Stop the server and put the jar into the plugins folder.
  3. Start the server. The plugin creates plugins/SMPForge/config.yml with the defaults shown under Configuration.
  4. Edit config.yml to suit your server.
  5. Apply the changes with /smpforge reload (Reload config and data), or restart the server.

Setup guide

  1. Drop SMPForge.jar into /plugins and restart.
  2. Run /smpforge and go through the four categories once. It takes a few minutes and it is the whole setup.
  3. Optional: /smpforge items to give totems a cooldown or a carry limit, /smpforge enchants to cap what you do not want.
  4. Optional: /smpforge ritual new revive, build the pattern, add a command.

Lifesteal and hardcore SMPs: ban totems, cap Mending, limit gapples to a handful, and build a revive ritual that gives a heart back.

Story and content SMPs: close the End until the plot opens it, switch off crystal damage for a scene, turn PvP on for the finale.

Normal survival: turn off creeper griefing and phantoms, cap enchants, leave the rest alone.

Commands

From plugin.yml. "Not set" in the permission column means plugin.yml attaches no permission to the command itself; the nodes the plugin checks are listed under Permissions.

CommandAliasesUsageDescriptionPermission
/smpforge/forge, /smpf/smpforge [items|enchants|ritual|rule|preset|kit|start|vanish|invsee|endersee|webhook|once|reload]The SMPForge control panel.not set

Subcommands in detail

/smpforge                      Open the control panel.
/smpforge items [filter]       Open the item manager, optionally filtered.
/smpforge enchants             Open the enchant manager.
/smpforge ritual new <id>      Create a ritual and open its editor.
/smpforge ritual <id>          Edit a ritual.
/smpforge ritual <id> command <command>   Add a command to a ritual.
/smpforge ritual <id> clearcommands       Remove its commands.
/smpforge rule <id> [on|off]   Flip a rule from console or a command block.
/smpforge kit save|give [player]|clear    Save, hand out or forget the join kit.
/smpforge start [seconds]      The start countdown (3 to 60 seconds, default 10).
/smpforge vanish               Vanish or reappear.
/smpforge invsee <player>      Look at a player's inventory.
/smpforge endersee <player>    Open a player's ender chest.
/smpforge webhook <url|off>    Set or remove the admin command log webhook.
/smpforge once reset <item>    Let a one-craft-only item be crafted again.
/smpforge reload               Reload config and data.
/smpforge preset <name> · preset save <name> · preset delete <name> · preset undo

Permissions

From plugin.yml.

NodeDefaultDescriptionChildren
smpforge.adminoperatorsOpen the panel and change every rule.none
smpforge.bypassoperatorsIgnore every rule, item limit and enchant cap.none

Placeholders

Registered with PlaceholderAPI under the identifier smpforge (SMPForgePlaceholders.java). PlaceholderAPI must be installed for these to work.

PlaceholderReturns
%smpforge_combat%true or false: combat tagged right now
%smpforge_combat_seconds%seconds of combat tag left, 0 when free
%smpforge_vanished%true or false
%smpforge_rule_<id>%the on/off message for a rule, e.g. %smpforge_rule_pvp%
%smpforge_rule_<id>_raw%true or false for a rule
%smpforge_number_<id>%a tuning number, e.g. %smpforge_number_pvp-damage%
%smpforge_rules_on%how many switches are on
%smpforge_rules_total%how many switches there are

Configuration reference

The default files as they ship in the jar, with their comments. The plugin writes them to plugins/SMPForge/ on first start.

config.yml

Top-level keys:

KeyDefaultComment above it
worlds[] (empty list)SMPForge - the rules of your SMP, set from inside the game. Run /smpforge to open the control panel. Everything you change there is written to plugins/SMPForge/data/, so this file only holds the things you set once. Worlds the rules apply in. Empty means...
itemssection, 3 keysnone
enchantssection, 2 keysnone
ritualssection, 1 keynone
combatsection, 2 keysnone
startsection, 4 keysnone
warden-heartsection, 1 keynone
webhook"" (empty)A Discord webhook that hears every command an op or admin runs. Set it with /smpforge webhook <url>.
webhook-format"**{player}** ran `{command}`"none
webhook-hello"SMPForge is listening to admin commands."none
themesection, 11 keysEvery message below is written against these names, not against hex codes: <accent>Open</accent> rather than <#e0a333>Open</#e0a333>. Change a colour here and it changes on every screen at once. Ordinary MiniMessage still works, so <gradient:#a:#b> and...
messagessection, 249 keysnone
first-run-tiptrueOn the very first start: one console line and one chat message for the first admin who joins, with buttons that open the panel and the presets. Each shows once ever. false turns both off.
review-remindertrueOne thank-you line with the BuiltByBit review link: once in the console after install and once in chat for the first operator who joins. It never repeats and sends nothing anywhere. false turns it off.
plugins/SMPForge/config.yml
# SMPForge - the rules of your SMP, set from inside the game.
#
# Run /smpforge to open the control panel. Everything you change there is written to
# plugins/SMPForge/data/, so this file only holds the things you set once.
#
# Worlds the rules apply in. Empty means every world.
worlds: []

items:
  cooldown-step: 5        # seconds added per click in the item manager
  limit-step: 1           # carry limit added per right-click
  limit-check-ticks: 40   # how often carry limits are checked (20 ticks = 1 second)

enchants:
  scan-inventories: true  # trim items that already break a cap
  scan-ticks: 100

rituals:
  radius: 3.0             # how far from the altar dropped items count

combat:
  # Commands a combat-tagged player may still run. Everything else is refused until the tag ends.
  allowed-commands: [msg, r, tell, w, reply]
  kill-on-logout: true    # logging out while tagged counts as dying

start:
  teleport-to-spawn: true # gather everybody at spawn for the countdown
  clear-inventory: false  # wipe inventories when the SMP begins
  give-kit: true          # hand out the saved kit when it begins
  spread-radius: 0        # scatter players this far from spawn (0 = leave them at spawn)

warden-heart:
  max-health: 30          # the most health a player can reach with warden hearts (20 = 10 hearts)

# A Discord webhook that hears every command an op or admin runs. Set it with /smpforge webhook <url>.
webhook: ""
webhook-format: "**{player}** ran `{command}`"
webhook-hello: "SMPForge is listening to admin commands."

# ------------------------------------------------------------------------------------------------
# THEME
# ------------------------------------------------------------------------------------------------
# Every message below is written against these names, not against hex codes: <accent>Open</accent>
# rather than <#e0a333>Open</#e0a333>. Change a colour here and it changes on every screen at
# once. Ordinary MiniMessage still works, so <gradient:#a:#b> and <#ff0000> are fine anywhere.
theme:
  accent: "#e0a333"     # your colour: headings and anything the player is meant to click
  accent2: "#eecc8f"    # a lighter accent, for a second level of emphasis
  title: "#f4f7ff"      # screen titles
  text: "#c2ccdd"       # ordinary prose
  muted: "#6b7a94"      # hints, separators, anything the eye should skip
  value: "#ffffff"      # the numbers and names the player opened the screen to read
  good: "#57e08a"
  warn: "#ffc857"
  bad: "#ff6b6b"
  small-caps: false     # ᴇхᴀᴍᴘʟᴇ - a garnish; whole menus in it read badly
  # Real Minecraft item pictures beside the buttons and in the chest screens. Drawn from the
  # client's own textures, so there is nothing to install and no resource pack: it needs a
  # 1.21.9 or newer client, and older ones simply see the buttons as words.
  item-icons: true

messages:
  prefix: "<#c98b2e><bold>Forge</bold></#c98b2e> <muted>»</muted> "
  no-permission: "<bad>You cannot do that.</bad>"
  reloaded: "<value>Config and data reloaded.</value>"
  help: "<text>/smpforge · items [filter] · enchants · ritual <id|new <id>> · rule <id> [on|off] · preset <name|list|save|undo> · kit save|give|clear · start [seconds] · vanish · invsee <player> · endersee <player> · webhook <url|off> · once reset <item> · reload</text>"
  help-rule: "<text>/smpforge rule <id> [on|off]</text><newline><muted>{rules}</muted>"
  help-ritual: "<text>/smpforge ritual new <id> · /smpforge ritual <id> · /smpforge ritual <id> command <command> · clearcommands</text>"
  help-kit: "<text>/smpforge kit save · give [player] · clear</text>"
  help-webhook: "<text>/smpforge webhook <url|off></text>"
  help-once: "<text>/smpforge once reset <item></text>"
  help-preset: "<text>/smpforge preset <name> · preset list · preset save <name> · preset delete <name> · preset undo</text>"

  # ---- presets ----
  panel-presets: "<white><icon:board></white><value>Presets</value>"
  panel-presets-tip: "<text>Set the whole board at once: friendly, lifesteal, hardcore, UHC and your own.</text>"
  presets-title: "<#c98b2e><bold>Presets</bold></#c98b2e>"
  presets-intro: "<text>A preset sets every switch and number at once. Item rules, enchant caps, recipes and rituals stay as they are, and undo puts the board back.</text>"
  presets-apply: "<white><icon:board></white><value>{title}</value>"
  presets-apply-saved: "<white><icon:save></white><value>{title}</value><muted> (saved)</muted>"
  presets-saved-tip: "<text>A board you saved, potion bans included.</text>"
  presets-undo: "<white><icon:back></white><warn>Undo the last preset</warn>"
  presets-undo-tip: "<text>Puts every switch and number back to how it was before.</text>"
  presets-field: "<text>Save the current board as</text>"
  presets-save: "<white><icon:save></white><good>Save the current board</good>"
  presets-save-tip: "<text>Under the name above, to use again later. It is kept in data/presets.yml, so it can be copied to another server.</text>"
  preset-row: "<value>{preset}</value><text>: {help}</text>"
  preset-row-saved: "<value>{preset}</value><muted> (saved)</muted>"
  preset-applied: "<text>Preset </text><value>{preset}</value><text> applied: {on} of {all} switches on. </text><muted>/smpforge preset undo puts the board back.</muted>"
  preset-undone: "<text>The board is back to how it was before the last preset.</text>"
  preset-no-undo: "<bad>There is no preset to undo.</bad>"
  preset-unknown: "<bad>No preset called </bad><value>{preset}</value><bad>.</bad> <muted>/smpforge preset list</muted>"
  preset-bad-name: "<bad>A preset name is 1 to 24 lower case letters, digits, - or _.</bad>"
  preset-reserved: "<bad>{preset} is a built-in preset. Pick another name.</bad>"
  preset-saved: "<text>The board is saved as preset </text><value>{preset}</value><text>.</text>"
  preset-deleted: "<text>Preset </text><value>{preset}</value><text> deleted.</text>"

  # The one-time tip for the first admin who joins (first-run-tip below turns it off).
  first-run: "<text>SMPForge is installed. Set your SMP's rules in game: </text><click:run_command:'/smpforge'><hover:show_text:'Open the control panel'><accent><u>open the panel</u></accent></hover></click><text> or </text><click:run_command:'/smpforge preset'><hover:show_text:'Friendly, lifesteal, hardcore, UHC and more'><accent><u>start from a preset</u></accent></hover></click><text>. This tip only shows once.</text>"
  # These four names stay in quotes: YAML reads a bare on, off, yes or no as true or false,
  # and the message would never be found.
  "on": "on"
  "off": "off"
  "yes": "<good>yes</good>"
  "no": "<bad>no</bad>"
  none: "none"
  banned: "<bad>banned</bad>"
  every-world: "every world"
  close: "<white><icon:close></white><text>Close</text>"
  back: "<white><icon:back></white><text>Back</text>"
  back-tip: "<text>Back to the panel.</text>"

  # ---- panel ----
  panel-title: "<#c98b2e><bold>SMPForge</bold></#c98b2e>"
  panel-intro: "<text>Rules apply in: </text><value>{worlds}</value>"
  panel-category: "<white><icon:combat></white><value>{category}</value><text>  ({on}/{all} on)</text>"
  panel-category-tip: "<text>Switch {category} mechanics on and off.</text>"
  panel-numbers: "<white><icon:settings></white><value>Tuning</value>"
  panel-numbers-tip: "<text>Damage, knockback, cooldowns.</text>"
  panel-items: "<white><icon:items></white><value>Item manager</value>"
  panel-items-tip: "<text>Cooldowns, carry limits and bans per item.</text>"
  panel-enchants: "<white><icon:enchant></white><value>Enchant manager</value>"
  panel-enchants-tip: "<text>Cap or ban enchantments.</text>"
  panel-rituals: "<white><icon:ritual></white><value>Rituals</value>"
  panel-rituals-tip: "<text>Items on an altar that run commands.</text>"
  panel-potions: "<white><icon:empty></white><value>Potion bans</value><text>  ({count} banned)</text>"
  panel-potions-tip: "<text>Effects nobody may have from a potion, arrow or beacon.</text>"
  panel-recipes: "<white><icon:bind></white><value>Custom recipes</value><text>  ({count})</text>"
  panel-recipes-tip: "<text>Draw your own crafting recipes.</text>"
  panel-tools: "<white><icon:staff></white><value>Staff tools</value>"
  panel-tools-tip: "<text>The join kit, the starting gun, vanish.</text>"

  # ---- potion bans ----
  potions-title: "<#c98b2e><bold>Potion bans</bold></#c98b2e>"
  potions-intro: "<text>ON means players may have the effect. OFF bans it from potions, arrows and beacons.</text>"
  potions-tip: "<muted>Click to flip {effect}.</muted>"
  effect-banned: "<bad>That effect is banned on this server.</bad>"

  # ---- custom recipes ----
  recipes-title: "<#c98b2e><bold>Custom recipes</bold></#c98b2e>"
  recipes-intro: "<text>Every recipe here works in any crafting table, live.</text>"
  recipes-empty: "<text>No custom recipes yet. Name one below.</text>"
  recipes-field: "<text>Name for a new recipe</text>"
  recipes-new: "<white><icon:yes></white><good>New recipe</good>"
  recipes-new-tip: "<text>Opens the editor for the name above.</text>"
  recipes-edit: "<white><icon:bind></white><value>{id}</value><text>  makes {result}</text>"
  recipes-edit-tip: "<text>Open the recipe editor.</text>"
  recipe-gui-title: "<muted>Recipe: <value>{id}</value></muted>"
  recipe-slot-empty: "<text>Empty</text>"
  recipe-result-empty: "<text>Result</text>"
  recipe-slot-tip: "<muted>Hold an item and click to put it here.</muted>"
  recipe-slot-clear: "<muted>Right-click to clear.</muted>"
  recipe-arrow: "<muted>makes</muted>"
  recipe-info: "<value>Recipe {id}</value>"
  recipe-info-count: "<text>{count} ingredient(s) in the grid.</text>"
  recipe-info-no-result: "<muted>Put the result in the slot on the right.</muted>"
  recipe-info-live: "<good>Saved recipes work at once.</good>"
  recipe-save: "<good>Save</good>"
  recipe-save-tip: "<muted>Registers the recipe as drawn.</muted>"
  recipe-delete: "<bad>Delete this recipe</bad>"
  recipe-delete-tip: "<muted>Cannot be undone.</muted>"
  recipe-incomplete: "<bad>A recipe needs at least one ingredient and a result.</bad>"
  recipe-saved: "<text>Recipe </text><value>{id}</value><text> saved: it makes {item}.</text>"
  recipe-deleted: "<text>Recipe </text><value>{id}</value><text> deleted.</text>"

  # ---- staff tools ----
  tools-title: "<#c98b2e><bold>Staff tools</bold></#c98b2e>"
  tools-kit-saved: "<text>Join kit: </text><value>{count} item(s)</value>"
  tools-kit-none: "<text>Join kit: </text><muted>none saved</muted>"
  tools-webhook-set: "<text>Admin webhook: </text><good>on</good>"
  tools-webhook-none: "<text>Admin webhook: </text><muted>off · /smpforge webhook <url></muted>"
  tools-kit-save: "<white><icon:save></white><good>Save my inventory as the kit</good>"
  tools-kit-save-tip: "<text>Armour and off hand included.</text>"
  tools-kit-get: "<white><icon:kit></white><value>Give me the kit</value>"
  tools-kit-get-tip: "<text>To check what new players get.</text>"
  tools-kit-clear: "<white><icon:delete></white><bad>Forget the kit</bad>"
  tools-kit-clear-tip: "<text>Nothing is handed out until a new one is saved.</text>"
  tools-vanish: "Vanish"
  tools-vanish-tip: "<text>Players cannot see you; admins still can.</text>"
  tools-start-field: "<text>Countdown seconds</text>"
  tools-start: "<white><icon:announce></white><good>Start the SMP</good>"
  tools-start-tip: "<text>Counts down on every screen, then lets everybody go.</text>"
  kit-saved: "<text>Kit saved: </text><value>{count} item(s)</value><text>.</text>"
  kit-given: "<text>Here is your kit.</text>"
  kit-gave: "<text>Gave the kit to </text><value>{player}</value><text>.</text>"
  kit-cleared: "<text>Kit cleared.</text>"
  kit-none: "<bad>No kit saved. /smpforge kit save</bad>"
  kit-who: "<text>/smpforge kit give <player></text>"
  staff-who: "<text>Name an online player.</text>"
  vanish-on: "<text>You are </text><value>vanished</value><text>.</text>"
  vanish-off: "<text>You are </text><value>visible</value><text> again.</text>"
  invsee-title: "<muted>{player}'s inventory</muted>"
  webhook-set: "<text>Webhook set. Admin commands are reported there.</text>"
  webhook-off: "<text>Webhook off.</text>"
  once-reset: "<text>{item} can be crafted once more.</text>"
  start-already: "<bad>A countdown is already running.</bad>"
  start-title: "<value>{seconds}</value>"
  start-title-soon: "<#c98b2e><bold>{seconds}</bold></#c98b2e>"
  start-subtitle: "<text>The SMP starts soon</text>"
  start-go: "<#c98b2e><bold>GO!</bold></#c98b2e>"
  start-go-sub: "<text>Good luck.</text>"
  start-began: "<value>The SMP has begun.</value>"

  # ---- combat tag ----
  combat-tagged: "<bad>You are in combat. No commands, and logging out is a death.</bad>"
  combat-free: "<text>You are out of combat.</text>"
  combat-bar: "<bad>⚔ In combat </bad><value>{seconds}s</value>"
  combat-no-commands: "<bad>You cannot use commands in combat.</bad>"
  combat-no-water: "<bad>No water in a fight.</bad>"
  combat-logged: "<value>{player}</value><text> logged out in combat and died for it.</text>"

  # ---- the rest of the board ----
  afk-protected: "<text>{player} is AFK and cannot be hurt.</text>"
  breach-swap: "<bad>No breach swapping: hold the mace before you swing it.</bad>"
  death-invisible: "<text>{player} died.</text>"
  ban-on-death-reason: "<bad>You died. This SMP is one life only.</bad>"
  spectator-on-death: "<text>You died. You can watch, but that was your one life.</text>"
  health-tag: "<red>❤</red>"
  golden-head-name: "<#ffd25f><bold>Golden Head</bold></#ffd25f>"
  golden-head-lore: "<muted>Right-click: Regeneration II for 8s, Absorption for 2m.</muted>"
  golden-head-eaten: "<text>You feel the gold work.</text>"
  warden-heart-name: "<#3ee4d4><bold>Warden Heart</bold></#3ee4d4>"
  warden-heart-lore: "<muted>Right-click: one extra heart, for good.</muted>"
  warden-heart-used: "<text>You now have </text><value>{hearts} hearts</value><text>.</text>"
  warden-heart-full: "<text>Your heart cannot take any more.</text>"
  item-once-gone: "<bad>{item} has already been crafted on this server. There is only one.</bad>"
  item-once-single: "<bad>{item} is a one-off: craft it one at a time.</bad>"
  item-once-crafted: "<value>{player}</value><text> crafted the only </text><value>{item}</value><text>.</text>"

  # The icon rows: a small item beside a bold name and a grey line, so a screen can be scanned.
  row-category: "<accent><bold>{category}</bold></accent>"
  row-category-detail: "<text>{on} of {all} switched on</text>"
  row-number: "<accent><bold>{title}</bold></accent><text>  ·  </text><value>{value}</value>"
  row-number-detail: "<muted>{help}</muted>"
  row-ritual: "<accent><bold>{name}</bold></accent><muted>  {id}</muted>"
  row-ritual-detail: "<text>{items} item(s) on {altar}, trigger {trigger}</text>"
  category-title: "<#c98b2e><bold>{category}</bold></#c98b2e>"
  category-intro: "<text>Click a switch to flip it. Changes are live at once.</text>"
  switch-on: "<white><icon:yes></white><good><bold>ON</bold></good>  <value>{title}</value>"
  switch-off: "<white><icon:no></white><bad><bold>OFF</bold></bad> <text>{title}</text>"
  switch-tip: "<muted>Click to flip.</muted>"
  numbers-title: "<#c98b2e><bold>Tuning</bold></#c98b2e>"
  numbers-intro: "<text>Numbers that change how the game feels.</text>"
  numbers-line: "<value>{title}</value><text>: </text><#c98b2e>{value}</#c98b2e><text>  ·  {help}</text>"
  numbers-down: "<white><icon:down></white><text>-</text> <value>{title}</value>"
  numbers-up: "<white><icon:up></white><text>+</text> <value>{title}</value>"
  rituals-title: "<#c98b2e><bold>Rituals</bold></#c98b2e>"
  rituals-intro: "<text>Drop the items around the altar, right-click it with the trigger.</text>"
  rituals-line: "<value>{name}</value><text> ({id}): {items} item(s) on {altar}, trigger {trigger}</text>"
  rituals-empty: "<text>No rituals yet. /smpforge ritual new <id></text>"
  rituals-edit: "<white><icon:ritual></white><value>Edit {name}</value>"
  rituals-edit-tip: "<text>Open the ritual editor.</text>"

  # ---- item manager ----
  item-gui-title: "<muted>Item manager  <text>{page}/{pages}</text></muted>"
  item-name: "<value>{item}</value>"
  # An item that already has a rule on it is named in the accent colour and lit up, so the grid
  # says which ones you have touched without opening them one by one.
  item-name-ruled: "<accent>{item}</accent>"
  item-gui-help: "<white><icon:help></white><value>How this works</value>"
  item-gui-none: "<white><icon:items></white><muted>Nothing picked</muted>"
  item-gui-none-tip: "<text>Click an item in the grid. It shows up here.</text>"
  item-line-cooldown: "<text>Cooldown: </text><#c98b2e>{value}</#c98b2e>"
  item-line-limit: "<text>Carry limit: </text><#c98b2e>{value}</#c98b2e>"
  item-line-banned: "<text>Banned: </text>{value}"
  item-line-craft: "<text>Craftable: </text>{value}"
  item-help-left: "<muted>Left-click: cooldown +5s (shift: -5s)</muted>"
  item-help-right: "<muted>Right-click: carry limit +1 (shift: -1)</muted>"
  item-help-shift: "<muted>Middle-click: favourite</muted>"
  item-gui-filter: "<white><icon:search></white><value>All items</value>"
  item-gui-filter-tip: "<text>Filter: {filter}. Use /smpforge items <filter>.</text>"
  item-gui-configured: "<white><icon:items></white><value>Only configured</value>"
  item-gui-configured-tip: "<text>{count} item(s) have a rule.</text>"
  item-gui-ban: "<white><icon:ban></white><bad>Ban selected item</bad>"
  item-gui-ban-tip: "<text>Click an item first, then this.</text>"
  item-gui-craft: "<white><icon:items></white><value>Toggle crafting</value>"
  item-gui-craft-tip: "<text>Stops the selected item being crafted.</text>"
  item-gui-once: "<white><icon:tier></white><value>One craft only</value>"
  item-gui-once-tip: "<text>The selected item can be crafted once on the whole server.</text>"
  item-gui-glow: "<white><icon:hologram></white><value>Toggle glow</value>"
  item-gui-glow-tip: "<text>Gives every one of the selected item the enchantment shimmer.</text>"
  item-line-once: "<text>One craft only: </text><#c98b2e>{count} made</#c98b2e>"
  item-line-glow: "<text>Glows</text>"
  item-pick-first: "<text>Click an item in the grid first.</text>"
  item-updated: "<text>Updated </text><value>{item}</value><text>.</text>"
  gui-prev: "<white><icon:back></white><value>Previous page</value>"
  gui-next: "<white><icon:next></white><value>Next page</value>"
  gui-page: "<text>Page {page} of {pages}</text>"

  # ---- enchant manager ----
  enchant-gui-title: "<muted>Enchant manager  <text>{page}/{pages}</text></muted>"
  enchant-name: "<value>{enchant}</value>"
  enchant-line-cap: "<text>Max level: </text><#c98b2e>{value}</#c98b2e><text>  (vanilla {vanilla})</text>"
  enchant-help-left: "<muted>Left-click: cap +1</muted>"
  enchant-help-right: "<muted>Right-click: cap -1</muted>"
  enchant-help-shift: "<muted>Shift-click: ban</muted>"
  enchant-gui-reset: "<white><icon:enchant></white><value>Reset every cap</value>"
  enchant-gui-reset-tip: "<text>Back to vanilla levels.</text>"
  enchant-reset: "<text>Every enchant is back to vanilla.</text>"
  enchant-capped: "<text>An enchantment on your gear was lowered to this server's cap.</text>"

  # ---- rituals ----
  ritual-gui-title: "<muted>Ritual: <value>{name}</value></muted>"
  ritual-slot-empty: "<text>Empty slot</text>"
  ritual-slot-tip: "<muted>Hold an item and click to place it here.</muted>"
  ritual-slot-clear: "<muted>Right-click to clear.</muted>"
  ritual-altar: "<white><icon:ritual></white><value>Altar: {block}</value>"
  ritual-altar-tip: "<muted>Hold a block and click to change it.</muted>"
  ritual-trigger: "<white><icon:ritual></white><value>Trigger: {item}</value>"
  ritual-trigger-tip: "<muted>Hold an item and click to change it.</muted>"
  ritual-consume-on: "<good>Consumes the items</good>"
  ritual-consume-off: "<text>Leaves the items</text>"
  ritual-consume-tip: "<muted>Click to flip.</muted>"
  ritual-effects-on: "<good>Particles and sound</good>"
  ritual-effects-off: "<text>Silent</text>"
  ritual-effects-tip: "<muted>Click to flip.</muted>"
  ritual-delete: "<white><icon:delete></white><bad>Delete this ritual</bad>"
  ritual-delete-tip: "<muted>Cannot be undone.</muted>"
  ritual-info: "<value>Ritual {id}</value>"
  ritual-info-items: "<text>Needs {count} item(s) on the ground.</text>"
  ritual-info-command: "<text> - {command}</text>"
  ritual-info-no-commands: "<text>No commands yet: /smpforge ritual <id> command <command></text>"
  ritual-created: "<text>Ritual </text><value>{name}</value><text> created.</text>"
  ritual-deleted: "<text>Ritual </text><value>{name}</value><text> deleted.</text>"
  ritual-unknown: "<bad>No ritual called </bad><value>{id}</value>"
  ritual-command-added: "<text>{name} now runs {count} command(s).</text>"
  ritual-commands-cleared: "<text>Commands of {name} cleared.</text>"
  ritual-hold-block: "<text>Hold a block first.</text>"
  ritual-hold-item: "<text>Hold an item first.</text>"
  ritual-missing: "<text>The ritual needs </text><value>{count}x {item}</value><text> on the ground.</text>"
  ritual-done: "<#c98b2e>{ritual}</#c98b2e><text> completed.</text>"

  # ---- rules in play ----
  rule-unknown: "<bad>No rule called </bad><value>{rule}</value>"
  rule-set: "<value>{rule}</value><text> is now </text><value>{state}</value><text>.</text>"
  rule-off: "<bad>{what} are disabled on this server.</bad>"
  pvp-off: "<bad>PvP is off on this server.</bad>"
  too-high: "<bad>You cannot glide above Y {height}.</bad>"
  item-banned: "<bad>{item} is banned on this server.</bad>"
  item-no-craft: "<bad>{item} cannot be crafted here.</bad>"
  item-limit: "<text>You may only carry </text><value>{limit}x {item}</value><text>; the rest dropped.</text>"

# On the very first start: one console line and one chat message for the first admin who joins,
# with buttons that open the panel and the presets. Each shows once ever. false turns both off.
first-run-tip: true

# One thank-you line with the BuiltByBit review link: once in the console after install and once
# in chat for the first operator who joins. It never repeats and sends nothing anywhere. false turns it off.
review-reminder: true

Config guide

The annotated summary from the store page. Where it and the default file above differ, the file is what the plugin ships.

Almost nothing lives in config.yml, because the point is that you set the rules in game. What is there:

worlds: []              which worlds the rules apply in; empty = all of them
items:
  cooldown-step: 5      seconds added per click in the item manager
  limit-step: 1
  limit-check-ticks: 40
enchants:
  scan-inventories: true  trim gear that already breaks a cap
rituals:
  radius: 3.0           how far from the altar dropped items count
combat:
  allowed-commands: [msg, r, tell, w, reply]
  kill-on-logout: true
start:
  teleport-to-spawn: true
  clear-inventory: false
  give-kit: true
  spread-radius: 0
warden-heart:
  max-health: 30
webhook: ""             set with /smpforge webhook <url>
messages:               every line the plugin says, MiniMessage

Your rules, item rules, enchant caps and rituals are written to plugins/SMPForge/data/ as plain YAML, so you can copy them to another server.

FAQ

Which servers and versions does it run on?

It needs Paper or a Paper fork such as Purpur, because it uses Paper-only APIs (the dialog API for its menus, Adventure text components). Spigot and CraftBukkit are not supported. plugin.yml declares api-version 1.21, the jar is built against Paper API 1.21.11, and it needs Java 21 or newer.

Does it need other plugins?

No other plugin is required (plugin.yml has no hard dependencies). Optional: PlaceholderAPI (plugin.yml softdepend), used when present.

How do I apply config changes?

Edit plugins/SMPForge/config.yml and run /smpforge reload (reload config and data). A restart works too.

Does it run on Folia, or for Bedrock players?

Not tested on Folia, and plugin.yml does not declare folia-supported. Bedrock players (through Geyser) have not been tested either.

What licence do I get?

The licence terms are the BuiltByBit EULA shown on the listing. There is no licence key to enter, and the plugin never contacts a licence server.