There are two ways to host a Horizon server, and both run the same program, horizon-server. On your own PC, the launcher’s Servers page does everything with buttons. On a VPS or headless box, you install it with one script, prepare the game files from your own copy of Minecraft 26.3, run horizon-server init and horizon-server start, and players join on port 25565. It runs without Java, keeps its settings in one file, and both vanilla 26.3 and Horizon clients can join.
Before you start
- You need your own Minecraft 26.3. The server reads its game files from the ones you prepared, just like the client. Nothing of Mojang’s is downloaded or shipped.
- Online mode is the default. Every player signs in with a Microsoft account, Horizon and vanilla players alike. An offline server lets anyone who can reach it join under any name. Keep one on your LAN or a VPN like Tailscale, with a whitelist.
- Settings apply at the next restart for most keys in
server.toml. There’s no live reload yet, thoughconfig setapplies a few things at once.
Option 1: the launcher’s Servers page
The Servers page has been in the launcher since 0.15; the Play page also has a Host a server button. Choose Create a server (or Add a server folder… for an existing one) and fill in the name, a new or copied world, game mode, difficulty, player limit and who can join: Friends only (a whitelist; the first name becomes an operator) or Anyone with the address. Tick the Minecraft EULA box. The defaults give you a friends-only survival world that checks accounts.
Each server’s page shows its state, uptime, players, TPS, MSPT and RAM, plus tabs for Overview (with a console), Players, Settings and Backups. If the game crashes, the launcher restarts it and tells you. Friends on your Wi-Fi paste the Address on this network. For friends elsewhere, the page walks you through Tailscale, which needs no router changes and only reaches people you invite; Horizon never turns on Tailscale Funnel. The alternative is forwarding TCP 25565 on your router.
Backups can run every 6 hours keeping the last 12 (manual backups are never deleted), and Update now backs up the world first and rolls back by itself if the new version won’t start.
Option 2: the command line (VPS, home server)
1. Install
Linux (x86-64) and macOS:
curl -fsSL https://raw.githubusercontent.com/horizon-rust/horizon/main/packaging/server/install.sh | sh
Windows, in PowerShell:
irm https://raw.githubusercontent.com/horizon-rust/horizon/main/packaging/server/install.ps1 | iex
The script downloads the current Nightly, checks it (against the signature when OpenSSL 3 is installed, otherwise against the SHA-256 GitHub publishes) and never asks for sudo. It puts horizon-server and horizon-prepare in ~/.local/bin. Linux on ARM builds from source.
2. Prepare the game files
You need Minecraft 26.3 played once, Java 25 and the 26.3 server.jar (its URL is downloads.server.url in your launcher’s versions/26.3/26.3.json):
horizon-prepare --prepare --server-jar /path/to/server.jar
On a machine with no Minecraft, prepare on your own computer and copy the prepared 26.3 folder over with horizon-server import-resources DIR, or into ~/.local/share/horizon/game-files/horizon-client/26.3.
3. First run
mkdir my-server && cd my-server
horizon-server init
horizon-server start
horizon-server status
init asks about the EULA, the world name and seed, the port, the whitelist and the first operator, then writes server.toml. Every question has a flag for scripts, for example horizon-server init --eula --world survival --whitelist --player Alex --op Alex --yes. Already have a vanilla server folder? Run init inside it: the world, ops.json and whitelist keep vanilla’s names and formats, so going back to vanilla works too.
4. Everyday commands
| Command | What it does |
|---|---|
horizon-server run |
Foreground, console in your terminal |
horizon-server start / stop / restart |
Background |
horizon-server cmd say Hello |
Any console command |
horizon-server whitelist add NAME |
Whitelist (names are looked up as accounts in online mode) |
horizon-server backup / restore |
Zip the world; restore keeps the replaced world aside |
horizon-server panel |
One-time login link for the web panel, valid 10 minutes |
horizon-server service install |
Start with the computer (systemd, launchd, or a logon task on Windows) |
horizon-server update / rollback |
Install the newest release with a backup and automatic fallback |
The server never updates by itself; it tells you when a release is out. If the game crashes, it restarts it, waiting longer each time, and gives up after 5 crashes in 10 minutes.
Docker, Pterodactyl and AMP
No image is published. Build one from the repository and mount your prepared files read-only:
git clone https://github.com/horizon-rust/horizon && cd horizon
docker build -f packaging/server/Dockerfile -t horizon-server .
docker run -d --name horizon -p 25565:25565 --stop-timeout 180 \
-v horizon-data:/data \
-v /path/to/26.3:/opt/horizon/.local/horizon-client/26.3:ro \
-e HORIZON_EULA=true -e HORIZON_WHITELIST=true -e HORIZON_PLAYERS=Alex,Steve -e HORIZON_OP=Alex \
horizon-server
The repository also ships a Pterodactyl egg (packaging/server/pterodactyl-egg.json) and an AMP template; both install the server build and expect you to upload your prepared 26.3 files to resources/.
Security basics
- Never put the web panel on the open internet. It listens on
127.0.0.1:8130; reach it over SSH (ssh -L 8130:127.0.0.1:8130 your-server) or bind it to a Tailscale address. - RCON and the query port are off by default. RCON isn’t encrypted, so keep its port closed to the internet.
horizon-clients-only = trueturns away non-Horizon clients, but it reads a brand any client can fake. It keeps out people who didn’t install Horizon, not cheaters.- Native mods on a server run unsandboxed in a standalone engine you build yourself. Only build code you’ve read. See Is Horizon safe?
How fast is it?
The project’s bot benchmark (19 October 2026, a 4-thread i7-7500U laptop CPU, 1 to 50 bots on another machine) compared horizon-server with vanilla 26.3, Paper and Fabric with Lithium. Horizon used 0.7 GB with one player and 1.1 GB with 50, against 3.4 to 4.5 GB for the Java servers; started in 8 to 9 seconds against 15 to 22; and used the least CPU from 10 players up. Paper’s average tick was shorter at every count, and at 50 players Horizon and Paper both held 20 TPS. Short on RAM? low_memory = true under [engine] trades about 1% of tick time for less memory on Linux. Background in Rust vs Java.
When nobody can join
- The whitelist is on by default:
horizon-server whitelist add NAME. - Open the port in your firewall, or use the server’s Tailscale address.
- “no prepared game files”: prepare (step 2) or set
[engine] resources. - “registries.json not found next to the resources”: the prepared folder is from an older release; prepare again.
- Keeps restarting:
horizon-server statusshows the last crash,horizon-server logs -n 200the log before it.
More fixes are in Horizon launch errors. Once it’s running, the release channel question (and why the install script fetches the Nightly) is in Nightly or stable?, and you can compare notes with other hosts in our server list.