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:
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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 & 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 & 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 — message Matt with your Minecraft username.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="bevel section">
|
||||
<h2>About the project</h2>
|
||||
<p>
|
||||
Brass & 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 — 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 — 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 (< 50)</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bevel section">
|
||||
<h2>Privacy & 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 — 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 & Sigil Launcher — a private project by <a href="/matt">Matt Sijbers</a>.
|
||||
</footer>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -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
|
||||
@@ -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."
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user