Skip to content

Migrating from Bukkit / Spigot / Paper to Pumpkin ​

This guide covers architectural and configuration differences when transitioning a server from Bukkit, Spigot, or Paper to Pumpkin.


1. Architectural Differences ​

AspectBukkit / Spigot / PaperPumpkin
Runtime EnvironmentJava Virtual Machine (requires Java 17/21+)Native executable (compiled Rust, no Java required)
Startup Commandjava [flags] -jar server.jar./pumpkin
Tick LoopSingle-threaded tick loop with async worker offloadingMultithreaded tick execution across CPU cores
Plugin FormatJava bytecode (.jar) targeting Bukkit APIWebAssembly (.wasm), or .jar via PatchBukkit
Plugin LanguagesJava, Kotlin, ScalaRust, Python, Kotlin, C#, Go, C
Configurationserver.properties, paper.yml, spigot.ymlpumpkin.toml (TOML format)
Memory ManagementJVM Garbage CollectionNative OS memory allocation

2. Plugins & Extensions ​

WebAssembly Plugins ​

Pumpkin's primary plugin format is WebAssembly (.wasm):

  • Isolation: Plugins run in a sandboxed WebAssembly runtime.
  • Language Support: Plugins can be compiled to WASM from Rust, Python, Go, C#, C, or Kotlin.
  • Custom Plugins: For porting custom Bukkit plugins to Pumpkin, see the Developer Migration Guide.

Bukkit Plugin Compatibility: PatchBukkit ​

For servers relying on existing Bukkit/Spigot .jar plugins, the PatchBukkit project provides a compatibility layer:

  • Architecture: PatchBukkit embeds a JVM within Pumpkin and reimplements parts of the Bukkit API, bridging calls to Pumpkin via JNI and FFI.
  • Plugin Location: Compatible .jar plugins are placed in patchbukkit/patchbukkit-plugins/.
  • Status & Limitations: PatchBukkit is in active development. While standard Bukkit API calls are supported, plugins that depend on internal NMS (net.minecraft.server) classes, CraftBukkit internals, or bytecode manipulation may not function properly.
  • Java Requirement: Running PatchBukkit requires a Java runtime (JRE/JDK) installed on the host system to run the embedded JVM.

3. Configuration & Properties ​

Pumpkin uses TOML configuration files instead of server.properties and YAML:

Paper / Spigot (server.properties)Pumpkin (pumpkin.toml)
server-port=25565server_address = "0.0.0.0:25565"
motd=...motd = "A Pumpkin Server"
max-players=20max_players = 20
online-mode=trueonline_mode = true
view-distance=10view_distance = 10
simulation-distance=8simulation_distance = 8

4. World & Data Storage ​

  • Format Compatibility: Pumpkin reads standard Anvil chunk format (.mca files).
  • Directory Layout: Ensure dimension directories (world, world_nether, world_the_end) match Pumpkin's expected layout when copying world folders from existing Paper/Spigot installations.
  • Latest World & Data Pack Format Required: At least for now, Pumpkin only supports the latest world format and latest data pack format for its target Minecraft release. Older world formats or legacy data pack versions are not automatically converted at runtime.
    • Upgrading Worlds in the Client: If migrating an older world, upgrade it first before loading it in Pumpkin. You can update a world directly in the official Minecraft client: open the client on the matching latest version, navigate to Singleplayer, select the world, click Edit, and choose Optimize World. Alternatively, you can run the world once on a vanilla server matching the latest version.
    • Data Packs: Ensure all data packs located in world/datapacks are updated to the pack format expected by the target release.

5. Startup & JVM Flags ​

No Java Installation Needed ​

Pure Pumpkin is a self-contained native executable. You do not need a Java runtime (JRE/JDK) installed on your system or inside your container to run the server.

Startup Commands ​

Paper and Spigot servers often use JVM startup scripts with heap allocation and garbage collection flags (such as Aikar's Flags):

bash
# Common Paper startup command with Aikar's Flags:
java -Xms10G -Xmx10G \
  -XX:+UseG1GC \
  -XX:+ParallelRefProcEnabled \
  -XX:MaxGCPauseMillis=200 \
  -XX:+UnlockExperimentalVMOptions \
  -XX:+DisableExplicitGC \
  -XX:+AlwaysPreTouch \
  -XX:G1NewSizePercent=30 \
  -XX:G1MaxNewSizePercent=40 \
  -XX:G1HeapRegionSize=8M \
  -XX:G1ReservePercent=20 \
  -XX:G1HeapWastePercent=5 \
  -XX:G1MixedGCCountTarget=4 \
  -XX:InitiatingHeapOccupancyPercent=15 \
  -XX:G1MixedGCLiveThresholdPercent=90 \
  -XX:G1RSetUpdatingPauseTimePercent=5 \
  -XX:SurvivorRatio=32 \
  -XX:+PerfDisableSharedMem \
  -XX:MaxTenuringThreshold=1 \
  -Dusing.aikars.flags=https://mcflags.emc.gs \
  -Daikars.new.flags=true \
  -jar paper.jar --nogui
bash
# Linux / macOS:
./pumpkin

# Windows:
./pumpkin.exe

# Docker:
docker run -p 25565:25565 -v ./data:/data pumpkinmc/pumpkin:latest

Memory Differences ​

  • No Garbage Collector: Pumpkin is written in Rust and uses deterministic compile-time memory management (RAII). There is no runtime garbage collector or GC pause tuning.
  • No Fixed Heap Allocation: Flags like -Xms and -Xmx do not exist in native binaries. Memory is allocated from the OS dynamically as chunks and entities load, and returned when they unload.
  • JVM Flags Do Not Apply: Flags tuning garbage collection strategies, generational sizing, or JVM internals are not needed and cannot be passed to the binary.

Admin Checklist ​

Released under the MIT License.