Skip to content

Rustic Server is Horizon’s server with a sandboxed plugin system. Create one from the launcher, host it where you want, add plugins that cannot take it down.

les-copains-smp · consoleexample
Video (example data): the console of a Rustic server shows a plugin that failed at start-up; it is updated from the Plugins tab and reloaded while the server keeps running.

Recorded in Rustic Launcher with example data: a plugin that failed at start-up, updated and reloaded while the server runs.

Robust where it counts.

Plugins run in a WebAssembly sandbox with fuel, memory and time limits. A trap, a panic or an infinite loop disables that plugin; the server goes on.

    • Every plugin runs isolated, in WebAssembly
    • Fuel, memory and time limited on every call
    • Error, panic or infinite loop: only that plugin is disabled
    • Updated and reloaded while the server runs
    • 0.37 µs for a host import round trip
    • 1.3 µs for a console command to a plugin
    • 21.3 µs for an event with 10 subscribed plugins
    • 180 ms cold compile, 0.24 ms from the cache
    • 5 official plugins, in English and French
    • rustic new, build, check, test, run --watch
    • Tests run the real .wasm in an in-memory server
    • Rustic Bridge (early): Bukkit and Paper jars isolated in a JVM
Example · server logonline

buggy: infinite loop

TPS before the fault20
TPS after the fault20

0players disconnected; only the faulty plugin is disabled

On this computer, on your own VPS over SSH, or reachable through Rustic Relay without port forwarding. Managed from the same screen.

  • Your computer

    On this computer

    Start a server next to your game. Console, players, backups and statistics in the launcher.

  • SSH

    On your own VPS

    Give the launcher your server's address: it installs, configures and updates Horizon over SSH, after checking the host key with you.

  • Invite code · temporary address

    Through Rustic Relay

    No port forwarding: friends join with an invite code or a temporary address, your own domain is optional.

Watch a faulty plugin get disabled while the game goes on, what a call into a plugin costs, and the limits every plugin runs under.

sandbox · crash and recoverexample
essentials-litepermschat-formatmenusmini-gamebuggyservertps 20.0
  1. [rustic] Rustic ready: 6 plugin(s) enabled (6 loaded, 0 failed)
  2. [rustic] [buggy] fuel-exhausted in event: … — the plugin is disabled
  3. server tick goes on · tps 20.0 · players stay connected
  4. > rustic reload buggy
  5. [rustic] reloaded buggy

Example in the server’s own log format. Limits per call: fuel, a wall-clock deadline and a memory cap.

measured cost per callcriterion · release build
  • host import round trip0.37 µs
  • console command into a plugin1.3 µs
  • event, 1 subscribing plugin2.2 µs
  • event, 10 subscribing plugins21.3 µs

Logarithmic bars. Source: docs/PERFORMANCE.md (Rust benchmarks of the server repo).

180 mscold compile (460 KiB plugin)
6.3 msfrom the disk cache
0.24 msfrom the memory cache

Default limits of each plugin

  • fuel_per_call = 50_000_000Instructions a plugin may run per call (default); an infinite loop runs out.
  • epoch_deadline_ms = 50Wall-clock deadline of one call; a plugin that hangs is stopped.
  • memory_mb = 64Default memory limit of a plugin, capped by the server (512 MB).

Written from scratch for Rustic, in English and French, each one a sandboxed .rplugin you can read, test and change.

  • Essentials Lite

    Spawn, homes, warps, teleport requests, /back, private messages and broadcasts, with a teleport warmup and cooldown.

    essentials-lite.rpluginWebAssembly
  • Perms

    Groups with inheritance and weights, prefixes, wildcard and negated nodes, temporary nodes, promotion tracks.

    perms.rpluginWebAssembly
  • Chat Format

    Per-group line formats, @mentions, anti-spam, link and word filters, mutes with expiry.

    chat-format.rpluginWebAssembly
  • Menus

    Chest menus built with the SDK’s Menu builder, and a recipe book of patterns to copy.

    menus.rpluginWebAssembly
  • Mini-game

    Spleef and King of the Hill: lobby countdown, timed rounds, live sidebar, a leaderboard.

    mini-game.rpluginWebAssembly
  • Or your ownrustic new starts from a template (basic, command, gui, service) with tests that pass out of the box.$ rustic new

Plugins are Rust crates built for WebAssembly with the Rustic SDK. Tests run your real plugin in an in-memory server from cargo test, MockBukkit-style, without starting a game.

use rustic::prelude::*;

#[rustic::handlers]
impl Greeter {
    #[command(name = "spawn", description = "Teleport to the spawn")]
    fn spawn(&mut self, cmd: &mut CommandCtx) -> CommandResult {
        let player = cmd.player()?;
        let spawn = World::overworld().spawn_location()?;
        player.teleport(&spawn)?;
        cmd.reply(Text::mini("<green>Welcome back to spawn!"));
        Ok(())
    }
}

A /spawn command: registered when the plugin is enabled, removed when it is disabled. From the first-plugin guide.

The rustic command
  • rustic new <id>A plugin crate from a template, with passing tests.
  • rustic buildCompile for wasm32-wasip2, check the component, package the .rplugin.
  • rustic checkValidate a manifest or a package, list what it asks for.
  • rustic testRun the plugin’s tests against the in-memory server.
  • rustic run --watchStart a dev server; every save rebuilds and hot-reloads the plugin.
  • rustic bridge analyzeTell which Bukkit plugin jars could run on Rustic Bridge.

Rustic Bridge runs existing Bukkit and Paper plugin jars, unmodified, in a JVM next to the server. If one gets stuck or crashes, the JVM is stopped and those plugins are disabled; the server goes on.

Rustic Bridge

early

Each jar becomes a Rustic plugin with its plugin.yml commands and permissions, its listeners at their priorities, its scheduler tasks and its config. Bukkit and WebAssembly plugins share the same events.

  • A separate JVM (sidecar): a stuck or crashing plugin cannot take the server down
  • A watchdog stops an unresponsive JVM; rustic reload bukkit-bridge brings the plugins back
  • Not yet: inventories, entities other than players, scoreboards, NMS
Methods of the proxied Bukkit interfaces implemented206 / 1,025 · 20 %Early: the long tail is missing. Weighted by use, the demo plugins’ 52 API members are all served. Source: docs/BUKKIT_MAPPING.md.
server log of a bot test (docs/BRIDGE.md)
  1. [bukkit-bridge] JVM started (pid 52956) in 178 ms
  2. Rustic ready: 4 plugin(s) enabled (4 loaded, 0 failed)
  3. System chat: Welcome, BridgeBot0!
  4. [Rustic Bridge] a plugin called System.exit(3); refused
  5. [Rustic Bridge Watchdog] the main thread has been busy for 3026 ms in `command (Probe)`
  6. [bukkit-bridge] the JVM did not answer within 5000 ms; the JVM (pid 52956) is stopped and the Bukkit plugins are disabled
  7. <BridgeBot0> the server survived a stuck plugin
  8. [bukkit-bridge] JVM started (pid 34884) in 193 ms

Create your first Rustic server from the launcher.

Free, with your own copy of the game. Plugins, console, players and backups on one screen.

Download