Install Palworld mods, turn them on and off, and find out why one isn't working.
Most mod managers can put files in a folder. The hard part with Palworld is that
there are four folders a mod can belong in, nothing tells you when a mod is in
the wrong one, and a mod that fails to load fails silently. This reads the
contents of every .pak, cross-references what UE4SS actually loaded last run,
and says which of those two things went wrong.
Windows, no install, no dependencies. Download the zip from
Releases, extract it
into your Palworld folder (the one with Palworld.exe) or anywhere else, and run
EZPalModManager.exe.
The exe isn't code-signed, so Windows SmartScreen may say it's from an unknown publisher (click More info, then Run anyway). Each release lists the zip's SHA-256 so you can check your download, and you can build the exe yourself from this source instead; see Building from source below.
Finds your game. Every Steam library, Xbox Game Pass, dedicated servers, and
the usual loose locations. If it guesses wrong, pick from the list or browse. Browsing to Win64, Paks, or the Steam
library root resolves to the right place anyway. Several installs (say, the game and a server) can be switched
between from … → Switch install.
Knows whether UE4SS is there, and installs it. Missing, broken (UE4SS.dll
without its dwmapi.dll proxy), two copies fighting, the old flat 3.0.1
layout, or a missing MemberVariableLayout.ini. Each of those gets a banner
saying what it means. Where the answer is "you need the Palworld build of UE4SS",
Install UE4SS fetches it from Okaetsu's own GitHub releases and puts it in
place, keeping whatever was there as ue4ss.pmm-old-<date>. Your mods carry
over to the new one with their settings and stay on or off as they were.
Install PalSchema does the same for PalSchema. Both windows show the release, file
name, size and source before anything is downloaded, and nothing is fetched
until you press the button. This is the only part of the app that uses the
network; see Privacy and security below. Pak mods are still managed without UE4SS; they don't need it.
Works with the Steam Workshop. Since v0.7, Palworld installs mods from the
Steam Workshop itself. Those get their own Steam Workshop mods group, with
each mod's own name, picture and Workshop page. Their switches are the game's
own: the app changes Mods\PalModSettings.ini the same way Options →
Mod Management does, by the mod's ActiveModList line, and only while
Palworld is closed (it keeps its own copy of that list while it runs). The
game's copies of Workshop mods, in Mods\NativeMods and the paks folders, are
never moved, renamed or deleted by the app: installs leave them out, Clean up
never lists them, and removing a Workshop mod means unsubscribing on Steam.
Otherwise they're checked like any other mod: whether they started, the mods
they depend on, file conflicts with your other paks, hotkeys, and game updates.
UE4SS from the Workshop is recognised as such. A game whose only UE4SS is the Workshop's isn't told UE4SS is missing, and Install UE4SS won't put a second copy beside it. If UE4SS is set up both by hand and from the Workshop, the app says so, because Palworld loads both, which can load mods twice or crash the game; it explains how to keep one. A dedicated server, which has no Mod Management menu, gets a banner when its settings name Workshop mods without saying which folder they're in, and Choose folder… sets it.
Installs mods. Point it at a .zip, .7z, .rar, a folder, or a bare
.pak. It reads what's inside, works out where each piece goes, and shows you
that before writing anything:
PalHarvest-5233-2-1-0.zip 3 items, 4 files · Nexus mod 5233, v2.1.0
☑ PalHarvest UE4SS mod → Pal\Binaries\Win64\ue4ss\Mods\PalHarvest
☑ PalHarvestBP_P blueprint pak → Pal\Content\Paks\LogicMods
☑ PalHarvestIcons_P content pak → Pal\Content\Paks\~mods
One archive often holds several mods; each one can be left out. Existing files
are backed up as .pmm-bak rather than overwritten. You can pick several
downloads at once, or drop them onto the .exe; they open one after another.
Links back to where you got it. The install window has an optional Mod page field. Nexus downloads fill it in themselves, since their file names carry the mod ID. For a CurseForge zip, copy the page address from your browser and press Paste link; if a Nexus or CurseForge address is already on your clipboard, the window points that out. When you update a mod from a newer zip, the link you added last time is kept. The link is stored locally, and the app never visits the page.
Remembers where mods came from. Each mod's row shows where it came from, and clicking that opens its page. Nexus downloads fill themselves in, because their filenames encode the mod id, version and release date. The only mods you ever type details for are the ones you got some other way.
Shows what each mod is. Click a mod's name to open its info: a picture gallery, a description, and where it came from. Mods with a picture get a thumbnail in the list, and search looks inside descriptions too.
The app never downloads anything from Nexus or CurseForge. Both sites' terms forbid tools that read their pages (Nexus terms §11, Overwolf/CurseForge §3), so the information arrives the way you'd move it yourself:
- From the mod page. Open mod page, copy the description, press Paste text. Right-click a picture, choose Copy image, press Paste image (or Ctrl+V anywhere in the window).
- From the download. A README or pictures packed in the archive become the description and gallery automatically when you install.
- From your own files. Add pictures… takes PNG, JPEG, WebP, GIF or BMP. Pictures are stored rotated upright and at most 1920 px, so the store stays small.
- From the mod's folder. A README or
preview.pngalready in the folder is offered with one click.
Pasting a mod's page address fills in the source and mod ID from the link itself; the page isn't opened.
For your own mods, what you write and add here goes into Package for
sharing: the description as DESCRIPTION.md and the pictures under
images/, with the cover as preview, ready to upload. When someone installs
that package with this app, they get the same description and pictures.
Keeps your settings when a mod updates. Install a newer version of a mod
you've configured and your settings file stays as you left it; the new one
lands beside it as <name>.new so you can see what changed. The app records
what each mod shipped, so it can tell your edits from the mod's own defaults.
A file you never touched is just replaced.
Uninstalls cleanly. Every file an install writes is recorded, so removal takes exactly those files and nothing else. Each install keeps its own record: removing a mod from the game leaves a dedicated server's copy alone. Mods installed before this app fall back to deleting their own folder or pak, and it tells you that first.
Makes mods. New mod scaffolds a working UE4SS Lua mod, switched on and ready to edit. Package for sharing zips it laid out to extract into any Palworld install, the way Nexus mods ship.
Explains failures. Load errors are translated. A DLL rejected with 0x7f
becomes built against a different UE4SS ABI. Paks whose contents say they
belong in the other folder are flagged. Mods old enough to predate the current
game build are noted.
Configures mods. Any mod shipping a config file gets real controls per
setting. ini/txt/cfg files are edited line by line so comments and
formatting survive; json is edited structurally; lua configs are code and
open in your editor instead. Every save writes a .bak first.
Profiles. Save the current set of enabled mods under a name (a modded solo set, a near-vanilla one for multiplayer) and switch between them. Loading a profile stages the changes so you can look before applying.
Play. Starts the game (or server) through Steam. When it closes, the app rescans and shows what happened: what loaded, what failed and why, what was on but never started. Sessions started from Steam directly are noticed too.
Save backups. The first time you press Play with a mod setup you haven't
played before, your SaveGames folder is copied first. … → Save backups
restores any of them in one click, and backs up what's there now before doing
so, so a restore can itself be undone. The last ten automatic backups are kept.
Game updates. The app remembers the Steam build each mod was last seen loading on. After a patch you get "Palworld updated to build X since your mods last ran, 6 mods haven't loaded on this build yet". Play once, and any mod that worked before the patch but not after is called out by name.
File conflicts. Two paks that replace the same asset can't both win. The
app reads every pak's index, finds the overlaps, and says which one wins: a
pak ending in _P always beats one that doesn't; between two _P paks the
name that sorts last is normally read first, so that result is shown as
likely. Content paks missing the _P suffix are flagged too, Unreal ranks
them below the game's own files, so they usually can't replace anything.
Core blueprints. A pak that replaces the player character, controller, state or game mode is flagged. Those mods carry a whole copy of something the game updates, which is why they break or crash after a patch, and two of them can never work together.
Hotkeys. Mods declare keys in three different places, RegisterKeyBind
calls, config.lua tables, and [keys] sections of .ini files, and the app
reads all three. Two enabled mods on the same key are flagged on both rows.
Mods that build their keys in code are listed as unreadable rather than assumed
to be fine.
Nothing leaves your PC. No account, no telemetry, no analytics. Everything
the app records (sources, links, pictures, descriptions, receipts, backups)
stays in %LOCALAPPDATA%\PalModManager. Steam Workshop mods are read from the
files Steam already downloaded; the app never contacts Steam. The one exception is Install
UE4SS / PalSchema: when you press it, the app asks GitHub for the current
release and downloads it, and that request carries no information about you
beyond what any download does.
Files from strangers are handled as such.
- Archives can't write outside the folder they're unpacked into, and one that would unpack to more than 8 GB, hold more than 20,000 files, or inflate a file a thousand times over (a zip bomb) is refused before it is opened. What 7-Zip unpacks is checked afterwards rather than trusted, including for links pointing elsewhere on disk.
- Downloads only ever come from GitHub over HTTPS, redirects included, and are checked against the SHA-256 GitHub publishes for each release file.
- Links only open if they are web pages. A mod page link that is really a
program path, a
file://address or a custom protocol is refused. - Pictures are re-encoded when added, which strips camera and GPS data, XMP and C2PA provenance tags, AI generator prompts stored in PNG text, and JPEG comments. A picture declaring an absurd size is refused.
- The source is checked in the tests for invisible Unicode characters (zero-width, bidi, tag characters and the like), the kind watermarking tools hide in text.
All under …:
- UE4SS log: the log live, filtered to mod lines or just problems. UE4SS
writes hundreds of engine offsets at startup (
ArIsError = 0x29) that look like errors and aren't; those are hidden. - Conflicts & hotkeys: every file conflict and key clash in one place, with a jump to the config that sets each key.
- Blueprint load order: edits BPModLoaderMod's
load_order.txtwith two lists instead of hand-typed pak names. - Clean up leftovers: configs for mods that are gone, orphaned
.ucas/.utocfiles, empty mod folders, and UE4SS copies parked by Repair. Everything goes to the Recycle Bin. What Palworld put there for Steam Workshop mods is never on the list. - Share modlist: copy your enabled mods as text for Discord, export them to a file, or open a friend's file to see what you're missing (with links), what you have switched off, and what you run that they don't. Match their setup stages the on/off changes for you to apply.
PalSchema mods get their own group. PalSchema has no enable flag, so a mod
is switched off by moving its folder from PalSchema\mods to
PalSchema\disabled-mods, where PalSchema doesn't look.
A hybrid mod often ships a Lua mod and a PalSchema mod under one name. Each half gets its own row and switch. Both halves share one page link, description and set of pictures.
| State | Means |
|---|---|
| working | Confirmed in UE4SS.log: it started last time you played. |
| worked before update | It started, but on the game version before the latest patch. Play once to confirm it still does. |
| didn't start | Switched on, but the last session never started it. |
| starts next launch | Switched on or installed since you last played, so it hasn't had a chance to start yet. |
| error | It tried to start and failed; the reason is on the row. |
| off | Switched off. Won't load next launch. |
| on | A pak mod that's switched on. Pak mods never write to the log, so whether it works can only be seen in game. |
| wrong folder | The pak's own contents say it belongs in another folder; the row says which. |
| needs PalSchema / PalSchema off | A PalSchema mod whose framework isn't installed or switched on. |
| can't start | A Steam Workshop mod missing something it runs in, such as the Workshop's UE4SS or PalSchema; the row says what. |
| needs another mod | A Steam Workshop mod depending on one you aren't subscribed to, or have switched off. |
| mods off in game | On in the game's list, but every mod is switched off in Palworld's Mod Management. A banner offers Switch on. |
| can't read | A Steam Workshop item whose Info.json can't be read. The game can't load it either. |
| for servers only / for the game only | A Steam Workshop item with nothing to install here. |
Rows keep to the essentials: the switch, the name, a link to the mod's page when there is one, and its state. The mod's type, folder and version are in its info window (click the name). Notes under a row are coloured by weight: red for something that stops the mod working, amber for a clash worth knowing about, grey for information.
A switch drawn as an amber outline is a change you haven't applied yet. Apply changes and Undo appear at the bottom whenever there is one.
Everyday actions are in the … menu (profiles, save backups, sharing, folders); the specialist ones (conflicts, UE4SS log, load order, cleanup) are under … → Tools.
Changes apply on the next launch. UE4SS loads mods once at startup, so nothing can be hot-swapped, which is the whole reason this is a desktop app rather than an in-game menu.
Everything the app does, scriptable:
python palmods.py status # the full report
python palmods.py status --html # also write dashboard.html
python palmods.py install <archive> -y # install without prompting
python palmods.py install <zip> --link URL # ...and link it to its mod page
python palmods.py uninstall <name> # remove a mod
python palmods.py enable <name> # toggle
python palmods.py disable <name>
python palmods.py disable palschema:<name> # one half of a hybrid mod
python palmods.py new <name> # scaffold a mod of your own
python palmods.py path --detect # list every install found
python palmods.py path --set <folder> # point at one
python palmods.py source <name> --set-source Nexus --id 3915
python palmods.py profile save modded # save / load / list / delete
python palmods.py doctor --fix # repair a conflicting UE4SS
python palmods.py check # UE4SS, updates, conflicts, hotkeys, leftovers
python palmods.py backup create # back up saves; also: list, restore <id>
python palmods.py export --text # your modlist, ready to pasteA plain name is enough unless two kinds of mod share it. Then enable,
disable and uninstall change nothing and print the commands that pick each
one, using ue4ss:<name>, pak:<name>, palschema:<name> or
workshop:<name>. A Steam Workshop mod goes by its package name, as its
ActiveModList line has it.
The CurseForge app reinstalls the flat-layout UE4SS 3.0.1 over the top of the
experimental build, which silently reverts every Nexus mod that needs the newer
one. The symptom is mods quietly not loading and UE4SS.log reappearing in
Win64\. doctor detects that, rescues any mods stranded in the wrong root,
and parks the stray files.
The DLL checksum part of that check needs a known-good dwmapi.dll to compare
against, which isn't shipped, because it's UE4SS's binary rather than ours. Put one in
%LOCALAPPDATA%\PalModManager\reference\ to enable it; everything else in
doctor works without it.
Everything this tool generates lives in %LOCALAPPDATA%\PalModManager:
| File | What |
|---|---|
settings.json |
Game folder and preferences |
registry.json |
Per-mod source, id, version, notes |
receipts.json |
What each install wrote, for clean removal, kept per game folder |
profiles.json |
Saved sets of enabled mods |
manifest.json |
Regenerated each scan; the in-game panel reads this |
state.json |
Which build each mod last loaded on, per install |
error.log |
Details of anything that went wrong, if anything has |
backups\ |
Save-game backups, one folder per install |
media\ |
Mod pictures and their thumbnails, one folder per mod |
Nothing is written next to the program. The release is a one-file build, and that folder is a temp directory deleted when the app closes.
Settings, the registry, receipts, profiles and state are never edited in
place. Each save is written to a new file and swapped in whole, so a crash or a
power cut can't leave half a file behind, and the version before is kept as
<name>.bak. A file that won't read is never written over: it's kept as
<name>.corrupt-<time> and the .bak takes its place. UE4SS's mods.txt and
mods.json are saved the same way when you switch a mod on or off.
When something goes wrong in the app itself, it says so and writes the details
to error.log. Copy details puts them on the clipboard for a bug report. In
both, your home folder appears as %USERPROFILE%, so your Windows user name
stays out of anything you share.
An optional read-only UMG panel, F8 in game, listing what's installed. It exists
because UE4SS Lua can open a file but cannot enumerate a directory, so it reads
modlist.txt, which the desktop app rewrites on every scan. Toggling isn't
offered there because it could never apply before the next launch anyway.
| File | |
|---|---|
palmods_gui.py |
The app |
palmods.py |
Scanning, log parsing, pak reading, toggling, config editing |
palpaths.py |
Finding Palworld; settings and data locations |
palinstall.py |
Archive inspection, install, uninstall, scaffolding |
palworkshop.py |
Palworld's own mod loader: PalModSettings.ini, Workshop packages, its UE4SS |
palregistry.py |
Mod sources, install receipts, profiles |
palsafety.py |
Build tracking, pak conflicts, hotkeys, save backups, launching |
paltools.py |
Leftovers, load order, modlists, log classification |
palwindows.py |
Log, conflicts, load order, backups, cleanup, compare, session windows |
palui.py |
Shared palette, fonts and widgets (switch, buttons, themed scrollbar) |
palicons.py |
Icons and the app mark, drawn in code; no image files |
paltext.py |
Wording helpers (plural, and_list) |
palget.py |
Downloading UE4SS and PalSchema from their GitHub releases |
palmedia.py |
Mod descriptions and pictures: clipboard, files, archives, links |
palinfo.py |
The mod info window and picture viewer |
ingame/ |
The in-game Lua panel |
package.py |
Builds the release zip |
Windows only. Developed and tested on Python 3.14.
pip install -r requirements.txt
python palmods_gui.pyThat runs the app straight from source. To build the exe and the release zip:
python -m PyInstaller build/PalModManager.spec --distpath dist/app --workpath build/pyi --noconfirm
python package.pyThe zip lands in dist/. Its version comes from local VERSION in
ingame/PalModManager/Scripts/main.lua.
Releases are built the same way on GitHub's own Windows machines: Actions →
Release → Run workflow runs the tests, builds the exe and the zip from
main, and publishes both as a release with their SHA-256, under that version
and its section of the changelog. It stops if the version is already released.
python tests/run_all.pyRuns every script in tests/ (about 30 seconds, standard library plus
Pillow). Pass a word to run only matching files, python tests/run_all.py safety, or -v to see every check.
The tests never touch your game, saves or settings. Each builds a throwaway
Palworld install in the temp folder. Install auto-detection is switched off,
and any attempt to resolve a game folder outside the temp folder fails the
test. Network access is blocked, test windows stay hidden, and removed files
are deleted rather than sent to your Recycle Bin (set
PMM_TEST_REAL_RECYCLE=1 to exercise the real Recycle Bin).
python tests/screenshots.py retakes the pictures in docs/screenshots the
same way: a made-up install with made-up mods, so they never show anyone's
real setup.
Pak index parsing handles both formats: versions ≥ 10 use the path-hash plus full directory index, earlier ones inline their entries. Palworld's own paks are v11, but mods in the wild ship v3 and v8 too, and those parse differently, getting this wrong makes working mods look broken.
Blueprint detection requires an actual ModActor asset, which is what
BPModLoaderMod scans LogicMods for. A path merely containing Mods/ is not
enough: plenty of content mods namespace their assets under
/Game/Mods/<author>/…, and treating that as a blueprint told people to move
working mods out of the folder where they belonged.
.7z and .rar archives need 7-Zip installed. .zip needs nothing.
Copyright (c) 2026 Hahnter. All rights reserved. The release exe bundles Python, Tcl/Tk and Pillow, each under its own permissive license. UE4SS and PalSchema are not included; the app downloads them from their authors' GitHub releases when you ask it to.


