Use Info.json for new auto-install packages.
PalMods now understands two safe package contracts. The official Pocketpair contract is the recommended route for new releases; the original PalMods game-root contract remains supported for every existing mod.
Pocketpair package
A package-root Info.json declares identity, version, dependencies, tags, and one or more install rules.
- Works with Pocketpair’s uploader
- Fills safe wizard fields
- Supports client + server targets
- Supports multiple install types
Game-root archive
The zip mirrors a Palworld install and starts with Pal/, Engine/, or Mods/.
- No migration required
- Same scanner and installer behavior
- One declared loader per file
- Useful for existing releases
Manual download
Tools, configs, frameworks, and unusual archives can remain manual. They receive malware scanning but do not claim a one-click destination.
- No structural contract
- Clear instructions required
- Never silently auto-installed
- Best for standalone utilities
We do not retroactively require Info.json. Old files keep their format and install path; only new official packages opt into the new contract.
Put Info.json at the package root.
Start with Pocketpair’s Mod Uploader whenever possible. It creates the manifest, thumbnail placeholder, and standard target folders for Lua, Paks, LogicMods, and PalSchema.
FastWorkPals/
|-- Info.json <- required, exactly this name
|-- thumbnail.png <- optional preview
|-- Scripts/ <- target declared by Info.json
| |-- main.lua
|-- README.md <- optional, not installed
|-- .workshop.json <- uploader metadata; not an install targetCreate the packageUse Palworld Mod Uploader’s “Create New Mod,” or reproduce the same folder structure by hand.
Place the payloadPut only files that belong to the mod under clear target folders such as Scripts, Paks, or PalSchema.
Declare the targetsEvery install target must exist. A rule is a recipe, not permission to point outside the package.
Zip the contentsInfo.json should be at the zip root. One wrapper folder is normalized with a warning, but root is the portable choice.
PalMods verifies safe paths, duplicate destinations, the selected client/server side, and every target before the file can become auto-installable. The desktop repeats those checks before writing to the game.
Every Info.json field, in plain English.
JSON keys are case-sensitive in this guide. Keep the names generated by Pocketpair’s uploader.
ModNameThe human-readable title shown to players.
Suggested as the mod title; never used as a filesystem path.
PackageNameA stable ID using only A-Z, a-z, and 0-9.
Required. Used for destinations, dependency matching, and collision protection.
ThumbnailA package-relative image path such as thumbnail.png.
The path is checked. Upload your PalMods icon separately so you can review the crop.
VersionAny non-empty release string. Change it for every update.
Fills the file version. Pocketpair compares versions as plain strings, not SemVer.
DebugModefalse for public releases.
true produces a warning because Pocketpair redeploys the mod on every launch.
MinRevisionThe last five digits of the minimum supported game version title.
Stored for compatibility work; must be an integer from 0 to 99999.
AuthorYour public author or team name.
Recorded with the package, but never used to claim or change PalMods ownership.
DependenciesPackageName values required by this mod.
Stored and exposed to clients. Do not put display names or URLs here.
TagsPocketpair Workshop tags.
Recognized tags are offered as reviewable PalMods tag suggestions.
InstallRuleOne or more Type + Targets recipes.
Required for auto-install. Every target is proven to exist and is rechecked locally.
Changing it creates a different package identity. Two enabled mods with the same PackageName are ambiguous; Pocketpair only loads one, in an undefined order.
The official loader compares the old and new values as strings. It only needs a different value, though a readable release scheme is much easier for users.
InstallRule says what to copy and where it belongs.
Targets are paths inside your package. Type selects one known Pocketpair destination. Authors cannot provide arbitrary destination paths.
Mods/NativeMods/UE4SSNative UE4SS payloads. Shared-path collisions are blocked.
Mods/NativeMods/UE4SS/Mods/{PackageName}UE4SS Lua scripts and their package files.
Mods/NativeMods/UE4SS/Mods/PalSchema/mods/{PackageName}PalSchema data-edit packages.
Pal/Content/Paks/LogicModsBlueprint or logic pak payloads.
Pal/Content/Paks/~WorkshopMods/{PackageName}Asset replacement and ordinary pak payloads.
Omit IsServer or set it to false. Steam and Game Pass installs select these rules.
Set "IsServer": true. PalMods selects it only for a Windows dedicated server.
Declare multiple rules when one release includes paks, Lua, PalSchema, or distinct client and server payloads.
Pocketpair may extend the format. PalMods stores what it can read, but a package with an unsupported Type stays manual until the scanner and desktop understand its destination. It will never partially install only the rules it recognizes.
Start from a complete, valid example.
These examples use the exact field and target names expected by the official uploader. Replace the names, revision, dependencies, and payloads with your own.
The smallest complete manifest for a UE4SS Lua mod.
{
"ModName": "Fast Work Pals",
"PackageName": "FastWorkPals",
"Thumbnail": "thumbnail.png",
"Version": "1.2.0",
"DebugMode": false,
"MinRevision": 82182,
"Author": "YourName",
"Dependencies": ["UE4SS"],
"Tags": ["UE4SS", "Gameplay"],
"InstallRule": [
{
"Type": "Lua",
"Targets": ["./Scripts"]
}
]
}Different rules may select different source folders for the same release.
{
"ModName": "Island Systems Overhaul",
"PackageName": "IslandSystemsOverhaul",
"Thumbnail": "thumbnail.png",
"Version": "2.0.0",
"DebugMode": false,
"MinRevision": 82182,
"Author": "YourName",
"Dependencies": ["UE4SS", "PalSchema"],
"Tags": ["UE4SS", "PalSchema", "Gameplay"],
"InstallRule": [
{ "Type": "Paks", "Targets": ["./Paks"] },
{ "Type": "Lua", "Targets": ["./Scripts"] },
{ "Type": "PalSchema", "Targets": ["./PalSchema"] },
{
"Type": "Lua",
"IsServer": true,
"Targets": ["./ServerScripts"]
}
]
}Paks
"Targets": ["./Paks"]Paks/MyMod.pakAsset replacement or cooked data. Keep .pak, .ucas, .utoc, and .sig companions together.
LogicMods
"Targets": ["./LogicMods"]LogicMods/MyLogicMod.pakBlueprint logic packages. Declare UE4SS/BP dependencies where your project requires them.
PalSchema
"Targets": ["./PalSchema"]PalSchema/MyChanges.jsonTargeted schema data changes. Include PalSchema in Dependencies and Tags.
UE4SS
"Targets": ["./Native"]Native/MyPlugin.dllAdvanced shared native payloads. Existing unmanaged and cross-mod files are never overwritten.
A folder target claims every file below that folder. Keep targets narrow so readers, scanners, and future maintainers can see exactly what each rule owns.
PalMods fills facts—not guesses.
When the browser finds a readable Info.json, it shows a package review card. Nothing overwrites your form until you choose “Apply package fields.”
Fast Work Pals
Version 1.2.0 · Lua · 1 client rule · UE4SS dependency
ModNameMod titleSuggested after you review itVersionFile versionFilled immediately for that fileInstallRule.TypeLoader typesPrimary loader + full multi-loader metadataIsServerServer compatibilityAdds Windows server support when declaredTagsKnown PalMods tagsOnly recognized taxonomy matchesPackageName / Dependencies / MinRevisionPackage metadataStored for install and compatibility checksSummary, description, category, client/server side, crossplay safety, permissions, NSFW status, save safety, ownership, and support promises still require an author’s judgment.
Passing Info.json is only the beginning.
The browser gives fast feedback. The server is authoritative. The desktop verifies the downloaded bytes one final time before installation.
Browser preview
Reads only the zip directory and small Info.json entry. Shows missing targets and safe autofill suggestions.
Server scan
Checks archive limits, malware status, portable paths, duplicate destinations, manifest fields, targets, Lua findings, and checksum.
API contract
Publishes normalized format, PackageName, version, rules, loaders, dependencies, and capability-gated one-click readiness.
Desktop verification
Downloads by checksum, reparses Info.json, selects the correct side, checks ownership/collisions, then tracks every written file.
- Info.json is readable JSON and contains an object.
- PackageName is non-empty and strictly alphanumeric.
- At least one recognized InstallRule has at least one Target.
- Every selected Target exists inside the package.
- No absolute path, parent traversal, drive path, ADS, or reserved Windows name.
- Case-insensitive duplicate archive and destination paths are rejected.
- Client and server rules are selected separately.
- A PackageName collision with another managed mod is blocked.
- Existing unmanaged files are never overwritten.
- Unknown Types and Linux official-server installs fail closed.
Pocketpair’s uploader disables DebugMode during publishing. PalMods warns when it remains true because the official loader reinstalls the package on every launch, even when Version has not changed.
Your current PalMods packages remain valid.
The original format mirrors the Palworld game root. Keep using it for existing files; move a future release to Info.json when the official format gives you a reason to.
MyMod.zip
|-- Pal/
| |-- Content/
| |-- Paks/
| |-- ~mods/
| |-- MyMod/
| |-- MyMod.pak
| |-- MyMod.ucas
| |-- MyMod.utoc
|-- postinstall.md (optional)Legacy contract rules
- The zip starts at Pal/, Engine/, or Mods/—not MyMod/Pal/.
- Payload files stay inside the isolated path for the declared loader.
- Root README, LICENSE, CHANGELOG, and postinstall.md are allowed but not installed.
- postinstall.md is shown after install and may be at most 64 KiB.
- Steam Win64 UE4SS paths may be safely rebased for supported historical targets.
No rescan or repack is forced.
Keep the layout or adopt Info.json.
Best official-tool compatibility.
Its presence selects the official package contract. Once Info.json exists, its rules must accurately claim the package payload; the archive is no longer judged only by the old top-level Pal/Engine/Mods layout.
Server support must be explicit.
Add a separate rule with IsServer true. It may reuse the client target or point to a server-specific folder. The current official server loader supports Windows dedicated servers only.
"InstallRule": [
{
"Type": "Lua",
"Targets": ["./Scripts"]
},
{
"Type": "Lua",
"IsServer": true,
"Targets": ["./ServerScripts"]
}
]Rules without IsServer true are eligible.
At least one IsServer true rule is required.
Use a supported legacy/manual package until Pocketpair adds support.
A package can contain both client and server rules. In the PalMods listing, review the broader “side” field yourself so users know whether clients, the server, or both must install it.
Test the package, not just the project.
A working development folder can still become a broken release zip. Test the exact archive users will receive.
Create a clean package
Remove editor output, backups, source secrets, crash dumps, and payloads not claimed by a rule.
Open the final zip
Confirm Info.json is at root, casing is exact, every target exists, and companion files stayed together.
Use a clean test game
Test client and server rules separately. Start with no stale copy of the previous release.
Test update and uninstall
Upgrade from the last public version, disable it, uninstall it, and verify unrelated mods remain untouched.
Before every upload
One missed line here causes most packaging failures.
- PackageName is stable and unique among your enabled packages.
- Version differs from the previous release.
- DebugMode is false.
- MinRevision matches the oldest game build you actually tested.
- Dependencies use exact PackageName values.
- Client and Windows-server rules were tested independently.
- The final zip passes PalMods preview with no blocking errors.
- Description documents install side, dependencies, save risk, update, and removal.
Built from Pocketpair’s current specification.
The official format is new and can change. These are the primary documents behind this guide and the validator.