Skip to content

Quickstart

How to create a pack from scratch

Basic Concepts

Voodoo Packs are recipes for Voodoo to figure out all mods and dependencies

this creates lockpacks, where voodoo pinned all versions and copied input files intoa archine

voodoo packages using the lockpacks as inputs, providing reproducable deployments

Downloading Voodoo

grab yourself a voodoo jar from the releases

# verify voodoo version
java -jar voodoo.jar --version

# initiates project working directory (sets up wrapper scripts and gitignore)
java -jar voodoo.jar init project

# optional
# setup bash autocomplete
_VOODOO_COMPLETE=bash ./voodoo > voodoo-autocomplete.sh
source voodoo-autocomplete.sh

Setup Modpack Repository

run the generateSchema command once to make it generate a config.json and ./schema/

./voodoo generateSchema

now you should see config.json5 which might contain some useful defaults

/config.json5

{
  "$schema": "./schema/config.schema.json",
  "curseforgeGenerators": {},
  "forgeGenerators": {},
  "fabricGenerators": {},
  "overrides": {}
}

Autocompletion Configuration

we are interested in fabric and fabric mods on curseforge so we see there is already a section that filters curseforge mods by section and a entry that generated the fabric modloader versions

/config.json5

{
  "$schema": "./schema/config.schema.json",
  "curseforgeGenerators": {
    "Fabric": {
      "section": "MODS",
      "categories": [
        "Fabric"
      ]
    }
  },
  "fabricGenerators": {
    "Fabric": {
      "requireStable": true
    }
  },
  "overrides": {
    "side_client": {
      "type": "common",
      "side": "CLIENT"
    },
    "side_server": {
      "type": "common",
      "side": "SERVER"
    },
  }
}

after running generateSchema again these will be available via json-schema for autocompletions

Create a Modpack

we are going to create modpack with the id magicpack for Minecraft version 1.16.3 (but this is just for the first version of the pack)

voodoo init pack --id magicpack --mcVersion 1.16.3

you should now see a new folder magicpack/ containing several files

/magicpack/modpack.meta.json contains general pack information as well as where you will upload your modpack (fileserver or similar)

/magicpack/v0.0.1.voodoo.json contains specific info about one version as well as the modlist
the filename does not matter as long as the extension matches .voodoo.json

magicpack/v0.0.1_src/ is the folder for all configuration file and related things, this is going to be minecraft/ folder
the version specific .voodoo.json contains a reference to the folder name, try to keep them separate when maintaining multiple versions

Set Modloader

by default the modloader is set to None

/magicpack/v0.0.1.voodoo.json5
{
  "$schema": "../schema/versionPack.schema.json",
  "version": "0.0.1",
  "mcVersion": "1.16.3",
  "srcDir": "v0.0.1_src",
  "modloader": {
      "type": "modloader.none"
  },
  "mods": {}
}

lets replace with with fabric

/magicpack/v0.0.1.voodoo.json5

{
  "$schema": "../schema/versionPack.schema.json",
  "version": "0.0.1",
  "mcVersion": "1.16.3",
  "srcDir": "v0.0.1_src",
  "modloader": {
      "type": "modloader.fabric",
      "intermediateMappings": "Fabric/1.16.3"
  },
  "mods": {}
}

Fabric/1.16.3 is from the fabricGenerator that was named Fabric this field has json-schema enum constraint, so autocompletion should be available after running generateSchema

Add Mods

currently the modlist is empty so lets add some

there is multiple entry types that you can

Curseforge mods downloads from curse CDN and also resolves dependencies

Direct downloads of URLs can be rehosted or pointing to the original location

This is for mods built on Jenkins CI

Takes files from /local/ folder

No-operation Useful for replacing dependencies

since we setup mods from curseforge with the name Fabric before, we can use them
so lets add some mods

/magicpack/v0.0.1.voodoo.json5
{
  "$schema": "../schema/versionPack.schema.json",
  "version": "0.0.1",
  "mcVersion": "1.16.3",
  "srcDir": "v0.0.1_src",
  "modloader": {
      "type": "modloader.fabric",
      "intermediateMappings": "Fabric/1.16.3"
  },
  "mods": {
    "": [
      {
        "type": "curse"
        "curse_projectName": "Fabric/campanion"
      }  
    ],
    "side_client": [
      {
        "type": "curse",
        "curse_projectName": "Fabric/appleskin"
      },
      {
        "type": "curse",
        "curse_projectName": "Fabric/hwyla"
      }
    ],
}

//TODO: add sections about overrides and properties of entries

Compiling the pack

compiling the pack does resolve all dependencies of entries and pins versions

voodoo compile magicpack/v0.0.1.voodoo.json5

this created /magicpack/lock/ folder containing the output artifacts DO NOT DELETE this folder unless you know what you are doing this folder contains the inputs for all tasks (except compile)

Testing in MultiMC

before deploying the pack, lets make sure it runs first

before this make sure multimc is in your PATH

voodoo launch multimc magicpack/v0.0.1.voodoo.json5

Packaging and Upload

voodoo package magicpack/modpack/meta.json5 voodoo mmc-voodoo server

this created /_upload/voodoo/, /_upload/multimc-voodoo and /_upload/server/

upload selfupdating pack

upload the content of /_upload/voodoo/ to $uploadBaseUrl (configured in /magicpack/modpack.meta.json)

make sure to NOT DELETE existing files on the fileserver

example with "uploadBaseUrl": "https://mydomain.com/mc/"
/_upload/voodoo/magicpack.json should be accessible from https://mydomain.com/mc/magicpack.json

/_upload/multimc-voodoo contains multimc instances that selfupdate

Deploy server

upload /_upload/server/magicpack_v0.0.1/ to your server and run the server-installer.jar on the server to download mods and modloader installer directly

make sure to not update a running server (so either stop it or install into a new directory and then transfer worlds and configs)

assuming your server runs in the folder /home/user/server/magicpack on your server and you want to use /home/user/_upload/ as a temporary upload directory

upload to server

rsync _upload/server/magicpack_v0.0.1/ user@minecraftserver:/home/user/_upload
run on server
cd /home/user/_upload/magicpack_v0.0.1/

# doanlods mods, modloader and installs them in the server
java -jar server-installer.jar /home/user/server/magicpack

# delete the installer
cd ..
rm -rf magicpack_v0.0.1/