Downloads
The NOVA Swift Dedicated Server is one small standalone program. It doesn't need the game, a pilot or any EV Nova data: it carries the session (rules, chat, moderation, the plug-in check) while each player's own game runs their ship. You run it from a web admin panel in your browser.
Linux
Linux ARM
Windows
macOS
Beta. The server is new (server-v1.0.0-beta.1): builds for Linux, macOS and Windows, over IPv4 and IPv6. The Linux installer runs the official server on a Google Cloud VM; the Docker files live in the repository under packaging/server/ and haven't been tried yet, so please report anything that goes wrong.
- No game data. Nothing copyrighted to copy onto a VPS.
- Zero setup. It starts with sensible defaults, makes
server.cfgnext to itself and prints the admin address and a one-time password. - Web admin panel on port
53737with a four-step setup wizard, players (kick, ban, message), live settings, plug-ins from the catalog, the public listing helper, a network check and live logs. - Plain-language errors, for example "Port 53735 is already in use. Is another server running?".
- Everyone plays together. Linux, Steam Deck, Windows and Apple players share the same server.
Where to run it
The server is light (a few MB of memory per player, no simulation). Anything that can stay switched on will do.
| Where | Cost | Good for | Notes |
|---|---|---|---|
| Your own PC | Free | Evenings with friends | Only up while the PC is on. Needs port forwarding on your router. |
| Raspberry Pi or old laptop | Free if you have one | A 24/7 home server | Uses a few watts. Same port forwarding as a PC. |
| A small VPS | Free tiers exist (Google Cloud e2-micro), or a few dollars a month (Hetzner) | A public server | Has a public address already: just open the ports in its firewall. |
| Tailscale or ZeroTier | Free | Friends only, no forwarding | Everyone joins the same private network and connects to your 100.x.y.z address. Can't be listed publicly. |
Set it up in 5 minutes
Download and start it
Unpack the download. On Windows double-click
Start Server.bat(orNovaSwiftServer.exe). On Linux or macOS run./NovaSwiftServerin a terminal. It prints a box with your admin panel address and an admin password shown only once: write it down.Open the admin panel
On a desktop your browser opens by itself on
http://localhost:53737and signs you in for the first-run wizard. On a headless machine open the printed address from your own computer (or through an SSH tunnel, see below).Answer four questions
The wizard asks for a name, open or password (plus player slots and the rules: Safe, Full stakes or Custom), which plug-ins to run (optional, picked from the community catalog), and whether you want a public listing.
Open the ports
Forward UDP
53735and53736on your router, or open them in your VPS firewall (next sections). The panel's Network page has a "can players reach me?" check and an automatic router (UPnP) button.Join it
In the game choose Multiplayer, then Quick Connect, and type the address from the dashboard (it has a Copy button). Anyone on your network sees it under LAN automatically.
Pick your path
- Download the zip for your system and unpack it anywhere (it keeps its settings and logs in that folder, so it's portable).
- Start it: double-click on Windows,
./NovaSwiftServeron macOS and Linux. On macOS the first run may need right-click, Open because the build isn't notarised yet. - Finish the wizard in the browser that opens. Forward the ports (or tick UPnP in Settings).
- Settings has Start with this computer (a scheduled task on Windows, a login item on macOS) if you want it back after a reboot.
Works on any Ubuntu/Debian-style VPS: a Google Cloud e2-micro (free tier, Always Free region), Hetzner, DigitalOcean, Oracle Ampere (arm64) and so on.
- Create the VM (Ubuntu 22.04+). In the provider's firewall / VPC rules allow UDP 53735-53736 from anywhere. Do not open 53737.
- SSH in and run the installer. It picks x86_64 or arm64, creates a
novaswiftuser, installs to/opt/novaswift-server, adds a systemd service that always restarts, opens the game ports inufwif present, and prints the admin password:curl -fsSL https://raw.githubusercontent.com/SirStig/NovaSwift/main/packaging/server/install-server.sh | sudo bash - From your own computer, tunnel to the panel and open it:
ssh -L 53737:localhost:53737 you@your-vps # then browse to http://localhost:53737 - Finish the wizard. Put your VPS address (or a DNS name) in Public listing if you want to be listed.
Update later by re-running the same command (your settings stay), or from the panel's Settings page. Remove it with sudo /opt/novaswift-server/uninstall.sh.
The image builds for amd64 and arm64 and contains only the server. Settings, plug-ins and logs live in the ./data folder. Get packaging/server/ from the repository (or the release page), then:
# docker-compose.yml (also in packaging/server/)
services:
novaswift:
build:
context: ../.. # the repository root
dockerfile: packaging/server/Dockerfile
image: novaswift-server
restart: always
ports:
- "53735:53735/udp"
- "53736:53736/udp"
- "127.0.0.1:53737:53737/tcp" # admin panel, this machine only
volumes:
- ./data:/data
docker compose up -d
docker compose logs novaswift | head -30 # admin password is printed once
Built-in image for a different CPU: docker buildx build --platform linux/amd64,linux/arm64 -f packaging/server/Dockerfile .
A Raspberry Pi 4 or 5 (64-bit Raspberry Pi OS or Ubuntu) runs it comfortably. Use the Linux installer from the VPS tab (it picks the arm64 build), then forward UDP 53735-53736 on your router to the Pi. Give the Pi a fixed address in your router so the forwarding keeps working, and open the panel from any computer on your network at http://<pi-address>:53737. Because it's your own network you can leave the panel open; just use a good password.
Open the ports
| Port | Protocol | What it's for | Open to the internet? |
|---|---|---|---|
53735 | UDP | The game itself | Yes, players need it |
53736 | UDP | Status pings (server lists, player counts, latency) and LAN discovery. Game port + 1 if you change the game port. | Yes, to show as online in server lists |
53737 | TCP | Web admin panel | No. Keep it on your own network, or reach it over SSH or a VPN. The panel is plain HTTP. |
In your router's settings, forward UDP 53735 and UDP 53736 to the computer running the server, or press Try automatic port forwarding (UPnP) on the panel's Network page (many routers have UPnP off).
Then give players your public address (the Network page looks it up). If your router's WAN address differs from it, or starts with 100.64 to 100.127, your provider uses carrier-grade NAT and forwarding can't work: use a VPS or Tailscale instead. Many routers can't loop back to their own public address, so test from your phone on mobile data.
# ufw (Ubuntu, Debian, Raspberry Pi OS); the installer does this for you
sudo ufw allow 53735:53736/udp
# firewalld (Fedora, RHEL)
sudo firewall-cmd --permanent --add-port=53735-53736/udp && sudo firewall-cmd --reload
Windows asks the first time the server starts: allow it on private and public networks. To add the rule yourself, in an administrator PowerShell:
New-NetFirewallRule -DisplayName "NOVA Swift server" -Direction Inbound -Protocol UDP -LocalPort 53735-53736 -Action Allow
Allow UDP 53735-53736 in the provider's firewall or security group as well as in the machine's own firewall (see the Linux tab). Google Cloud: VPC network, Firewall, create a rule for udp:53735-53736 from 0.0.0.0/0. Hetzner: Firewalls, add an inbound UDP rule. Don't open 53737; use the SSH tunnel.
The admin panel
| Page | What you do there |
|---|---|
| Dashboard | Status, uptime, players, bandwidth, version, update notice, and the address players type, with a Copy button. |
| Players | Who is online (ping, star system, time), kick, ban, message one player, or announce to everyone. |
| Settings | Name, description, welcome message, region, slots, join password, rules, ports, LAN visibility, UPnP, admin password, updates, start with the computer. Most changes apply instantly; rules change for players already online. |
| Plug-ins | Browse and search the NovaSwift catalog, turn plug-ins on (the server downloads them), or upload your own file. Gameplay plug-ins are required; art and sound plug-ins are automatically optional. Catalog plug-ins get the one-click Install & Join prompt in the game; your own file is marked "players must get this themselves". |
| Public listing | Fill in owner and address, see a checklist, copy the ready-made servers.json entry, and open the pull request on GitHub. |
| Network | The ports to open, your addresses, a public-IP lookup, a local self-test, UPnP, CGNAT warning, and router, VPS and Tailscale instructions. |
| Logs | A live tail of joins, refusals and errors (also saved in logs/server.log). |
| Bans | The blocked addresses; add or lift one. |
Security. The panel is protected by the generated admin password and a login lockout, but it is plain HTTP. Bind it to this computer only in Settings (Admin panel is reachable from: This computer only) if the machine is on the internet, and use an SSH tunnel. Lost the password? Run NovaSwiftServer --reset-admin-password.
server.cfg and the console
Everything lives in one server.cfg next to the program (or, if that folder isn't writable, in your user data folder; --data FOLDER picks one). The panel rewrites it when you save, so you rarely touch it. Changes made by hand need a restart.
[server]
name = Joshua's NovaSwift server
description = Friendly co-op, newbies welcome
port = 53735 # UDP; port + 1 answers pings
max_players = 8
password = # empty = open
motd = Welcome, pilot! # shown in chat when someone joins
region = eu
lan_announce = true
upnp = false
[rules]
preset = safe # safe | full | custom
# custom only: pvp_damage_real, death_real, friendly_fire, allow_pvp, allow_trade, game_speed
[admin]
port = 53737
bind = 0.0.0.0 # 127.0.0.1 = this computer only
password_hash = # set from the panel
[plugins]
enabled = frozen-heart # catalog ids and uploaded folder names
[public]
listed = false
address = play.example.com
owner = Jane
contact = discord: jane
[updates]
check = true
auto_update = false
[bans]
203.0.113.7 = griefing
Command line: --data DIR, --port N, --admin-port N, --no-browser, --no-stdin, --reset-admin-password, --version. Console commands (type them into the server window):
| Command | Does |
|---|---|
status | Name, uptime, players, rules, address |
players | Who's connected (id, name, ping, address) |
kick <id|name> [reason] | Remove a player |
ban <id|name> / unban <ip> | Remove and block a player's address, or lift a ban |
say <text> | Message everyone |
rules [safe|full] | Show or switch the stakes |
plugins | Required and optional plug-ins |
quit | Stop the server |
Passwords. A join password is sent hashed, but game traffic isn't encrypted. Don't reuse a password that matters.
Security
The server is built for the public internet. The admin panel listens on this machine only by default (use an SSH tunnel; the installer enforces it), logins lock out with growing waits, passwords must be strong, and every admin action is written to an audit log. The Linux service runs as a no-login account inside a systemd sandbox (read-only system, no capabilities, filtered system calls); the Docker image runs unprivileged with a read-only file system.
On the game port the server rate-limits and size-limits every connection, blocks flooding addresses for ten minutes, refuses to answer oversized or unpadded status pings (so it cannot be used to amplify an attack), strips forged identities from relayed messages, and cleans player names and chat. Admins can kick, ban, mute and run an invite-only allowlist; players can /votekick, /report and block others. Updates install only from signed GitHub releases, and plug-in downloads are HTTPS-only, size-capped and unpacked safely.
Honest limits. A player who is the sync authority of a star system runs that system's game logic, so a modified client can cheat within plausible limits there; game traffic is not encrypted; the panel has no built-in HTTPS (tunnel or reverse proxy). Details: docs/SECURITY.md.
Keep it running
The Linux installer sets up a systemd service that starts at boot and restarts after a crash: sudo systemctl status novaswift-server, journalctl -u novaswift-server -f. Docker uses restart: always. On Windows and macOS use Start with this computer in Settings. The server checks GitHub for new versions (tag server-v…) and shows a notice; it only installs them if you turn on automatic updates.
Get listed
The public server list is a JSON file in the NovaSwift-Plugins repository. Both the game's browser and the server list on this website read it. The panel's Public listing page does the paperwork:
Fill in the details
A public address (a DNS name is best), your name and a contact such as a Discord name. The checklist tells you what's missing.
Copy your entry
The panel generates the entry, including the content hash of every gameplay plug-in you require. Nothing is uploaded automatically.
Open the pull request
The button opens
servers/servers.jsonon GitHub in edit mode: paste the entry into the list and choose Propose changes. A check runs on it, and once it's merged your server appears in the game and on the website.
Rules for listing: a public address (no 192.168.x.x), no password, honest rules labels, plug-ins players can get from the catalog, family-friendly names, and a contact. Servers that stay offline for a month or two may be removed. Until you're listed players can join with your address.
{
"id": "example-eu",
"name": "Example Sector",
"host": "nova.example.com",
"port": 53735,
"region": "eu",
"description": "Friendly 24/7 server, safe rules, stock EV Nova.",
"owner": { "name": "Jane", "contact": "discord: jane" },
"rules": "safe",
"plugins": [],
"maxPlayers": 12,
"added": "2026-10-13"
}
The old headless mode
Before the standalone server, the Linux game build could run headless with --server. It still works, but it needs your EV Nova data on the machine and has no web panel, so it is legacy: prefer the Dedicated Server above.
scripts/run-dedicated-server.sh --name "My Server" --port 53735 --max-players 8 --rules safe
FAQ and troubleshooting
Do I need EV Nova or the game on the server?
No. The server never reads game data; it only compares players' plug-in lists. Plug-ins you enable are downloaded from the community catalog (or uploaded by you) to the server's own plugins folder.
"Port 53735 is already in use"
Another server (or a game you are hosting) is using it. Stop that, or change the port: start with --port 53745, or fix it in server.cfg. The admin panel still opens so you can change the port there.
Friends can't connect
Check UDP 53735 is forwarded to the right machine and allowed in its firewall. Test from outside your network, and use the panel's Network page. If your provider uses carrier-grade NAT, forwarding won't work: use a VPS or Tailscale.
The server shows as offline in lists but people can join
Status pings use UDP 53736 (game port + 1). Forward and allow that port too.
Players get "plug-ins" errors
Everyone needs the same gameplay plug-ins as the server. The game lists what to install, disable or update, and offers one-click Install & Join for catalog plug-ins. Cosmetic plug-ins don't count. For plug-ins you uploaded yourself, players must get the same file.
UPnP didn't work
Many routers ship with UPnP turned off, and it can't help behind carrier-grade NAT. Forward the ports by hand.
I forgot the admin password
Run the server once with --reset-admin-password. It prints a new password and exits.
Does it work with Apple players?
Yes. Mac, iPhone, iPad and Apple TV players join by address, from the server list or Quick Connect, the same as desktop players.