Skip to content

v1.4.0

Choose a tag to compare

@github-actions github-actions released this 29 Aug 02:10
· 16 commits to main since this release

Palworld Save Pal v1.4.0

Plugins and scripting

PSP can now run Lua scripts against your save. The same scripts work on the desktop app, a self-hosted Docker deployment, or online at palworldsavepal.app.

This is something we've been dreaming up for a while, and now that PSP is merging with PalworldSaveTools (PST), it finally made sense to build it.

We're going to keep working on PSP until everything from PalworldSaveTools has made its way over and we've reached full feature parity. This merge isn't about leaving PST behind. The goal is to bring everything together under PSP and build on it from there.

There are still a few things to finish up, but we'll keep chipping away at them until the two projects are fully caught up.

One of the first areas ported are the options available under Menu -> Functions. Instead of taking every PST function and turning it into another hardcoded button, we've moved most of the available functions into plugins. That gives us 38 commands out of the box across four bundled plugins:

  • Save Cleanup (13 commands): Delete inactive players (guild admins are never touched), duplicated players, imported pals, empty guilds, inactive bases, skins, structures outside their base, invalid structures, and unreferenced data. It can also strip pals, items, and passive skills that aren't in the game's catalogs, and fix last-online timestamps that are somehow in the future.
  • Save Repair (10 commands): Scan for illegal pals and player stats, then fix only the ones you choose. Restore structures, chests, and resource nodes to full HP. Heal and recompute pals, remove skills a species can't learn, rebuild missing item records, resize inventories based on a player's key items, and reassign pals to the guild they actually belong to.
  • World Reset (7 commands): Reset supply drops, anti-air turrets, the oil rig, invaders, dungeons, lock gimmicks, and completed quests for every player.
  • Save Tools (8 commands): Set the game day, max every pal in the world and in storage, resize containers or player/guild inventories, unlock private chests, unlock the Viewing Cage for a player, and generate PalDefender /killnearestbase commands for every base.

The part that matters more than 38 commands

The interesting part isn't really the 38 commands.

Those four plugins don't get any special treatment. They use the exact same API that's available to plugins you write yourself. That means adding new functionality to PSP no longer has to wait for us to build and release another version.

  • Clone one and change it. Any plugin, including the ones that ship with PSP, can be cloned into an editable copy with a new ID. Don't like that Delete Inactive Players skips guild admins? Clone it, remove that check, and run your version. The original stays untouched.
  • Write your own. Hit "New Plugin" and PSP will scaffold a working script. The built-in editor has syntax checking, autocomplete, hover information, and signature help for the entire host API.
  • Iterate as you go. Edit the script, save it, run it against your own save, check the result, then change it again. No rebuilds, reinstalls, or waiting for the next PSP release. A plugin is just a manifest.json and some .lua files.
  • Share it. Export a plugin as a .zip and send it to someone else. They can install it directly. A single .lua file works too.
  • Need something specific? Let us know. If PSP doesn't do something you need, there's a good chance we can write a plugin for it without having to turn it into a full PSP feature. That's a much nicer workflow than "maybe it'll be in the next release."

Safety

Scripts run inside a locked-down Lua sandbox with memory and execution limits. They don't have access to the filesystem, network, or process spawning. Those libraries aren't exposed in the first place, so there isn't anything for a script to call.

Each plugin also declares the capabilities it needs, such as reading or writing the save, raw access, game data, storage, or logging. You grant those capabilities when installing the plugin. Anything it doesn't have permission for simply doesn't exist from the script's point of view.

Destructive operations can also be previewed first. Dry runs use the same code path as the real operation, show you what would happen, and leave your save completely untouched.

Plugins can also define their own UI through the manifest, including grouped sections, selectable tables, and richer parameters. It's all data-driven, so the manifest controls how the commands are presented without being able to execute anything itself. That's what makes flows like Save Repair's scan-then-fix-selected workflow possible.

Everything above is documented in docs/plugins.md, including the manifest schema, host API, capabilities, sandbox limits, multi-file plugins, and a complete example. If you're interested in writing your own plugin, that's the place to start.

The bundled plugins are also available in psp-app/src/bundled, and they're probably the best examples of how to actually use the API.

New Features

  • Overview dashboard: Replaces the old file page. Once a save is loaded, you'll get an overview of world composition, pal traits and conditions, top species and player leaderboards, anomaly counts, and a legality report. The legality report checks things like impossible levels, HP, condenser ranks, and unknown species or skills against the game data catalogs, with danger/warning severity for each issue. There's also a Certified Server Level, which we make absolutely no promises about. The full report can be exported as JSON.
  • Effigies editor: New Effigies page (shortcut E) for editing unspent effigy counts by type. Includes a grid/list toggle. Counts are limited to each type's cumulative maximum, and explicit edits take priority over changes that would otherwise come from relic flags. The same behavior applies when toggling relics on the map.
  • Registry: Bulk Actions is now the Registry. It makes more sense now that it's basically a catalog of your players, pals, and guilds in addition to being a bulk editor. Guilds now have both a card grid and sortable table, and guild leadership is shown in a few more places: the crown in the players tab, Leader column, card footer, and the detail member list. Selection and bulk actions work from either view.
  • Server manager: Fixed mod loading and added more settings to the editor, including ranch pal work speed, blocked technology, voice chat and its distances, enemy camps near bases, automatic guild master transfer and its check interval, and builder-name display with its cache TTL.
  • UI refresh: Universal Pal Storage has been restyled to fit the rest of the app. Map popups and tooltips now use a shared component, the breeding side panel collapses down to a small rail, and wiki cards and item badges now use rarity styling.

Improvements & Fixes

  • The desktop build now removes the web-only parts of the output, including sitemaps, redirects, localized roots, and JSON data used by the WASM worker. There's no reason to ship that stuff in the desktop app, distribution size is reduced by ~50%.
  • Fixed the pal editor getting stuck forever when editing a base worker or a pal with no owner or guild.
  • Fixed base membership resolution missing pals because the save can use two different spellings for the slot key depending on how the entry was written. The same fix also applies to pal transfers when repointing containers.
  • GPS-to-palbox cloning now keeps the target player as the owner.
  • Bulk delete now reports the pals that were actually dispatched instead of just reporting the ones selected.
  • ElementType contained four display names that don't exist in either the element or pal data, meaning nothing could ever match them.
  • Locale switching now uses a proper runtime with cross-context synchronization instead of two separate paths that could end up disagreeing.
  • CI now cancels superseded runs, caches packages correctly, and installs from a frozen lockfile.
  • Refreshed items.json. Fifteen enum members used by the game were missing. Since missing members are silent, those items were getting stamped as None and disappearing from the item picker. This fixes fishing rods, bait, Pal awakening items, treasure maps, and several boss-reward essentials.
  • The web version could load the wrong world when a save folder contained a backup copy of itself. Dropping or uploading a folder pulled in every Level.sav under it, and the first one found won — backups and .psp-backup both sort ahead of Level.sav, so the backup usually did. Backup player files were being mixed in the same way, which is what made the web and desktop versions disagree about things like accessories. The save folder is now anchored to the topmost Level.sav, and nothing outside it is read at all.
  • UID Swap now moves everything it claims to. Pals, structures, chest and booth locks, container slot owners, and dimensional pal storage were all staying behind with the original UID, so the swapped-in player kept the old pal count and owned none of the base. Fog of war is still not included, and can't be: its mask lives in LocalData.sav, which is per-machine and isn't part of a dedicated server save.