Skip to main content
Documentation
PalMods.gg
HomeDocsPackaging
Author specification · official-format ready

Package once.
Publish everywhere.

Build a Palworld package that Pocketpair’s uploader understands, PalMods can explain, and the desktop app can install safely. This is the complete contract—from your first Info.json to multi-loader and dedicated-server releases.

Pocketpair-nativeUses the official package vocabulary and uploader format.

Locally revalidatedThe desktop trusts the archive, not a stale database claim.

Backwards compatibleExisting game-root packages keep working unchanged.

01 · The decision

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.

Supported · PalMods classic

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
Always available

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
Nothing breaks on launch day.

We do not retroactively require Info.json. Old files keep their format and install path; only new official packages opt into the new contract.

02 · Package anatomy

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.

OFFICIAL PACKAGE TREE
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 target
1

Create the packageUse Palworld Mod Uploader’s “Create New Mod,” or reproduce the same folder structure by hand.

2

Place the payloadPut only files that belong to the mod under clear target folders such as Scripts, Paks, or PalSchema.

3

Declare the targetsEvery install target must exist. A rule is a recipe, not permission to point outside the package.

4

Zip the contentsInfo.json should be at the zip root. One wrapper folder is normalized with a warning, but root is the portable choice.

A manifest is not a security shortcut.

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.

03 · Manifest reference

Every Info.json field, in plain English.

JSON keys are case-sensitive in this guide. Keep the names generated by Pocketpair’s uploader.

FieldWhat to enterPalMods behavior
ModName

The human-readable title shown to players.

Suggested as the mod title; never used as a filesystem path.

PackageName

A stable ID using only A-Z, a-z, and 0-9.

Required. Used for destinations, dependency matching, and collision protection.

Thumbnail

A package-relative image path such as thumbnail.png.

The path is checked. Upload your PalMods icon separately so you can review the crop.

Version

Any non-empty release string. Change it for every update.

Fills the file version. Pocketpair compares versions as plain strings, not SemVer.

DebugMode

false for public releases.

true produces a warning because Pocketpair redeploys the mod on every launch.

MinRevision

The last five digits of the minimum supported game version title.

Stored for compatibility work; must be an integer from 0 to 99999.

Author

Your public author or team name.

Recorded with the package, but never used to claim or change PalMods ownership.

Dependencies

PackageName values required by this mod.

Stored and exposed to clients. Do not put display names or URLs here.

Tags

Pocketpair Workshop tags.

Recognized tags are offered as reviewable PalMods tag suggestions.

InstallRule

One or more Type + Targets recipes.

Required for auto-install. Every target is proven to exist and is rechecked locally.

PackageName must stay stable.

Changing it creates a different package identity. Two enabled mods with the same PackageName are ambiguous; Pocketpair only loads one, in an undefined order.

Version must change, not “increase.”

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.

04 · Installation contract

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.

TypeOfficial destinationUse it for
UE4SSMods/NativeMods/UE4SS

Native UE4SS payloads. Shared-path collisions are blocked.

LuaMods/NativeMods/UE4SS/Mods/{PackageName}

UE4SS Lua scripts and their package files.

PalSchemaMods/NativeMods/UE4SS/Mods/PalSchema/mods/{PackageName}

PalSchema data-edit packages.

LogicModsPal/Content/Paks/LogicMods

Blueprint or logic pak payloads.

PaksPal/Content/Paks/~WorkshopMods/{PackageName}

Asset replacement and ordinary pak payloads.

Client rule

Omit IsServer or set it to false. Steam and Game Pass installs select these rules.

Server rule

Set "IsServer": true. PalMods selects it only for a Windows dedicated server.

Multi-type rule set

Declare multiple rules when one release includes paks, Lua, PalSchema, or distinct client and server payloads.

Unknown future Types fail closed.

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.

05 · Copyable patterns

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.

Lua · client

The smallest complete manifest for a UE4SS Lua mod.

Info.json · Lua
{
  "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"]
    }
  ]
}
Multi-loader · client + server

Different rules may select different source folders for the same release.

Info.json · multi-rule
{
  "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"]
    }
  ]
}
Install Type

Paks

"Targets": ["./Paks"]Paks/MyMod.pak

Asset replacement or cooked data. Keep .pak, .ucas, .utoc, and .sig companions together.

Install Type

LogicMods

"Targets": ["./LogicMods"]LogicMods/MyLogicMod.pak

Blueprint logic packages. Declare UE4SS/BP dependencies where your project requires them.

Install Type

PalSchema

"Targets": ["./PalSchema"]PalSchema/MyChanges.json

Targeted schema data changes. Include PalSchema in Dependencies and Tags.

Install Type

UE4SS

"Targets": ["./Native"]Native/MyPlugin.dll

Advanced shared native payloads. Existing unmanaged and cross-mod files are never overwritten.

Targets may name a file or a folder.

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.

06 · Upload wizard

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.”

Official Info.json detectedREVIEW

Fast Work Pals

Version 1.2.0 · Lua · 1 client rule · UE4SS dependency

ModNameMod titleSuggested after you review it
VersionFile versionFilled immediately for that file
InstallRule.TypeLoader typesPrimary loader + full multi-loader metadata
IsServerServer compatibilityAdds Windows server support when declared
TagsKnown PalMods tagsOnly recognized taxonomy matches
PackageName / Dependencies / MinRevisionPackage metadataStored for install and compatibility checks
Fields we deliberately do not infer

Summary, description, category, client/server side, crossplay safety, permissions, NSFW status, save safety, ownership, and support promises still require an author’s judgment.

07 · Trust boundary

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.

01

Browser preview

Reads only the zip directory and small Info.json entry. Shows missing targets and safe autofill suggestions.

02

Server scan

Checks archive limits, malware status, portable paths, duplicate destinations, manifest fields, targets, Lua findings, and checksum.

03

API contract

Publishes normalized format, PackageName, version, rules, loaders, dependencies, and capability-gated one-click readiness.

04

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.
DebugMode belongs in development.

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.

08 · Backwards compatibility

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.

PALMODS GAME-ROOT V1
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.
Existing fileStays game-root v1

No rescan or repack is forced.

Next releaseYour choice

Keep the layout or adopt Info.json.

New modInfo.json preferred

Best official-tool compatibility.

Do not put Info.json into a game-root zip casually.

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.

09 · Dedicated servers

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.

CLIENT + SERVER RULES
"InstallRule": [
  {
    "Type": "Lua",
    "Targets": ["./Scripts"]
  },
  {
    "Type": "Lua",
    "IsServer": true,
    "Targets": ["./ServerScripts"]
  }
]
Steam / Game PassSelects client rules

Rules without IsServer true are eligible.

Dedicated WindowsSelects server rules

At least one IsServer true rule is required.

Dedicated LinuxOfficial format blocked

Use a supported legacy/manual package until Pocketpair adds support.

IsServer does not mean server-only.

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.

10 · Ship with confidence

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.

Build

Create a clean package

Remove editor output, backups, source secrets, crash dumps, and payloads not claimed by a rule.

Inspect

Open the final zip

Confirm Info.json is at root, casing is exact, every target exists, and companion files stayed together.

Install

Use a clean test game

Test client and server rules separately. Start with no stale copy of the previous release.

Remove

Test update and uninstall

Upgrade from the last public version, disable it, uninstall it, and verify unrelated mods remain untouched.

Release gate

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.
11 · Source of truth

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.

Your package has a contract now.

Let the wizard do the repetitive part.

Upload the final zip, review the Info.json suggestions, and keep the human decisions in your hands.