Badger Studios
Sign in Get started
Documentation

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, and python3 (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

  1. 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.
  2. Asks your Minecraft server's name. This becomes the name shown on your panel.
  3. Generates an Ed25519 keypair locally. The private key never leaves your machine.
  4. 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.
  5. 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.
  6. 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.net subdomain via a Cloudflare Tunnel) on a best-effort basis, then prints your one-time owner login and how to reach the dashboard.
  7. Prints the exact ufw commands to open the ports your Minecraft server(s) need.

Supported server types

BadgerOS auto-detects your server software — start/stop/console/backups work identically across all of them, no configuration needed:

FamilyDetected software
Plugin-basedPaper, Purpur, Folia, Pufferfish, Spigot, Leaf, Airplane
Mod-basedForge, NeoForge, Fabric, Quilt
VanillaStock server.jar
ProxyVelocity, 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

FreePremium — $9/mo or $90/yr
ServersOneUnlimited / 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 asState 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.

CodeWhat it means and what to doWho fixes it
BOS-1001Release 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-1002Release 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-1003Download 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-1004Update 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-1005Update 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-1006This 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-2001Could 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-2002The 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-2003License 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-2004This 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-2005This 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-2006An 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-2007This 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-3001Server 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-3002Server 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-3003Java 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-3004Server 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-3005Server 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-3006Console 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-3007Out 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-3008tmux 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-4001Path 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-4002Permission 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-4003Disk 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-4004Backup 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-4005Backup 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-4006Restore 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-4007Upload 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-4008Upload 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-4009Offsite 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-5001Port 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-5002Server 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-5003Proxy 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-5004A 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-5005Hosted 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-6001Sign-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-6002Session 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-6003Not 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-6004Two-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-6005Request 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-6006Too many requests
This client is being rate-limited.
Wait and retry. Automation should slow down rather than retry immediately.
Usually resolves itself
BOS-7001AI 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-7002AI 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-7003AI 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-7004AI 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-8001Checkout 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-8002Payment 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-8003Usage 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-9001Unexpected 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-9002Request body was malformed
The request could not be parsed.
Usually a stale browser tab. Reload the page.
You can fix this
BOS-9003A 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-9004Database 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.