From 795c2af50bb3f1be4ebfd6af5f5aad143dc08958 Mon Sep 17 00:00:00 2001 From: Aryan Singh Date: Fri, 10 Jul 2026 12:26:33 -0500 Subject: [PATCH] Allow beta-typed Modrinth builds for EasyAuth (easyauth:beta) EasyAuth publishes its 26.x builds as beta on Modrinth, and the itzg resolver only accepts release-typed versions by default, so the mc container failed to start. Pin easyauth:beta in the default mod list and teach the panel's mod manager to compare entries by base slug so version qualifiers don't break protected/duplicate checks. Co-Authored-By: Claude Fable 5 --- .env.example | 4 +++- dashboard/src/app/(panel)/mods/page.tsx | 12 ++++++++---- dashboard/src/server/modrinth.ts | 14 +++++++++++--- docker-compose.yml | 6 ++++-- docs/mods-and-modpacks.md | 6 +++++- docs/troubleshooting.md | 1 + 6 files changed, 32 insertions(+), 11 deletions(-) diff --git a/.env.example b/.env.example index 6ed8b47..cb6ad2e 100644 --- a/.env.example +++ b/.env.example @@ -24,7 +24,9 @@ MC_SEED= # Server-side mods (Modrinth project slugs, comma-separated). # Auto-resolved to the newest compatible release on every container start. -MODRINTH_PROJECTS=fabric-api,easyauth,spark,lithium,ferrite-core +# Append ":beta" to allow beta-typed builds for a project (EasyAuth ships +# its 26.x builds as beta on Modrinth). +MODRINTH_PROJECTS=fabric-api,easyauth:beta,spark,lithium,ferrite-core # To run a full modpack instead, set its Modrinth slug (e.g. adrenaline) # and see docs/mods-and-modpacks.md before enabling. MODRINTH_MODPACK= diff --git a/dashboard/src/app/(panel)/mods/page.tsx b/dashboard/src/app/(panel)/mods/page.tsx index 63eda78..1a3b60d 100644 --- a/dashboard/src/app/(panel)/mods/page.tsx +++ b/dashboard/src/app/(panel)/mods/page.tsx @@ -31,6 +31,10 @@ type SearchHit = { const PROTECTED = new Set(["fabric-api", "easyauth"]); +// Managed entries may carry a version qualifier ("easyauth:beta") — compare +// by the base slug. +const baseSlug = (entry: string) => entry.split(":")[0].toLowerCase(); + export default function ModsPage() { const { data, refresh } = useApi("/api/mods", 0); const [query, setQuery] = useState(""); @@ -82,7 +86,7 @@ export default function ModsPage() { } }; - const managedSet = new Set((data?.managed ?? []).map((s) => s.toLowerCase())); + const managedSet = new Set((data?.managed ?? []).map(baseSlug)); return (
@@ -121,7 +125,7 @@ export default function ModsPage() { )} {hits?.length === 0 &&

No compatible mods found.

} {hits?.map((h) => { - const already = managedSet.has(h.slug.toLowerCase()); + const already = managedSet.has(baseSlug(h.slug)); return (
{h.icon_url ? ( @@ -166,13 +170,13 @@ export default function ModsPage() { {(data?.managed ?? []).map((slug) => (
  • {slug} - {PROTECTED.has(slug.toLowerCase()) && ( + {PROTECTED.has(baseSlug(slug)) && ( required )} - {!PROTECTED.has(slug.toLowerCase()) && ( + {!PROTECTED.has(baseSlug(slug)) && (