Paper vs Fabric vs Forge: which Minecraft server type to run
Plugins or mods, who has to install what, which one holds 20 TPS, and which one your friends group actually needs. With a decision table and the Docker settings for each.
· 8 min read
What actually differs
Every Minecraft server runs the same game logic. The server types differ in how they let you change it.
- Vanilla is Mojang's server jar. No extension point beyond datapacks and commands. Any client on the same version joins.
- Paper (and Purpur, a fork of Paper with more configuration) is a performance-focused fork of Spigot. It runs plugins: server-side code written against the Bukkit API. Plugins live in
plugins/, and because they only run on the server, unmodified vanilla clients join. Players never install anything. - Fabric is a lightweight mod loader. It runs mods that patch the game itself, which means mods that add blocks, items, or dimensions must also be installed on every player's client. A subset of Fabric mods are server-side only, mostly performance and admin tools.
- Forge and NeoForge are the loaders behind large modpacks. Same rule: content mods must match between server and client. NeoForge forked from Forge in 2023; for 1.20.1 and older you want Forge, and for 1.21 and newer most of the modding ecosystem has moved to NeoForge.
| Vanilla | Paper / Purpur | Fabric | Forge / NeoForge | |
|---|---|---|---|---|
| Extends with | datapacks | plugins (plugins/) | mods (mods/) | mods (mods/) |
| Players install anything? | no | no | yes, for content mods | yes |
| Vanilla client can join? | yes | yes | only if every mod is server-side | rarely |
| Typical use | small groups, purists | survival with admin tools, minigames, land claims | lightweight modded, optimized vanilla | big modpacks |
Performance in practice
Paper's reason to exist is per-tick efficiency: async chunk loading, entity activation ranges, configurable tick rates for hoppers and mob spawning, and dozens of smaller fixes. On the same hardware and the same world, Paper typically holds 20 TPS at player counts where vanilla starts dropping ticks, and it exposes a tps command so you can watch it. The trade is that a handful of optimizations change technical behavior (some redstone and farm mechanics), which purists notice and most groups do not.
Fabric on its own performs like vanilla, because it is vanilla with a hook system. Add Lithium (game logic), FerriteCore (memory), and Krypton (networking) on the server and you get much of Paper's headroom while keeping vanilla mechanics exact. Technical players favor this combination for that reason.
Forge and NeoForge carry more loader overhead, and the mods people run on them are heavy: a 150-mod pack loads far more entities, block entities, and event handlers per tick than any plugin server. The loader is not the bottleneck; the pack is. Budget memory accordingly (see troubleshooting) and expect longer startup times.
Version availability lag
Server software trails Mojang releases, and the lag differs by loader. This matters more than it looks: if your group updates their clients on release day and the server cannot follow, nobody can join.
| Loader | Typical lag after a Minecraft release | What is usually behind |
|---|---|---|
| Vanilla | none | nothing |
| Paper | days to a couple of weeks; early builds are marked experimental | some plugins |
| Fabric | loader the same day; Fabric API within days | individual mods, weeks to months |
| NeoForge | days to weeks for the loader | most mods, months; large packs, longer |
| Forge | weeks | mods; a large share stayed on 1.20.1 |
The practical consequence: pin VERSION in your compose file and move only when the plugins or mods you depend on have moved.
What a friends group usually wants
Most groups do not need mods. They need a survival world that stays up, a whitelist, and a few conveniences. That points to Paper. Plugins for land claims, sleep voting, teleport homes, and scheduled backups cover the requests that actually come up, and nobody installs anything on their client.
The exceptions are specific:
| If your group... | Run |
|---|---|
| wants vanilla mechanics exactly, with a handful of players | Vanilla |
| wants the vanilla feel plus admin tools and better TPS | Paper |
| has technical players who care about redstone parity | Fabric with Lithium and FerriteCore |
| already agreed on a modpack from CurseForge or Modrinth | whatever the pack targets (Forge, NeoForge, or Fabric) |
| wants minigames and a deep plugin ecosystem | Paper or Purpur |
If you are unsure, start on Paper. The world carries over if you change your mind.
How each runs in the itzg image
The itzg/minecraft-server image installs any of these from one environment variable. VERSION sets the Minecraft version in every case; the second variable pins the loader build when you need to.
| Type | TYPE= | Pin the loader with | Content goes in |
|---|---|---|---|
| Vanilla | VANILLA (default) | nothing | datapacks inside the world folder |
| Paper | PAPER | PAPER_BUILD | /data/plugins |
| Purpur | PURPUR | PURPUR_BUILD | /data/plugins |
| Fabric | FABRIC | FABRIC_LOADER_VERSION | /data/mods |
| Forge | FORGE | FORGE_VERSION | /data/mods |
| NeoForge | NEOFORGE | NEOFORGE_VERSION | /data/mods |
A Paper server for a friends group looks like this:
services:
mc:
image: itzg/minecraft-server:latest
container_name: minecraft-server
environment:
EULA: "TRUE"
TYPE: "PAPER"
VERSION: "1.21.1"
MEMORY: "4G"
RCON_PASSWORD: "change-this-to-something-long"
ports:
- "25565:25565"
- "127.0.0.1:25575:25575"
volumes:
- ./data:/data
restart: unless-stopped
stop_grace_period: 2mSwap TYPE and the same file runs Fabric or Forge. Content goes into ./data/plugins or ./data/mods on the host, followed by a restart. The image can also fetch it for you: MODRINTH_PROJECTS takes a list of Modrinth project slugs (on Fabric, include fabric-api, which most mods require), and SPIGET_RESOURCES takes SpigotMC resource IDs for plugins. The full walkthrough of the rest of that file, including Podman, is in Run a Minecraft server in Docker on Linux.
Migrating between them
The world is the part that carries. Plugins and mods never do, because they are different APIs entirely.
- Stop the server and take a full copy of
data/. - Note what carries:
world/(and on Paper,world_nether/andworld_the_end/),server.properties,whitelist.json,ops.json,banned-*.json, and player data inside the world. - Note what does not: everything in
plugins/ormods/, and any config those wrote. You will source equivalents for the new type. - Vanilla to Paper: change
TYPEand start. Paper splits the Nether and End into separate world folders automatically on first boot. - Paper back to vanilla: move the region files from
world_nether/DIM-1andworld_the_end/DIM1back underworld/first, or the Nether and End come up empty. - Any modded loader to Paper or vanilla: blocks and items from mods no longer exist and are dropped as air or missing entries when chunks load. Only do this if the world was effectively vanilla.
- Fabric to Forge or the reverse: the world loads, but each mod's blocks vanish unless the same mod exists for the new loader under the same IDs.
Run the migrated server once, check the log for chunk errors, and join before deleting the copy from step 1.
Where MineUI and the companion mod fit
MineUI is a desktop app that attaches to a Minecraft server container. It does not care which TYPE the container runs; it reads /data the same way. The Mods page lists both /data/mods and /data/plugins and lets you upload a jar or fetch one from a URL, the config editor opens server.properties and files under config/, and the RCON console runs allowlisted commands against any of them. The tps command in that console returns real data on Paper and Purpur, which report tick rate over RCON; vanilla, Fabric, and Forge do not have that command.
MineUI's Simple mode, which creates and supervises a server for you without containers, is vanilla only. It downloads the official server jar and verifies its SHA-1; it does not install Paper, Fabric, or Forge. To run any of those, use the container route above and attach.
The optional companion, mineui_server_utils, runs inside the server JVM and feeds MineUI real tick-based TPS and MSPT, per-dimension chunk and entity counts, and the actual loaded mod or plugin list. Its current state, at version 0.2.0:
- a Forge mod built against Forge 47.x for Minecraft 1.20.1; it will not load on other Forge versions or on NeoForge;
- a Paper/Bukkit plugin compiled against the 1.20.1 API (
api-version: 1.20), which also loads on Spigot, Purpur, Folia, and Bukkit-compatible hybrids; - no Fabric or NeoForge adapter yet; the core is loader-agnostic and adding one means writing a new adapter module;
- no packaged release yet; you build the jars with the repo's Gradle wrapper and JDK 17.
Without it, MineUI still shows status, players, logs, and container metrics for every server type. Installation and the attach flow are on the Getting Started page.
Troubleshooting
Clients are rejected with "Incompatible mods" or a mod rejection list. Forge and NeoForge require the client to have the same content mods as the server, on the same loader and Minecraft version. Compare the two mods/ folders; the rejection screen names the missing or mismatched mods. On Fabric the same happens only for mods that require both sides; server-only mods do not trigger it.
A plugin fails to load with "Unsupported API version", or errors on startup after an update. Check the plugin's page for the Minecraft versions it supports and the Paper version it was built against. Plugins built for older APIs usually load on newer Paper; the reverse does not hold. Remove the jar, restart, then find a build for your version.
A Forge server crashes with OutOfMemoryError or takes minutes to start. Modpacks need more heap than the image default. Set MEMORY to 6G for a medium pack and 8G to 10G for large ones, keep it under about 75 percent of host RAM, and enable USE_AIKAR_FLAGS: "true". If startup is slow but succeeds, that is normal for large packs; look for the Done line in the log rather than the healthcheck, and raise start_period if the container is restarted before it finishes.
Next steps
Frequently asked questions
- Can vanilla clients join a Paper server?
- Yes. Paper and Purpur run plugins on the server only, so a stock Minecraft client on the same version connects with nothing installed. That is the main reason friends groups choose Paper.
- Can I run plugins and mods on the same server?
- Hybrids such as Mohist and Arclight load Forge mods and Bukkit plugins together. They work for some combinations and break in ways neither ecosystem supports. Use one only if a specific plugin has no mod equivalent.
- Is Purpur better than Paper?
- Purpur is Paper plus more configuration options and gameplay toggles. It runs the same plugins. Choose Paper unless you want a specific Purpur feature; Paper builds usually appear first after a Minecraft release.
- Does MineUI's companion mod work on Fabric or NeoForge?
- Not yet. mineui_server_utils 0.2.0 ships a Forge 1.20.1 mod and a Paper/Bukkit plugin. Without it, MineUI still shows status, players, logs, and container metrics for any server type.