mirror of
https://github.com/Regrave/content-installer.git
synced 2026-07-31 12:52:34 -04:00
Calagopus Panel extension for installing Minecraft plugins, mods, and datapacks from Modrinth
https://github.com/Regrave/content-installer
- TypeScript 54.6%
- Rust 42.3%
- CSS 3.1%
| .github | ||
| backend | ||
| frontend | ||
| .gitignore | ||
| client-only-mods.json | ||
| LICENSE | ||
| Metadata.toml | ||
| README.md | ||
Content Installer
A Calagopus Panel extension for browsing, installing, and managing Minecraft plugins, mods, datapacks, and modpacks directly from the panel.
Powered by Modrinth and CurseForge.
Features
Browse
- Search plugins, mods, and datapacks from Modrinth and CurseForge
- Card grid layout with project icons, descriptions, and download counts
- Results automatically filtered by server type (Paper, Fabric, Forge, NeoForge, etc.) and Minecraft version
- Sort by relevance, downloads, follows, newest, or recently updated
- Detail modal with full project description (rendered markdown/HTML), version selector, and one-click install
- Source toggle to switch between Modrinth and CurseForge
- Duplicate detection - warns when a mod is already installed and offers to update, removing the old version automatically
Modpacks
- Browse and install modpacks from both Modrinth and CurseForge
- Full Modrinth
.mrpackinstall support with automatic loader installation (Fabric, Forge, NeoForge, Quilt) - Full CurseForge modpack install support with
manifest.jsonparsing and per-file API resolution - Client-only mod filtering via filename patterns, Modrinth metadata lookup, and JAR metadata inspection
- Clean install option (wipes server files before installing)
- Real-time progress tracking with file-by-file status
Manage
- View all installed plugins/mods/datapacks with Modrinth identification via file hashing
- One-click update when newer compatible versions are available
- Remove installed content with confirmation dialog
Datapacks
- Full datapack support for all server types (including vanilla)
- World selector when multiple worlds exist
- Reads
level-namefromserver.propertiesto find the correct world directory
CurseForge Integration
- CurseForge API key stored securely in panel settings (never exposed to the browser)
- All CurseForge API calls proxied through the panel backend
- Admin configuration page at Extensions > Content Installer to manage the API key
- Handles mods that disable third-party downloads gracefully
Server Detection
Automatically detects your server type and Minecraft version using a deterministic decision tree:
Server type (checked in order, most specific first):
.mcvc-type.jsonmarker (from MC Version Chooser extension)purpur.yml> Purpurpufferfish.yml> Pufferfishleaves.yml> Leavesconfig/folia-global.yml> Foliaconfig/paper-global.yml> Paperspigot.yml> Spigotbukkit.yml> CraftBukkit.fabric/orfabric-server-launch.jar> Fabric.quilt/orquilt-server-launcher.jar> Quiltlibraries/net/neoforged/> NeoForgelibraries/net/minecraftforge/> Forgeserver.properties(nothing else matched) > Vanilla
Minecraft version (checked in order):
.mcvc-type.jsonmarker versionversion.jsonin server root (vanilla + Bukkit-chain)- Forge/NeoForge library folder name (version encoded in path)
logs/latest.log- greps for"Starting minecraft server version"
Content tabs shown based on detection:
- Vanilla > Datapacks only
- Plugin servers (Paper, Spigot, Purpur, etc.) > Plugins + Datapacks
- Mod servers (Fabric, Forge, NeoForge, Quilt) > Mods + Datapacks
- Hybrid servers (Mohist, Arclight) > Plugins + Mods + Datapacks
Architecture
├── Metadata.toml # Extension metadata
├── backend/
│ └── src/
│ ├── lib.rs # Route registration, install/remove/modpack handlers
│ ├── curseforge.rs # CurseForge API proxy endpoints
│ ├── settings.rs # Extension settings (CurseForge API key)
│ └── modpack.rs # Modpack types, progress tracking, client-only detection
├── frontend/
│ └── src/
│ ├── index.ts # Extension entry point + route registration
│ ├── detect.ts # Server type + MC version detection
│ ├── modrinth.ts # Modrinth API client
│ ├── curseforge.ts # CurseForge API client (calls backend proxy)
│ ├── AdminConfigPage.tsx # Admin settings page for CurseForge API key
│ ├── ContentInstallerPage.tsx # Main page with tab routing
│ ├── BrowseTab.tsx # Search + install from Modrinth/CurseForge
│ ├── ModpacksTab.tsx # Modpack browser + installer
│ ├── ManageTab.tsx # View + remove + update installed content
│ └── app.css # Styling
Backend API Routes
Server routes (/api/client/servers/{uuid}/content-installer/):
POST .../install- Download a file to plugins/, mods/, or datapacks/GET .../install/status- Check download progressPOST .../remove- Remove a filePOST .../modpack/install- Install a Modrinth modpack (.mrpack)POST .../modpack/cf-install- Install a CurseForge modpackGET .../modpack/status- Check modpack install progressGET .../curseforge/search- Proxy CurseForge searchGET .../curseforge/files- Proxy CurseForge file listingGET .../curseforge/description- Proxy CurseForge mod descriptionGET .../curseforge/status- Check if CurseForge is configured
Admin routes (/api/admin/content-installer/):
GET .../settings- Get extension settings (masked API key)PUT .../settings- Update extension settings
All server routes require files.create or files.delete permissions. Download URLs are validated against a whitelist of trusted CDN domains (Modrinth CDN, CurseForge CDN).
Installation
- Download the latest
.c7s.zipfrom Releases - Upload it via Admin > Extensions in your panel
- A "Content" tab will appear in each server's sidebar
- (Optional) Go to Admin > Extensions > Content Installer to configure CurseForge
License
MIT