Minecraft: Java Edition

Run a Minecraft server on your own machine

Local Test is a small desktop app for macOS and Windows. Point it at a folder and it sets up a Minecraft server there: it fetches or builds the server software, writes the files that have to sit beside it, works out which Java the version needs, and runs it. No terminal, no hosting account, no monthly panel, and no upload of anything to anywhere. The world is a folder on your disk.

It is free, there is no account, and there is nothing to buy. What it costs says the whole of that in six lines.

What you need first #

Four things, and the app checks three of them for you.

  • Minecraft: Java Edition. Everything here is a server for the Java edition, which is the one on a computer. Bedrock, which is what runs on phones, consoles, and the copy sold in the Microsoft Store, speaks a different protocol and cannot join any of these. Everybody who wants to play on it needs Java Edition.
  • Java itself. A Minecraft server is a Java program, and Java is a separate thing from Minecraft. Local Test looks for it before it downloads anything and says Java is not installed, and a Minecraft server is a Java program. when it is missing, with where to get it. It also checks the version, because Minecraft is strict about that and terrible at saying so.
  • A folder. Any folder. A server puts about fifteen files and three world folders in the one you choose, so a new empty folder is the tidy answer, and Local Test will also make a subfolder of its own inside a folder you are already using.
  • Some memory. The app suggests half the machine's, never less than 1 GB and never more than 8 GB. Most of the machine is the wrong answer: the operating system, your browser and Minecraft itself still need theirs.

What you do not need is a terminal, an account with anybody, a hosting plan, or any idea what a jar file is.

Setting one up #

  1. Pick a flavour. Paper, Vanilla, Spigot or CraftBukkit. Which of the four to pick is below; if you have no reason to choose otherwise, Paper is the one.
  2. Pick a Minecraft version. The list comes from Mojang and PaperMC as they publish it, not from a table inside the app, so a version released this morning is in it. Everybody joining needs the same version.
  3. Choose the folder, and whether the server sits in it directly or in a subfolder of its own. Local Test looks in the folder first and refuses to install on top of a world that is already there.
  4. Answer the EULA question. Mojang require their agreement to be accepted before any server will start. The app asks, with Mojang's own address, and will not answer for you.
  5. Set the eleven things worth setting in server.properties: the message in the server list, the port, how many players, game mode, difficulty, whether an account is required, PvP, spawn protection, view distance, a seed, and a whitelist. Everything else stays at Minecraft's own default.
  6. Press Deploy. The server starts, its output goes into the Activity tab line by line, and Stop ends it and everything it started.

The command that gets run is not a secret, and it is the one you would have typed:

java -Xms1024M -Xmx4096M -jar server.jar nogui

nogui matters more than it looks: without it the server opens a small window of its own, which on a machine being driven by an app is a second window nobody asked for and one that holds the process open after a stop.

Which of the four to pick #

The useful difference between these is not their feature lists. It is that two of them are a download and two of them are compiled on your own machine, which is the difference between a server that is ready in under a minute and one that is ready in twenty.

The four flavours, how each arrives, and what checks it.
FlavourHow it arrivesChecked againstPlugins
PaperDownload from PaperMCSHA-256Yes
VanillaDownload from MojangSHA-1No
SpigotCompiled on your machineNone publishedYes
CraftBukkitCompiled on your machineNone publishedYes

Paper is the sensible default, and the app marks it as such. Somebody who says “I want a Spigot server” today almost always means a Paper one: it is a fork of Spigot, it runs Spigot and Bukkit plugins unchanged, and it is markedly faster once there are players or redstone in the world. The app describes it as A faster Spigot, and what most people now mean by a plugin server. Runs Spigot and Bukkit plugins unchanged.

Vanilla is the right answer when you want the game exactly as Mojang ship it: Mojang's own server, exactly as they ship it. No plugins. Mojang have published a server for every version since 1.2.5; ask for anything older and the app says so rather than failing at the download.

CraftBukkit is the right answer about once a year, when a plugin is old enough that nothing else will load it. Spigot is on the list because some people need exactly it, and because the reason it cannot simply be downloaded is worth understanding before you pick it by accident.

Why two of them take twenty minutes #

Spigot and CraftBukkit may not lawfully be handed out as files. Not by this app and not by anybody: they contain decompiled Mojang code, and Mojang's licence does not permit that to be distributed as a binary. What SpigotMC publish instead is BuildTools, a jar that fetches the pieces on your own machine and compiles the server there. The finished server never travels, because it is made where it is used, and that is the only lawful route to one.

An app that handed you a ready-made Spigot jar would be putting you on the wrong side of that licence quietly, on your behalf, and saving you fifteen minutes for the trouble. So choosing Spigot or CraftBukkit downloads a compiler rather than a server, and on an ordinary machine that is five to twenty minutes. It also needs git installed, because the first thing BuildTools does is clone the repositories it builds from.

Twenty minutes with nothing obviously happening looks exactly like an app that has hung, and the reasonable thing to do to an app that has hung is force quit it, which throws the build away and leaves a half-finished folder behind. Local Test says how long it will take before it starts, and the compiler's own output goes into the Activity tab as it runs, so there is something moving to watch. It is compiling. It has not stopped.

Paper exists partly to avoid all of this. It is a download, it runs the same plugins, and it is faster.

What is checked before it runs #

A server jar is a program that will run on your computer, so it is worth knowing what stands between the internet and that. Two things do.

The address is checked before the request is made. A version manifest is data fetched from the internet: it says where the jar is, and without a check it could say anywhere. Every URL, including the ones a manifest hands back, is matched against a list of hosts compiled into the app, over HTTPS only. The list is launchermeta.mojang.com, piston-meta.mojang.com and piston-data.mojang.com for the version list and the vanilla jar; fill.papermc.io, fill-data.papermc.io and api.papermc.io for Paper; and hub.spigotmc.org for BuildTools. Anything else is refused with the host named, and nothing is downloaded.

The bytes are checked against the publisher's own checksum. Mojang publish a SHA-1 for each server jar and PaperMC a SHA-256 for each build, and a file whose hash does not match is not run.

There is one download with nothing to check it against, and the app says so rather than implying a verification that is not happening: SpigotMC publish no checksum for BuildTools, so this download is protected by HTTPS and the pinned host and nothing further.

A checksum proves the bytes are the ones that were published. It does not prove anything about who published them, and neither Mojang nor PaperMC sign these files in a way an app could check. That is the honest boundary, and it is written down here rather than implied away.

The EULA is yours, not the app's #

Mojang require their end user licence agreement to be accepted before a server will run. Every Minecraft server keeps a file called eula.txt beside it and refuses to start until the line inside says true.

Local Test writes that file with the line set to false, and it will not set it to true for you. This is exactly what it puts on disk:

# Mojang require you to accept their EULA before a server will start.
# https://aka.ms/MinecraftEULA
# Local Test wrote this file. It did not accept anything for you: the line
# below says what you chose in the app.
eula=false

Then it asks, once, with the real address in the question: https://aka.ms/MinecraftEULA, Mojang's own address for the agreement rather than a summary of it written here. Say yes and the line becomes eula=true and the server starts. Say no and it does not, which is a correct outcome and not a fault.

The reason is not squeamishness about paperwork. That agreement is between the person running the server and Mojang. It is not this app's to sign, and there is no version of "I ticked it for you" that is honest.

Connecting to it #

This is the one part of Local Test that is not the web. A Minecraft server speaks its own protocol over TCP, so there is no page to open and no link to click, and the app does not offer one. What it gives you is an address to paste into Minecraft's own Add Server box, under Multiplayer.

  • On the machine running it, the address is localhost.
  • For everybody else in the house, it is that machine's address on your network, which the app lists for you.

The port is 25565 unless you changed it, and Minecraft assumes that one, so the app says Port 25565 is the default, so the port can be left off when adding the server in Minecraft. Change it and it says the other thing instead, naming the port you have to type on the end.

One setting is worth understanding before you turn it off. Require a Minecraft account is what stops somebody joining as any username they like, and switching it off gets its own warning: With this off, anybody can join as any username, including yours. It is for offline play on a network you trust, not for a server on the internet.

Running it #

Once it is up, the project page is the server's front end. Who is on, what it is saying, and a box to type into it.

The address, and who is onThe address to type into Minecraft, with a button to copy it, and the list of who is currently connected. The list is read from what the server prints, so it empties when the server stops rather than keeping names that are no longer there.
The console, and backupsAnything a server console takes works in the box: op yourname, whitelist add, say, stop. Enter sends it and the arrow keys walk back through what you have already sent. Backing up the world is one button.

The console

The log is coloured by what each line is: a warning in yellow, an error in red, somebody joining or leaving in green, and a Java stack trace folded into the line that caused it rather than sprawling over forty rows.

The box under it types straight into the server, exactly as if you were at the terminal it is running in. One line at a time, deliberately: a command with a newline hidden in it is refused rather than run as two, so something pasted out of a web page cannot quietly do a second thing.

A project that is not a Minecraft server does not get a console. What is harmless typed at a server console is an unrelated instruction typed at whatever else a project happens to be running.

Backing up a world

One button, and the world goes into a zip in a backups folder inside the project. Nothing leaves your computer, and each backup is named for the world, the version and the time, so they sort in order and no two ever land on the same name.

Taken while the server is running, Local Test asks it to stop writing and flush what it has before the copy starts, and turns writing back on afterwards. That is the same thing a server administrator does by hand, and it is still not perfect: a world saved while people are playing can be a few seconds behind what they are actually doing. The app says so on the button rather than letting you find out later. Stopping the server first is the only way to get an exact copy.

What this is not #

  • Not hosting. The server runs on your computer, out of a folder on your disk. Close the app and it stops. Nothing is uploaded anywhere and there is no bill.
  • Not a way to let friends across the internet join. People on your own network can connect. Anybody further away cannot, unless you arrange that yourself with your own router, and Local Test will not arrange it for you or open a port on your behalf.
  • Not a plugin manager. Paper, Spigot and CraftBukkit get a plugins folder, and what goes in it is your business to put there.
  • Not Bedrock. Phones, consoles and the Microsoft Store edition cannot join a Java Edition server, whichever flavour it is.
  • Not a way around the EULA, or around the licence that stops Spigot being distributed as a file. Both are why parts of this work the way they do.

What it is: the setting-up, done properly, by an app instead of by twenty minutes of following somebody's blog post. Once it is running, the Activity tab shows everything the server prints, and Stop ends it and everything it started.

Getting the app #

Local Test is free, needs no account and no card, and does the rest of what is on the front page as well: it serves any folder at a localhost address, runs software projects, and has an editor and a git panel in it.

macOS and Windows, . Both builds are unsigned, so the first launch needs one extra click, and the download section says exactly what your computer will tell you and how to check the file is the one that was published.

The full reference for this feature, including every server.properties default the app writes and what to do when something goes wrong, is in the documentation.