BlazeBans/Start here

Servers and scope

Every punishment carries a scope. Scope decides which servers enforce it. On a single server this barely matters; on a network it is the setting that determines whether a ban actually stops someone.

The two scopes

Global. The record applies everywhere that shares the database. Stored with scope global and no server ID.

Server. The record applies only on the server whose ID it was stored against. Stored with scope server and that ID.

A server enforces a record when the record is global, or when the record's server ID matches its own server.id. Records that match neither are still stored and still show in history. They are just not applied here, which is exactly what you want when a hub and a survival server share one database.

Configuring the default

In settings.yml:

yaml
server:
  # Unique per server. Lowercase letters, digits, dots, dashes, underscores.
  id: "survival"

  # Shown to players and staff in messages.
  display-name: "Survival"

  # "server" or "global"
  scope: "server"

scope is the default applied when a command does not say otherwise. It does not restrict what staff can choose; it decides what happens when they choose nothing.

Server IDs are normalised before storage: lowercased, and any character outside a-z 0-9 . - _ becomes a dash. A blank ID becomes default. Pick the final ID before staff start punishing, because renaming it later orphans every record stored against the old one.

Choosing per punishment

Any punishment command accepts --scope:

minecraft
/ban Steve 30d Cheating --scope server:global
/mute Steve 1h Spam --scope server:this
/ban Steve 7d Griefing --scope server:creative
ValueMeaning
server:globalEverywhere. global, all, *, server:all, and server:* are the same thing
server:thisThis server only, using its configured server.id
server:<id>One named server, whether or not you are on it

An unrecognised bare value is treated as a server ID, so --scope creative and --scope server:creative mean the same thing.

Who can use which scope

Scope is permission-gated so a moderator on one server cannot quietly ban someone from the whole network.

NodeGrants
blazebans.scope.globalIssuing global punishments
blazebans.scope.server.<id>Issuing punishments scoped to that specific server
blazebans.adminAny scope

Punishing on your own server is always allowed with no scope node at all: if the resolved scope matches the local server.id, the check passes. Console bypasses the check entirely.

Common setups

Single server, no proxy

yaml
server:
  id: "main"
  display-name: "The Server"
  scope: "global"

Global by default. There is no second server for a local scope to distinguish, and global records are simpler to reason about if you add a proxy later.

Network with a shared punishment policy

Every backend and the proxy point at the same database. Each has its own id. All of them set:

yaml
server:
  scope: "global"

Ban once, banned everywhere. Grant blazebans.scope.server.<id> to server-specific staff who should only be able to punish locally.

Network with independent servers

Same shared database, scope: "server" on each. A ban on the minigame server does not touch survival. History is still shared, so staff on either server can see the whole record before deciding. Grant blazebans.scope.global only to network administrators.

What scope does not do

Scope controls enforcement, not visibility. /history and /lookup show every record for a player regardless of where it was issued, and the entry says which server it came from. That is deliberate: a moderator deciding on a punishment should see that the player was banned on another server last week.

The same applies to alt lookups, staff history, and the profile menus. Only enforcement is scoped.

Proxy and backend together

Running BlazeBans on both the Velocity proxy and the backend servers is the usual network setup.

The proxy checks bans at connection time and refuses the connection before the player reaches a backend. That produces the ban screen on the server list rather than a join-then-kick, and it means one lookup instead of one per backend.

Backends still need BlazeBans for mutes, warnings, chat enforcement, the GUIs, and AutoMod, since none of those exist at the proxy layer. Give the proxy its own server.id (proxy works) so its own records are distinguishable.