- Rust 99.7%
- Nix 0.3%
Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: I880c11195559fcfb9701e945a10fe87b6a6a6964 |
||
|---|---|---|
| docs | ||
| nix | ||
| src | ||
| tests | ||
| .envrc | ||
| .gitignore | ||
| .rustfmt.toml | ||
| .taplo.toml | ||
| build.rs | ||
| Cargo.lock | ||
| Cargo.toml | ||
| flake.lock | ||
| flake.nix | ||
Pakker
A fast, reliable multiplatform modpack manager for Minecraft, written in Rust.
Overview
Pakker is a command-line tool for managing Minecraft modpacks across multiple platforms including CurseForge, Modrinth, and GitHub. It provides a streamlined workflow for creating, maintaining, and distributing modpacks with support for automated dependency resolution, version management, and multi-platform exports.
Key Features
Multi-Platform Support
- CurseForge, Modrinth, and GitHub integration
- Unified project management across all platforms
- Platform-specific filtering and optimizations
- Automatic platform-specific manifest generation
Intelligent Project Management
- Dependency Resolution - Automatically resolve and manage project dependencies
- Version Management - Update strategies (latest, specific version, pinned)
- Project Inspection - Detailed project information with dependency trees
- Fuzzy Matching - Typo-tolerant project searches with suggestions
Flexible Export System
- Profile-Based Exports - Customize exports for different platforms and use cases
- Platform Filtering - Automatically exclude projects not available on target platform
- Override Management - Separate override directories for client/server configurations
- Non-Interactive Mode - Full CI/CD support with scriptable commands
Advanced Configuration
- Profile-Specific Settings - Override paths, filtering rules, and export behavior per profile
- Project-Level Customization - Per-project export settings, aliases, and properties
- Side Detection - Automatic client/server/both classification
- Redistributable Control - Manage non-redistributable mod inclusion per profile
Installation
From Source
git clone https://github.com/yourusername/pakker
cd pakker
cargo build --release
The binary will be available at target/release/pakker.
Prerequisites
- Rust 1.70 or later
- Git (for remote repository features)
Quick Start
Initialize a New Modpack
# Create a new modpack for Fabric 1.20.1
pakker init -m 1.20.1 -l fabric
# Or for Forge
pakker init -m 1.20.1 -l forge
Add Mods
# Interactive mode - search and select
pakker add sodium
# Non-interactive with platform specification
pakker add-prj --mr sodium --yes
# Add with specific properties
pakker add-prj --cf jei --side both --yes
Inspect Projects
# View project details
pakker inspect sodium
# Multiple projects with dependency trees
pakker inspect sodium lithium phosphor
# View all projects
pakker ls
Fetch Mod Files
# Download all mod files
pakker fetch
# Or use sync to update and fetch
pakker sync
Export Modpack
# Export for CurseForge
pakker export --profile curseforge
# Export for Modrinth
pakker export --profile modrinth
# Export server pack
pakker export --profile serverpack
Project Structure
my-modpack/
├── pakku.json # Modpack configuration
├── pakku-lock.json # Lockfile with resolved versions
├── mods/ # Downloaded mod files
├── overrides/ # Files to include in all exports
├── server-overrides/ # Server-specific files
└── client-overrides/ # Client-specific files
Configuration Example
Basic Configuration (pakku.json)
{
"name": "My Awesome Modpack",
"version": "1.0.0",
"description": "A performance-focused modpack",
"author": "YourName",
"overrides": ["overrides"],
"serverOverrides": ["server-overrides"],
"clientOverrides": ["client-overrides"]
}
With Export Profiles
{
"name": "Multi-Platform Pack",
"version": "1.0.0",
"overrides": ["overrides"],
"exportProfiles": {
"curseforge": {
"filterPlatform": "curseforge",
"includeNonRedistributable": false,
"overrides": ["overrides", "curseforge-specific"]
},
"modrinth": {
"filterPlatform": "modrinth",
"includeNonRedistributable": true
},
"serverpack": {
"includeClientOnly": false,
"serverOverrides": ["server-config"]
}
}
}
Common Workflows
Development Workflow
# Initialize project
pakker init -m 1.20.1 -l fabric
# Add core mods
pakker add-prj --mr fabric-api --yes
pakker add-prj --mr sodium --yes
pakker add-prj --mr lithium --yes
# Configure and test
pakker fetch
# ... test in game ...
# Add more mods
pakker add create
# Check status
pakker status
# Export for testing
pakker export --profile modrinth
CI/CD Pipeline
# Non-interactive project addition
pakker add-prj --mr fabric-api --yes --no-deps
pakker add-prj --cf jei --yes
# Update to latest versions
pakker update --yes
# Fetch all files
pakker fetch
# Export for all platforms
pakker export --profile curseforge -o dist/curseforge.zip
pakker export --profile modrinth -o dist/modrinth.mrpack
pakker export --profile serverpack -o dist/server.zip
Multi-Platform Release
# Add projects from multiple platforms
pakker add-prj --mr sodium --cf sodium --yes
pakker add-prj --mr lithium --cf lithium --yes
# Configure CurseForge export (no non-redistributable)
# Configure Modrinth export (allow all)
# (in pakku.json - see Export Profiles documentation)
# Export for both
pakker export --profile curseforge -o releases/curseforge-pack.zip
pakker export --profile modrinth -o releases/modrinth-pack.mrpack
Documentation
- Commands Reference - Complete command documentation
- Export Profiles - Profile configuration guide
- Migration Guide - Migrating from Pakku
- Examples - Configuration examples
Command Overview
| Command | Description |
|---|---|
init |
Initialize a new modpack project |
import |
Import an existing modpack |
add |
Add projects interactively |
add-prj |
Add projects non-interactively with explicit platforms |
rm |
Remove projects |
update |
Update projects to newer versions |
ls |
List all projects in modpack |
inspect |
View detailed project information |
fetch |
Download all project files |
sync |
Update and fetch in one command |
export |
Export modpack for distribution |
status |
Check for available updates |
set |
Modify project properties |
link |
Link related projects |
diff |
Show differences with remote |
credentials |
Manage API credentials |
cfg |
Configure modpack properties |
See COMMANDS.md for detailed usage.
Features in Detail
Dependency Resolution
Pakker automatically resolves and manages dependencies:
pakker add sodium
# Automatically adds fabric-api as a dependency
Dependencies are tracked in pakku-lock.json and can be inspected:
pakker inspect sodium
# Shows:
# Dependencies: fabric-api
Project Side Detection
Projects are automatically classified as client-only, server-only, or both:
- Client-only: Shaders, client performance mods, minimap mods
- Server-only: Server management mods, world generation mods
- Both: Most gameplay mods, APIs, libraries
Override this with:
pakker set sodium --side client
Version Management
Control how projects are updated:
# Pin to specific version
pakker set sodium --strategy specific --version 0.5.0
# Always use latest
pakker set lithium --strategy latest
# Manual updates only
pakker set fabric-api --strategy pinned
Export Profiles
Customize export behavior per platform:
- Override directories - Different overrides per export
- Platform filtering - Exclude unavailable mods
- Redistributable control - Manage non-redistributable content
- Client/server filtering - Remove client-only mods from server packs
See EXPORT_PROFILES.md for complete documentation.
Remote Repositories
Sync modpack configuration with Git repositories:
# Add remote
pakker remote add origin https://github.com/user/modpack.git
# Pull updates
pakker remote-update
# Configuration is automatically synced
Credentials Management
Store platform API credentials securely:
# Set credentials
pakker credentials set --curseforge YOUR_CF_KEY
pakker credentials set --modrinth YOUR_MR_TOKEN
# Credentials are used automatically for:
# - Private mods
# - Rate limit increases
# - Authenticated downloads
Platform Compatibility
CurseForge
- Full project search and metadata
- Automatic manifest generation
- Non-redistributable mod detection
- Curse modpack import support
Modrinth
- Complete Modrinth API integration
- .mrpack format import/export
- Environment metadata support
- Full modpack search
GitHub
- GitHub Releases integration
- Direct JAR downloads
- Version tag support
Advanced Usage
Fuzzy Project Search
Don't remember exact names? Pakker helps:
pakker add sodum
# Suggested: Did you mean "sodium"?
Batch Operations
Add multiple projects efficiently:
pakker add-prj --mr sodium --yes
pakker add-prj --mr lithium --yes
pakker add-prj --mr phosphor --yes
Or use a script:
#!/bin/bash
mods=("sodium" "lithium" "phosphor" "iris")
for mod in "${mods[@]}"; do
pakker add-prj --mr "$mod" --yes
done
Inspect Dependency Trees
Visualize complex dependency relationships:
pakker inspect create
# Shows:
# create v0.5.1
# ├── flywheel v0.6.10
# │ └── forge-api v1.20.1
# └── registrate v1.3.3
Custom Export Profiles
Create specialized export configurations:
{
"exportProfiles": {
"production": {
"filterPlatform": "curseforge",
"includeNonRedistributable": false,
"overrides": ["overrides", "prod-config"]
},
"development": {
"includeNonRedistributable": true,
"overrides": ["overrides", "dev-config"]
},
"client": {
"includeClientOnly": true,
"overrides": ["overrides", "client-extras"]
}
}
}
Acknowledgments
Pakker is inspired by Pakku, bringing similar functionality with improved performance and additional features through Rust implementation.