A Minecraft mod manager for the terminal.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mars 716579f824 Merge pull request 'Add support for filtering plugins and resource packs' (#14) from PluginResourcePackSupport into main 1 month ago
.github Update FUNDING.yml to include Open Collective 1 year ago
src Add plugins and modpack distinction 3 months ago
.gitignore Initial commit 1 year ago
Cargo.lock Changed out StructOpt for Clap 3 months ago
Cargo.toml Changed out StructOpt for Clap 3 months ago
LICENSE Create LICENSE 1 year ago
README.md specified types 3 months ago

README.md

              ___---___
        ___---    |    ---___
     ---      ___---___      ---
    |---___---         ---___---|
    |      ---___   ___---      |
     ---___       |       ___---
           |---___|___---|
            --__  -  __--
                |-_-|
                 -_-
    __  __
   / / / /___  ____  ____  ___  _____
  / /_/ / __ \/ __ \/ __ \/ _ \/ ___/
 / __  / /_/ / /_/ / /_/ /  __/ /
/_/ /_/\____/ .___/ .___/\___/_/
           /_/   /_/

Hopper

A Minecraft package manager for the terminal.

Hopper can automatically search, download, and update Minecraft mods, modpacks, resource packs, and plugins from Modrinth so that keeping your mods up-to-date and compatible with each other is easy. With Hopper, you won't have to manually visit CurseForge and download each mod one-by-one every time you set up a new instance, or deal with the hassle of swapping out different mod versions for hours while trying to get Minecraft to accept them all at once.

Hopper is still very early in development, but important features are coming along smoothly, and we'll have lots of progress to show off in the coming weeks. It's written in Rust and released under the AGPLv3.

We're looking for people to help contribute code and write documentation. Please reach out to us in our Discord "server" if you're interested in helping out. If you have a taste in CLI apps like Hopper, your input is especially appreciated.

Inspired by applications like paru, a feature-packed AUR helper and topgrade, a tool to upgrade everything

Donate usingLiberapay

High-level Goals

Continuous

  • Small binary size
  • Minimal compile times

Features

High Priority:

  • Modrinth package searching
  • Modrinth package installation
  • Parallel package downloading
  • Per-instance package management
  • Package updating
  • Listing installed packages

Medium Priority

  • CurseForge package searching
  • CurseForge package installation
  • A man(1) entry

Low Priority:

  • fish(1) autocomplete
  • bash(1) autocomplete
  • zsh(1) autocomplete
  • Nushell autocomplete
  • Configurable search result display like Starship
  • Versioning system repository package management & compilation

External-Dependent:

  • Conflict resolution
  • Dependency resolution
  • Integration into PolyMC and/or theseus
  • Integration into topgrade(1)
  • Graphical frontend with notifications

Modrinth REST API docs

File Architecture

~/.hopper/
├── hopper.conf
├── cache/
│   ├── 1.19.1/
│   │ └── fabric/
│   └── 1.18.2/
│     ├── forge/
│     └── plugin/
└── templates/
      └── example-template.hop -> ~/.minecraft/mods/example-template.hop

Hopfile Structure

Hopfiles will contain a Minecraft version number, a list of packages, the name of the type of package it uses, and any references to other hopfiles it's based on, or "templates". If a hopfile is based on other template hopfiles, it inherits the packages from them. A hopfile does not inherit the package or Minecraft version from a template.

template = example-template

mc-version = 1.19.2

type = fabric

[packages]
sodium

Hopper Configuration File Structure

Hopper's configuration will be maintained with a list of all hopfiles known to hopper. Its config will also contain a list of mod hosting sites like Modrinth and CurseForge and a list of (remote or local) version-control repositories from which to compile mods. The latter will use a (potentially custom) build file format to be defined at a later date.

[hopfiles]
file = ~/.minecraft/mods/1.19.1.hop

# Mod Hosts

[Modrinth]
api = https://api.modrinth.com/

[CurseForge]
api = https://api.curseforge.com/

# Git Repositories

[Iris Shaders]
source = git+https://github.com/IrisShaders/Iris.git

Docs

Usage

hopper [SUBCOMMAND] [OPTIONS]

Common OPTIONS:

-d, --dir [FILE]

Specifies the path for the hopfile being utilized

-f, --filename [FILE]

Saves to a specific file name.

-m, --mc-version [VERSION]

Specifies for what VERSION of Minecraft PACKAGES are being managed

-t, --type [TYPE]

Specifies what TYPE of PACKAGEs is being referenced. TYPEs include modloader names like fabric, forge, and quilt, as well as resource packs and modpacks.

-v, --verbose

Includes debug information in the output of hopper commands.

SUBCOMMANDs

get [OPTIONS] PACKAGE

Searches for a PACKAGE, displays the results, and downloads any selected PACKAGES to the local cache.

OPTIONS

-n, --no-confirm

Does not display search results and downloads exact matches to the cache. Requires --mc-version and --type be specified.

init [OPTIONS] --mc-version VERSION --type TYPE TEMPLATE

Creates a hopfile in the current directory and adds it to the global known hopfiles list in the configuration file. If a TEMPLATE is passed as an argument, the hopfile is added as a new template. A name is generated using the VERSION and TYPE specified unless --filename is used.

OPTIONS

--template [TEMPLATE1,TEMPLATE2...]

Specifies TEMPLATE hopfiles' names upon which to base the new hopfile.

install [OPTIONS] PACKAGE

Adds a PACKAGE to the current hopfile and runs hopper update. If the PACKAGE cannot be found in the package cache, it runs hopper get first.

OPTIONS

--template [TEMPLATE1,TEMPLATE2...]

Specifies a template hopfile to which to install mods

list [OPTIONS]

Lists all installed packages.

update [OPTIONS] PACKAGE

Updates installed PACKAGEs and adds mods if they're missing to directories with known hopfiles. If a PACKAGE is passed, --type must be specified so that hopper updates the correct package.