HiveScale for Minecraft

The cross-server backend for a Minecraft network on Paper, Folia and Velocity. Matchmaking, one shared economy, network-wide moderation and worlds on demand, each behind a single SDK call. Here is what you get, and the call that drives it.

Matchmaking

Players queue from the lobby and HiveScale routes them to the best instance anywhere on the network, then transfers them. Boot a fresh SkyWars arena per match, or keep a pool of Bedwars games warm.

  • Auto-routes to the best server in the player's own region, or target a region yourself.
  • Capacity aware, so no instance gets slammed while another sits empty.
  • Returns a matched world too, for per-match instanced games.
// Queue a player from the lobby into SkyWars.
hive.matchmaking()
    .findServer(player.uuid(), player.name(), "skywars")
    .thenAccept(result -> {
      if (result.isSuccess())
        hive.transfer(player, result.matchedServer());
    });
Matchmaking docs

Player data

One profile per player, not one per box. Coins, ranks, stats and playtime read the same on every server, so the economy is shared and perks travel from server to server.

  • fetchPlayerData upserts the player and reads their profile back on join.
  • Currencies are network-wide balances; stats are namespaced per game.
  • First-seen engine and last-seen time come along for free.
// On join: load the network-wide profile and balances.
hive.player()
    .fetchPlayerData(player.uuid(), player.name(), "lobby", GameType.MINECRAFT)
    .thenAccept(data -> welcome(player, data.getCurrencies()));
Player data docs

Punishments

Bans, mutes and kicks apply across every Paper server and the Velocity proxy at once, and survive reconnects.

  • Punish by name even while the player is offline, resolved network-wide.
  • Optionally IP-based, and lift a ban (and the last IP) just as easily.
  • Query what is active before you act.
// Ban by name across the whole network, even while offline.
hive.punishments().createPunishmentByName(
    "Griefer123", PunishmentType.BAN, "Raiding", null,
    /* ipBased */ true, mod.uuid(), mod.name());
Punishments docs

Worlds

Boot an arena or a saved world on any node the moment it is needed, route the player in, and let it sleep when the round ends.

  • Open per-player or per-team worlds on demand.
  • Snapshots happen automatically; release a world when it goes idle.
  • A survival world stays safe; an arena stays disposable.
// Open a world on demand on any node, then route the player in.
hive.worlds().openPlayerWorld(player.uuid(), "skyblock", "island")
    .thenAccept(route -> { /* READY: send them now. LOADING: wait, then send. */ });
Worlds docs

Connecting a server

Add the SDK to your plugins and run the Hive core plugin on each box. Every Paper and Folia server, and the Velocity proxy, announces itself to the registry and heartbeats on boot, so the network always knows what is live. Your code just talks to it.

// Once at startup, in your plugin. The Hive core plugin
// already announced this box to the network on boot.
HiveSdk hive = HiveSdk.create(HiveSdkConfig.builder()
    .baseUrl("https://hub.hivescale.dev")
    .apiKey(System.getenv("HIVE_API_KEY"))
    .build());
Quickstart

Managed servers on your own Hetzner account

Don't want to touch infrastructure? HiveScale provisions game servers straight into your own Hetzner Cloud, so control and billing stay with you while we keep them wired to your network.

A Minecraft server provisioned on Hetzner, managed from the HiveScale dashboard
How managed servers work

Point your Paper, Folia and Velocity servers at one API key and the whole network is yours to talk to.