A universal Minecraft datapack, resource pack and mod builder.
Pack-Packer allows developers to maintain a single source structure and automatically generate:
- Standalone datapacks
- Standalone resource packs
- Forge mods
- Fabric mods
- NeoForge mods
- GitHub Releases
It supports template variables, automatic metadata generation, custom datagen scripts, and multi-loader packaging.
| Output | Description |
|---|---|
| Datapack | Pure Minecraft datapack .zip |
| Resource Pack | Pure Minecraft resource pack .zip |
| Forge Mod | Jar containing datapack/resourcepack |
| Fabric Mod | Jar with generated fabric.mod.json |
| NeoForge Mod | Jar with generated metadata |
| GitHub Release | Automatic artifact publishing |
A Pack-Packer project uses the following layout:
.
├── pack.yml
├── src/
│ ├── data/
│ │ ├── pack.mcmeta
│ │ └── data/
│ │ └── <namespace>/
│ │
│ ├── assets/
│ │ ├── pack.mcmeta
│ │ └── assets/
│ │ └── <namespace>/
│ │
│ ├── common/
│ │ ├── icon.png
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── CHANGELOG.md
│ │
│ └── generated/
│
├── template/
│ ├── forge/
│ ├── fabric/
│ └── neoforge/
│
├── scripts/
│ └── datagen/
│ ├── recipes.js
│ └── tags.js
│
├── dist/
│
└── package.json
- Node.js 20+
- pnpm
Install dependencies:
pnpm installRun:
pnpm run buildGenerated files:
dist/
├── <id>-<version>-datapack.zip
├── <id>-<version>-resourcepack.zip
├── <id>-<version>-forge.jar
├── <id>-<version>-fabric.jar
└── <id>-<version>-neoforge.jar
Pack-Packer uses pack.yml.
Example:
id: better_ores
name: Better Ores
version: 1.0.0
description: |
A Minecraft datapack and resource pack
that improves ore generation.
license: MIT
authors:
- MangoJellyPudding
contributors:
- name: Alex
contact:
homepage: https://example.com
github: alex
minecraft:
version: 1.21.1
pack_format:
data: 48
assets: 34
loaders:
forge:
enabled: true
version: 51.0.0
fabric:
enabled: true
version: 0.16.0
neoforge:
enabled: true
version: 21.1.0
build:
datapack: auto
resourcepack: auto
standalone:
datapack: true
resourcepack: true
mod: true
datagen:
enabled: true
output: src/generated
release:
enabled: true
draft: false
prerelease: falseTemplates are stored in:
template/
├── forge/
├── fabric/
└── neoforge/
Files inside templates support variables:
Example:
fabric.mod.json
{
"id": "${mod_id}",
"version": "${version}",
"name": "${mod_name}"
}During build:
${mod_id}
will become:
"better_ores"Variables come from:
- Built-in variables
variablessection inpack.yml
Example:
variables:
display_url:
https://github.com/example/project
issue_tracker_url:
https://github.com/example/project/issuesUse:
{
"homepage": "${display_url}"
}fabric.mod.json requires valid JSON.
Pack-Packer automatically handles:
Input:
description: |
Line one
Line twoOutput:
{
"description":
"Line one\nLine two\n"
}Fabric supports:
[
"Author",
{
"name": "Developer",
"contact": {
"github": "user"
}
}
]Use:
authors:
- MangoJellyPudding
contributors:
- name: Alex
contact:
github: alexThe builder converts them automatically.
Datagen allows generating files through JavaScript.
Location:
scripts/datagen/
Example:
scripts/datagen/test.js
import { Datagen } from "../datagen.js";
Datagen.data(
"better_ores",
"recipe/test.json",
{
type: "minecraft:crafting_shaped"
}
);Generated:
src/generated/
└── data/
└── data/
└── better_ores/
└── recipe/
└── test.json
Automatically initialized by build.
Datagen.gen(
"path/file",
content
);Supports:
- JSON
- Text
- mcfunction
- TOML
- Properties
- Custom formats
Example:
Datagen.gen(
"data/example/functions/load.mcfunction",
"say hello"
);Datagen.data(
namespace,
file,
content
);Example:
Datagen.data(
"example",
"loot_table/test.json",
{}
);Output:
generated/data/data/example/loot_table/test.json
Datagen.assets(
namespace,
file,
content
);Example:
Datagen.assets(
"example",
"models/item/test.json",
{}
);Output:
generated/assets/assets/example/models/item/test.json
Instead of:
Datagen.data(
"example",
"recipe/test.json",
{}
);Use:
const example =
Datagen.namespace("example");
example.data(
"recipe/test.json",
{}
);Pack-Packer supports automatic releases.
Workflow:
commit
|
tag
|
GitHub Actions
|
build
|
release
Create release tag:
git add .
git commit -m "release: v1.0.0"
git tag -a v1.0.0 -m "Version 1.0.0"
git push origin main
git push origin v1.0.0GitHub Actions will create:
Release v1.0.0
Assets:
better_ores-1.0.0-datapack.zip
better_ores-1.0.0-resourcepack.zip
better_ores-1.0.0-forge.jar
better_ores-1.0.0-fabric.jar
better_ores-1.0.0-neoforge.jar
Using GitHub Template:
- Open the Pack-Packer repository
- Click:
Use this template
- Create a new repository
- Clone:
git clone <repository>- Edit:
pack.yml
- Add content:
src/data/
src/assets/
- Build:
npm run buildRecommended:
node_modules/
dist/
src/generated/
*.log
.DS_Store
.idea/
.vscode/
GNU General Public License v3.0