v0.4.0
Hopper runs a game that is not Minecraft.
A template says when it is ready
Two releases shipped readiness plumbing with no tap on it: v0.3.0 added four strategies to the contract and the daemon, v0.3.1 an RCON client — and no operator could select any of them. There was no column, no field on a template definition, no mapping in the egg importer. Every server fell back to log with a single regular expression.
That is connected now, end to end. A template declares a readiness, an imported Pterodactyl egg keeps all its startup markers instead of the first one, and a strategy the node cannot run is said out loud rather than silently downgraded — a udp port probe used to become a TCP connect against a port where nothing listens, and fail for the whole timeout while the server was up and taking players.
Deadlines are opt-in. A template that names no timeoutMs keeps the open-ended wait it has always had; declaring a number is how it opts into a start that is allowed to fail. Giving it a default would have handed every imported egg a deadline that now stops the server, where expiring used to print a console line.
Factorio
Not Java, so nothing reads SERVER_MEMORY. No Bukkit line — it says Hosting game at IP ADDR. Its port is UDP, the one case a port readiness cannot serve. It takes its port on the command line, so it touches no configuration file at all. And it installs from a public tarball, which is what lets continuous integration run it end to end.
The install script seeds the server private: the archive's own example asks to be listed publicly with no credentials, which produces a server that claims to be on the list and is not.
A port can be named
readiness.role — "which of the server's ports to knock on" — has been in the contract since the strategies were added and never worked, because an allocation had no name to match against. A port can carry one now, and the daemon reads it. Without this, a template declaring RCON on its own port had the daemon speak the handshake at the game port and, at the deadline, stop a server that was serving players.
A startup command can name one too: --rcon-port {{server.allocations.rcon.port}}.
And a command nobody wrote
The invocation builder dropped any token whose substitution came out empty — right for -Xmx{{SERVER_MEMORY}}M, wrong for a flag/value pair, where it left the bare flag behind to eat the next argument. An unresolved variable now refuses the start and names what to create, on the install path as well as the start path.
Upgrading
From the panel: Settings → Update now. Nothing changes for an existing server: templates that declare none of this keep their startupDetection, their stop command and their 30-second stop, and send the daemon a byte-identical configuration.
Not yet
Factorio speaks RCON and its template does not use it. Stopping a server over RCON — for the games that read no standard input at all — comes next.