The short answer: which one to run
Start from what players should experience, not from benchmarks. If a modpack is involved, the pack has already chosen the loader and the Minecraft version for you. If nobody should have to install anything to join, you want plugins or server-side-only mods, never content mods.
- Community or public server with claims, economy, ranks or minigames, joined from vanilla clients: Paper, or Purpur for more settings to tune.
- Java and Bedrock players on one server: Paper with Geyser and Floodgate.
- A published modpack: whatever loader and Minecraft version the pack ships for. Look it up, do not choose.
- Your own mod list on 1.20.1: Forge.
- Your own mod list on a newer version: NeoForge, Forge or Fabric, whichever has every mod you cannot do without on that exact version.
- Vanilla gameplay, better performance, no client installs: Paper, or Fabric with only server-side mods such as Lithium.
- A very large server with players spread across a big map, every plugin checked: Folia.
- Plugins and content mods on one server: no clean answer. Read the section on hybrids, Sponge and proxies first.
Plugins or mods: the only decision that really matters
Everything else follows from one question. Does the person joining your server have to install anything?
Plugins are server-side only. They run on Bukkit-family software (Paper, Spigot, Purpur) and change how the vanilla game behaves: land claims, economies, permissions, minigames, anti-cheat, warps. They do it with blocks and items that already exist in the game, so players connect with a stock client. That is why shops, claims and /home commands are plugin territory.
Mods add content. New blocks, machines, entities, dimensions, recipes. That content has to exist on both ends of the connection, so a mod loader (NeoForge, Forge or Fabric) loads it on the server and the same loader with the same mod list loads it on every client. There is no way around this for content mods. The server sends its registries at login and the client is rejected if it cannot match them. Performance mods are the exception: Lithium's own page says it can go on a server without players installing it.
A mod loader cannot run plugins and Paper cannot run content mods. They patch the game at different points and expose different APIs. If you want both, you are looking at hybrid software or Sponge, and both have real costs.
If your idea is really vanilla plus quality of life, check whether a datapack already does it. Datapacks are server-side, need no client install and cost nothing.
- Plugins: server-side only, vanilla clients, run on Paper, Spigot or Purpur
- Content mods: needed on both sides, run on NeoForge, Forge or Fabric with a matching mod list on every client
- Server-side-only mods such as Lithium: run on the loader, and unmodified clients can still join
- Datapacks: server-side vanilla scripting, no client install, no extra server software
- Client-only mods such as Sodium, Iris and minimaps work on any server including Paper
Paper: the default answer for plugin servers
Paper began as a fork of Spigot, itself a fork of Bukkit. Since 1.21.4 it has been a hard fork: it no longer pulls changes from Spigot, keeps the API it already inherited working, and does not automatically adopt API that Spigot adds later. It extends the Bukkit API with its own and patches the server for performance, including asynchronous chunk loading and optimisations to the light engine, hoppers and entities. Plugins are published on Hangar, PaperMC's own repository, as well as on Modrinth and SpigotMC.
Two facts date a lot of forum advice. Paper has bundled the spark profiler since 1.21, and Timings is deprecated and off by default, so a thread telling you to run /timings is out of date. Global settings live in config/paper-global.yml and config/paper-world-defaults.yml, and from 26.1 each world's overrides sit in a paper-world.yml under world/dimensions.
What Paper cannot do is load a mod. It has no Forge or Fabric compatibility layer, and PaperMC's own documentation says the design of the Bukkit API rules out sane mod support.
Two forks are worth knowing. Purpur is built on Paper, runs the same plugins and exposes far more gameplay settings. Folia adds regionised multithreading, ticking separate regions of the world in parallel. PaperMC says plainly that Folia will not help most servers, suits very high player counts in modes that spread players out, such as SkyBlock or SMP, breaks most public plugins and is not a drop-in replacement for Paper.
One upgrade trap. From 1.20.5 Paper stopped relocating CraftBukkit into versioned packages, so a plugin that reads the server version from a package name fails, and in 26.1 it dropped its internal remapper because Mojang no longer obfuscates the server. Abandoned plugins that reach into server internals are the likeliest to break, so look for an explicitly tested version on the plugin page rather than a vague "1.21+".
- Hard fork since 1.21.4: existing Spigot plugins keep working, new Spigot-only API does not arrive
- spark is bundled from 1.21; Timings is deprecated and off by default
- Folia is for very large, spread-out servers and needs Folia-aware plugins
- Geyser plus Floodgate lets Bedrock clients join a Paper server; keep online-mode on, because Floodgate's account linking relies on it
Forge and NeoForge: two maintained loaders, not old and new
Forge is the oldest loader and the one most large content mods were first written against. In July 2023 almost the entire Forge team left to start NeoForge, a fork, and from 1.20.2 NeoForge moved its code into its own package names, so a mod generally needs a separate build for each.
Both are still maintained and both publish builds for current releases, including 26.x, so the choice is not old versus new. It is decided per Minecraft version by the mods you want. The fixed point is 1.20.1: NeoForge's own review of 2023 says its team neglected 1.20.1 once 1.20.2 arrived and that effort there is better spent on Forge, which still ships 1.20.1 builds. Forum threads titled "Forge vs Fabric" that predate the split are the ones to stop reading.
Installation is not a single jar. The NeoForge installer run with --installServer, like the Forge installer in server mode, produces a libraries folder, run.sh and run.bat, and a user_jvm_args.txt where your memory flags belong. A panel that expects one server.jar needs a startup command pointing at the generated argument file, or the server will not boot.
Read version numbers carefully. NeoForge 21.1.x is for 1.21.1 and 20.4.x for 1.20.4; from 26.1 the number starts with the full game version, as in 26.1.0.x. Forge numbers do not track the game at all: 47.x is 1.20.1 and 65.x is 26.2.
Java matters too. 1.20.1 wants Java 17, 1.20.5 to 1.21.11 need Java 21, and 26.1 onwards needs Java 25. The wrong one throws UnsupportedClassVersionError with a class file version: 61 is Java 17, 65 is Java 21, 69 is Java 25.
- 1.20.1: Forge. From 1.20.2: whichever of Forge or NeoForge your mods are built for
- No single server jar: expect run.sh, run.bat and user_jvm_args.txt
- Forge and Fabric mods are not interchangeable without a translation layer, and since 1.20.2 Forge and NeoForge mods generally are not either
Fabric: a small loader, a versioned API, its own mod set
People confuse two things here. Fabric Loader is small and deliberately independent of the Minecraft version. Fabric API is a separate mod carrying the version-specific hooks most Fabric mods call, so it must match your game version. A missing dependency called fabric-api means the API, not the loader.
The Fabric server launcher is one jar that downloads any missing loader and Minecraft files on first start, then runs the server, and Fabric documents it as a drop-in replacement for a vanilla server jar in admin panels and start scripts. That makes the install noticeably simpler than Forge's.
The standard server-side performance set is Lithium (game logic, without aiming to change vanilla mechanics), FerriteCore (memory use) and C2ME (chunk generation, loading and saving spread across several cores, which pays off during a large pregeneration). None of them is Fabric-only any more: Lithium and FerriteCore publish NeoForge builds and C2ME has a NeoForge edition, but they update at different paces, so check your exact version. C2ME's authors fully support only the latest release and snapshot, and ask you to back up first.
Watch sidedness. Fabric mods declare an environment of client, server or * in fabric.mod.json, and Modrinth shows on each project page where a mod belongs. A client-only mod such as a shader loader or a minimap has no business on a server, and a mislabelled one can stop it starting.
Quilt is a Fabric fork whose loader also runs Fabric mods. Its volunteer team still maintains the loader but has retired its own libraries and mappings from 26.1, so unless a mod you need is Quilt-only, plain Fabric is the simpler choice.
- Fabric Loader is version-independent; Fabric API is not, and most mods need it
- Lithium, FerriteCore and C2ME now exist beyond Fabric; check the build for your loader and version
- Check the client and server flags on Modrinth before uploading anything to /mods
Minecraft 26.1 changed the ground rules
After 1.21.11 the version numbers changed: the releases that followed are 26.1 and 26.2. Paper, Forge, NeoForge and Fabric all publish builds for them, but the move is bigger than a normal update, for four reasons.
Java: 26.1 needs Java 25, where 1.20.5 to 1.21.11 ran on Java 21. Code: Mojang stopped obfuscating the game, and Fabric's 26.1 announcement says no mod from 1.21.11 or earlier works on it without at least being recompiled, so a modded upgrade waits for every mod on your list. World: vanilla moved every dimension under world/dimensions/minecraft and player data into a players folder, and Paper dropped the old Bukkit layout at the same time. No way back: PaperMC states that a world upgraded to 26.1 cannot be downgraded.
So keep a modpack on its own version until the pack moves. Move a plugin server once every plugin lists 26.x, with Java 25 installed, on a copy of the world first, and check that anything reading the world folder directly, such as a backup script or a map renderer, understands the new layout.
- Java 25 from 26.1; class file version 69 in the error means Java 25
- Overworld: region, entities and poi move into world/dimensions/minecraft/overworld
- Nether: DIM-1, or world_nether on Paper, becomes world/dimensions/minecraft/the_nether
- End: DIM1, or world_the_end on Paper, becomes world/dimensions/minecraft/the_end
- Back up before the first 26.x start. The upgrade is one-way
Hybrids, Sponge and proxies: plugins and mods together
Mohist, Arclight and Ketting bolt the Bukkit API onto Forge or NeoForge, and Arclight also has a Fabric edition. Cardboard does something similar on Fabric. Sinytra Connector goes the other way and runs Fabric mods on NeoForge. They all work, sometimes, for some combinations.
The cost is support. PaperMC's Velocity documentation says it does not support Forge-Bukkit hybrids because they have caused several issues, and some widely used plugins list hybrids as unsupported. When a plugin writes to a block whose registry entry is owned by a mod and the two desync, you are debugging it yourself on a live world.
Sponge is the one plugin platform designed to sit beside mods: SpongeForge and SpongeNeo run Sponge plugins alongside Forge or NeoForge mods. The catch is the catalogue. Sponge's FAQ is explicit that Bukkit plugins do not run on it and that making them run is not a goal.
For plugin-style administration on a modded server, look at mod-native tools first. LuckPerms ships builds for Bukkit, Fabric, Forge, NeoForge, Sponge, Velocity and BungeeCord, spark runs on all of them, and Ledger covers block logging and rollbacks on Fabric.
The other architecture: a Velocity proxy in front, a Paper hub for anything plugin-shaped, and a separate NeoForge or Fabric server for the modded world. Hub players can use an unmodified client; anyone crossing to the modded server needs the modded one. The backends need player-info forwarding: FabricProxy-Lite on Fabric, Proxy Compatible Forge on Forge or NeoForge. More moving parts, so test a real server switch on a copy, but every piece is supported software.
- Hybrid software is unsupported by PaperMC and by many plugin authors; budget debugging time
- Sponge supports plugins beside mods, but only Sponge plugins, never Bukkit ones
- Velocity proxy plus a Paper hub and a modded backend is the maintainable version of "both"
What actually breaks when you switch
Nothing crosses the plugin and mod line. Not one jar in /plugins will load on a mod loader, and not one mod in /mods will load on Paper. Budget for finding replacements rather than porting anything.
Removing mods from a world that used them does not fail cleanly. Modded blocks in already-generated chunks become air, modded block entities disappear and modded items sitting in chests or player inventories are deleted on load. A tech-mod base becomes a hole in the ground. This is the most expensive surprise in a Forge-to-Paper move and the reason to test on a copy.
Version downgrades are impossible. A world opened once in 1.21 cannot go back to 1.20, because the data fixer only runs forwards, and the same is true of a world opened in 26.1. Upgrade a copy, always.
Modpacks need care. A CurseForge client zip is not a server install. Use the pack's published server pack if there is one, and strip client-only mods such as OptiFine, shader loaders, minimaps and ReplayMod. Skipping that step produces the classic "works in single-player, crashes on the server" report.
Permissions, economy balances and land claims do not migrate themselves either. Export the data before you rebuild anything, not after.
- Wrong Java version: UnsupportedClassVersionError, class file 61 = Java 17, 65 = Java 21, 69 = Java 25
- Client mod list mismatch: the login handshake rejects the client before the world loads
- Missing Fabric API: mods fail with an unresolved fabric-api dependency
- Client zip uploaded as a server pack: crash on startup from client-only mods
Migrating an existing world between loaders
Stop the server before you copy anything. Region files are written lazily, so copying a running world gives you half-written chunks that fail to load days later.
Vanilla, Forge, NeoForge and Fabric share vanilla's folder layout, so moving between them is a question of mods, not folders. Paper is the odd one out.
Moving to Paper is the easy direction: PaperMC's documentation says Paper converts a vanilla world's storage automatically. Put the world in place, check that level-name in server.properties points at it, and start the server.
Moving away from Paper is manual. Up to 1.21.11, copy world_nether/DIM-1 and world_the_end/DIM1 back inside world, then delete world_nether and world_the_end. From 26.1 the dimension folders already match, and the only job is to move five files, game_rules.dat, scheduled_events.dat, wandering_trader.dat, weather.dat and world_gen_settings.dat, from world/dimensions/minecraft/overworld/data/minecraft into world/data/minecraft. Fabric and Forge take the same steps as vanilla.
If you are dropping mods, do not leave the old chunks as swiss cheese. Open the world in MCA Selector, delete the chunks that held modded content so they regenerate, then pregenerate the border with Chunky before players come back.
- Vanilla, Forge, NeoForge and Fabric up to 1.21.11: world/, world/DIM-1, world/DIM1, modded dimensions in world/dimensions/modid/name
- Paper up to 1.21.11: world/, world_nether/DIM-1, world_the_end/DIM1
- entities/ and poi/ folders must travel with the region folder beside them
- Java and Bedrock worlds use different formats, and none of this server software converts between them
RAM, CPU, and when more RAM does nothing
The server ticks the world on a single thread. Paper moves chunk loading off it and Folia regionises it, but entity and block-entity ticking is fundamentally serial, so single-core speed sets your ceiling, not core count and not RAM.
Watch MSPT rather than RAM: anything under 50 ms per tick is within budget. spark is already inside Paper and installs on every loader, so profile before you buy.
Rough heap sizing: Paper with a dozen plugins and 20 to 40 players is comfortable in 3 to 4 GB, a 150-mod pack wants 5 to 6 GB, and a 300-plus mod kitchen-sink pack realistically wants 8 to 10 GB. Set -Xms equal to -Xmx and leave 0.5 to 1 GB of the container outside the heap for metaspace, thread stacks and direct buffers, so a 4 GB plan means -Xmx3G. Exceeding the container limit gets the process killed with no Java stack trace, which reads as a random crash.
More RAM will not fix low TPS.
- view-distance 10 loads 21x21 = 441 chunks per player; view-distance 6 loads 13x13 = 169, a 62% cut
- simulation-distance drives mob, redstone and machine load; 5 or 6 suits most servers
- Aikar's G1GC flags are still the sane default; do not paste a 30-flag string from a 2016 thread
Where to run it, including on hardware you already own
Honest answer first. For two to six friends playing a couple of evenings a week, you do not need to buy anything. A desktop with 16 GB of RAM and a recent CPU will host a 100-mod pack while the owner plays on the same machine. Use Tailscale or a similar overlay network rather than port forwarding, so you are not publishing your home IP or opening a router port to the internet.
What paid hosting buys is the server being up when your PC is not, a stable address, backups that run without anyone remembering to make them, and somebody else's upload bandwidth. A residential upload of around 10 Mbps carries six players comfortably. It does not carry forty at view-distance 10.
For reference: Puranode's Minecraft plan is a single 4 GB plan at €10.99 a month, VAT included, in one region, Helsinki in Finland, so check your players' ping to Finland first. Right now the hosting node is at capacity, so every game server is set up on request rather than at checkout. If a pack outgrows 4 GB, a RAM change is a manual resize done the same day during business hours, never a self-serve slider.
- Small private pack, occasional play: self-host and use an overlay network, no purchase needed
- Public server, 24/7 uptime, many players: rent a server in a datacentre near your players
- Whatever you run on, take backups off the box itself, not just to the same disk