Repository navigation
Releases: ptMuta/hopper
Release list
hopper 0.3.4
Hopper 0.3.4
Managed updates now stage a clean new pack and review only local customizations.
- Audit tracked files against the installed version's pristine baseline before
staging. Unchanged files update or disappear with the new pack without prompting,
including files adopted during onboarding. - Automatically merge independent text edits using the installed baseline, local
content and incoming defaults. Overlapping edits, binary changes and unavailable
baseline content require review. Customized files removed upstream offer an
explicit keep-or-remove choice; admin-deleted files remain absent. - Build the new installation in an isolated clean room. After shutdown and a verified
backup, carry worlds, server.properties, operator settings and custom additions
into it before swapping installations and validating startup. - Preserve the new upstream baseline separately from retained or merged custom
content so subsequent updates review only admin changes. - Exclude temporary update work from rolling backups, reserve additional space for
the stopped-world copy, and recover interrupted directory swaps from the verified
snapshot.
Automatic text merging is line-based and does not validate configuration semantics
or replace pack-specific migration instructions. Missing baseline bytes and bounded
merge limits fall back to review. Existing backup and revert commands remain available.
The release includes a statically linked Linux x86-64 binary and SHA256SUMS.
hopper 0.3.3
Hopper 0.3.3
Verified rolling world backups and automatic recovery for managed server updates.
- Back up the complete stopped instance before every changed update, including all
worlds and dimensions, configs, mods, access lists, launcher, lock and managed Java
runtimes. Verify archive contents and integrity before applying any files. - Keep the latest two verified update backups by default. Configure retention with
hopper configure NAME --backup-keep N; onboarding backups remain separate. - Add
hopper backups NAMEandhopper revert NAME [--backup ID]. Revert restores
the matching world and installation offline, pins the restored version where
supported, and pauses scheduled updates while retaining restart schedules. - Automatically revert failed applies and failed initial startups. Check authenticated
RCON and Minecraft status for stable readiness, with a configurable 20-minute
default timeout (--startup-timeout SECONDS). Stopped instances validate on their
nexthopper start; operator cancellation prevents automatic restart. - Show conflict diffs and ask whether to keep local files or use incoming versions.
Scheduled and noninteractive updates skip conflicting updates without stopping the
current server. Recheck digest-bound choices after shutdown, and review acknowledged
local edits again when upstream changes. - Preserve recovery progress across interruptions.
hopper repair NAMEresumes
restoration without registry access; incomplete recovery blocks ordinary starts. - Include backup history, maintenance progress and outcomes in status and JSON output.
Reverting discards world progress made after the selected snapshot. Automatic recovery
covers the update and initial startup window; use manual revert for later problems.
Preflight checks require free space for a new backup, staged files and restoration.
Existing installations should run hopper repair NAME while stopped (add
--scope system for system instances) to refresh generated units and the system helper
before relying on scheduled recovery or startup guards.
The release includes a statically linked Linux x86-64 binary and SHA256SUMS.
hopper 0.3.2
Hopper 0.3.2
Administrator-controlled network settings, without firewall confirmation gates.
- Remove the RCON firewall confirmation requirement from system start, restart, and
updates, including scheduled maintenance. Remove--rcon-firewall-confirmedand
its stored confirmation; existing instance records continue to load. - Add
hopper ports NAME --game PORT --rcon PORTto set game and RCON ports, and
hopper listen NAME ADDRESSto set Minecraft'sserver-ip. Addresses accept
IPv4, IPv6,localhost, or*for all interfaces. Omit values to inspect settings. - Changes preserve other properties and the RCON password, update the instance record,
and apply on the next start or restart. Both verbs support system scope and JSON output. - Preserve explicit ports during onboarding without probing or renumbering them.
Allocate ports only when unspecified, and avoid probing coordinator-assigned ports
again in installation workers. Dry runs no longer allocate ports. - Local RCON connections and player counts follow the configured listen address,
including IPv6 and wildcard listeners. Pending endpoint changes retain the running
server's control endpoint until the next service start.
The release includes a statically linked Linux x86-64 binary and SHA256SUMS.
hopper 0.3.1
Hopper 0.3.1
Fix CurseForge credentials in managed instances and automatically elevate system
commands through sudo.
- Exporting a replacement
CURSEFORGE_API_KEYrefreshes the saved instance credential
before install, repair, check, update, and configure. System workers receive the
refreshed key through systemd credentials instead of continuing to use a stale key. - CurseForge commands fail early when required credentials are missing or malformed.
Explicit search reports a missing key instead of returning no results; configuration
checks credentials before saving settings. Interactive configuration can use the
saved instance key for version discovery. --scope systemautomatically elevates the coordinator through sudo before prompts
or changes, preserving the CurseForge key. Root skips sudo. Noninteractive runs never
prompt for a password and fail immediately if sudo authorization is unavailable.
Pack workers continue to run unprivileged.
The release includes a statically linked Linux x86-64 binary and SHA256SUMS.
hopper 0.3.0
Hopper 0.3.0
Interactive use at a terminal; scripts keep every argument mandatory.
- Anything left out is asked at a terminal: instance pickers for every instance
command, live search across Modrinth and CurseForge forinstall,searchand
versions, release choice only when there is one, mod pickers fordisableand
enable, a settings editor forconfigure, the shell forcompletions. - The equivalent command is printed before anything runs whenever something was asked.
- New confirmations at a terminal:
stop/restartof a running server (with players
online),remove, applyingupdateto a running server,onboard. Scripts and-y
proceed as before. - A CurseForge pack without a server pack asks whether to build from the client pack and
keeps the answer for updates. - New
--no-inputflag andHOPPER_NO_INPUT;CIalso disables prompts.
TERM=dumborHOPPER_ACCESSIBLE=1asks line by line.TERM=dumbdisables colour. disableandenableaccept several files.
Exit code changes:
- A missing argument exits 2 and lists every missing flag.
install x --provider modrinthwithout--packpreviously exited 1. - A declined EULA exits 3 (previously 1). Ctrl-C at a prompt exits 130.
Verification: all 626 automated tests pass, including pseudo-terminal tests that drive
the prompts with real keystrokes and check the terminal is restored after Ctrl-C,
Ctrl-Z and SIGTERM; Clippy and formatting checks pass. The release includes a
statically linked Linux x86-64 binary and SHA256SUMS.
hopper 0.2.1
Hopper 0.2.1
Fixes onboarding failing with unexpected backup entry type for installations
containing sparse files, including Minecraft world region files.
- Accept GNU sparse-file archive entries and verify their complete logical contents,
including zero-filled holes, against the original file hashes and sizes. - Preserve strict verification: mismatched contents/sizes and unsupported special
entry types still fail. Unsupported-entry errors now identify the path and type. - Add regression coverage for extended sparse headers, fully sparse files, real
onboarding restore, destination verification, and corruption rejection.
If onboarding failed at backup verification in 0.2.0, the original installation was
not moved or deleted. Update with hopper self-update, verify hopper --version
reports 0.2.1, keep the source server stopped, and rerun the original onboarding
command. Do not treat the previous unverified archive as a verified backup.
This patch does not change onboarding's conservative live-port check.
Verification: all 600 automated tests pass; Clippy and formatting checks pass.
The release includes a statically linked Linux x86-64 binary and SHA256SUMS.
hopper 0.2.0
Hopper 0.2.0
Hopper now manages explicit named Minecraft server instances with mandatory systemd
services, native GregTech: New Horizons support, and verified existing-world onboarding.
Breaking changes and migration
- Linux with systemd 247 or newer is required. Installs create a stopped, disabled
service;hopper start NAMEenables and starts it. - Select sources explicitly with
--providerand the provider's pack/collection/file
options. Bare pack names,cf:shorthand, implicit directory updates, and optional
service installation are no longer supported. Barehopperprints help. - User scope is always the default, including under sudo. System installs require
explicit--scope systemand use a dedicated unprivileged service account. - Adopt a stopped existing installation with
hopper onboard NAME --provider … --from PATH. This creates a verified private backup, preserves the installed
baseline, world, edited configs, custom files and disabled mods, and moves the
installation only after successful verification and service setup. An unmanaged
baseline needs an explicit installed version and, for GTNH, Java selection. - Starts are rejected while any
.newconflict remains, including launcher conflicts.
Review and merge or deliberately reject each change, then remove its sidecar.
The systemd pre-launch guard also covers boot-time and direct systemd starts.
Refresh existing generated units withhopper repair NAME --scope useror
sudo hopper repair NAME --scope systemwhile the server is stopped.
New features
- Native GTNH stable/testing releases and daily/experimental snapshots, with explicit
version pinning and version-matched modern Java bootstrap components. - Graceful scheduled restarts and updates: stage before shutdown, warn through RCON,
save the world, stop, apply changes, and restart only previously running servers.
Operator stop cancels pending maintenance. Updates that produce.newconflicts
leave the server stopped for review. - Hardened system services and unprivileged pack workers, private credentials, and
explicit RCON firewall acknowledgement. User services support lingering. - Verified backups, interrupted-install/adoption recovery, safe port allocation,
protected world paths, and service removal/reattachment without deleting data. - Hosting/performance guidance for GTNH and other packs in
docs/hosting.md.
Upgrade cautions
Testing/nightly packs are not automatically safe for production worlds. Major GTNH
upgrades can require merging incoming configs and explicit Forge world-remapping
consent. Hopper does not automatically approve potentially destructive conversions.
Keep a verified backup and follow the pack's upgrade instructions.
Verification
- 598 automated tests; Clippy and formatting checks pass.
- Disposable Debian Incus verification covered GTNH 2.8.4 stable and 2.9.0-RC-1
testing on GraalVM 25, real user/system services and scheduled restarts, live system
hardening, onboarding preservation and RCON secret rotation, interrupted-install
recovery, service reattachment, and operator-stop cancellation. The testing world
required an operator-reviewed config change and explicit remapping consent. - The verification container and temporary helper were removed afterward.
- Daily/experimental discovery was verified; those branches and authenticated
CurseForge downloads were not boot-tested in that container.
hopper 0.1.6
A friendlier hopper chat. Update with hopper self-update.
00:24 [server] first
00:24 <minecraft> second, from chat
00:24 [server] third
00:24 /list
│ There are 0 of a max of 20 players online:
>
- An input prompt. You type at
>. Messages arriving meanwhile print above it, and the prompt is redrawn underneath. - No more double echo. A line you type appears once, as
<you> message./sayand/mearen't echoed locally, since the server log already shows them. - Timestamps on everything, including your own messages and commands.
- Command output is indented under its command behind a
│gutter, so it reads as the command's answer. - A day of history. Chat opens with the last 24 hours, including messages you sent from chat. The game never logs those, so hopper keeps its own record in
~/.local/state/hopper/chat/. Lines are ordered by the server's own timestamps, so history appears in the order things happened.
hopper 0.1.5
Fixed: hopper self-update hanging after "yes"
GitHub reports when its API rate limit resets as a Unix timestamp; hopper read it as a number of seconds to wait. GitHub allows 60 anonymous requests an hour, shared by everything behind your IP. Once 20 or fewer were left, hopper scheduled its next download about three years out, so self-update hung right after the prompt.
- The reset value is now understood in both forms, and no wait can exceed an hour.
- Rate limits are tracked per host, so GitHub's API limit no longer slows downloads from
github.com. - Self-update now prints each step, and gives up after 2 minutes with an error naming what stalled.
If 0.1.4's self-update hangs for you, update this once with the installer, which downloads directly and doesn't use the GitHub API:
curl -fsSL https://raw.githubusercontent.com/ptMuta/hopper/main/install.sh | shNew: hopper chat
Talk with the players on your server from the terminal:
- Chat, joins and leaves show up live, with recent history when you open it.
- A line you type is shown to every player as
<you> message;--namechanges the name. - A line starting with
/runs as a console command and prints its output (/list,/kick Steve,/time set day). - It reads the systemd journal when hopper runs the server as a service, and
logs/latest.logotherwise./quitor Ctrl-D leaves.
hopper 0.1.4
hopper show now includes your public address, ready to share with players outside your network:
public: 203.0.113.9:25565
address: 192.168.1.20:25565
host: myserver:25565
It's resolved the way dig TXT o-o.myaddr.l.google.com @ns1.google.com does: one DNS query to Google's own nameserver, over IPv4 and over IPv6 where available. There's no HTTP and no third-party "what is my IP" site. Players outside your network can only reach it if the port is forwarded to this machine.
Update with hopper self-update.