# Brass & Sigil Self-hosted Minecraft modpack distribution + administration system. Three components, one repo: ``` brass-and-sigil/ ├── launcher/ ← Avalonia desktop client (Windows .NET 8) │ Auths with Microsoft, syncs the modpack, launches the game. ├── server/ ← brass-sigil-server daemon (Linux .NET 8) │ Wraps the MC subprocess, exposes the admin web panel, │ syncs mods, runs backups + BlueMap, handles whitelist. ├── pack/ ← Modpack content │ ├── pack.lock.json Source of truth for mod versions / URLs / hashes │ ├── tweaks/ Hand-written data-only tweak source │ └── overrides/ Build output / hand-placed local files (gitignored) ├── scripts/ ← Build + deploy entry points (run from repo root) │ ├── Update-Pack.ps1 Refresh pack.lock.json from Modrinth/CurseForge │ ├── Check-Updates.ps1 Non-mutating "what's new?" report │ ├── Build-Tweaks.ps1 Compile tweaks/ into pack/overrides/mods/*.jar │ ├── Build-Pack.ps1 Generate manifest.json from the lockfile │ └── Deploy-Brass.ps1 One-shot build + deploy everything └── docs/ ← Operational notes, deploy runbook, schema docs ``` ## Quick start ```powershell # Pull dependencies, copy and edit the deploy profile git clone brass-and-sigil cd brass-and-sigil Copy-Item scripts\deploy.config.template.ps1 scripts\deploy.config.ps1 notepad scripts\deploy.config.ps1 # fill in deploy share, SSH host, etc. # Build + deploy everything in one go .\scripts\Deploy-Brass.ps1 ``` `deploy.config.ps1` is gitignored -- local values never get committed. ## Component reference | Component | What it does | Technology | |-----------|--------------|------------| | `launcher/` | Friend-distributed client. Auths with Microsoft via WebView2 + XboxAuthNet, downloads mods, launches Minecraft. Single self-contained `.exe` published from `publish/`. | Avalonia 12 + CmlLib.Core | | `server/` | Daemon running alongside the MC process on Linux. Hosts a Kestrel web panel for admin (cookie-auth, rate-limited), bridges RCON, runs scheduled backups + BlueMap renders, handles whitelist requests. | ASP.NET Core minimal APIs | | `pack/` | Lockfile-driven modpack content. `pack.lock.json` resolves mod slug → URL+SHA-1; `Build-Pack.ps1` walks it and produces `manifest.json` for the launcher and the server-tool to consume. | PowerShell tooling | ## Workflow 1. **Bump mod versions:** `.\scripts\Update-Pack.ps1` (queries Modrinth + manual CurseForge entries). 2. **Sanity-check:** `.\scripts\Check-Updates.ps1` for a non-mutating availability report. 3. **Edit tweaks** under `pack/tweaks//` if you're changing recipes / loot / etc. 4. **Deploy:** `.\scripts\Deploy-Brass.ps1` -- builds launcher + server, regenerates manifest, mirrors everything to the deploy share, scp's the server binary. ## Secrets / config files | File | Tracked? | Notes | |------|----------|-------| | `launcher/launcher-config.template.json` | ✓ | Empty placeholders, public-safe | | `launcher/launcher-config.json` | ✗ | Local override; merged into the published exe at build time if present | | `server/deploy/server-config.example.json` | ✓ | Template; rename to `server-config.json` on the server with real values | | `server/deploy/server-config.json` | ✗ | Production config; lives on the server only | | `scripts/deploy.config.ps1` | ✗ | Local deploy profile (paths, SSH host, share location) | ## License See `LICENSE`.