Compatibility
Minecraft: Java Edition
Platforms
Links
Tags
Creators
Details
xLimbo
A rock-solid fallback / limbo server plugin for Paper (Pufferfish) networks. When your
main server crashes, restarts or becomes unreachable, players routed to xLimbo land in an empty
void world ā creative mode, flight enabled, on an unbreakable glass floor ā so they stay connected
to the network instead of being disconnected. When the main server is back, they hop straight over
with /join (or automatically).
xLimbo is built to never go down: every code path fails safe. It never throws out of enable/reload, never blocks the main thread, never disables itself on a bad config value, and no single player action can lag, crash, grief or escape the sandbox.
⨠Features
- Void world owned by the plugin ā created programmatically with an ultra-cheap generator (one shared glass-floor layer per chunk; caves, decorations, structures, mobs and noise all disabled). Ephemeral: autosave off, spawn chunks not kept loaded, optional safe reset on restart.
- Join flow ā players are put in creative + flight and async-teleported to a bounded, spread-out random spawn (chunk preloaded first, so the join tick never blocks on generation).
- World border bounds all roaming and caps total chunk generation; random spawns always land inside it.
/joinā sends the player to the main server via the proxy (BungeeCordConnectmessage), with configurable aliases, permission and a per-player cooldown to stop proxy spam.- Optional auto-join ā send players back automatically after a delay.
- Optional action bar ā repeating hint (component parsed once, reused each cycle).
- Message control ā suppress join/quit/death broadcasts; optional custom join message and chat clear. All text is MiniMessage and fully configurable.
/xlimbo reload//xlimbo infoā reload re-reads and re-validates config and re-applies live. A few settings are restart-only:join-command.aliases,world.name,world.floor-yandworld.floor-block(the world/generator is fixed at creation).- Exploit resistance (all individually toggleable, safe defaults on): unbreakable floor, void rescue, blocked portals, no liquids, no gravity blocks, no fire, no explosions, no mob spawns, no redstone, no item drops, entity-item blocking + periodic cleanup, and an optional build-rate guard against lag machines.
š¦ Requirements
- Paper 1.18.2+ (or a fork like Pufferfish / Purpur)
- Java 21 runtime
š Install
- Grab a jar (see Downloads below) and drop it in your xLimbo server's
plugins/folder. - Start the server once ā xLimbo creates the
xlimboworld and writes a defaultconfig.yml. - Edit
plugins/xLimbo/config.ymlto taste, then run/xlimbo reload(most settings apply live; aliases,world.name,floor-yandfloor-blockneed a restart). - Point your proxy's fallback/xlimbo server at this instance and set
main-serverin the config to the proxy name of the server you want/jointo send players to.
āØļø Commands & permissions
| Command | Permission | Default | Description |
|---|---|---|---|
/join (+ aliases) |
xlimbo.join |
everyone | Connect to the main server. |
/xlimbo reload |
xlimbo.admin |
op | Reload + re-apply config live. |
/xlimbo info |
xlimbo.admin |
op | Show build/version + runtime status. |
āļø Recommended server-level tuning
Some performance and security tuning lives outside the plugin. For a fallback server that should stay flat under load:
server.propertiesview-distance=4,simulation-distance=4(xLimbo also sets these per-world, but the global default matters for any other world and for the initial spawn world).spawn-protection=0,allow-nether=false.online-mode=falseonly behind a proxy ā and only with secure forwarding (below).
spigot.ymlā lowerentity-tracking-rangevalues andmerge-radius; keepview-distancein step.pufferfish.yml/ Paper'sconfig/paper-world-defaults.ymlā tighten entity activation ranges, disable ticking far from players, and keepmax-auto-save-chunks-per-ticklow (xLimbo runs with autosave off anyway).- Proxy forwarding security (important): the
/join"Connect" plugin message can be spoofed by clients if forwarding isn't secured. Configure Velocity modern forwarding (or a BungeeCord IP-forwarding guard / firewall so only the proxy can reach the backend) so players can't impersonate the proxy or move themselves around the network. The plugin cannot enforce this ā it must be set up on the proxy + server.
ā” How it stays fast & stable
- Immutable settings snapshot. Config is parsed once into an immutable object (with MiniMessage
components pre-parsed) and swapped atomically on
/xlimbo reload. No hot path ā per-tick, per-chunk or per-event ā ever readsgetConfig()or re-parses MiniMessage. - O(1) generation. The generator writes one floor layer and disables every vanilla phase via
the
shouldGenerate*hooks, with a single fixed biome. Chunk cost is flat no matter how far players roam, and the world border caps how far that can go. - Async where it matters. Join teleports use
teleportAsyncaftergetChunkAtAsyncpreloads the destination, so the join tick never blocks on generation. World creation happens once at startup, never during ticks; the optional world reset uses an absolute path, never throws and never runs while players are on. - Ephemeral world. Autosave off, spawn chunks not kept in memory, reduced view/simulation distance ā the world doesn't bloat disk or RAM.
- Register only what's enabled. Listeners and tasks are only registered for enabled features, and torn down/rebuilt cleanly on reload ā no leaked tasks, no dead handlers.
- Fail-safe everywhere.
onEnable/reloadare wrapped so they can never throw out; a failing feature is logged and skipped rather than taking the server (and everyone on the network) down.

