Skip to content
C++23, no external JVM

A Minecraft server
rewritten from scratch.

Written entirely in C++23 and shipped as one native binary per platform. No bundled JRE and no hidden Java process. It has no garbage collector to pause, and Java and Bedrock players share the same world.

Early development

Basalt is young and not finished. Expect unexpected behaviour, missing features and changes between releases, and keep backups of anything you care about.

# verify the download (SHA256SUMS comes with each release)
sha256sum --check --ignore-missing SHA256SUMS

# make it executable and start it
chmod +x BasaltServer-*
./BasaltServer-<version>-Linux-x64
Minecraft
26.3
Native, older versions supported
Cross-play
Built in
Java and Bedrock
Platforms
5
macOS, Linux, Windows
License
GPL-3.0
Open source
Two projects

The server and the proxy.

They share their entire network layer through Wire: one implementation of the protocol, used by both sides.

Basalt Server

The Minecraft server itself.

Vanilla parity is the goal for every system: same seed, same world, same drops, same redstone, same mobs, bugs included. Then a plugin platform on top of it.

  • Lua plugins in .bspkg packages, sandboxed
  • Bukkit plugins through Basalt Shim, no Java on the host
  • Linear regions; Anvil regions are read and converted

Basalt Proxy

One address in front of many servers.

A native proxy sharing Wire with the server: backends, forced hosts, fallback, forwarding and Java and Bedrock clients.

  • Lua plugins in .bppkg packages
  • Velocity, BungeeCord, BungeeGuard and Basalt forwarding
  • Velocity and BungeeCord plugin adapters planned after Shim
What you get

Native first, and nothing left behind.

The plugin API is Lua and it is the fast path. Everything else is here so that moving to Basalt does not cost you what your server already runs on.

Plugins in Lua, natively ? This is the fast path and the official API. Native plugins talk to the server directly, so anything performance sensitive belongs here.

The plugin API is Lua, packaged and versioned, running in a sandbox with an instruction budget and a memory ceiling. No process boundary, no serialisation, no second heap.

Java and Bedrock together

Both editions join the same world. Bedrock and older Java clients are translated at the edge, built in, with no proxy and no plugins to add. Bedrock support is newer and has known limits, listed in the documentation.

Vanilla parity, bugs included

The goal is the same seed, the same world, the same drops, damage, redstone and mobs. Where vanilla does something strange, Basalt aims to do the same strange thing. Parity is not complete yet.

No garbage collector

There is no JVM heap to size and no collector that can pause the tick. Memory is managed directly, so a stutter has a cause you can profile.

Bukkit plugins, without Java ? Shim executes Java bytecode and is built into the server. It starts only when a jar is present, and compatibility is still growing, so check the documentation for what is known to work.

Drop a Bukkit, Spigot or Paper jar into plugins/ and the server runs it on Basalt Shim, a Java machine embedded in the binary. Velocity and BungeeCord adapters for the proxy are planned.

One binary to deploy

A binary and a config folder. Nothing to install on the host and no runtime version to keep matched.

Plugins

Written in Lua, sandboxed by default.

Plugins are packaged with a manifest, code, resources and metadata, and run inside a sandbox with an instruction budget. A broken plugin is stopped without taking the server down.

Text is authored in MiniMessage and rendered through the component model, never through legacy colour codes.

Plugin documentation
hello.lua
on("player.join", function(e)
    e.player:send("<gradient:aqua:green>Welcome!</gradient>")
end)

Open source, all of it.

The server, the proxy, the network layer they share and this site are all public. Read the code, file an issue, send a patch, or fork it and take it somewhere else.