Distribution updated sodium 0.8.12-alpha.4 → 0.8.13 and
supplementaries 3.5.26 → 3.7.7. Rename the mods-sides.json keys so
sync-server-mods.sh doesn't halt on the missing old jars.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E6PydPB5dvyQ7wxrzS7JvQ
The distro release dropped craftingstation and added create_jet_boots +
flightapi, but mods-sides.json still listed craftingstation as `both`.
sync-server-mods.sh halts on a selected jar missing from the source, so
update-all.sh would have failed — and under --hard that lands after
`docker compose down`, leaving the stack down.
classify-mods.py also picked up sawmill and supplementaries, which had no
entry at all and were therefore never synced to the server. All four new
entries default to `both`.
mods-sides.json entries now 190 = jars in distribution 190.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Wz4tizJzjivT4FhdsqAMb
craftingstation, dirigo, mechtrowel and smartfeedingtroughs landed in the
cochi distribution but were never classified, so sync-server-mods.sh left
the server on the old 151-jar set while clients pulled 155. All four
declare BOTH-side deps in neoforge.mods.toml and register blocks/items,
so the server needs them or joining clients hit a registry mismatch.
cochi is Python 3.10 (no tomllib), so classify-mods.py can't run there —
the tomls were read directly.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The distribution replaced architectury 13.0.8 -> 13.0.11, balm 21.0.58 ->
21.0.63 and defaultoptions 21.1.6 -> 21.1.7 (both versions of each were
briefly on disk, so both got classified and both were synced into /mods),
and dropped chat_heads. Removing the stale keys — sync-server-mods refuses
to run while a selected jar is missing from the distribution.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Distribution bumped ftb-library to 2101.1.33 (satisfies ulicraftmod's
[2101.1.33,) requirement) and added Nirvana Lib + its Common Networking
dependency. Drops build_dim, removed from the distribution.
All three new jars declare side BOTH in neoforge.mods.toml.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Distribution added the two missing hard deps (cupboard for lootintegrations,
collective for starterkit) and replaced ftb-library 2101.1.31 with 2101.1.32.
Drops the 2101.1.31 key so sync-server-mods stops halting on the absent jar.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Distribution grew to 186 required jars (Create/Ars addons, YUNG's loot
integrations, easy_npc, ulicraftmod 1.1.3). classify-mods.py seeds the 23
new keys (3 client, 20 both).
Drops PuzzlesLib-v21.1.51 and ulicraftmod-1.0.0 (superseded versions still
sitting on the oxps dist disk — keeping them mapped `both` would sync two
copies of the same mod id into /mods) and iris (moved to forgemods/optionaloff).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ars_nouveau, ars_creo and world_dimension_nexus all declare NeoForge
side BOTH and are content mods, so they stay on the server subset.
Create is already in the pack, so ars_creo's dependency is satisfied.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Distribution added 11 jars. classify-mods.py seeds all as `both`
(none declare CLIENT in neoforge.mods.toml). Hand-flip the two
pure-client cosmetic ones so sync-server-mods.sh drops them:
- ExtremeSoundMuffler: client-side sound muffling UI
- ToastControl: client-side toast popup suppression
Rest stay `both` — Placebo/moonlight/caelus are libs, and
amendments/etched/fishingoverhaul/immersive_paintings/
createornithopterglider/emotecraft add server-side content or sync.
Also map iris as `client`. It is referenced by distribution.json but
absent from the local (gitignored) dist jar dir, so classify-mods.py
never sees it; mapping it keeps mods-sides.json aligned with the
manifest. Client-only, so the sync selection is unchanged.
server-mods/ now 130 jars (was 123).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Distribution replaced the wrong-version jars: rechiseled now
mc1.21 (gate [1.21,1.21.2) — valid for 1.21.1, no longer the broken
mc1.21.11 build) so back to `both`; fusion bumped 1.3.2a→1.3.2b, stays
`client` (resource-pack texture feature). Dropped the two stale entries.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
rechiseled-1.2.5-neoforge-mc1.21.11.jar targets Minecraft 1.21.11 /
NeoForge 21.11, not this server's 1.21.1 / 21.1.233. As `both` it crashed
the server at pre-load (FATAL ModLoader: requires minecraft 1.21.11). Mark
`client` to exclude it from server-mods so the server boots.
NOTE: the jar is still wrong-version for clients too (same gate) — it must
be removed from / replaced in the distribution to be usable at all.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Two new distribution mods. rechiseled adds decorative blocks → both
(server needs the block registry). fusion is a client-only resource-pack
texture/model feature (no blocks/logic) → client, so sync drops it from
server-mods.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
New custom mod ulicraftmod-1.21.1-1.0.0-6.0.10 added to the distribution;
content mod (server + client), so both.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
YUNG's Cave Biomes hard-requires geckolib>=4.7.6 and terrablender>=4.1.0.8;
both now in the distribution. Classified both (server worldgen libs).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Added picaxe (both). Pruned 5 stale keys for removed jars: LittleFrames,
waterframes, watermedia, watervision (WaterMedia stack dropped from the
pack) and the orphan iris key. sides keys 135→131 = current dist count.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
watermedia throws IllegalEnvironmentException on server-side ("keep it
on client"). Its natives (wm_binaries) and dependents (watervision,
waterframes) are client-render media mods too — flip all four to client
so sync drops them.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
cwb declares @Mod(dist=CLIENT); classify-mods.py read its toml side as
BOTH (the dist annotation isn't in the manifest), so it synced to the
server and RuntimeDistCleaner FATAL'd on CubesWithoutBordersImpl. Flip
to client so sync drops it.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Distribution grew 76→135 forgemods; classify-mods.py seeded the 59
new jars into mods-sides.json (57 both, 2 client). Unblocks the server
mod sync — server was stuck on the old 52-jar subset.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Drippy Loading Screen (and other client-only mods declaring BOTH in their
manifest) crashed the dedicated server with "Attempted to load class
net/minecraft/client/gui/screens/Screen for invalid dist DEDICATED_SERVER".
tomllib can't catch these (they declare BOTH), so hand-classify the leaf
client-only mods as `client`: BetterF3, JustEnoughResources, MouseTweaks,
Searchables, TravelersTitles, drippyloadingscreen, entityculling, fancymenu,
konkrete, melody, ponderjs, welcomescreen, yeetusexperimentus. Now 24 client
/ 52 both.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Drop packwiz entirely. The server now loads a filtered mod subset from a
local ./server-mods volume instead of fetching a packwiz pack at boot.
New flow:
- tooling/classify-mods.py (tomllib only, no network) reads each jar's
META-INF/neoforge.mods.toml and seeds mods-sides.json with a side
(client|server|both; default both). Existing entries are preserved.
- mods-sides.json: committed, keyed by jar filename, hand-editable override
surface. Initial seed: 65 both, 11 client, 0 server (76 jars).
- tooling/sync-server-mods.sh mirrors the both/server jars from
$DISTRIBUTION_WEB_ROOT into ./server-mods/ (authoritative; prunes strays;
halts on a missing jar). Replaces render-pack.sh.
- compose: minecraft mounts ./server-mods:/mods:ro with REMOVE_OLD_MODS=TRUE
(itzg auto-syncs /mods -> /data/mods). Removed PACKWIZ_URL, the pack.
extra_host (auth. kept for authlib), and depends_on caddy (drasl kept).
Both classify-mods.py and sync-server-mods.sh resolve their source dir as:
CLI arg / MODS_DIST_DIR env / $DISTRIBUTION_WEB_ROOT (in that order).
Removed: tooling/render-pack.sh + add-custom-mod.sh (packwiz tooling),
pack/ (packwiz source), custom/ (76 jars now sourced from the distribution),
the pack. caddy vhost + its mounts/alias, and the packwiz .gitignore block.
Client distribution is UNCHANGED: HeliosLauncher still installs the full
modset from distribution.json. Docs (CLAUDE.md, plan/04/05/14, runtime)
updated; plan/04-packwiz.md stubbed as superseded by plan/04-mods.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>