Everything you need to run BadgerOS
Install, firewall setup, supported server types, and upgrading to Premium — all on one page.
Getting started
BadgerOS installs directly on the same machine as your Minecraft server(s) and manages them locally — start/stop, console, backups, players, plugins, and more, all from one dashboard. It doesn't run your server for you or move it anywhere; it finds the server(s) you already have on disk and gives you a proper control panel for them.
Two ways to get going:
- Guided setup — answers a couple of questions, hands you one command to paste into your VPS.
curl -fsSL https://badgerstudios.net/install.sh | bash— if you already know what you're doing.
Requirements
- A Linux VPS or server with
bash,curl,openssl, andpython3(the installer checks for all four and tells you exactly what's missing). - An existing Minecraft server (or Velocity/Waterfall/BungeeCord proxy) already on disk — BadgerOS finds and manages what's there, it doesn't provision a new one for you.
- Outbound internet access to
badgerstudios.net— every install, free or Premium, registers here once to get its unique id and license. There's no offline install path.
Installing
Guided setup
The setup wizard asks your server's name, your OS family, and your Minecraft server type, then generates a single install command tailored to your answers. Paste it into your VPS and the wizard's progress bar picks up automatically once your server registers — no need to copy anything back and forth.
Direct install
curl -fsSL https://badgerstudios.net/install.sh | bash
Non-interactively (for scripts/CI), set the server name and skip prompts with an environment variable:
curl -fsSL https://badgerstudios.net/install.sh | BADGEROS_PANEL_NAME="My Server" bash
What install.sh does
- Confirms the control plane is actually reachable over the internet — the install fails here on purpose if it isn't, since every install needs its own id and license.
- Asks your Minecraft server's name. This becomes the name shown on your panel.
- Generates an Ed25519 keypair locally. The private key never leaves your machine.
- Registers with the control plane, which assigns a unique agent id and immediately issues a signed Free-plan license certificate — no waiting, no browser step required for Free. Optionally asks for an email too, so a badgerstudios.net account can find this install later — entirely separate from Premium, and skippable.
- Offers to upgrade to Premium right away. Say yes and it walks you through checkout and pastes back a signed Premium certificate; say no and upgrade any time later from the same claim link.
- Downloads the actual panel software from the same signed release channel later updates use, verifies its signature and checksum, installs it, and starts it as a systemd service (survives reboots). Also sets up a hosted dashboard link (a
badgerstudios.netsubdomain via a Cloudflare Tunnel) on a best-effort basis, then prints your one-time owner login and how to reach the dashboard. - Prints the exact
ufwcommands to open the ports your Minecraft server(s) need.
Your hosted dashboard link
Every install gets a badgerstudios.net subdomain that tunnels straight to your
panel — Cloudflare's edge is the only thing actually public; your panel still only listens on
127.0.0.1, exactly like an SSH tunnel would reach it, just without you needing to
open one by hand. This is set up automatically near the end of install.sh and
printed as "Your dashboard" when it finishes. It's best-effort — if it can't be set up (no
outbound access to Cloudflare, an unsupported CPU architecture), the install still succeeds and
falls back to the SSH-tunnel instructions below.
The address itself is auto-generated from your server's name on Free; Premium accounts can instead choose their own from the dashboard.
Signing in without a password every time
Visiting the hosted link directly still shows your panel's own login screen — the same owner
account and password as always. If you'd rather not re-type it, create a free account at
badgerstudios.net using the email you linked during install (optional, and
separate from Premium — install.sh asks for one either way). Signing in there and
picking a server hands you off to your panel already signed in, using a short-lived, signed
one-time link rather than a second password — your panel's own login is still the only real
credential that exists.
Supported server types
BadgerOS auto-detects your server software — start/stop/console/backups work identically across all of them, no configuration needed:
| Family | Detected software |
|---|---|
| Plugin-based | Paper, Purpur, Folia, Pufferfish, Spigot, Leaf, Airplane |
| Mod-based | Forge, NeoForge, Fabric, Quilt |
| Vanilla | Stock server.jar |
| Proxy | Velocity, Waterfall, BungeeCord |
Not sure what you're running? Pick "Not sure yet" in the setup wizard — BadgerOS detects it for you after install.
Firewall & ports
At the end of a successful install, you'll see something like this — paste it as shown:
sudo ufw allow 25565/tcp comment 'Minecraft'
sudo ufw allow 25566/tcp comment 'Minecraft (secondary)'
sudo ufw reload
Don't open port 8770 — the dashboard binds to 127.0.0.1 only, by design, so nothing
on the internet can reach it directly no matter what your firewall allows. Reach it over an SSH
tunnel (ssh -L 8770:127.0.0.1:8770 you@your-server) or put an HTTPS reverse proxy in
front of it — the installer prints both options when it finishes.
Free vs Premium
| Free | Premium — $9/mo or $90/yr | |
|---|---|---|
| Servers | One | Unlimited / Velocity networks |
| Start / stop / console | ✓ | ✓ |
| Local backups | ✓ | ✓ |
| Player management | ✓ | ✓ |
| Hosted dashboard link (auto-generated address) | ✓ | ✓ |
| Choose your own hosted address | — | ✓ |
| Banking & finance dashboard | — | ✓ |
| Webhooks & scheduled tasks | — | ✓ |
| Advanced security monitoring | — | ✓ |
| Signed auto-updates | — | ✓ |
| Extra color themes + custom CSS theme upload | — | ✓ |
AI Assistant add-on — $20/mo
A separate add-on rather than a plan tier: it stacks on top of Free or Premium and doesn't
change whichever one you're on. It puts a chat bubble in your dashboard (and a
badgeros agent chat command in your terminal) backed by an AI that can actually
operate the server — start, stop and restart it, run console commands, read the console, and
read or edit config and plugin files.
Every shell command it runs is confined to that one server's directory by a bubblewrap sandbox, so it cannot reach the rest of your box even if something goes wrong or the model is fed a malicious instruction inside a file it reads. It's owner-only — administrators don't get it by default, because it's the same trust level as handing out shell access.
You supply the model: bring your own key from Anthropic or OpenRouter, or point it at a local Codex CLI. Buy it from the same claim link you'd use to upgrade; it switches on automatically within a few hours, or immediately if you paste the activation code.
Upgrading to Premium
Every install prints a claim link (also shown on the install script's Free-plan confirmation).
Opening it asks for the email you'd like the subscription tied to, then takes you through Stripe
Checkout. When payment completes, the page shows a short activation code —
paste that code back into the terminal where the install script is waiting (or
re-run install.sh and answer "yes" to the upgrade prompt at any time). That's the one
manual step: activation has to happen on your own machine, since it's what actually unlocks your
local panel.
Custom themes (Premium)
Premium accounts can upload their own CSS file from Settings to restyle the dashboard — colors, layout, fonts, imagery, almost anything, without ever touching the panel's own code. It's loaded after every built-in stylesheet, so it has the final say. Free accounts get the default Badger Violet theme; Premium unlocks four more built-in themes plus custom uploads.
Where files live
| Running as | State directory |
|---|---|
| root | /var/lib/badgeros/ |
| non-root | ~/.local/share/badgeros/ |
That directory holds your agent keypair (agent.key / agent.pub), your
agent id, license.json (the signed certificate your panel checks locally to know its
own plan), the panel software itself under app/, and
FIRST_RUN_PASSWORD.txt — your one-time owner login, printed once by the installer and
safe to delete once you've signed in and changed it.
Troubleshooting
"Could not reach the control plane"
Check this machine's outbound internet access (a corporate firewall or restrictive security group is the usual cause), then re-run the install command. Nothing is written until this check passes.
Re-running the installer
Safe to do any time. If an agent keypair already exists in the state directory, it's reused rather than regenerated — your agent id and plan stay the same.
Lost your claim link
It's https://badgerstudios.net/claim/<your-agent-id> — your agent id is saved in the state directory (see above) if you need to find it again.
Error codes
Every failure BadgerOS can report has a code. Your panel shows these under Settings › Error log, along with what each one means and what to do about it. Quote the code if you contact support — it is far more useful than a screenshot of the message.
| Code | What it means and what to do | Who fixes it |
|---|---|---|
| BOS-1001 | Release archive layout is unexpected The downloaded update did not contain the files the installer expects at the top level. Re-run the installer. If it happens twice, the published release is malformed and we need to republish it. | Contact support |
| BOS-1002 | Release signature did not verify The update manifest was not signed by the BadgerOS release key. The panel refused to install it. Do not retry over the same network. This means either a corrupted download or someone tampering with it in transit. Report it. | Contact support |
| BOS-1003 | Download did not match its checksum The update downloaded but its hash disagreed with the signed manifest, so it was discarded. Retry once -- this is usually a truncated download. If it repeats, report it. | Usually resolves itself |
| BOS-1004 | Update check could not reach the release channel The panel could not fetch the update manifest. Check outbound HTTPS from this machine. The panel keeps running the version it already has. | Usually resolves itself |
| BOS-1005 | Update installed but the service did not restart The new version is on disk but the old one is still running. Restart the panel service manually (systemctl --user restart badgeros, or systemctl restart badgeros). | You can fix this |
| BOS-1006 | This panel has no control-plane identity No agent credentials were found on disk, so the panel cannot check in. This is normal for a manually-copied install. Re-run the installer if you want this panel linked to your account. | Needs a settings change |
| BOS-2001 | Could not reach the control plane The check-in to badgerstudios.net failed. Your servers are unaffected. Usually transient. If it persists for a day, check outbound HTTPS and DNS from this machine. | Usually resolves itself |
| BOS-2002 | The control plane rejected this panel's credentials The agent id and secret on disk are not accepted any more. This happens if the install was removed from your account. Contact support before reinstalling, so you don't lose the license. | Contact support |
| BOS-2003 | License signature did not verify The stored license certificate is not validly signed, so paid features stayed off. Re-claim the license from your claim link. If that fails, contact support. | Contact support |
| BOS-2004 | This feature needs Premium The action requires a plan this install does not currently hold. Upgrade from your claim link, or from Settings, then retry. Entitlements apply within one check-in. | Needs a settings change |
| BOS-2005 | This feature needs the AI assistant add-on The AI assistant is not enabled on this install. Purchase the add-on, or configure your own provider key in Settings to use it without the add-on. | Needs a settings change |
| BOS-2006 | An install with this name already exists on your account Another registered panel is using the same or a very similar name. Choose whether this is a replacement for that install or a genuinely separate one. Both are supported; we just don't want to guess. | Needs a settings change |
| BOS-2007 | This account has reached its install limit The number of registered panels on this account is at its cap. Remove an install you no longer use, or request an increase -- we approve these by hand to keep licence sharing honest. | Contact support |
| BOS-3001 | Server did not start The launch command exited before the server came up. Open the console for that server -- the Java error is printed there. Most often a bad start flag, a missing jar, or an EULA that was never accepted. | You can fix this |
| BOS-3002 | Server jar not found The configured jar file does not exist at the path recorded for this server. Check the server folder in Files, then correct the path in that server's settings. | Needs a settings change |
| BOS-3003 | Java is not installed or not on PATH No usable Java runtime was found, so no Minecraft server can be launched. Install a JDK matching your server version (Java 21 for 1.20.5+), then restart the panel. | You can fix this |
| BOS-3004 | Server stopped unexpectedly The process exited without being asked to. Crash recovery will retry it if enabled. Check the console and the crash report in the server folder. Repeated crashes are almost always a plugin or an out-of-memory kill. | You can fix this |
| BOS-3005 | Server did not stop within the grace period A graceful shutdown was requested but the process was still alive when the timeout expired. Use Kill to end it. If this is routine, raise the graceful-stop timeout in Settings -- big worlds take longer to save. | Needs a settings change |
| BOS-3006 | Console command could not be delivered The panel could not write to the server's console. The server is probably not running, or was started outside the panel. Restart it from the panel so it can attach. | You can fix this |
| BOS-3007 | Out of memory The server was killed by the operating system for exceeding available RAM. Lower the server's heap size, or add RAM. Allocating more than the machine has makes this more likely, not less. | Needs a settings change |
| BOS-3008 | tmux session could not be created The panel manages server processes inside tmux and could not start a session. Confirm tmux is installed and that the panel's user may create sessions. | You can fix this |
| BOS-4001 | Path is outside the allowed directory A file operation tried to reach outside the folder it is confined to. It was refused. This is a safety refusal, not a fault. If the file you want really is elsewhere, add that location as a search root instead. | Needs a settings change |
| BOS-4002 | Permission denied on disk The operating system refused the read or write. Check ownership of the server folder. The panel can only touch files its own user can. | You can fix this |
| BOS-4003 | Disk is full There is not enough free space to complete the operation. Free space or lower backup retention. Backups are the usual cause -- check Settings. | You can fix this |
| BOS-4004 | Backup failed The archive was not created, so no new restore point exists. Check free space first, then the service log. The previous backups are untouched. | You can fix this |
| BOS-4005 | Backup archive is corrupt Verification of the archive failed; it will not restore. Delete it and take a fresh backup. If archives keep failing verification, suspect the disk. | You can fix this |
| BOS-4006 | Restore failed The world was not fully restored from the archive. Do not start the server. Check the service log, then restore from an older archive. | Contact support |
| BOS-4007 | Upload rejected by the scanner An uploaded file was refused because it matched a rule for unsafe content. See the scan detail on the file. If you are certain it is safe, an owner can override; if not, get it from the original author. | You can fix this |
| BOS-4008 | Upload too large The uploaded file exceeded the size limit for that endpoint. Upload it another way (SFTP into the server folder), or raise the limit if you host this panel yourself. | Needs a settings change |
| BOS-4009 | Offsite backup sync failed Local backups succeeded but copying them offsite did not. Check the remote's credentials in Settings. Local restore points still exist. | Needs a settings change |
| BOS-5001 | Port already in use Another process is bound to the port this server wants. Find it (ss -ltnp | grep the port) and stop it, or move this server to a different port. | You can fix this |
| BOS-5002 | Server is not reachable from outside The server is running locally but a connection from the internet did not get through. Open the port in your firewall (ufw allow). If you are behind NAT, forward it too. | You can fix this |
| BOS-5003 | Proxy forwarding is misconfigured The proxy and its backends disagree about player forwarding, so players get kicked on join. Set modern forwarding on the proxy, enable it on every backend, and give them the same secret. Run the panel's diagnostics for the exact mismatch. | Needs a settings change |
| BOS-5004 | A backend is reachable without going through the proxy A backend server accepts direct connections, letting anyone bypass the proxy and join as any username. Bind backends to 127.0.0.1 and firewall their ports. This is an active security hole, not a warning. | Needs a settings change |
| BOS-5005 | Hosted dashboard link could not be created The tunnel that gives this panel a badgerstudios.net address did not come up. The panel is still reachable on its local address. Retry from Settings; if it keeps failing, report it. | Contact support |
| BOS-6001 | Sign-in failed The username or password did not match. Retry. Repeated failures from one address are rate-limited, so wait rather than hammering it. | You can fix this |
| BOS-6002 | Session expired The session is older than the configured lifetime. Sign in again. Adjust the session length in Settings if it expires too eagerly. | You can fix this |
| BOS-6003 | Not permitted The signed-in user's role does not include this action. An owner can grant the permission in Settings. Some actions are owner-only by design because they grant access to the whole machine. | Needs a settings change |
| BOS-6004 | Two-factor code was wrong The submitted code did not verify. Check your device's clock -- drift is the usual cause. Use a recovery code if you are locked out. | You can fix this |
| BOS-6005 | Request failed its security check The request lacked a valid CSRF token and was refused. Reload the page and retry. If it repeats, sign out and back in. | You can fix this |
| BOS-6006 | Too many requests This client is being rate-limited. Wait and retry. Automation should slow down rather than retry immediately. | Usually resolves itself |
| BOS-7001 | AI provider rejected the request The model provider refused the call, usually an invalid or expired key. Re-enter your provider key in Settings. On the metered add-on there is no key to check -- report it instead. | Needs a settings change |
| BOS-7002 | AI monthly spend cap reached This install hit its configured spend limit, so further calls were refused before any money was spent. Raise the cap in Settings if that was not intended. The cap exists so a runaway loop cannot bill you. | Needs a settings change |
| BOS-7003 | AI sandbox is unavailable bubblewrap is missing or cannot create a namespace, so commands cannot be run safely and were not run at all. Install bubblewrap. On Ubuntu 24.04+ the panel also needs its AppArmor profile -- the installer sets this up. | You can fix this |
| BOS-7004 | AI hit its tool-call limit for one message The assistant made too many tool calls in a single turn and was stopped. Ask again in smaller steps. This limit stops a runaway loop from burning tokens. | You can fix this |
| BOS-8001 | Checkout could not be started The payment session was not created, so nothing was charged. Retry. If it keeps failing, report it -- this is on our side, not yours. | Contact support |
| BOS-8002 | Payment succeeded but the entitlement did not arrive The charge went through and the feature did not switch on. Reload your claim page -- it asks the payment provider directly and grants from there. Contact support if it stays off. | Contact support |
| BOS-8003 | Usage could not be reported for billing Metered usage was recorded locally but not yet submitted. No action needed. It is retried, and usage is never dropped or double-counted. | Usually resolves itself |
| BOS-9001 | Unexpected internal error Something failed in a way the panel did not anticipate. The details are in the error log. Send us the error report from Settings; it carries the code and a redacted stack, not your data. | Contact support |
| BOS-9002 | Request body was malformed The request could not be parsed. Usually a stale browser tab. Reload the page. | You can fix this |
| BOS-9003 | A background task failed A scheduled job did not complete. Servers are unaffected. Check the error log for which job and why. Scheduled backups failing is the case worth acting on. | You can fix this |
| BOS-9004 | Database is locked or corrupt The panel's own state database could not be read or written. Restart the panel. If it repeats, report it -- do not delete the database, it holds your users and settings. | Contact support |
FAQ
Does BadgerOS see my Minecraft data?
No. It runs entirely on your own server; the control plane only ever handles registration, licensing, and billing.
Can I self-host without any of this?
The control-plane registration step is required for every install — it's how your unique license is issued. There's no offline mode.
What happens if I downgrade from Premium?
Your dashboard falls back to the free default theme and Premium-only features lock again, but nothing about your Minecraft server itself changes.