Initial commit: Brass & Sigil monorepo

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.
This commit is contained in:
Matt Sijbers
2026-05-05 00:19:05 +01:00
commit a1331212cb
99 changed files with 12640 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
# Caddyfile for the brass-sigil-server web panel.
#
# Caddy auto-fetches and renews a Let's Encrypt cert for your domain,
# so HTTPS just works once DNS is pointed at the server and ports 80 + 443
# are open.
#
# Prereqs:
# 1. A domain name (e.g. panel.example.com) with an A/AAAA record pointing
# at this server's public IP. Let's Encrypt does NOT issue certs for
# raw IPs -- you need a hostname.
# 2. Inbound 80 (for the HTTP-01 ACME challenge) and 443 (for the panel)
# open in your firewall and in any cloud security group.
# 3. Caddy installed:
# sudo apt install caddy # Debian / Ubuntu
# brew install caddy # macOS
# winget install CaddyServer.Caddy # Windows
# 4. brass-sigil-server running on localhost:8080 with webHost: localhost
# and webPassword set (use `brass-sigil-server set-password` if you
# haven't already).
#
# Install:
# Linux package: replace /etc/caddy/Caddyfile with this file, then
# sudo systemctl reload caddy
# Manual: caddy run --config Caddyfile
panel.example.com {
encode gzip
reverse_proxy localhost:8080 {
# SSE log stream uses chunked streaming responses -- Caddy must not
# buffer them, otherwise console updates arrive in batches every minute
# instead of in real time.
flush_interval -1
# Pass the real client IP through. brass-sigil-server's ForwardedHeaders
# middleware honours this so the per-IP login rate limit partitions
# correctly (10 attempts / minute / IP).
header_up X-Forwarded-For {remote_host}
header_up X-Real-IP {remote_host}
}
# Sensible hardening defaults.
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Referrer-Policy "strict-origin-when-cross-origin"
-Server
}
}
+27
View File
@@ -0,0 +1,27 @@
# /etc/apache2/sites-available/bns-admin.sijbers.uk.conf
#
# Reverse-proxy vhost for the brass-sigil-server admin panel.
# certbot will manage the SSL config (certificate paths, redirect from :80, etc.)
# when run as: sudo certbot --apache -d bns-admin.sijbers.uk
<VirtualHost *:80>
ServerName bns-admin.sijbers.uk
ProxyPreserveHost On
ProxyRequests Off
# SSE log stream needs streaming responses, not buffered ones.
SetEnv no-gzip 1
SetEnv proxy-sendcl 1
# `flushpackets=on` is the SSE-critical bit on Apache -- pushes each chunk
# straight through instead of batching for ~60 s.
ProxyPass / http://127.0.0.1:8080/ flushpackets=on keepalive=On
ProxyPassReverse / http://127.0.0.1:8080/
# So brass-sigil-server's rate limiter sees the real client IP, not 127.0.0.1.
RequestHeader set X-Forwarded-Proto "https"
ErrorLog ${APACHE_LOG_DIR}/bns-admin.sijbers.uk-error.log
CustomLog ${APACHE_LOG_DIR}/bns-admin.sijbers.uk-access.log combined
</VirtualHost>
+284
View File
@@ -0,0 +1,284 @@
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Brass &amp; Sigil Launcher -- Matt Sijbers</title>
<meta name="description" content="A private custom Minecraft Java Edition launcher for the Brass & Sigil modpack -- built in C# / .NET 8 / Avalonia." />
<link rel="icon" href="/images/favicon-light.ico" media="(prefers-color-scheme: light)" type="image/x-icon" />
<link rel="icon" href="/images/favicon-dark.ico" media="(prefers-color-scheme: dark)" type="image/x-icon" />
<link rel="stylesheet" href="css/matt.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" />
<style>
html, body {
background: var(--color-primary-darker-10);
overflow: auto;
height: auto;
min-height: 100vh;
max-height: none;
}
.page-wrap {
max-width: 900px;
margin: 0 auto;
padding: clamp(20px, 5vw, 60px) clamp(16px, 5vw, 32px) 80px;
}
.back-link {
display: inline-flex;
align-items: center;
gap: 8px;
margin-bottom: 24px;
font-size: 0.95em;
}
.hero {
padding: clamp(20px, 4vw, 36px);
margin-bottom: 24px;
}
.hero h1 {
font-size: clamp(1.6em, 6vw, 2.6em);
text-transform: uppercase;
margin: 0 0 8px;
}
.hero .subtitle {
color: var(--color-secondary-text);
font-size: clamp(0.9em, 3vw, 1.1em);
margin: 0;
}
.tag-row {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 18px;
}
.tag {
background: var(--color-primary-darker-20);
color: var(--color-primary-text);
padding: 6px 12px;
border-radius: 999px;
font-size: 0.85em;
font-weight: 500;
}
.action-row {
display: flex;
flex-wrap: wrap;
gap: 12px;
margin-top: 22px;
}
.action-btn {
display: inline-flex;
align-items: center;
gap: 8px;
background: var(--color-accent);
color: #fff !important;
padding: 10px 18px;
border-radius: 8px;
font-weight: 600;
font-size: 0.95em;
text-decoration: none;
transition: background 0.15s linear, transform 0.1s linear;
}
.action-btn:hover {
background: var(--color-accent-lighter-10);
transform: translateY(-1px);
}
.action-btn.secondary {
background: var(--color-primary-darker-20);
color: var(--color-primary-text) !important;
}
.action-btn.secondary:hover {
background: var(--color-primary-darker-30);
}
.whitelist-note {
margin: 18px 0 0;
padding: 10px 14px;
background: var(--color-primary-darker-10);
border-left: 3px solid var(--color-accent);
border-radius: 6px;
color: var(--color-secondary-text);
font-size: 0.9em;
line-height: 1.45;
}
.whitelist-note i { color: var(--color-accent); margin-right: 6px; }
.section {
padding: clamp(18px, 3.5vw, 28px);
margin-bottom: 18px;
}
.section h2 {
margin-top: 0;
margin-bottom: 12px;
}
.section p {
line-height: 1.55;
color: var(--color-primary-text);
}
.facts {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
margin-top: 8px;
}
.fact {
background: var(--color-primary-darker-10);
border-radius: 12px;
padding: 14px 18px;
}
.fact .label {
font-size: 0.78em;
color: var(--color-secondary-text);
text-transform: uppercase;
letter-spacing: 0.05em;
margin: 0 0 4px;
}
.fact .value {
font-family: "Ubuntu", sans-serif;
font-weight: 500;
color: var(--color-primary-text);
margin: 0;
}
@media (max-width: 540px) {
.facts { grid-template-columns: 1fr; }
}
ul.feature-list {
padding-left: 1.25em;
margin: 4px 0 0;
}
ul.feature-list li {
color: var(--color-primary-text);
line-height: 1.5;
margin: 4px 0;
}
footer.page-footer {
color: var(--color-secondary-text);
font-size: 0.85em;
text-align: center;
margin-top: 40px;
}
</style>
</head>
<body>
<div class="page-wrap">
<a href="/matt#projects" class="back-link"><i class="fa fa-arrow-left"></i> Back to portfolio</a>
<div class="bevel hero">
<h1>Brass &amp; Sigil Launcher</h1>
<p class="subtitle">A private custom Minecraft Java Edition launcher for a small friend group.</p>
<div class="tag-row">
<span class="tag">C# / .NET 8</span>
<span class="tag">Avalonia</span>
<span class="tag">CmlLib.Core</span>
<span class="tag">Single-file Windows</span>
<span class="tag">Private project</span>
</div>
<div class="action-row">
<a class="action-btn" href="/pack/BrassAndSigil-Launcher.exe">
<i class="fa fa-download"></i> Download launcher
</a>
<a class="action-btn secondary" href="https://sijbers.uk:8443/projects/BS/repos/brass-and-sigil-launcher/browse"
target="_blank" rel="noopener noreferrer">
<i class="fa fa-code"></i> View source code
</a>
<a class="action-btn secondary" href="/matt#projects">
<i class="fa fa-user"></i> Developer portfolio
</a>
</div>
<p class="whitelist-note">
<i class="fa fa-info-circle"></i>
You'll need to be whitelisted on the server to actually join &mdash; message Matt with your Minecraft username.
</p>
</div>
<div class="bevel section">
<h2>About the project</h2>
<p>
Brass &amp; Sigil is a private Minecraft modpack centred on the Create mod, aeronautics, tech and magic mods,
with Distant Horizons for far-render exploration. This launcher is the desktop client built specifically
to distribute the pack to a small friend group (under 50 players, no public release).
</p>
<p>
The launcher is a native Windows application written in C# on .NET 8, using the Avalonia UI framework.
It ships as a single self-contained executable so friends can just download and run it &mdash; no installer,
no .NET runtime to install, no separate config files.
</p>
</div>
<div class="bevel section">
<h2>What it does</h2>
<ul class="feature-list">
<li>Fetches a JSON manifest from a self-hosted server and syncs the modpack files (mods, configs, resourcepacks) to the player's local install directory, using SHA-1 hashing so only changed files are downloaded.</li>
<li>Authenticates the player with their own personal Microsoft account via the standard MSAL OAuth flow, so only legitimate Minecraft Java Edition owners can sign in.</li>
<li>Installs the right Minecraft version and Forge loader, then launches the game with the configured memory and the player's session.</li>
<li>Auto-updates the modpack on every launch when the manifest changes &mdash; players never have to manually install or update mods.</li>
</ul>
</div>
<div class="bevel section">
<h2>Technical details</h2>
<div class="facts">
<div class="fact">
<p class="label">Language</p>
<p class="value">C# (.NET 8)</p>
</div>
<div class="fact">
<p class="label">UI Framework</p>
<p class="value">Avalonia 12</p>
</div>
<div class="fact">
<p class="label">Minecraft auth</p>
<p class="value">CmlLib.Core.Auth.Microsoft</p>
</div>
<div class="fact">
<p class="label">Game launching</p>
<p class="value">CmlLib.Core 4.x + Forge installer</p>
</div>
<div class="fact">
<p class="label">Distribution</p>
<p class="value">Single-file self-contained .exe</p>
</div>
<div class="fact">
<p class="label">Audience</p>
<p class="value">Private friend group (&lt; 50)</p>
</div>
</div>
</div>
<div class="bevel section">
<h2>Privacy &amp; data</h2>
<p>
The launcher does not collect, store, or transmit any user data beyond what the standard Microsoft and
Minecraft authentication flows require. Auth tokens are cached locally on the player's machine via the
MSAL token cache &mdash; no telemetry, no analytics, no third-party services beyond Microsoft and Mojang.
</p>
<p>
The modpack manifest and mod files are served from a self-hosted Linux server that I personally operate.
</p>
</div>
<div class="bevel section">
<h2>Status</h2>
<p>
Active development. The launcher is functional end-to-end (manifest sync, Microsoft auth, Forge install,
game launch) and is currently being prepared for distribution to a small group of friends.
</p>
<p>
Source code is publicly available, MIT-licensed, on my self-hosted Bitbucket:
<a href="https://sijbers.uk:8443/projects/BS/repos/brass-and-sigil-launcher/browse"
target="_blank" rel="noopener noreferrer">sijbers.uk:8443/.../brass-and-sigil-launcher</a>.
</p>
</div>
<div class="bevel section" style="text-align: center; font-size: 0.85em;">
<p style="margin: 0; color: var(--color-secondary-text); letter-spacing: 0.04em;">
NOT AN OFFICIAL MINECRAFT PRODUCT. NOT APPROVED BY OR ASSOCIATED WITH MOJANG OR MICROSOFT.
</p>
</div>
<footer class="page-footer">
Brass &amp; Sigil Launcher &mdash; a private project by <a href="/matt">Matt Sijbers</a>.
</footer>
</div>
</body>
</html>
+26
View File
@@ -0,0 +1,26 @@
[Unit]
Description=Brass & Sigil Minecraft server (with web admin panel)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=matt
Group=matt
WorkingDirectory=/home/matt/brass-sigil-server
ExecStart=/home/matt/brass-sigil-server/brass-sigil-server run
Restart=on-failure
RestartSec=10s
# Give the JVM enough room to start up gracefully on Stop (sends "stop" to MC,
# waits for clean shutdown, then escalates to SIGTERM/SIGKILL).
TimeoutStopSec=60s
KillMode=mixed
# Tighten attack surface -- typical for a service running as a regular user.
PrivateTmp=true
ProtectSystem=full
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
+105
View File
@@ -0,0 +1,105 @@
#!/usr/bin/env bash
# Sudo cleanup script -- review before running.
# Removes dormant game servers (ARK, Valheim, Terraria), trims journald logs,
# caps snap revision retention. Does NOT touch Bitbucket, TeamViewer, or the
# matt-wakeford.co.uk / sijbers.uk / diceheart.com websites.
#
# Run with: sudo bash /tmp/cleanup-sudo.sh
#
# Set -e: abort on first error so we don't cascade-damage state.
set -euo pipefail
echo "=== Pre-cleanup disk ==="
df -h / | grep -v Filesystem
# ────────────────────────────────────────────────
# 1. ARK server -- install, user, broken systemd unit
# ────────────────────────────────────────────────
echo
echo "=== ARK ==="
if systemctl list-unit-files ark.service &>/dev/null; then
echo " Disabling ark.service"
systemctl disable --now ark.service 2>/dev/null || true
fi
if [[ -f /lib/systemd/system/ark.service ]]; then
echo " Removing /lib/systemd/system/ark.service"
rm -f /lib/systemd/system/ark.service
fi
if [[ -f /etc/systemd/system/ark.service ]]; then
echo " Removing /etc/systemd/system/ark.service"
rm -f /etc/systemd/system/ark.service
fi
if id ark &>/dev/null; then
# Make sure no processes are running as ark before userdel.
pkill -u ark 2>/dev/null || true
sleep 1
echo " Removing 'ark' user + home"
userdel -r ark 2>/dev/null || userdel ark
fi
# ────────────────────────────────────────────────
# 2. Valheim (vhserver) -- LGSM stack
# ────────────────────────────────────────────────
echo
echo "=== Valheim (vhserver) ==="
if id vhserver &>/dev/null; then
pkill -u vhserver 2>/dev/null || true
sleep 1
echo " Removing 'vhserver' user + home (incl. orphaned LGSM backups)"
userdel -r vhserver 2>/dev/null || userdel vhserver
fi
# ────────────────────────────────────────────────
# 3. Terraria -- empty home, never used
# ────────────────────────────────────────────────
echo
echo "=== Terraria ==="
if id Terraria &>/dev/null; then
pkill -u Terraria 2>/dev/null || true
echo " Removing 'Terraria' user + home"
userdel -r Terraria 2>/dev/null || userdel Terraria
fi
# ────────────────────────────────────────────────
# 4. systemd reload to forget the gone units
# ────────────────────────────────────────────────
echo
echo "=== systemctl daemon-reload ==="
systemctl daemon-reload
systemctl reset-failed 2>/dev/null || true
# ────────────────────────────────────────────────
# 5. journald -- cap to 500 MB
# ────────────────────────────────────────────────
echo
echo "=== journald ==="
echo " Trimming /var/log/journal to 500 MB"
journalctl --vacuum-size=500M
# ────────────────────────────────────────────────
# 6. snap -- only keep current + 1 prior revision
# ────────────────────────────────────────────────
echo
echo "=== snap retention ==="
echo " Setting refresh.retain=2 (snap will auto-clean older revs over time)"
snap set system refresh.retain=2
# Force-clean orphaned _old.snap files older than 30 days. Snap will redo
# this organically but we can prod it now to reclaim immediately.
echo " Forcing snap to drop disabled revisions"
for snap in $(snap list --all | awk '/disabled/{print $1, $3}'); do
if [[ "$snap" == "disabled" ]]; then continue; fi
done
# Easier path: ask snap directly.
LANG=C snap list --all | awk '/disabled/{print $1, $3}' | \
while read -r name rev; do
echo " snap remove --revision=$rev $name"
snap remove --revision="$rev" "$name" || true
done
# ────────────────────────────────────────────────
echo
echo "=== Post-cleanup disk ==="
df -h / | grep -v Filesystem
echo
echo "Done. Bitbucket, TeamViewer, and websites untouched."
+135
View File
@@ -0,0 +1,135 @@
{
"name": "Brass and Sigil",
"version": "0.6.1",
"minecraft": {
"version": "1.21.1"
},
"loader": {
"type": "neoforge",
"version": "21.1.228"
},
"files": [
{
"path": "mods/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",
"size": 19123767
},
{
"path": "mods/create-aeronautics-bundled-1.21.1-1.2.1.jar",
"url": "https://cdn.modrinth.com/data/oWaK0Q19/versions/YhZLrAFC/create-aeronautics-bundled-1.21.1-1.2.1.jar",
"sha1": "fdf1ae69e8b6437e0196b3a35dd2325aa904aba9",
"size": 33030286
},
{
"path": "mods/sable-neoforge-1.21.1-1.2.2.jar",
"url": "https://cdn.modrinth.com/data/T9PomCSv/versions/3FMsUjO4/sable-neoforge-1.21.1-1.2.2.jar",
"sha1": "c5ecd3fcf60a31d84112c708abe29e341b2d1b73",
"size": 12719293
},
{
"path": "mods/createbigcannons-5.11.3+mc.1.21.1.jar",
"url": "https://cdn.modrinth.com/data/GWp4jCJj/versions/bsGaXKEd/createbigcannons-5.11.3%2Bmc.1.21.1.jar",
"sha1": "8b61fa850e260bdeb5d360576123f98c260afa50",
"size": 3715787
},
{
"path": "mods/tfmg-1.2.0.jar",
"url": "https://cdn.modrinth.com/data/USgVjXsk/versions/uDi14nbt/tfmg-1.2.0.jar",
"sha1": "b520f3687f60a69eb265ff5b9a16759b9e124103",
"size": 4924243
},
{
"path": "mods/DistantHorizons-3.0.2-b-1.21.1-fabric-neoforge.jar",
"url": "https://cdn.modrinth.com/data/uCdwusMi/versions/KkaaQtTD/DistantHorizons-3.0.2-b-1.21.1-fabric-neoforge.jar",
"sha1": "1ff0a8920e52add541471f7b32d0d389997145ba",
"size": 30019727
},
{
"path": "mods/sodium-neoforge-0.6.13+mc1.21.1.jar",
"url": "https://cdn.modrinth.com/data/AANobbMI/versions/Pb3OXVqC/sodium-neoforge-0.6.13%2Bmc1.21.1.jar",
"sha1": "38af70fa4dc4b2aaac636e92fdba3bedd5a025e1",
"size": 1162994
},
{
"path": "mods/iris-neoforge-1.8.12+mc1.21.1.jar",
"url": "https://cdn.modrinth.com/data/YL57xq9U/versions/t3ruzodq/iris-neoforge-1.8.12%2Bmc1.21.1.jar",
"sha1": "a3e6355915c7d3b2bc392724795113e51d289378",
"size": 2438548
},
{
"path": "mods/modernfix-neoforge-5.27.4+mc1.21.1.jar",
"url": "https://cdn.modrinth.com/data/nmDcB62a/versions/6U8JVjdw/modernfix-neoforge-5.27.4%2Bmc1.21.1.jar",
"sha1": "2f39363f0d6d5a5ccc2a9e0f50ad3385611c3cb7",
"size": 562051
},
{
"path": "mods/ferritecore-7.0.3-neoforge.jar",
"url": "https://cdn.modrinth.com/data/uXXizFIs/versions/x7kQWVju/ferritecore-7.0.3-neoforge.jar",
"sha1": "9563692efb708b6b568df27a01ec52f6311928ef",
"size": 121559
},
{
"path": "mods/architectury-13.0.8-neoforge.jar",
"url": "https://cdn.modrinth.com/data/lhGA9TYQ/versions/ZxYGwlk0/architectury-13.0.8-neoforge.jar",
"sha1": "6ca11d3cc136bf69bb8f4d56982481eb85b5100b",
"size": 584004
},
{
"path": "mods/rhino-2101.2.7-build.81.jar",
"url": "https://cdn.modrinth.com/data/sk9knFPE/versions/ZdLtebKH/rhino-2101.2.7-build.81.jar",
"sha1": "480235a9f7749f68ce6fec3b9c3cac3428b92a4a",
"size": 882033
},
{
"path": "mods/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",
"size": 76369
},
{
"path": "mods/kubejs-neoforge-2101.7.2-build.363.jar",
"url": "https://cdn.modrinth.com/data/umyGl7zF/versions/Fe9CjPws/kubejs-neoforge-2101.7.2-build.363.jar",
"sha1": "d4e88254e8c26687d4c6aeb4dfa9c2ad70f260a2",
"size": 2270442
},
{
"path": "mods/jei-1.21.1-neoforge-19.27.0.340.jar",
"url": "https://cdn.modrinth.com/data/u6dRKJwZ/versions/YAcQ6elZ/jei-1.21.1-neoforge-19.27.0.340.jar",
"sha1": "27d0d85e7e32e926fc3664ab6815df5cdabb7941",
"size": 1529391
},
{
"path": "mods/Jade-1.21.1-NeoForge-15.10.5.jar",
"url": "https://cdn.modrinth.com/data/nvQzSEkH/versions/yd8FKCmx/Jade-1.21.1-NeoForge-15.10.5.jar",
"sha1": "d5bf134b3dbde9f5258666823900e21341dc0a50",
"size": 725742
},
{
"path": "mods/Chunky-NeoForge-1.4.23.jar",
"url": "https://cdn.modrinth.com/data/fALzjamp/versions/LuFhm4eU/Chunky-NeoForge-1.4.23.jar",
"sha1": "ab0c74743a653020fe2dfc4986b43e893947f3e9",
"size": 340572
},
{
"path": "mods/ftb-library-neoforge-2101.1.31.jar",
"url": "https://mediafilez.forgecdn.net/files/7746/959/ftb-library-neoforge-2101.1.31.jar",
"sha1": "686d4e784c28c14f7760cc22b2de6a8573b56b74",
"size": 1411181
},
{
"path": "mods/ftb-teams-neoforge-2101.1.9.jar",
"url": "https://mediafilez.forgecdn.net/files/7369/21/ftb-teams-neoforge-2101.1.9.jar",
"sha1": "328e04bf1a445870aacea8fe7637670f84272a8f",
"size": 291847
},
{
"path": "mods/ftb-chunks-neoforge-2101.1.14.jar",
"url": "https://mediafilez.forgecdn.net/files/7608/681/ftb-chunks-neoforge-2101.1.14.jar",
"sha1": "908b63b11d0e00ae6c9557d3fe6440bdbcf21bb7",
"size": 642340
}
],
"launcherVersion": "0.1.0",
"launcherUrl": "https://sijbers.uk/pack/BrassAndSigil-Launcher.exe"
}
+12
View File
@@ -0,0 +1,12 @@
{
"manifestUrl": "https://sijbers.uk/pack/manifest.json",
"serverDir": "./server",
"javaPath": "java",
"memoryMB": 8192,
"webPort": 8080,
"webHost": "localhost",
"webPassword": null,
"rconPort": 25575,
"rconPassword": "",
"acceptEula": false
}