A Minecraft server in Rust.
Paper plugins run without a rewrite.
Engine, networking, worldgen and lighting are Rust, with no GC pauses. A real paper-api.jar lives in a JVM inside the server process. One binary: game data and the plugin API are embedded.
chunkwake setup --dir ./serverWindows x86_64 · Linux x86_64 (musl) · Java 25+ only for plugins
One bench. Two servers.
Not synthetic: the same world, the same bots and the same scenarios. Switch metrics and see where the difference actually shows up.
Ordinary Paper plugins on a multithreaded core.
Chunkwake runs Paper plugins while the engine is built around Rust and tokio.
| Core | Paper/Folia plugins | Multithreading |
|---|---|---|
| Paper | Ordinary plugins | Single main thread |
| Folia | folia-supported only | Regions |
| Chunkwakethis | Paper and Folia APIs | By stages |
The compatibility boundary is plugins that reach into NMS and CraftBukkit internals. Vanilla classes are on the classpath and some of those plugins work; this is not promised in full.
World, mechanics and plugins already work.
World generation, redstone, mobs, inventory and plugins are implemented. The line-by-line status matrix is in the docs.
World
- Vanilla overworld generation
- Nether and End
- Anvil read and write
- Light, spawn, world border
- Villages and structures
Mechanics
- Redstone and pistons
- Fluids, fire, random ticks
- Mobs, projectiles, XP
- Furnaces, anvil, stations
- Signs and books
Plugins
- The real paper-api.jar
- Events in Paper order
- Folia schedulers
- Maven libraries, loader/bootstrapper
- NMS classes on the classpath
Operations
- One binary
- setup, doctor, config set
- Backups and rollback
- Built-in metrics dashboard
- Vanilla commands
Plugins compile and run as they do on Paper.
The official paper-api.jar is on the classpath. The API behaviour is implemented, so code compiles and runs as it does on Paper.
- Bukkit and Paper events in Paper order, with cancellation and data replacement.
- GlobalRegionScheduler, RegionScheduler, AsyncScheduler and EntityScheduler for every plugin.
- plugin.yml and paper-plugin.yml, Maven libraries, loader and bootstrapper.
- PDC, Metadatable, registries, tags, attributes and plugin channels.
Plugins need Java 25+. The server finds it via java-path, CHUNKWAKE_JAVA or PATH.
public final class HelloPlugin extends JavaPlugin {
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(new Listener() {
@EventHandler(priority = EventPriority.NORMAL)
public void onJoin(PlayerJoinEvent event) {
event.getPlayer().sendMessage("chunkwake is awake");
}
}, this);
}
}class HelloPlugin : JavaPlugin() {
override fun onEnable() {
server.pluginManager.registerEvents(object : Listener() {
@EventHandler(priority = EventPriority.NORMAL)
fun onJoin(event: PlayerJoinEvent) {
event.player.sendMessage("chunkwake is awake")
}
}, this)
}
}name: HelloPlugin
version: 1.0.0
main: dev.chunkwake.hello.HelloPlugin
api-version: "26.3"A Rust core with plugins in the JVM.
The core and the world live in Rust. Plugins live in a real JVM next to it through a JNI bridge. If an event has no listeners, Rust never sends it anywhere.
crates/
├── protocol packets 26.3, NBT, text components
├── net connections, game, commands, events
├── worldgen noise, biomes, surfaces, structures
├── world chunks, palettes, Anvil, light
├── bridge JVM over JNI, embedded API
├── server binary: CLI, setup, console, backups
├── metrics metrics and dashboard
└── lab vanilla comparison and benchmarks
java/
├── api-impl Bukkit / Paper / Folia on top of Rust
└── test-plugin live event checksWhat is planned.
These features are not in a release yet. The design is described in ARCHITECTURE.md.
Parallel ticking with Paper semantics
Plugins see one main thread while executing in parallel.
Dynamic islands instead of regions
The world is split by load, not by Folia’s fixed grid.
The world as an event log
Rollback and replay instead of whole-world backups.
An FFM bridge with shared memory
The next generation of the Rust/JVM boundary.
Try it on your server.
Release builds will appear here as soon as the first tag ships. For now, build from source in a couple of minutes.
chunkwake setup --dir ./server