Project Zomboid is a zombie survival game; playing it with friends means running a dedicated server somewhere. Zomboid Control Panel is the web app that sets up and manages that server for you — no command line required — with a live world map, Workshop mod management, scheduled restarts, backups, and Discord integration built in.
At a glance — server status, RCON & PanelBridge connection state, live player activity, host telemetry, disk headroom, the next scheduled maintenance action, console error count, backup readiness, and quick actions. One screen covers 80% of routine admin work.
- What It Does
- Requirements
- Quick Start
- Setup
- PanelBridge
- Remote Access
- Security
- Development
- Community
- Server control — Start, stop, restart, save. Live status and uptime.
- Console — Live log viewer and RCON terminal with command history.
- Scheduling — Recurring restarts, saves, broadcasts with countdown warnings.
- Backups — Manual or scheduled world backups with configurable retention, snapshot preview, and download/upload of the raw archive. Restore takes an automatic safety backup first and warns it can't be undone.
- Roles & permissions — Capability-based access control: three built-in roles (admin, technician, moderator) plus fully custom ones, each granting an explicit subset of the panel's 28 individual capabilities across 12 areas (server lifecycle, RCON, backups, mods, and more).
- Account recovery — Single-use recovery codes, generated in advance from an authenticated admin session, let the admin reset their own password later if they get locked out. Two more paths cover losing access to the panel entirely: a local-only token file, or the
--reset-passwordCLI flag run directly on the server.
- Players — Online list, activity history, kick/ban/unban, access levels, notes and tags.
- World map — Live player positions on Knox County with right-click actions.
- Mod manager — Track Workshop mods and detect updates, decide server membership from your Steam collection, auto-sort load order by declared dependencies, and scan for conflicts. Collection sync adds what's missing without deleting the optional mods you keep on the side.
- Server config — Full INI editor with structured and raw views. Sandbox, spawn points, mod settings — searchable and editable in-browser.
- Events & weather — Rain, storms, blizzards, climate control, time control, sound triggers, zombie management.
- PanelBridge — Server-side Lua mod for actions RCON can't reach: teleport, heal, god mode, character export/import, inventory.
- Discord bot — Slash commands and two-way chat relay.
- Single sign-on (SSO) — OpenID Connect login, with ready-made presets for Google, Authentik, Keycloak, Azure AD, Okta, and Auth0, or any other compliant provider entered by hand. Full discovery + PKCE + state/nonce flow, with a one-click credential test before you commit to it.
- Multi-server — Manage multiple PZ servers from one panel.
- Chunk cleaner — Visual map selector for reclaiming disk space from an aging save: delete individual chunks or drag out a rectangular region, with per-save stats before you commit.
- Auto-update — Checks for new releases, downloads and applies them.
Don't have a Project Zomboid server yet? You don't need one before you start — the Setup Wizard in Quick Start below installs a fresh Build 41 or Build 42 server for you, RCON included. The rest of this section applies either way; if you're pointing the panel at a server you already run, confirm these in its .ini first:
- RCON enabled, and network access between the panel and the PZ server (same machine, same LAN, or a reachable IP):
Use the actual RCON port and password configured for your server.
RCONPort=27015 RCONPassword=choose-a-strong-password DoLuaChecksum=false
DoLuaChecksum=falseis needed only for PanelBridge features. curlfor World Map build detection (Docker, Windows, and macOS already have it; a bare-metal Linux tarball install might not). Without it, the map still works — it just falls back to a fixed build and stops tracking new Project Zomboid map releases, which Debug > World Map will flag.
The packaged binary includes its own runtime — no Node.js, Python, or Java install needed on the panel host.
Choose where the panel runs. It can run beside the game server, in Docker, or on a separate computer. The panel needs RCON access to the game server; PanelBridge features additionally need its server files or SFTP access.
| Your setup | Use this guide |
|---|---|
| Windows PC or Windows server | docs/install/windows.md |
| Linux PC, VPS, or home server | docs/install/linux.md |
| macOS | macOS below |
| Docker or Unraid | docs/install/docker.md |
| Renting from a host (Indifferent Broccoli, etc.) | docs/install/hosted.md |
Not sure which? If you already rent a Project Zomboid server from a host, pick Hosted — you're not installing anything server-side. Otherwise pick the row that matches the computer the panel will run on; Docker needs the fewest manual steps if that machine has it.
Every path above ends the same way: a browser tab open to the panel's setup screen, where you create your admin account. Download the current package from Releases. Something not working? docs/install/troubleshooting.md is organized by what's actually on your screen, not by which guide you followed.
There's no native macOS binary. Run the panel with Docker Desktop or OrbStack — see the macOS row in docs/install/docker.md's own chooser table, which points you at the fastest of its four Docker paths. Project Zomboid server hosting itself needs Linux or a hosting provider; the panel can still run on your Mac.
The fastest path to a fully working setup — panel and a new Project Zomboid server — is the all-in-one installer:
curl -fsSL https://raw.githubusercontent.com/fpsacha/zomboid-control-panel/main/docker/all-in-one/bootstrap.sh | shIt checks Docker, generates the secret and persistent configuration, pulls the
prebuilt release images, installs PZ, detects the LAN address, and publishes
the required UDP ports 16261 and 16262, and prints the panel URL near the end
once the health check passes.
If PZ already runs on the host, in another container, or on another machine, use the panel-only image instead:
curl -O https://raw.githubusercontent.com/fpsacha/zomboid-control-panel/main/docker-compose.install.yml
docker compose -f docker-compose.install.yml up -dThe panel-only image deliberately does not publish PZ game ports; those belong to the existing game-server host or container.
See docs/install/docker.md for the full walkthrough of these and the other two configurations (bind-mounting an existing PZ install, and Unraid specifically) — including running PZ in a separate container from the panel, and choosing between the published image and building from source.
- Open the panel and create your admin account.
- In Settings, set your server install path and Zomboid data path.
- Configure RCON (host, port
27015, password from your server.ini). - Optionally install PanelBridge for advanced features.
If you installed a brand-new server with the Setup Wizard, steps 2 and 3 are already done — the wizard fills them in as part of installing.
PanelBridge is a server-side Lua drop-in that enables features RCON can't reach — teleport, heal, weather control, character export/import, inventory editing, sound triggers.
There is no client-side component. Players don't install anything. The panel copies PanelBridge.lua into your server's Install/media/lua/server/ folder, then you set DoLuaChecksum=false in the server INI, restart the PZ server, and enable it in Settings → PanelBridge.
For a remote server without a shared filesystem, use the Remote server via SFTP option in the same panel. It syncs the bridge command and result files through a local cache; it does not expose the server's full filesystem to the panel.
If you're running the panel on the same machine as your browser, skip this section.
To access the panel from another machine, allow the origin before first launch:
CORS_ORIGINS=http://YOUR-IP:3001 ./start.shAfter login, save it permanently in Settings → Remote Access so the env var isn't required next time.
For VPS or public-internet deployment, put the panel behind a reverse proxy (nginx or Caddy) with HTTPS, and set HTTPS=true so the panel emits HSTS headers. Don't expose port 3001 directly to the internet.
The panel uses a live socket.io connection for status updates, chat, and the world map's activity overlay — nginx does not forward WebSocket upgrade requests by default, so without the Upgrade/Connection headers below the panel will load but the connection indicator will show disconnected and any live-updating panel (world map included) will silently stop working, while everything else keeps working normally. This is the single most common reverse-proxy misconfiguration reported against the panel.
Recommended pattern: terminate TLS at nginx, run the panel itself over plain HTTP behind it (no need to also configure certificates inside the panel).
server {
listen 443 ssl http2;
server_name your-domain.example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3001;
proxy_http_version 1.1;
# Required for socket.io — without these two lines the panel's
# live connection never establishes, but every plain HTTP(S)
# request still works, which is why this is easy to miss.
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Then set these before first launch (see linux.md Phase 9 for the systemd equivalent):
TRUST_PROXY=1 HTTPS=true ./start.shTRUST_PROXY=1 tells the panel to trust the X-Forwarded-* headers above for one proxy hop (IP-based rate limiting and login all key off this) — only set it if the panel is genuinely reachable exclusively through your proxy, never if port 3001 is also exposed directly. HTTPS=true makes the panel emit HSTS and treat the connection as secure for cookies even though it's speaking plain HTTP to nginx.
If you instead terminate TLS at nginx and run the panel's own HTTPS listener behind it (double TLS termination — only needed if something else on the same host also talks to the panel directly over HTTPS), point proxy_pass at https://127.0.0.1:<your HTTPS port> instead and add proxy_ssl_verify off; if you're using the panel's self-signed certificate. The Upgrade/Connection headers above are still required either way — they're about forwarding the client's upgrade request, not about which protocol nginx uses to reach the panel.
- JWT authentication on all API routes.
- Capability-based roles: three built-in roles plus custom ones, each granting only the specific actions it needs — a moderator account doesn't get server-wipe just because an admin's does.
- Rate limiting on login, RCON, and destructive operations.
- RCON parameter sanitization to prevent command injection.
- CORS configurable per deployment (LAN auto-allows private IPs, VPS requires explicit origins).
- Recovery codes are single-use, enforced even against two redemption attempts racing each other.
- Password reset via secure token file or
--reset-passwordCLI flag.
npm run install:all
npm run devFrontend at http://localhost:5173, backend at http://localhost:3001.
node build.js --all # Build Windows + Linux binaries
npm test # Run tests- Discord — discord.gg/jHsWJDNmSg for questions, support, and feature ideas.
- Issues — Report bugs or request features on GitHub.
- Changelog — See the latest release notes for what's new.
MIT










