Skip to content

Releases: ptMuta/hopper

hopper 0.3.4

Choose a tag to compare

@ptMuta ptMuta released this 16 Oct 21:11

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

Choose a tag to compare

@ptMuta ptMuta released this 16 Oct 20:35

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 NAME and hopper 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
    next hopper 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 NAME resumes
    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

Choose a tag to compare

@ptMuta ptMuta released this 13 Oct 19:09

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-confirmed and
    its stored confirmation; existing instance records continue to load.
  • Add hopper ports NAME --game PORT --rcon PORT to set game and RCON ports, and
    hopper listen NAME ADDRESS to set Minecraft's server-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

Choose a tag to compare

@ptMuta ptMuta released this 13 Oct 18:43

Hopper 0.3.1

Fix CurseForge credentials in managed instances and automatically elevate system
commands through sudo.

  • Exporting a replacement CURSEFORGE_API_KEY refreshes 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 system automatically 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

Choose a tag to compare

@ptMuta ptMuta released this 03 Oct 22:25

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 for install, search and
    versions, release choice only when there is one, mod pickers for disable and
    enable, a settings editor for configure, the shell for completions.
  • The equivalent command is printed before anything runs whenever something was asked.
  • New confirmations at a terminal: stop/restart of a running server (with players
    online), remove, applying update to 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-input flag and HOPPER_NO_INPUT; CI also disables prompts.
    TERM=dumb or HOPPER_ACCESSIBLE=1 asks line by line. TERM=dumb disables colour.
  • disable and enable accept several files.

Exit code changes:

  • A missing argument exits 2 and lists every missing flag. install x --provider modrinth without --pack previously 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

Choose a tag to compare

@ptMuta ptMuta released this 03 Oct 16:17

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

Choose a tag to compare

@ptMuta ptMuta released this 03 Oct 14:23

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 NAME enables and starts it.
  • Select sources explicitly with --provider and the provider's pack/collection/file
    options. Bare pack names, cf: shorthand, implicit directory updates, and optional
    service installation are no longer supported. Bare hopper prints help.
  • User scope is always the default, including under sudo. System installs require
    explicit --scope system and 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 .new conflict 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 with hopper repair NAME --scope user or
    sudo hopper repair NAME --scope system while 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 .new conflicts
    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

Choose a tag to compare

@ptMuta ptMuta released this 01 Oct 21:32

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. /say and /me aren'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

Choose a tag to compare

@ptMuta ptMuta released this 01 Oct 21:07

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 | sh

New: 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; --name changes 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.log otherwise. /quit or Ctrl-D leaves.

hopper 0.1.4

Choose a tag to compare

@ptMuta ptMuta released this 01 Oct 20:54

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.