Making a package
A package is a .zip with three files at its root, plus your mod files:
MyMod.zip
├── manifest.json
├── icon.png (256×256 PNG)
├── README.md
└── plugins/
└── MyMod.dllmanifest.json
{
"name": "MyMod",
"version": "1.0.0",
"description": "What it does, in one line (max 250 chars)",
"website": "https://github.com/you/MyMod",
"dependencies": [
"[email protected]"
]
}- name: letters, numbers and underscores. Your mod's ID becomes
YourTeam-MyMod. - version:
major.minor.patch. Every upload must be higher than the last. - dependencies: other packages on the same game, as
Team-Name@version. That version or newer is installed.
Where files go
For BepInEx games, Hefty puts your files in BepInEx/plugins/YourTeam-MyMod/. If the zip has top-level plugins/, patchers/, config/ or core/ folders (optionally inside a BepInEx/ folder) they are mapped to the matching BepInEx folders. A package whose zip contains winhttp.dll (like a BepInEx pack) is treated as the mod loader.
Unreal Engine games
Zip your mod as usual. Hefty sorts the files by type:
.pak,.utoc,.ucasand.sigfiles go toContent/Paks/~mods/YourTeam-MyMod/. Put them in aLogicMods/folder in your zip for Blueprint mods, and they go toContent/Paks/LogicMods/.- UE4SS script mods (a folder with
Scripts/main.luaordlls/main.dll) go toBinaries/Win64/Mods/<ModName>/and get anenabled.txt. Hefty installs UE4SS for the player automatically the first time a script mod is added.
Because Unreal can't load mods from another folder, Hefty copies the active profile into the game when you press Play modded, and removes it again for Play vanilla.
Drop-in games
For other games an admin sets an install folder (for example Mods). Everything in your zip, except the manifest, icon and README, is copied there keeping its folders.
Modpacks
A modpack is a normal package with no mod files, just a manifest listing every mod as a dependency. Tick the Modpacks category when uploading. You can ship default configs by adding a config/ folder.
Uploading from a script
Create an API token on your account page, then:
curl -H "Authorization: Bearer gm_xxx" \ -F game=lethal-company -F team=YourTeam \ -F categories=tools -F [email protected] \ http://localhost:3000/api/v1/packages
API
GET /api/v1/games: supported gamesGET /api/v1/games/{game}/packages: every package and version for a gameGET /api/v1/packages/{game}/{team}/{name}: one packageGET /api/v1/packages/{game}/{team}/{name}/{version}/download: the zipPOST /api/v1/packages: upload (multipart)POST /api/v1/profilesandGET /api/v1/profiles/{code}: profile share codes