A standalone CLI for managing Unreal Engine plugins via the npm registry. No Node.js required.
macOS / Linux
curl -fsSL https://github.com/adamschlesinger/uepm/releases/latest/download/install.sh | shWindows (PowerShell)
irm https://github.com/adamschlesinger/uepm/releases/latest/download/install.ps1 | iexOr grab a binary directly from Releases.
Plugin consumer:
cd YourUnrealProject # directory containing a .uproject file
uepm init # creates Config/UEPM.ini, UEPMPlugins/, modifies .uproject
uepm install @acme/cool-pluginPlugin author:
cd YourPlugin # directory containing a .uplugin file
uepm init # detects .uplugin, prompts for plugin metadata, writes [Plugin]
uepm publish # builds .tgz, PUTs to registry — no npm required| Command | Description |
|---|---|
uepm init [--yes] |
Project context (.uproject present): creates Config/UEPM.ini, UEPMPlugins/, modifies .uproject. Plugin context (.uplugin present): prompts for publish metadata and writes [Plugin] section. |
uepm install [@scope/pkg[@ver] ...] |
Install plugins. No args installs everything in Config/UEPM.ini. |
uepm uninstall @scope/pkg |
Remove a plugin and update Config/UEPM.ini. |
uepm update [@scope/pkg] |
Update one or all plugins to latest compatible versions. |
uepm list |
Show installed plugins and engine compatibility status. |
uepm publish [--tag TAG] [--dry-run] [--yes] [--access public|restricted] |
Publish this plugin to the registry. Reads [Plugin] from Config/UEPM.ini. Requires UEPM_TOKEN. |
Every command accepts a global --json flag that emits structured JSON on stdout for scripting, CI, and editor tooling:
uepm --json list # [{"name": "@acme/cool-plugin", "version": "1.2.3", "compatible": true}]
uepm --json install @acme/pkg # [{"name": "...", "version": "...", "tarball": "...", "fresh": true}]Errors are emitted as {"error": "<message>"} on stdout with a non-zero exit code. Interactive commands (init, publish) require --yes when --json is used.
Config/UEPM.ini — human-edited, check this in:
[Settings]
EngineVersion = "5.4"
CommitPlugins = false
[Dependencies]
"@acme/cool-plugin" = "^1.2.0"
"@acme/base-utils" = "^2.0.0"CommitPlugins = false means UEPMPlugins/ is gitignored and restored by uepm install after clone.
Set to true to check the installed plugins into version control (recommended for Perforce).
uepm.lock — machine-generated, check this in:
{
"version": 1,
"plugins": {
"@acme/cool-plugin": {
"resolved": "1.2.3",
"tarball": "https://registry.npmjs.org/...",
"sha512": "sha512-...",
"dependencies": {}
}
}
}Run uepm init in your plugin directory to write a [Plugin] section:
# Config/UEPM.ini (inside the plugin source tree)
[Plugin]
Name = "@your-scope/plugin-name"
Version = "1.0.0"
Description = "Does cool things"
Author = "Your Studio"
License = "MIT"
EngineRange = ">=5.3.0, <6.0.0"
Main = "YourPlugin.uplugin"
[Dependencies]
# transitive deps go hereThen publish — no Node.js or npm required:
export UEPM_TOKEN=<your-npm-token>
uepm publish # interactive confirm + upload
uepm publish --dry-run # validate and list files without uploading
uepm publish --tag beta # publish under a non-default dist-taguepm publish builds the .tgz tarball in memory, computes SHA-512 integrity,
and PUTs directly to the registry API. package.json is never written to disk.
A plugin can declare its own UEPM dependencies in a Config/UEPM.ini at its package root. UEPM reads this after extraction and installs those deps recursively, with conflict detection.
Use file: paths to work against local plugin source without publishing:
[Dependencies]
"@acme/cool-plugin" = "file:../plugins/cool-plugin"file: deps create a symlink in UEPMPlugins/ pointing at the source directory — edits are visible immediately.
| Variable | Default | Description |
|---|---|---|
UEPM_REGISTRY |
https://registry.npmjs.org |
Registry base URL |
UEPM_TOKEN |
— | Bearer token for private registries |
RUST_LOG |
— | Log level (debug, info, warn, error) |
cargo build
cargo test
cargo test registry # run tests for a specific moduleModules: manifest, lockfile, uproject, registry, installer, resolver, commands/
MIT — see LICENSE