This release is a pre-release and may not be stable for production use.
mcwaiter
Minecraft server configurator and controller for Linux.
⚠️ Status: Early beta. Expect breaking changes. Please open issues or start a discussion if you find any bugs or would like to request a feature.
Create Minecraft servers and run each one as a sandboxed systemd service
under its own system user (mcwaiter-<name>).
Features
- Create servers for many loaders (Vanilla, Fabric, Paper, ...) with one command, using the MCJars API
- Interactive prompts for anything you don't pass as an argument
- Finds a matching Java installation automatically (based on the Minecraft version)
- Generates a ready-to-use
run.shand a commenteduser_jvm_args.txt(Aikar flags) - Service hardening and resource limits, configurable globally and per server
- Live console: follows the server log and sends commands via RCON
- Optional autostart of all servers on boot
Requirements
- Linux with systemd (other service managers are not supported yet)
- Python 3.10+
- Root privileges for most commands (mcwaiter re-runs itself with
sudowhen needed) - Java (mcwaiter looks for installed JDKs in
/usr/lib/jvm)
Installation
pipx install mcwaiter
or directly via git
pipx install git+https://github.com/Aintdev/mcwaiter.git
Quick start
# create a server (asks for anything you leave out)
mcwaiter create survival --version 1.20.1 --loader fabric
mcwaiter start survival
mcwaiter console survival
mcwaiter stop survival
Commands
mcwaiter [--version] <command> [options]
| Command | Description | Needs root |
|---|---|---|
create <name> |
Create a server | yes |
delete <name> |
Delete a server and its user | yes |
start <name> |
Start a server | yes |
stop <name> |
Stop a server | yes |
restart <name> |
Restart a server | yes |
status <name> |
Show the systemd status of a server | no |
console <name> |
Open the live console | yes |
shell <name> |
Open a shell as the server's user | yes |
edit <name> <relpath> |
Edit a file in the server directory | yes |
chown <name> |
Fix ownership of all server files | yes |
ls |
List all servers and whether they are running | no |
config |
Edit the global config (or a server's config with -n) |
with -n |
autostart |
Manage and run autostart | yes |
Every command accepts --debug. In debug mode, API responses are saved to
<config dir>/.debug/api.
create
mcwaiter create <name> [--version MC_VERSION] [--loader LOADER[@BUILD]]
--loader takes the format loader@build, for example fabric@0.20.1. If you
leave out the build (just fabric), mcwaiter lists the available ones and lets
you choose; the latest stable build is marked [STBL]. Missing arguments are
asked interactively.
mcwaiter picks a matching Java version (or asks), writes run.sh and
user_jvm_args.txt (6 GB heap by default) and asks you to accept the
Minecraft EULA. If anything fails, the
half-created server is cleaned up again.
delete
mcwaiter delete <name>
You have to type a random confirmation string. For scripts you can skip that
with --confirm-override (use at your own risk, this cannot be undone).
edit / config
mcwaiter edit survival server.properties # file path is relative to the server root
mcwaiter config # global config
mcwaiter config -n survival # per-server config
mcwaiter config -e nano # set the editor and use it
mcwaiter config -n survival -e nano # per-server config with nano as editor
The editor is stored in the config ([DEFAULTS] editor) and asked for on first use.
edit fixes file ownership afterwards.
console
Follows the server log (via journalctl) in a curses interface. If RCON is
enabled in the server's server.properties, you can type commands at the
bottom (up/down for history, PageUp/PageDown to scroll). Without RCON the log is
read-only.
Enabling RCON
Open server.properties with mcwaiter edit <name> server.properties and set
a port and a password of your choice:
enable-rcon=true
rcon.port=25575
rcon.password=your-safe-password
autostart
mcwaiter autostart --enable # install a systemd unit that starts your servers on boot
mcwaiter autostart --disable # remove it again
mcwaiter autostart --run # start all servers with autostart enabled (what the unit runs)
A server takes part in autostart when autostart = true is set in its
[OVERRIDES] section (mcwaiter config -n <name>). Servers are started in
alphabetical order.
How it works
- Servers are in
/opt/mcservers/<name>(configurable viaserverpath). - Each server runs as the system user
mcwaiter-<name>. startlaunchesrun.shas a transient systemd unit namedminecraft-<name>(viasystemd-run), so you can also usesystemctlandjournalctlon it directly.- Per-server settings are stored next to the server directory in
/opt/mcservers/<name>.ini.
Configuration
The global config is a config.ini in your user config directory
(~/.config/mcwaiter/ on most systems).
[DEFAULTS]
| Option | Default | Description |
|---|---|---|
serverpath |
/opt/mcservers/ |
Where servers are stored |
editor |
(empty) | Editor used by edit and config |
shell |
path of bash |
Shell used by shell and run.sh |
service-manager |
systemd |
Detected automatically |
[JAVA]
auto points to the default java binary and in the selection panel while creating a server, is listed under symlink.
Detected JDKs are added automatically as <jdk-name> = <path>
(for example java-21-openjdk = /usr/lib/jvm/java-21-openjdk/bin/java).
[SERVICE]
These are the defaults for all servers. Each server can override any of them in
its own [OVERRIDES] section; an empty value falls back to the global one.
A config file is owned by root and the minecraft-user cannot access it.
| Option | Default | Effect |
|---|---|---|
harden |
true |
NoNewPrivileges, RestrictSUIDSGID, LockPersonality, RestrictRealtime |
network-isolation |
false |
PrivateNetwork (no network access at all) |
deny-network |
false |
IPAddressDeny=any (ignored if network-isolation is on) |
private-tmp |
true |
PrivateTmp |
private-devices |
true |
PrivateDevices |
protect-kernel |
true |
Protects kernel tunables, modules, logs and control groups |
read-only-system |
false |
ProtectSystem=strict, ProtectHome=yes |
auto-restart |
on-failure |
systemd Restart= policy (no disables it) |
restart-sec |
5s |
systemd RestartSec= (0 disables it) |
memory-limit |
0 |
MemoryMax= (0 = unlimited) |
cpu-quota |
0 |
CPUQuota= (0 = unlimited) |
tasks-limit |
0 |
TasksMax= (0 = unlimited) |
Boolean options accept the usual configparser values (true/false,
yes/no, on/off, 1/0).
Example of a per-server config (/opt/mcservers/survival.ini):
[OVERRIDES]
autostart = true
memory-limit = 8G
private-devices =
Development
git clone https://github.com/Aintdev/mcwaiter.git
cd mcwaiter
pip install -e .
mcwaiter --help
License
Metadata
Release files for mcwaiter 0.1.0b1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| mcwaiter-0.1.0b1.tar.gz | 34.8 kB | With provenance | Details for mcwaiter-0.1.0b1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| mcwaiter-0.1.0b1-py3-none-any.whl | Python 3 | none | any | Details for mcwaiter-0.1.0b1-py3-none-any.whl |
Total release size: 60.6 kB
Release files / mcwaiter-0.1.0b1.tar.gz
| Download URL | mcwaiter-0.1.0b1.tar.gz |
|---|---|
| Size | 34.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fe027481af25d8d140e4269ff056b283c783ca50259333dfffecda45b5e5809a
|
|
BLAKE2b-256 checksum How to use checksums |
b7cbf3a9b693d3bb9168cadfef9ab541cdc4c909484c10fcaf2cf8cb6291de59
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.
Transparency logRelease files / mcwaiter-0.1.0b1-py3-none-any.whl
| Download URL | mcwaiter-0.1.0b1-py3-none-any.whl |
|---|---|
| Size | 25.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8d884f350f180327154e1166c146cdcc33f0af1e08544b8b4c5d585b2bb80a2f
|
|
BLAKE2b-256 checksum How to use checksums |
66dd3625c7d5e351f95ca81b0cfb8c45f36fb20f0889b76e195d691bc3dac8e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.
Transparency logSecurity for mcwaiter 0.1.0b1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for mcwaiter-0.1.0b1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.