Self-hosted Minecraft modpack distribution + administration system.
- launcher/ Avalonia 12 desktop client; single-file win-x64 publish.
Microsoft auth via XboxAuthNet, manifest+SHA-1 mod sync,
portable install path, sidecar settings.
- server/ brass-sigil-server daemon (.NET 8, linux-x64). Wraps the
MC subprocess, embedded Kestrel admin panel with cookie
auth + rate limiting, RCON bridge, scheduled backups,
BlueMap CLI integration with player markers + skin proxy,
friend-side whitelist request flow, world wipe with seed
selection (keep current / random / custom).
- pack/ pack.lock.json (Modrinth + manual CurseForge entries),
data-only tweak source under tweaks/, build outputs in
overrides/ (gitignored).
- scripts/ Build-Pack / Build-Tweaks / Update-Pack / Check-Updates
plus Deploy-Brass.ps1 unified one-shot deploy with
version-bump pre-flight and daemon-state detection.
3.4 KiB
Pack tweaks
This folder is the source for any data-only NeoForge mods we ship with the modpack. Each subfolder becomes one jar at build time.
The build pipeline:
pack/tweaks/<name>/ --(Build-Tweaks.ps1)--> pack/overrides/mods/<name>-<ver>.jar
|
v
(Build-Pack.ps1 picks it up)
|
v
manifest.json -> launcher install
Because the output is a real mod jar (with META-INF/neoforge.mods.toml),
the data inside auto-loads in single-player and on the server -- no
/datapack enable needed, no per-world setup.
Adding a new tweak (one big jar, recommended)
The simplest workflow is to keep extending brassandsigil-tweaks with more
worldgen / loot / recipe overrides. Just drop more JSON under
brassandsigil-tweaks/data/brassandsigil_tweaks/....
Common targets:
| What | Path |
|---|---|
| Custom configured feature (ore) | data/brassandsigil_tweaks/worldgen/configured_feature/<name>.json |
| Custom placed feature | data/brassandsigil_tweaks/worldgen/placed_feature/<name>.json |
| Lithostitched modifier | data/brassandsigil_tweaks/lithostitched/worldgen_modifier/<name>.json |
| Override another mod's loot table | data/<their_modid>/loot_table/blocks/<name>.json |
| Override another mod's recipe | data/<their_modid>/recipe/<name>.json |
| Override / extend a vanilla tag | data/minecraft/tags/<registry>/<name>.json |
After editing, bump the version in
brassandsigil-tweaks/META-INF/neoforge.mods.toml so launcher clients see
it as a new file and re-download.
Adding a separate tweak mod
Make a sibling folder. The structure must be:
tweaks/
<my-tweak>/
META-INF/
neoforge.mods.toml # modId + version are required
pack.mcmeta # pack_format: 48 for 1.21.1
data/
<my_namespace>/
...
Build-Tweaks.ps1 reads modId and version from the toml and produces
pack/overrides/mods/<modId>-<version>.jar. Old jars for the same modId
are auto-cleaned, so version bumps don't leave stale files behind.
What's in brassandsigil-tweaks today
skylands_end_stone_ore-- adds small End Stone veins to Terralith's Skylands biomes (#terralith:skylands). Targetsstone_ore_replaceablesso it only replaces the stone interior of the floating islands. Powers the Aeronautics Levitite-blend recipe without forcing players to visit The End. Tuning lives indata/brassandsigil_tweaks/worldgen/placed_feature/skylands_end_stone_ore.json(count= veins per chunk;sizein the configured_feature controls vein size).
Building
From the repo root:
# Builds tweak jars + manifest in one shot:
.\scripts\Build-Pack.ps1 -OutputPath .\scripts\manifest.json
# Just rebuild tweak jars:
.\scripts\Build-Tweaks.ps1
Then deploy: .\scripts\Deploy-Brass.ps1 mirrors pack/overrides/ to the
public share's files/ subdir and pushes the regenerated manifest alongside.