Add Reaper's Sky dedicated server deploy files

- server/mods.json: 59 server-safe mods pinned by sha1 (19 client-only excluded)
- server/deploy.sh: idempotent Debian 13 installer (Java 21, NeoForge 21.1.248,
  mods, eula/server.properties, 8G run.sh)
- server/build_mods.py: regenerate mods.json from the Prism instance
- server/README.md: setup + ops guide
This commit is contained in:
ReaperOfVeriod
2026-08-20 20:08:14 +02:00
parent 122e08d5d1
commit 2a5354fd63
4 changed files with 602 additions and 0 deletions
+62
View File
@@ -0,0 +1,62 @@
# Reaper's Sky - Dedicated Server
Everything needed to run the Reaper's Sky NeoForge **1.21.1** server (NeoForge
**21.1.248**) on Debian 13 (trixie).
## Quick start (on the server box)
```sh
sudo ./deploy.sh # installs Java 21 + curl/unzip, NeoForge, the 59 mods, config
./run.sh # start the server (run inside tmux/screen so it survives logout)
```
The first `./run.sh` generates the world. Wait for `Done (...)` in the console,
then connect with IP **`reaperofveriod.nl`** (port 25565).
`deploy.sh` is idempotent — safe to re-run; it skips anything already in place
and verifies every mod by sha1 before installing.
## What deploy.sh does
| Step | Result |
|------|--------|
| System packages | `openjdk-21-jre-headless`, `curl`, `unzip` (needs root/`sudo`) |
| NeoForge server | Official installer from Maven → server files + `libraries/` |
| Mods | Downloads the 59 server-safe mods pinned in `mods.json`, sha1-verified |
| Config | `eula.txt` (EULA accepted), `server.properties` (IP, motd, 8 G) |
| Run script | `run.sh` with 8 GB + G1GC (`nogui`) |
Install location defaults to `~/reaper-sky-server`. Override with `DIR=/path`,
memory with `MEMORY=6G`, etc.:
```sh
sudo DIR=/srv/minecraft MEMORY=10G ./deploy.sh
```
## Keeping it running
```sh
tmux new -s mc # new session
cd ~/reaper-sky-server && ./run.sh
# detach with Ctrl-b d, reattach later with: tmux attach -t mc
```
Stop the server cleanly with the console command `stop` (Ctrl-c also works).
## Configuration notes
- `server.properties` sets `online-mode=true` (Mojang authentication). Set it to
`false` in `~/reaper-sky-server/server.properties` to allow unauthenticated
clients, then restart.
- `difficulty=hard`, `spawn-protection=0`, `view-distance=10` are set for the
airship-focused, land-claim-friendly experience.
- The 19 client-only mods (Iris/shaders, Sodium, Minimap, Jade, JEI, etc.) are
intentionally excluded here — the server is pure gameplay logic.
## Updating the pack
1. Add/remove mods in the Prism instance `Reaper's Sky - dev`.
2. Rebuild + push the mrpack (see repo root `README.md`).
3. Re-run `server/build_mods.py` or regenerate `mods.json`, commit, push.
4. On the server: `git pull && sudo ./deploy.sh && ./run.sh`
(also remove any stale jars from `~/reaper-sky-server/mods/` first).
+92
View File
@@ -0,0 +1,92 @@
#!/usr/bin/env python3
"""Regenerate server/mods.json from the Prism instance's mods directory.
For every .jar in the pack instance it:
- computes sha1
- looks up the Modrinth download URL via the version_file API
(aero-shadow-fix is CurseForge-only, pinned manually)
- drops the 19 client-only mods
and writes the server manifest to mods.json.
Usage: python3 build_mods.py
"""
import hashlib, json, os, subprocess, sys, time
INSTANCE = os.path.expanduser(
"~/.local/share/PrismLauncher/instances/Reaper's Sky - dev/.minecraft/mods")
OUT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "mods.json")
MC_VERSION = "1.21.1"
NEOFORGE_VERSION = "21.1.248"
CLIENT_ONLY = {
"iris-neoforge-1.8.14-beta.1+mc1.21.1.jar",
"EuphoriaPatcher-1.9.3-r5.8.1-neoforge.jar",
"iris-flywheel-compat-NeoForge-2.3.1.jar",
"sodium-neoforge-0.8.12+mc1.21.1.jar",
"ImmediatelyFast-NeoForge-1.6.12+1.21.1.jar",
"entityculling-neoforge-1.10.5-mc1.21.1.jar",
"dynamic-fps-3.11.4+mc1.21.0-neoforge.jar",
"MouseTweaks-neoforge-mc1.21-2.26.1.jar",
"appleskin-neoforge-mc1.21-3.0.9.jar",
"Controlling-neoforge-1.21.1-19.0.5.jar",
"Searchables-neoforge-1.21.1-1.0.2.jar",
"skinlayers3d-neoforge-1.11.2-mc1.21.1.jar",
"xaerominimap-neoforge-1.21.1-26.4.2.jar",
"xaeroworldmap-neoforge-1.21.1-1.44.2.jar",
"Jade-1.21.1-NeoForge-15.10.6.jar",
"jade-sable-compat-1.3.0.jar",
"aero-shadow-fix.jar",
"aeronautics-propeller-blur-1.0a.jar",
"jei-1.21.1-neoforge-19.44.0.403.jar",
}
CURSEFORGE_ONLY = {
"aero-shadow-fix.jar": "https://www.curseforge.com/api/v1/mods/1641969/files/8589529/download",
}
UA = "opencode-pack-builder/1.0"
def sha1(path):
h = hashlib.sha1()
with open(path, "rb") as f:
for chunk in iter(lambda: f.read(65536), b""):
h.update(chunk)
return h.hexdigest()
def resolve(jar, digest):
if jar in CURSEFORGE_ONLY:
return CURSEFORGE_ONLY[jar]
r = subprocess.run(
["curl", "-s", "--max-time", "20", "-H", f"User-Agent: {UA}",
f"https://api.modrinth.com/v2/version_file/{digest}?algorithm=sha1"],
capture_output=True, text=True)
try:
return json.loads(r.stdout)["files"][0]["url"]
except Exception:
return ""
def main():
mods = []
for jar in sorted(os.listdir(INSTANCE)):
if not jar.endswith(".jar"):
continue
if jar in CLIENT_ONLY:
print(f" skip (client-only): {jar}")
continue
digest = sha1(os.path.join(INSTANCE, jar))
url = resolve(jar, digest)
if not url:
print(f" !! no URL for {jar} -- fix manually", file=sys.stderr)
mods.append({"file": jar, "url": url, "sha1": digest})
time.sleep(0.1)
manifest = {"minecraft": MC_VERSION, "neoforge": NEOFORGE_VERSION, "mods": mods}
with open(OUT, "w") as f:
json.dump(manifest, f, indent=2)
print(f"Wrote {len(mods)} server mods to {OUT}")
if __name__ == "__main__":
main()
+147
View File
@@ -0,0 +1,147 @@
#!/usr/bin/env bash
#
# Reaper's Sky - dedicated server deploy script (Debian 13 / trixie)
#
# Installs everything needed to run the Reaper's Sky NeoForge 21.1.248 server:
# - OpenJDK 21 (JRE, headless) + curl/unzip
# - NeoForge 21.1.248 server via its official installer
# - the 59 server-safe mods (pinned in mods.json, verified by sha1)
# - eula.txt + server.properties (IP reaperofveriod.nl)
# - run.sh (8 GB, G1GC)
#
# Usage: sudo ./deploy.sh (installs packages, needs root/sudo)
# ./deploy.sh (idempotent; safe to re-run)
#
# Defaults:
# DIR = "$HOME/reaper-sky-server"
# MEMORY = 8G
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
NEOFORGE_VERSION="21.1.248"
MC_VERSION="1.21.1"
INSTALLER_URL="https://maven.neoforged.net/releases/net/neoforged/neoforge/${NEOFORGE_VERSION}/neoforge-${NEOFORGE_VERSION}-installer.jar"
# --- config (override via env if you want) ------------------------------------
SERVER_DIR="${DIR:-$HOME/reaper-sky-server}"
MEMORY="${MEMORY:-8G}"
SERVER_IP="${SERVER_IP:-reaperofveriod.nl}"
DEFAULT_MOTD="Reaper's Sky"
MOTD="${MOTD:-$DEFAULT_MOTD}"
MAX_PLAYERS="${MAX_PLAYERS:-10}"
log() { printf '\033[1;34m[deploy]\033[0m %s\n' "$*"; }
die() { printf '\033[1;31m[deploy] ERROR:\033[0m %s\n' "$*" >&2; exit 1; }
# --- 1. system packages (Debian 13 ships OpenJDK 21) --------------------------
install_packages() {
if [ "$(id -u)" -ne 0 ]; then
if command -v sudo >/dev/null 2>&1; then SUDO="sudo"; else SUDO=""; fi
else
SUDO=""
fi
if command -v java >/dev/null 2>&1; then
log "Java already present: $(java -version 2>&1 | head -1)"
else
log "Installing openjdk-21-jre-headless, curl, unzip (apt)..."
${SUDO:+sudo} apt-get update -qq
${SUDO:+sudo} apt-get install -y -qq openjdk-21-jre-headless curl unzip
fi
java -version >/dev/null 2>&1 || die "Java 21 not available after install"
}
# --- 2. NeoForge server --------------------------------------------------------
install_neoforge() {
mkdir -p "$SERVER_DIR"
cd "$SERVER_DIR"
if [ -f "run.sh" ] && [ -d "libraries/net/neoforged/neoforge/$NEOFORGE_VERSION" ]; then
log "NeoForge $NEOFORGE_VERSION already installed."
return
fi
log "Downloading NeoForge $NEOFORGE_VERSION installer..."
curl -fL --retry 3 -o "neoforge-${NEOFORGE_VERSION}-installer.jar" "$INSTALLER_URL"
log "Running installer --installServer ..."
java -jar "neoforge-${NEOFORGE_VERSION}-installer.jar" --installServer
rm -f "neoforge-${NEOFORGE_VERSION}-installer.jar"
chmod +x run.sh
}
# --- 3. server mods (verified by sha1) -----------------------------------------
install_mods() {
[ -f "$SCRIPT_DIR/mods.json" ] || die "mods.json not found next to deploy.sh"
mkdir -p "$SERVER_DIR/mods"
cd "$SERVER_DIR/mods"
python3 - "$SCRIPT_DIR/mods.json" <<'PY'
import json, sys, hashlib, subprocess, os
manifest = json.load(open(sys.argv[1]))
for m in manifest["mods"]:
fname, url, want = m["file"], m["url"], m["sha1"]
tmp = fname + ".part"
if os.path.exists(fname):
h = hashlib.sha1()
with open(fname, "rb") as fh:
for b in iter(lambda: fh.read(65536), b""):
h.update(b)
if h.hexdigest() == want:
continue # already present & correct
subprocess.run(["curl", "-fL", "--retry", "3", "-o", tmp, url], check=True)
h = hashlib.sha1()
with open(tmp, "rb") as fh:
for b in iter(lambda: fh.read(65536), b""):
h.update(b)
if h.hexdigest() != want:
os.unlink(tmp)
raise SystemExit(f"sha1 mismatch for {fname}")
os.rename(tmp, fname)
print(f" + {fname}")
PY
log "Mods ready: $(ls -1 "$SERVER_DIR/mods"/*.jar | wc -l) jars installed."
}
# --- 4. eula + server.properties -----------------------------------------------
write_config() {
cd "$SERVER_DIR"
if [ ! -f eula.txt ]; then
printf 'eula=true\n' > eula.txt
log "Accepted Minecraft EULA (eula.txt)."
fi
cat > server.properties <<EOF
# Generated by Reaper's Sky deploy.sh
server-ip=$SERVER_IP
server-port=25565
motd=$MOTD
max-players=$MAX_PLAYERS
online-mode=true
difficulty=hard
level-type=default
allow-nether=true
spawn-protection=0
view-distance=10
simulation-distance=10
EOF
log "Wrote server.properties (IP=$SERVER_IP, max=$MAX_PLAYERS)."
}
# --- 5. run script ---------------------------------------------------------------
write_run() {
cat > "$SERVER_DIR/run.sh" <<'EOF'
#!/usr/bin/env bash
cd "$(dirname "$(readlink -f "$0")")"
exec java -XmsMEMORY -XmxMEMORY -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 \
@libraries/net/neoforged/neoforge/NEOFORGE_VERSION/unix_args.txt nogui
EOF
sed -i "s/MEMORY/$MEMORY/g; s/NEOFORGE_VERSION/$NEOFORGE_VERSION/g" "$SERVER_DIR/run.sh"
chmod +x "$SERVER_DIR/run.sh"
log "Wrote run.sh ($MEMORY RAM). Start with: cd $SERVER_DIR && ./run.sh"
}
install_packages
install_neoforge
install_mods
write_config
write_run
log "Done. Reaper's Sky server is at: $SERVER_DIR"
log "First boot generates the world. Run it with: cd $SERVER_DIR && ./run.sh"
log "Console: run inside tmux/screen so it keeps running when you disconnect."
log "To stop later: use the server console command stop"
+301
View File
@@ -0,0 +1,301 @@
{
"minecraft": "1.21.1",
"neoforge": "21.1.248",
"mods": [
{
"file": "Apotheosis-1.21.1-8.7.0.jar",
"url": "https://cdn.modrinth.com/data/rqFWfVlz/versions/wB4eASdJ/Apotheosis-1.21.1-8.7.0.jar",
"sha1": "5537a71726a0f6a4c74257f26eeeea060a7327c4"
},
{
"file": "ApothicAttributes-1.21.1-2.10.1.jar",
"url": "https://cdn.modrinth.com/data/DGaH8Rh0/versions/Xtaunf84/ApothicAttributes-1.21.1-2.10.1.jar",
"sha1": "cdcf0c7a6398913efa76b5b4e41e4fb67033156e"
},
{
"file": "ApothicEnchanting-1.21.1-1.6.1.jar",
"url": "https://cdn.modrinth.com/data/pL8MtgqY/versions/56c0M28v/ApothicEnchanting-1.21.1-1.6.1.jar",
"sha1": "1644e9da873f36cf9875e4ad351ef458756c347e"
},
{
"file": "ApothicSpawners-1.21.1-1.4.0.jar",
"url": "https://cdn.modrinth.com/data/DfxVkOAO/versions/pWfxcfO2/ApothicSpawners-1.21.1-1.4.0.jar",
"sha1": "b3be29751daea738e691db8949cce079e5aae3be"
},
{
"file": "Clumps-neoforge-1.21.1-19.0.0.1.jar",
"url": "https://cdn.modrinth.com/data/Wnxd13zP/versions/jo7lDoK4/Clumps-neoforge-1.21.1-19.0.0.1.jar",
"sha1": "fa2576297c7bd12b28aa7070e8141792bd66da4c"
},
{
"file": "Design-n-Decor-1.21.1-2.2b.jar",
"url": "https://cdn.modrinth.com/data/x49wilh8/versions/uQsIRky8/Design-n-Decor-1.21.1-2.2b.jar",
"sha1": "ff5f0411a3d82e15d69b65617128f6d54e818e1b"
},
{
"file": "ExplorersCompass-1.21.1-3.4.0-neoforge.jar",
"url": "https://cdn.modrinth.com/data/RV1qfVQ8/versions/hIJ2Ev1Q/ExplorersCompass-1.21.1-3.4.0-neoforge.jar",
"sha1": "9f62af344988a6e2d855b113e61cf0e1611c7e0f"
},
{
"file": "FarmersDelight-1.21.1-1.3.3.jar",
"url": "https://cdn.modrinth.com/data/R2OftAxM/versions/wpkbWnVh/FarmersDelight-1.21.1-1.3.3.jar",
"sha1": "55ea87dec84a632690a748857db08a35941980b6"
},
{
"file": "GlitchCore-neoforge-1.21.1-2.1.0.2.jar",
"url": "https://cdn.modrinth.com/data/s3dmwKy5/versions/S2TfWrZR/GlitchCore-neoforge-1.21.1-2.1.0.2.jar",
"sha1": "e3d4bb80a06f619be989ab529d0cd4e33e076943"
},
{
"file": "NaturesCompass-1.21.1-3.4.0-neoforge.jar",
"url": "https://cdn.modrinth.com/data/fPetb5Kh/versions/nFniEtJV/NaturesCompass-1.21.1-3.4.0-neoforge.jar",
"sha1": "e19721873bebc4dbc1674bb101af39d0ea406b95"
},
{
"file": "Patchouli-1.21.1-93-NEOFORGE.jar",
"url": "https://cdn.modrinth.com/data/nU0bVIaL/versions/BIogJv2D/Patchouli-1.21.1-93-NEOFORGE.jar",
"sha1": "5413bb9b8fc35ebe46b06b48bf9afafbd8471140"
},
{
"file": "Placebo-1.21.1-9.9.2.jar",
"url": "https://cdn.modrinth.com/data/tCkE8p2N/versions/1Ypo4tf4/Placebo-1.21.1-9.9.2.jar",
"sha1": "d44335094cf2db64998cb3ee31e58d8c01e80b4a"
},
{
"file": "Terralith_1.21.1_v2.6.2_Neoforge.jar",
"url": "https://cdn.modrinth.com/data/8oi3bsk5/versions/IY93YaEe/Terralith_1.21.1_v2.6.2_Neoforge.jar",
"sha1": "d4a9fe71b841f70edfb4b280f9bf5c58e4a28224"
},
{
"file": "ToughAsNails-neoforge-1.21.1-10.1.0.13.jar",
"url": "https://cdn.modrinth.com/data/ge1sOdFH/versions/mboAbksk/ToughAsNails-neoforge-1.21.1-10.1.0.13.jar",
"sha1": "38046bbfcd35cb1eb2bd17d9a9c3428b9750a82a"
},
{
"file": "WeightedInventory-1.21.1-2.2.0.jar",
"url": "https://cdn.modrinth.com/data/4hc3F83g/versions/qR45xqMV/WeightedInventory-1.21.1-2.2.0.jar",
"sha1": "8d4c5b5191b0ebf980a81b882a47435cbb6eae31"
},
{
"file": "YungsApi-1.21.1-NeoForge-5.1.7.jar",
"url": "https://cdn.modrinth.com/data/Ua7DFN59/versions/8Zmd0JGx/YungsApi-1.21.1-NeoForge-5.1.7.jar",
"sha1": "1c2e7b0d294690f9ed5e6627ba28182605543654"
},
{
"file": "YungsBetterDesertTemples-1.21.1-NeoForge-4.1.5.jar",
"url": "https://cdn.modrinth.com/data/XNlO7sBv/versions/GQ9iNWkI/YungsBetterDesertTemples-1.21.1-NeoForge-4.1.5.jar",
"sha1": "90529257dbd92558998c65178294bc7b2fd16a64"
},
{
"file": "YungsBetterDungeons-1.21.1-NeoForge-5.1.4.jar",
"url": "https://cdn.modrinth.com/data/o1C1Dkj5/versions/D6aZn0Em/YungsBetterDungeons-1.21.1-NeoForge-5.1.4.jar",
"sha1": "73a660c13063450e555e5e2c015ae24d606b32b4"
},
{
"file": "YungsBetterStrongholds-1.21.1-NeoForge-5.1.3.jar",
"url": "https://cdn.modrinth.com/data/kidLKymU/versions/8U0dIfSM/YungsBetterStrongholds-1.21.1-NeoForge-5.1.3.jar",
"sha1": "5d06a5850af7c577612d4592706a8e156bbe1cbf"
},
{
"file": "aeronautics-covers-1.0.1.jar",
"url": "https://cdn.modrinth.com/data/eWrKPy9E/versions/R35biaZf/aeronauticscovers-1.21.1-NeoForge-1.0.1.jar",
"sha1": "c4404a98d85c75e5e80ace462c3ed1bdf0b1c93e"
},
{
"file": "aeronautics-dyeable-components-1.0.4.jar",
"url": "https://cdn.modrinth.com/data/LBYQlFkX/versions/kOW3VwPl/dyeable-components-1.0.4%2Bmc1.21.1.jar",
"sha1": "caf60f71d89a3068cd07283f45bffc31704a7474"
},
{
"file": "aeronautics-gadgets-and-gizmos-1.1.3.jar",
"url": "https://cdn.modrinth.com/data/Sza3GgEL/versions/vQlkDgnK/createthrusters-bundled-V1.1.3.jar",
"sha1": "d29df5e23a6aee1171b08b424d73c02d6fc3dd6e"
},
{
"file": "aeronautics-portable-engine-liquid-fuel-2.0.0.jar",
"url": "https://cdn.modrinth.com/data/HLbPoouI/versions/L6KPVFxI/portable_engine_liquid_fuel-2.0.0-neoforge-1.21.1.jar",
"sha1": "f9602c7f9a8268507a835bfa47db1512d356dae7"
},
{
"file": "aeroworks-1.4.2.jar",
"url": "https://cdn.modrinth.com/data/P26k79kP/versions/tQ0dgIjI/aeroworks-1.4.2.jar",
"sha1": "3aad876e7a97236925da6ec61c8f176394e61a99"
},
{
"file": "ars_nouveau-1.21.1-5.13.0.jar",
"url": "https://cdn.modrinth.com/data/TKB6INcv/versions/ugLa4qlw/ars_nouveau-1.21.1-5.13.0.jar",
"sha1": "b8d71856fd76d89573e6976f2461ea7385a3fff7"
},
{
"file": "balm-neoforge-1.21.1-21.0.65.jar",
"url": "https://cdn.modrinth.com/data/MBAkmtvl/versions/KgypwTqX/balm-neoforge-1.21.1-21.0.65.jar",
"sha1": "69e0b3b69dd23c132e85b7e82310f45ae96b263d"
},
{
"file": "cable_facades-1.21.1-NeoForge-2.1.3.jar",
"url": "https://cdn.modrinth.com/data/twipgzWx/versions/fhYja6UD/cable_facades-1.21.1-NeoForge-2.1.3.jar",
"sha1": "52d5edbf92af50ab258565b51836c7e4ba9dc6e9"
},
{
"file": "carryon-neoforge-1.21.1-2.2.6.13.jar",
"url": "https://cdn.modrinth.com/data/joEfVgkn/versions/PV8oLZ1q/carryon-neoforge-1.21.1-2.2.6.13.jar",
"sha1": "2ceb0d9284525b6cb2a214c88cf6511cab91f601"
},
{
"file": "copycats-3.0.6+mc.1.21.1-neoforge.jar",
"url": "https://cdn.modrinth.com/data/UT2M39wf/versions/DVQFhrV3/copycats-3.0.6%2Bmc.1.21.1-neoforge.jar",
"sha1": "0e683c5d3db4942899453fd93054ac0a926c7ef8"
},
{
"file": "corpse-neoforge-1.21.1-1.1.13.jar",
"url": "https://cdn.modrinth.com/data/WrpuIfhw/versions/Zwf8nv8y/corpse-neoforge-1.21.1-1.1.13.jar",
"sha1": "a735362c4e5ef705956f1fcbac01fb9f1aae5b8e"
},
{
"file": "create-1.21.1-6.0.10.jar",
"url": "https://cdn.modrinth.com/data/LNytGWDc/versions/UjX6dr61/create-1.21.1-6.0.10.jar",
"sha1": "0e97e49837bed766e6f28a4c95b04885d6acc353"
},
{
"file": "create-aeronautics-bundled-1.21.1-1.3.1.jar",
"url": "https://cdn.modrinth.com/data/oWaK0Q19/versions/Vzp221Un/create-aeronautics-bundled-1.21.1-1.3.1.jar",
"sha1": "15d273d891578d583aa142354b63ed70f87fee62"
},
{
"file": "create-confectionery1.21.1_v1.1.3b.jar",
"url": "https://cdn.modrinth.com/data/WPE5gRs9/versions/ndnETBEN/create-confectionery1.21.1_v1.1.3b.jar",
"sha1": "47e235efa862c5cbea53fdf8346d4c499674defa"
},
{
"file": "create-new-age-1.2.0+neoforge-mc1.21.1.jar",
"url": "https://cdn.modrinth.com/data/FTeXqI9v/versions/IwtuwMZy/create-new-age-1.2.0%2Bneoforge-mc1.21.1.jar",
"sha1": "849df57070ffa75c2446b9c460d03f6b49fa089e"
},
{
"file": "create-simulated-thrusters-1.0.1.jar",
"url": "https://cdn.modrinth.com/data/EAUfbep8/versions/GFGgvio1/create_simulated_thrusters-1.21.1-NeoForge-1.0.1.jar",
"sha1": "bddb8bcbfe49231e196d1d40c8178aaf4dbebae5"
},
{
"file": "create-the-air-war-4.67.jar",
"url": "https://cdn.modrinth.com/data/GMrNnOis/versions/JnF14u1u/create_the_air_wars-4.67.jar",
"sha1": "8e5ba8f70df9a64bb51b9bfe35a01476873f014d"
},
{
"file": "create_connected-1.3.2-mc1.21.1.jar",
"url": "https://cdn.modrinth.com/data/Vg5TIO6d/versions/klOWKza5/create_connected-1.3.2-mc1.21.1.jar",
"sha1": "920de05b13c32fe1417d0aec0615057aa480cc8d"
},
{
"file": "create_jetpack-forge-5.2.1.jar",
"url": "https://cdn.modrinth.com/data/UbFnAd4l/versions/sCwiqLqq/create_jetpack-forge-5.2.1.jar",
"sha1": "cbd949c62723d805c2ab019def6e6718c50037b8"
},
{
"file": "createbigcannons-5.11.7+mc.1.21.1.jar",
"url": "https://cdn.modrinth.com/data/GWp4jCJj/versions/bOiDu0LS/createbigcannons-5.11.7%2Bmc.1.21.1.jar",
"sha1": "c90ee0b2142e2c58d233e150cb3a24c7cb07eb2d"
},
{
"file": "createdieselgenerators-1.21.1-1.3.15.jar",
"url": "https://cdn.modrinth.com/data/ZM3tt6p1/versions/UoPH8lO1/createdieselgenerators-1.21.1-1.3.15.jar",
"sha1": "7f751dabfa83c141c1d13025cd16f06553ba459b"
},
{
"file": "curios-neoforge-9.5.1+1.21.1.jar",
"url": "https://cdn.modrinth.com/data/vvuO3ImH/versions/yohfFbgD/curios-neoforge-9.5.1%2B1.21.1.jar",
"sha1": "418fcd42e3a7844c9bdc71c9b6401fdb3894e0c4"
},
{
"file": "deployer-0.1.2.jar",
"url": "https://cdn.modrinth.com/data/OZhUIuou/versions/XrLW2FiE/deployer-0.1.2.jar",
"sha1": "c3d2d9baad2e714cb8bf8ae6df9bc9cac6e87c1c"
},
{
"file": "ends_delight-2.6.1+neoforge.1.21.1.jar",
"url": "https://cdn.modrinth.com/data/yHN0njMr/versions/YTApg6Hl/ends_delight-2.6.1%2Bneoforge.1.21.1.jar",
"sha1": "0613a535d82b7a3d51d0caf0e04b082cb4c062e9"
},
{
"file": "expandeddelight-0.1.4.jar",
"url": "https://cdn.modrinth.com/data/e9V6wFcR/versions/RTRYPIJp/expandeddelight-0.1.4.jar",
"sha1": "cf26fe18c3a9deec525fe0f0e7c2d3b9f4e9f484"
},
{
"file": "ferritecore-7.0.3-neoforge.jar",
"url": "https://cdn.modrinth.com/data/uXXizFIs/versions/x7kQWVju/ferritecore-7.0.3-neoforge.jar",
"sha1": "9563692efb708b6b568df27a01ec52f6311928ef"
},
{
"file": "geckolib-neoforge-1.21.1-4.9.2.jar",
"url": "https://cdn.modrinth.com/data/8BmcQJ2H/versions/tPkJmim6/geckolib-neoforge-1.21.1-4.9.2.jar",
"sha1": "14c64013cadee7d28f3685f94350f9a4d2ec6d86"
},
{
"file": "irons_lib-1.21.1-2.1.0.jar",
"url": "https://cdn.modrinth.com/data/9nfaJPtX/versions/sQyzhxuH/irons_lib-1.21.1-2.1.0.jar",
"sha1": "70fba64d12b6ff9553580e52101d989c89297797"
},
{
"file": "irons_spellbooks-1.21.1-3.16.3.jar",
"url": "https://cdn.modrinth.com/data/s4OWxYQQ/versions/slKLosTb/irons_spellbooks-1.21.1-3.16.3.jar",
"sha1": "e8832385c01db56b9fcb19c48fcedc76a3a70d92"
},
{
"file": "kotlinforforge-5.12.0-all.jar",
"url": "https://cdn.modrinth.com/data/ordsPcFz/versions/uhJhCT7X/kotlinforforge-5.12.0-all.jar",
"sha1": "d10d062caf1aad9aec82d7852f2fee1781735c1f"
},
{
"file": "lithium-neoforge-0.15.4+mc1.21.1.jar",
"url": "https://cdn.modrinth.com/data/gvQqBUqZ/versions/DDUrRVCA/lithium-neoforge-0.15.4%2Bmc1.21.1.jar",
"sha1": "97212e45c963730bbfc7c44780df99317814c21b"
},
{
"file": "lithostitched-1.8.0+beta4-neoforge-21.1.jar",
"url": "https://cdn.modrinth.com/data/XaDC71GB/versions/81DDKTGJ/lithostitched-1.8.0%2Bbeta4-neoforge-21.1.jar",
"sha1": "0edda78ec8500143cca898881c476b2b04dac75a"
},
{
"file": "modernfix-neoforge-5.27.20+mc1.21.1.jar",
"url": "https://cdn.modrinth.com/data/nmDcB62a/versions/VsJnrw8k/modernfix-neoforge-5.27.20%2Bmc1.21.1.jar",
"sha1": "bc1a70e72e7dba8a3ff41404765fdd03a7ac6575"
},
{
"file": "player-animation-lib-forge-2.0.4+1.21.1.jar",
"url": "https://cdn.modrinth.com/data/gedNE4y2/versions/HJZB6bmA/player-animation-lib-forge-2.0.4%2B1.21.1.jar",
"sha1": "05be8ddcc78532b9a5520c718edc6c971cd0057c"
},
{
"file": "railways-0.3.0-beta.2+neoforge-mc1.21.1.jar",
"url": "https://cdn.modrinth.com/data/L3Jv0QZI/versions/czVeSmZo/railways-0.3.0-beta.2%2Bneoforge-mc1.21.1.jar",
"sha1": "82a28ce51fdbc583477d7ae7c4c94cc6d23ec2b4"
},
{
"file": "ritchiesprojectilelib-2.1.2+mc.1.21.1-neoforge.jar",
"url": "https://cdn.modrinth.com/data/B3pb093D/versions/hZ6B2Z0x/ritchiesprojectilelib-2.1.2%2Bmc.1.21.1-neoforge.jar",
"sha1": "ec2e4996f8bee8714173e603e379fef8a6901765"
},
{
"file": "sable-neoforge-1.21.1-2.0.5.jar",
"url": "https://cdn.modrinth.com/data/T9PomCSv/versions/U678xqle/sable-neoforge-1.21.1-2.0.5.jar",
"sha1": "05f666e973d32baaaf405acb9bbed6615b909971"
},
{
"file": "simulated-gauges-1.1.0.jar",
"url": "https://cdn.modrinth.com/data/AwDdvIWn/versions/LWK7hUmm/simulated_gauges-1.1.0.jar",
"sha1": "3588378ea8d5e424ecd00fdaa16a4e3355f09365"
},
{
"file": "spark-1.10.124-neoforge.jar",
"url": "https://cdn.modrinth.com/data/l6YH9Als/versions/v5qtqRQi/spark-1.10.124-neoforge.jar",
"sha1": "9430cc2ab64ff89d698be593769fb9f9ee4efae6"
},
{
"file": "waystones-neoforge-1.21.1-21.1.41.jar",
"url": "https://cdn.modrinth.com/data/LOpKHB2A/versions/fxszxKRW/waystones-neoforge-1.21.1-21.1.41.jar",
"sha1": "ce8f17600506c2a201c6eb5ff50e16d39f775ad6"
}
]
}