diff --git a/CLAUDE.md b/CLAUDE.md index ac57b3d..06ee4f4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -12,7 +12,9 @@ with `plan/` or the code, those win. - **Players**: 4–10 friends - **Modpack vibe**: Kitchen-sink (tech + magic + exploration + QoL) -- **Pack approach**: Manually curated (~50–100 mods), NOT a forked existing pack +- **Pack approach**: Manually curated, NOT a forked existing pack. Original target + ~50–100 mods; **actual is 164 jars** (2026-07-20, kitchen-sink expansion) — + ceiling knowingly exceeded, watch RAM - **Minecraft version**: 1.21.1, **NeoForge** (not classic Forge) - **Auth/skins**: Drasl (Yggdrasil-compatible), **password login** — no OIDC - **DNS**: handled OUTSIDE this repo; point `${BASE_DOMAIN}` + subdomains at the host @@ -131,7 +133,9 @@ while every other check passed. ### Memory sizing ~50–100 mods, 8 players, 1.21.1: `INIT_MEMORY: 4G`, `MAX_MEMORY: 10G`, -`USE_AIKAR_FLAGS: TRUE`. +`USE_AIKAR_FLAGS: TRUE`. **The pack is now 164 jars / 133 server-side** (Create +ecosystem + Ars Nouveau + full worldgen) — sized for the old 50–100 assumption, so +`MAX_MEMORY` may need a bump. Re-check heap usage under load before adding more. ## Config (.env) @@ -157,13 +161,12 @@ mirrored at apex `/launcher/`. Per guest: ## Open / Pending Work ### Roadmap — mod migration follow-ups (post packwiz→04-mods) -- [ ] **Curate `mods-sides.json` cosmetic-client mods.** tomllib auto-flagged 11 - hard client-only mods; the other 65 default `both`, including client-cosmetic - ones (BetterF3, entityculling, MouseTweaks, ponderjs, fancymenu, drippy, melody, - welcomescreen, Searchables, JustEnoughResources, TravelersTitles, yeetus…) that - load harmlessly on the server but waste RAM. Hand-edit them to `client` so - `sync-server-mods.sh` drops them from `./server-mods`. (Also review `appleskin`, - flagged `client` — flip to `both` if server-side food data wanted.) +- [ ] **Curate `mods-sides.json` cosmetic-client mods.** Pack is now **164 jars** + (2026-07-20): **31 `client` / 133 `both`**. The `both` set still contains + client-cosmetic mods that load harmlessly on the server but waste RAM — hand-edit + them to `client` so `sync-server-mods.sh` drops them from `./server-mods`. + (Also review `appleskin`, flagged `client` — flip to `both` if server-side food + data wanted.) ### Landing rework + mod list (PLANNED — see `plan/18-landing-rework.md`) Full design settled across WS1–WS6; all tasks unchecked, ready to execute. - [ ] **WS1 — Join flow off packwiz.** Homepage = UlicraftLauncher, 3 steps @@ -181,12 +184,15 @@ Full design settled across WS1–WS6; all tasks unchecked, ready to execute. - [ ] **WS5 — Footer status link** to `status.${BASE_DOMAIN}` (nav unchanged). - [ ] **WS6 — Mod shortlist + list component (`plan/17-mod-shortlist.md`).** - Light gap doc: current 76-jar pack is vanilla+ QoL/perf; **empty** on tech & - magic, thin worldgen, no map; orphan deps `ponderjs`/`Necronomicon`. Landing - mod-list component = auto-generated `mods.json` + extracted logos from the - distribution forgemods (`tooling/build-modlist.py`), flat alphabetical, pretty - names, no categories/links; feeds the "50+" stat tile. -- [ ] Server-side perf mods (C2ME, etc.). + Gap doc part **DONE**: pack filled out to **164 jars** (2026-07-20) — Create + ecosystem (tech), Ars Nouveau + ars_creo (magic), full YUNG's + Moog's + + TerraBlender (worldgen); `ponderjs` orphan resolved by Create. Still open: **no + map mod** (Xaero's), `Necronomicon` orphan (no Iron's Spells), and 164 > the + stated 50–100 ceiling. Still to build: landing mod-list component = + auto-generated `mods.json` + extracted logos from the distribution forgemods + (`tooling/build-modlist.py`), flat alphabetical, pretty names, no + categories/links; feeds the "50+" stat tile. +- [ ] Server-side perf mods (C2ME, etc. — `modernfix` already in the pack). - [x] **Filestash file share** (`files.`, 2026-07-14) — live in prod. One shared htpasswd login, writable, rendered `:ro` config. See `plan/20-files.md`. Follow-ups: add the Uptime Kuma HTTP monitor for `files.`; the share is diff --git a/plan/04-mods.md b/plan/04-mods.md index 1caf6e0..7e2b4d3 100644 --- a/plan/04-mods.md +++ b/plan/04-mods.md @@ -6,7 +6,8 @@ ## Why drop packwiz -- The packwiz index tracked only **9** mods while the real modset (76 jars) lives +- The packwiz index tracked only **9** mods while the real modset (76 jars at the + time of cutover; 164 as of 2026-07-20) lives in the distribution repo — packwiz was half-built and stale. - Manual packwiz curation (`.tmpl` render → `refresh` → re-hash) is the flagged pain point, and a single missing file (`custom/.gitkeep`) crashlooped the @@ -20,7 +21,7 @@ ``` ulicraft-distribution/dist (another repo, = $DISTRIBUTION_WEB_ROOT) servers/ulicraft-1.21.1/ - forgemods/required/*.jar ← 76 jars, Nebula-managed (SOURCE OF TRUTH) + forgemods/required/*.jar ← 164 jars (2026-07-20), Nebula-managed (SOURCE OF TRUTH) distribution.json ← generated by Nebula; CLIENT install list │ │ │ caddy distribution. vhost │ HeliosLauncher reads it → @@ -196,8 +197,9 @@ welcomescreen, yeetusexperimentus` — on top of the 11 tomllib auto-caught (sodium, sodium-extra, iris, ImmediatelyFast, appleskin, Controlling, BridgingMod, CustomSkinLoader, entity_model_features, entity_texture_features, tagtooltips). -**Current state: 24 `client` / 52 `both`.** The 52 may still hide a client-only -mod that loaded without crashing; if a future restart trips another +**State at first cutover: 24 `client` / 52 `both`. Current (2026-07-20, post +tech/magic/worldgen expansion): 31 `client` / 133 `both`.** The `both` set may +still hide a client-only mod that loaded without crashing; if a future restart trips another `invalid dist DEDICATED_SERVER`, flip that one jar to `client` and re-sync — same one-line loop. When excluding, prefer leaf mods; if a `both` mod hard-depends on the one you exclude you'll get a `Missing mandatory dependency` instead — put it diff --git a/plan/17-mod-shortlist.md b/plan/17-mod-shortlist.md index c060e67..796e3e7 100644 --- a/plan/17-mod-shortlist.md +++ b/plan/17-mod-shortlist.md @@ -1,14 +1,19 @@ # Mod shortlist + landing mod-list component (WS6) -> **Status: PLANNED — not started.** Two separable deliverables: (1) a curated -> kitchen-sink gap doc (this file), (2) an auto-generated `mods.json` + logos that -> feed a flat mod-list component on the landing page (see also `18-landing-rework.md`). +> **Status: gap doc DONE (pack filled out 2026-07-20), landing component still +> PLANNED.** Two separable deliverables: (1) a curated kitchen-sink gap doc (this +> file), (2) an auto-generated `mods.json` + logos that feed a flat mod-list +> component on the landing page (see also `18-landing-rework.md`). ## TL;DR -- Current pack (76 jars, `mods-sides.json`) is a polished **vanilla+ QoL/perf** base, - **not yet kitchen-sink**. Strong perf + QoL + storage + FTB + voice; **empty** on - tech and magic, **thin** on worldgen, **no** map mod. +- The pack is now **kitchen-sink** — **164 jars** (`mods-sides.json`: 133 `both`, + 31 `client`), up from the 76-jar vanilla+ base this doc originally described. + Tech (Create + ~18 addons), magic (Ars Nouveau + ars_creo) and worldgen (full + YUNG's set + Moog's structures + TerraBlender) all landed. **Map is still the + only open gap.** +- **164 jars is over the stated 50–100 ceiling** in `CLAUDE.md`. Accepted for now; + it moves the RAM/stability bar (`INIT_MEMORY 4G`/`MAX_MEMORY 10G` — watch it). - Jars live in the **external distribution repo** (`$DISTRIBUTION_WEB_ROOT/servers/ ulicraft-1.21.1/forgemods/required/*.jar`, Nebula-managed). Adding mods happens there, **not** in this repo. This doc is a shortlist only; depth = **light** (names @@ -17,48 +22,58 @@ from the jars — a different dataset from this shortlist. Flat alphabetical, pretty names, extracted logos, no categories, no Modrinth/CF links. -## Current pack — what's already in (76 jars) +## Current pack — what's in (164 jars) +- **Tech — Create ecosystem (the anchor):** create, createaddition, createdeco, + create_connected, copycats, create-central-kitchen, create-enchantment-industry, + create-integrated-farming, create_jetpack(+curios), create_mechanical_chicken, + create_mechanical_extruder, create_mechanical_spawner, mechanical_cow, + mechanicals, createsifter, createultimine, createornithopterglider, + CreateDragonsPlus, sliceanddice, sophisticatedbackpackscreateintegration, + kubejs-create. Non-Create tech: laserio, enderrf, EnderStorage, melter, + mob_grinding_utils, buildinggadgets2, charginggadgets, titanium, CodeChickenLib. +- **Magic:** ars_nouveau, ars_creo (Ars×Create bridge). +- **Worldgen/exploration:** full YUNG's set (BetterCaves, CaveBiomes, Bridges, + BetterDungeons, BetterMineshafts, BetterStrongholds, BetterDesertTemples, + BetterJungleTemples, BetterOceanMonuments, BetterWitchHuts, + BetterNetherFortresses, BetterEndIsland), Moog's (Voyager, End, Nether, + MissingVillages, moogs_structures), TerraBlender, ExplorersCompass, + world_dimension_nexus, HangGlider, fishingoverhaul. - **Perf:** sodium, sodium-extra, iris, immediatelyfast, entityculling, ferritecore, - lithium, spark. + lithium, modernfix, spark. - **QoL:** JEI, Jade(+addons), JER, JEProfessions, appleskin, MouseTweaks, Controlling, Searchables, inventoryessentials, polymorph, rightclickharvest, simplemagnets, fastleafdecay, torchmaster, trashcans, corpse(+curioscompat), lootr, comforts, - BetterF3, tagtooltips, cardboardboxes. + BetterF3, tagtooltips, cardboardboxes, EasyAnvils, EasyMagic, easydisenchanting, + easy-villagers, easy-piglins, EasierSleeping, solcarrot, Neat, Ping-Wheel, + moreoverlays, ToastControl, ExtremeSoundMuffler, colorfulhearts, UsefulSlime. - **Storage:** sophisticatedbackpacks(+core), functionalstorage(+more). -- **Farm/decor/build:** FarmersDelight, FramedBlocks, handcrafted. +- **Farm/decor/build:** FarmersDelight, handcrafted, rechiseled, amendments, + immersive_paintings, etched, emotecraft. - **FTB utils:** chunks, essentials, library, teams, ultimine. - **Voice:** Simple Voice Chat (`voicechat`). -- **Scripting/guide:** KubeJS(+rhino, +delight), ponderjs, Patchouli. -- **Libs:** architectury, balm, cloth-config, configured, curios, resourcefullib, - supermartijn642 core/config, jamlib, baguettelib, titanium, utilitarian, YungsApi, - Necronomicon, yacl. +- **Scripting/guide:** KubeJS(+rhino, +delight, +create), lootjs, toolsjs, ponderjs, + Patchouli. +- **Server-custom:** `ulicraftmod` (this group's own mod). +- **Libs:** architectury, balm, cloth-config, configured, curios, caelus, geckolib, + kotlinforforge, moonlight, Placebo, PuzzlesLib, resourcefullib, CreativeCore, + supermartijn642 core/config, jamlib, baguettelib, txnilib, fzzy_config, + titanium, utilitarian, YungsApi, Necronomicon, yacl, konkrete. -## Gaps vs kitchen-sink (tech + magic + exploration + QoL) +## Remaining gaps -- [ ] **Tech — empty.** Candidates: Create, Mekanism, Immersive Engineering, Applied - Energistics 2, Thermal Series, Powah. (Pick a subset; Create is the anchor.) -- [ ] **Magic — empty.** Candidates: Ars Nouveau, Botania, Iron's Spells 'n Spellbooks, - Eidolon. -- [ ] **Worldgen — thin** (only `YungsApi` + `ExplorersCompass`). Candidates: Terralith, - Tectonic, YUNG's structure set (Better Dungeons/Mineshafts/Strongholds…), - Repurposed Structures, William Wythers' Overhauled Overworld. -- [ ] **Map — none.** Candidate: Xaero's Minimap + Worldmap. -- [ ] **Server-side perf (optional):** ModernFix, C2ME. +- [ ] **Map — none.** Candidate: Xaero's Minimap + Worldmap. (`Ping-Wheel` and + `ftb-chunks`' claim map do not replace a minimap.) +- [ ] **Server-side perf (optional):** C2ME. (`modernfix` is in.) +- [ ] Optional second magic pillar (Botania / Iron's Spells) — Ars alone covers the + vibe; only add if the pack budget allows. -## Orphaned dependencies (cleanup) +## Orphaned dependencies -- [ ] **`ponderjs`** present but **no Create** — ponder is Create's. Add Create or drop. +- [x] **`ponderjs`** — resolved, Create is in the pack. - [ ] **`Necronomicon`** present but **no Iron's Spells** — it's Iron's Spells' lib. Add Iron's Spells or drop. -## Curation tradeoff - -Adding the tech+magic+worldgen anchors pushes 76 → 100+ jars, near the stated -50–100 ceiling, and raises the RAM/stability bar (`INIT_MEMORY 4G`/`MAX_MEMORY 10G`). -Curate deliberately; verify each candidate's NeoForge **1.21.1** build + the -`21.1.233` loader pin at add-time. - ## Execution (external repo, when ready) 1. Add jars in the distribution repo (Nebula `forgemods/required/`), keep the NeoForge diff --git a/plan/18-landing-rework.md b/plan/18-landing-rework.md index f95fb00..750b822 100644 --- a/plan/18-landing-rework.md +++ b/plan/18-landing-rework.md @@ -158,7 +158,7 @@ offline) reads `$DISTRIBUTION_WEB_ROOT/servers/ulicraft-1.21.1/forgemods/require ```json { "schemaVersion": 1, - "count": 76, + "count": 164, "mods": [ { "id": "jei", "name": "Just Enough Items (JEI)", "version": "19.27.0.340", "authors": "mezz", "description": "…", "logo": "/mod-logos/jei.png" } @@ -168,6 +168,8 @@ offline) reads `$DISTRIBUTION_WEB_ROOT/servers/ulicraft-1.21.1/forgemods/require `ModList.astro` (new) imports `mods.json` → flat grid (logo + name + version). The homepage stat tile (`site.ts` `stats[0].key "50+"`) is fed from `mods.json.count`. +(The hardcoded `"50+"` fallback is stale — the pack is 164 jars as of 2026-07-20; +bump it to `"150+"` when wiring the tile.) Tasks: - [ ] `tooling/build-modlist.py` (jar parse + logo extract + `mods.json`).