ASHENEX INTERACTIVE
DOCUMENTATION

Ashenex Steam Publisher

A one-click cook, package, and push-to-Steam tool for Unreal Engine. Configure unlimited build presets, validate them with a Pre-Flight Summary, then publish to Steam without leaving the editor. Watch progress live in a dedicated window with phase pips, smooth progress, and a re-openable build log. Each run is recorded in a Build History strip you can click through for details. Includes multi-platform depots, Steam Guard 2FA support, Test Login, JSON preset export/import, optional Steam DRM wrap, and an auto-promote SetLive branch.

C++ Editor Plugin Unreal 5 C++ Editor Tool Steam v1.0
01

Overview

Ashenex Steam Publisher replaces the usual juggling act of cooking your project, copying outputs, hand-editing app_build.vdf and depot_build_*.vdf files, and dropping into a terminal to run steamcmd. The entire pipeline runs from one button in the Unreal toolbar.

The plugin generates the Steam build scripts for you from values you fill in inside the editor, downloads steamcmd on first run, drives the cook, stage, and package phases through Unreal's standard packaging pipeline, then hands the resulting build off to Steam. A live progress window mirrors every phase as it happens, and a per-project Build History tracks the last ten publish outcomes.

One-click Cook to Package to Upload pipeline driven from a single editor button.
Multi-preset system. Keep separate configs for Shipping, Internal QA, Public Beta, etc.
Pre-Flight Summary modal. Reviews your entire config one last time before launch, with a configurable hard-gate that blocks publish when validation fails.
Live Progress window. Phase pips, smooth animated progress bar, scrolling log mirrored from steamcmd, and a Cancel button that's always available.
Re-openable progress. Close the window mid-build and re-open it from the toolbar to keep watching; the pipeline keeps running in the background.
Build History strip. Last ten publish outcomes shown as colored squares; hover for tooltip, click for detail popover (AppID, depots, branch, final status, duration).
Multi-platform depots. Each depot tagged Windows / Mac / Linux so a single Steam app can upload all three from the same project.
Per-depot install scripts. Point each depot at its own .vdf install script if needed.
Auto-generates app_build.vdf and depot_build_*.vdf files from your settings, including the Desc and SetLive slots.
SetLive branch automation. Optionally promote a successful build to a Steam branch automatically; rejects default at the editor layer to prevent accidents.
Test Login button. Validates Steam credentials by spawning a one-shot steamcmd session, results reported via editor notification.
Profile JSON Export / Import. Share a preset with a teammate or migrate between projects via a single .json file.
Steam Guard / 2FA. Handled with a popup when prompted.
Optional Steam DRM wrap. Automatically wrap your shipped executable with Valve's CEG DRM.
Multi-culture cooking. Pick exactly which of 39 locales ship in each build.
Password redaction. Steam credentials and 2FA codes are scrubbed from every log line surfaced to the editor.
Auto-download of steamcmd from Valve on first run. No manual SDK setup.
Settings persist per-project via EditorPerProjectUserSettings.ini.
02

Installation

Ashenex Steam Publisher can be installed via Fab through the Epic Games Launcher, or manually by dropping the plugin folder into your project. Either way, the plugin runs only in the editor, it does not add any runtime cost to your packaged game.

Method A · Fab / Epic Games Launcher
  1. Acquire Ashenex Steam Publisher from your Fab library in the Epic Games Launcher.
  2. Install it to the engine version you are targeting.
  3. Open your project in Unreal Engine.
  4. Go to Edit → Plugins.
  5. Under the Ashenex Interactive category, enable Ashenex Steam Publisher.
  6. Restart the editor when prompted.
Method B · Manual Install
  1. Download the plugin package.
  2. Create a Plugins folder in your project root if one doesn't exist.
  3. Copy the plugin folder into: YourProject/Plugins/AshenexSteamPublisher
  4. Open the project. If prompted to rebuild the plugin from source, click Yes.
  5. Confirm the plugin is enabled in Edit → Plugins → Ashenex Interactive.
  6. You should see a new Package and Push to Steam button in the level editor toolbar.
Engine

Ashenex Steam Publisher targets Unreal Engine 5.

03

Steamworks Setup

Before the plugin can publish anything, your title needs to exist on the Steamworks side. This is a one-time setup that takes about 15 minutes if you already have a Steamworks Partner account, longer if you're starting from scratch.

01If you don't have one, register a Steamworks Partner account at partner.steamgames.com and pay Valve's one-time Steam Direct fee for your title.
02Once your application is approved, note your numeric App ID. You'll enter this in the plugin's App ID field.
03Create at least one Depot under your application in Steamworks. Each depot has its own numeric ID (typically AppID + 1 for your first depot).
04Optional but strongly recommended. Create a dedicated builder account under your Steamworks group with build-upload permissions. Use those credentials in the plugin rather than your main partner login.
05On the machine you'll publish from, sign into the builder account once in your Steam client. This pre-authorises the machine and reduces how often Steam Guard prompts you during uploads.
06If you intend to use the SetLive auto-promote field, create your target branches (e.g. internal-qa, beta) under Steamworks → Builds → Manage Branches before publishing.
Steam Guard

Every upload requires Steam Guard two-factor authentication. Make sure you can receive the code (email or Steam Mobile Authenticator) before clicking Package & Publish. The plugin will prompt you with a popup to enter the 5-character code each time.

04

The Publisher Window

Click the Steam glyph in the level editor toolbar to open the publisher window. It's organised top-to-bottom as a header, a preset bar, a recent-history strip, a tools row, the settings panel, and a bottom action bar.

The Ashenex Steam Publisher window inside Unreal Engine, showing the eyebrow header with version pill, the preset combobox with New/Duplicate/Delete buttons, the RECENT build history strip, the Tools row with Test Login / Open Build Folder / Steam Build Page / Reset Preset / Export / Import, the Packaging and Steam sections, and the Package and Publish to Steam button at the bottom.
One window covers every step before publish. Validation pills in the section header summarise readiness at a glance.

From top to bottom, the window provides:

Preset bar with a combobox to switch between saved presets, plus + New, Duplicate, and Delete buttons. Preset names are auto-deduplicated.
RECENT history strip, up to 10 small squares representing your last publish runs. Green for success, crimson for failure, smoke for empty slots. Hover for tooltip; click any populated square for a full detail popover.
Validation pills at the top of the Packaging & Steam section header. Quick READY / NOT READY indicators per group of required fields.
Tools row with quick-actions for the active preset: Test Login, Open Build Folder, Steam Build Page, Reset Preset, Export, Import.
Details panel with the active preset's Packaging and Steam fields, grouped under section headers. Edits save instantly to Saved/Config/EditorPerProjectUserSettings.ini.
Action bar with Close and Package & Publish to Steam.
Settings Also Live in Project Settings

The same settings are mirrored under Edit → Project Settings → Plugins → Ashenex Steam Publisher. Edits in either place affect the same underlying config file. Use Project Settings for quick single-field tweaks, the publisher window for the full pre-publish review.

05

Presets

Most teams have more than one publishing target. A Shipping build for the public branch, an Internal QA build that points at a separate Steam app, a Public Beta with relaxed validation. Ashenex Steam Publisher stores every configuration as a self-contained preset, switchable from the combobox at the top of the publisher window.

Each preset is a full snapshot of Packaging and Steam settings, including its own credentials. This means a project can target multiple Steam apps or use different builder accounts per branch without re-typing the username and password every time.

01Click + New in the preset bar to create a fresh preset. The name auto-generates as Preset N and can be renamed inline through the details panel.
02Click Duplicate to clone the active preset (appended with (Copy)), useful for spinning up a beta variant of an existing Shipping config.
03Click Delete to remove the active preset. At least one preset must always exist; the button disables when only one remains.
04Use the combobox to switch between presets. The active preset's name is shown above the field list and is what Package & Publish will use.
05Use Export in the Tools row to save the active preset to a JSON file, and Import to load a JSON file into the active preset slot. Useful for sharing configs across machines or teammates.
Name Uniqueness

The plugin enforces unique preset names. If you rename a preset to a name that collides with another, or duplicate one whose copy name already exists, a numeric suffix is appended automatically and a toast notification explains what happened.

Legacy Single-Preset Migration

Existing projects upgraded from earlier single-config versions are migrated automatically on first run. Your previous settings become a preset named Default, and your subsequent presets are added alongside it.

06

Pre-Flight Summary

Click Package & Publish to Steam and the publisher window is replaced by a modal Pre-Flight Summary. It surfaces every critical field of the active preset one last time before the long-running build kicks off, so misconfigurations are caught before you start a 30-minute upload to the wrong branch.

The summary shows:

Status banner at the top, green READY TO PUBLISH when every required field is filled, crimson BLOCKERS DETECTED when at least one is missing or invalid.
Field list: preset name, build configuration, package directory, Steam App ID, depots (with platform and ID per entry), SetLive branch, build description, username, password presence, levels cooked, localizations, DRM on/off.
Blocker highlights. Required fields that are empty or invalid are painted crimson inline; the SetLive branch is flagged as BLOCKED if set to default.
Soft notes in dim italic below the field list (e.g. empty SetLive shows "Build will upload but NOT promote to any branch").
Hard-gate checkbox at the bottom. When enabled (default), Confirm is disabled if blockers are present and the label flips to Resolve Blockers to Continue. Disable for the legacy Continue Anyway behaviour.
Confirm & Publish on the right, Cancel on the left. Cancel returns you to the publisher window so you can adjust and try again.
The Ashenex Steam Publisher Pre-Flight Summary modal, showing the eyebrow header PUBLISHER PRE-FLIGHT CHECK, the title Confirm Publish, a green READY TO PUBLISH banner, and the full field summary including preset name, build configuration, package directory, App ID, depots, SetLive branch, build description, Steam username, password presence, levels cooked, localizations, and DRM state. Bottom row shows the Block on validation errors checkbox plus Cancel and Confirm and Publish buttons.
Pre-Flight catches every required field before the long pipeline starts. Empty SetLive shows the inline note "Build will upload but NOT promote to any branch".
Why the Hard Gate

Blockers (missing AppID, no depots, empty credentials, default SetLive branch) will fail downstream anyway and waste your cook time. The hard gate stops the pipeline before it starts so you can fix the config instead of watching the build die at the Steam upload step.

07

Progress & Build History

When you confirm at Pre-Flight, the publisher window dismisses and a dedicated Progress window opens. It mirrors every phase of the pipeline live: cook, stage, package, Steam upload, set-live.

The Progress window provides:

Status line with the current phase (e.g. "Cooking project", "Uploading to Steam (45%)", "Finished").
Five phase pips below the status, lighting up as each phase begins: Validate, Cook, Stage, Upload, Set Live.
Animated throbber on the right while the pipeline is running.
Smoothly-animated progress bar that lerps between values rather than snapping. Color shifts based on state (running / failed / complete).
Scrolling log box mirroring steamcmd stdout with timestamps at each phase change. Steam username and password are redacted in the displayed text.
Cancel button while running (terminates the active steamcmd process), flips to Close on completion.

Closing the window does not cancel the pipeline. The build continues in the background. Click the toolbar Steam glyph again to re-open the progress window and the pre-existing log, status, and progress are restored to where they left off.

The Ashenex Steam Publisher live progress window, showing the eyebrow header, the status line with a throbber, five phase pips below it, the animated crimson progress bar with percentage, a scrolling read-only log mirroring steamcmd output, and a Cancel button at the bottom.
Live progress, mid-cook. The log mirrors steamcmd with credentials redacted; closing the window doesn't kill the pipeline.

Build History

Each completed pipeline (success or failure) is recorded to the per-project Build History. The most recent 10 runs are surfaced as the RECENT strip near the top of the publisher window.

Hover any square for a quick tooltip (timestamp, profile name, duration, OK / FAILED). Click for a detail popover showing the full timestamp, outcome, AppID, depot count, build configuration, SetLive branch used, and the final status message. Older entries are dropped from the strip and from disk once the cap is reached.

The Ashenex Steam Publisher Build History Detail modal opened by clicking a square in the RECENT strip. Shows the eyebrow header PUBLISHER BUILD HISTORY, the title Build with the timestamp, a green Success outcome pill, and a field grid covering preset, duration, Steam App ID, depots, build configuration, SetLive branch, and the final status message.
Click any populated square in the RECENT strip for the full per-run summary, useful for spotting failure patterns over time.
08

Sample Configuration

A typical filled-in preset for a single-depot Windows shipping build looks like the following. Use these as starting values and adjust to your project's needs.

Preset Name
Shipping
Build Configuration
Shipping
For Distribution
true
Include Prerequisites
true
Package Directory
D:/Builds/MyGame
Cultures to Stage
English
Max Chunk Size
0
App ID
480
Depot 0 ID
481
Depot 0 Platform
Windows
Build Description
v0.3.2 internal QA
SetLive Branch
(empty)
Protect with DRM
false
Open Steamworks on Finish
true
Username
your_builder_user
Password
••••••••

App ID 480 and depot 481 are Valve's public Spacewar test app, useful for verifying your setup before pointing at your real product. Real app IDs are assigned by Steamworks when you create your title.

Multiple Depots

If your title ships multiple depots (e.g. one for Windows, one for Mac, one for Linux), add each one to the Depots array and tag each with the correct platform. The plugin generates a depot_build_<ID>.vdf for each entry automatically and the FileMapping is platform-aware.

SetLive Branch

Leave this empty to upload without auto-promoting (use the Steamworks web admin to set live manually). Fill in any branch name you've created in Steamworks Builds, Manage Branches to have the plugin promote the build for you on successful upload. default is rejected at the editor layer; Valve disallows it from steamcmd and blocks the publish anyway, so use the Steamworks website for that case.

09

Settings Reference

Every setting exposed by a preset, grouped by section. Required fields must be filled in before publishing; Optional fields have safe defaults and can be left alone for a basic setup.

Profile NameOptional

The display name for this preset (e.g. Shipping, Internal QA, Public Beta). Shown in the combobox at the top of the publisher window. If a name collides with an existing preset, a numeric suffix is added automatically.

Typestring
DefaultDefault
Build ConfigurationOptional

Which build configuration your project is cooked with. Shipping is the correct choice for public Steam releases; Development is useful for internal QA branches.

TypeEnumShipping / Development / DebugGame / Debug
DefaultShipping
For DistributionOptional

Marks the build as a distribution package. When enabled, debug symbols (.pdb) are stripped from the output before upload. Recommended for any public release.

Typebool
Defaulttrue
Include PrerequisitesOptional

Bundles the Visual C++ / DirectX redistributables your title needs into the staged build. Required for end-user installs from Steam.

Typebool
Defaulttrue
Package DirectoryRequired

The folder where the cooked, staged, and packaged build is written before being uploaded to Steam. Pick somewhere with at least 2 to 3 times your build size in free space.

TypeDirectory Path
ExampleD:/Builds/MyGame
Cultures to StageOptional

Which locales are cooked into the build. Leave empty to cook every culture your project supports, or add only the ones you want shipped (e.g. ship only English and Japanese for a launch build).

TypeArray<Enum>39 locales available
Max Chunk SizeOptional

If greater than zero, sets a maximum size (in bytes) per pak chunk. Useful for keeping per-file sizes under platform limits or improving patch granularity. Leave at 0 for default behaviour.

Typeint64
Default0
Levels to CookOptional

Specific maps to include in the cook. Leave empty to cook everything referenced from your default level; populate to ship only the listed levels (e.g. excluding a test map directory).

TypeArray<World>
App IDRequired

The numeric Steam application ID assigned to your title by Valve when your Steamworks application was created.

Typeint32
Example480
DepotsRequired

One entry per depot you want to upload. Each entry has its own Depot ID (numeric, assigned by Steamworks), a target Platform (Windows / Mac / Linux), and an optional Install Script, a path to a .vdf file that runs install-time logic on the user's machine (registry keys, redist installers, etc.).

TypeArray<FDepotInfo>
MembersDepotIDint32
MembersPlatformEnum: Windows / Mac / Linux
MembersInstallScript.vdf, optional
Build DescriptionOptional

A short note that appears next to your build in Steamworks (e.g. v0.3.2 internal QA). Maps to the Desc slot in app_build.vdf. Max ~80 characters per Steam's rules.

Typestring
Examplev0.3.2 internal QA
SetLive BranchOptional

If non-empty, the plugin promotes the build to this Steam branch automatically after upload. Maps to the SetLive slot in app_build.vdf. Leave empty to upload without flipping any branch. default is rejected by the editor; Valve disallows it from steamcmd as a safety measure. Allowed characters: A-Z, a-z, 0-9, hyphen, underscore.

Typestring
Exampleinternal-qa
Protect with DRMOptional

If enabled, the plugin instructs steamcmd to wrap your shipped .exe with Valve's CEG DRM before upload. The DRM-wrap step can take ~15 minutes on Valve's side; the progress window will report it.

Typebool
Defaultfalse
Open Steamworks on FinishOptional

When the upload completes successfully, opens your app's build page on partner.steamgames.com in your default browser. Handy for promoting the build to a Steam branch right after upload.

Typebool
Defaulttrue
UsernameRequired

Steam account used to authenticate the upload. Strongly recommended: a dedicated builder account under your Steamworks group rather than your personal Steam login. Per-preset, different presets can target different builder accounts.

Typestring
PasswordRequired

Password for the builder account. Stored as a masked field in the editor UI but written in clear text to EditorPerProjectUserSettings.ini. Make sure that file is in your .gitignore and never committed. Redacted from every log line shown in the progress window.

Typestring (masked)
Block on Validation ErrorsOptional

Global preference (not per-preset). When on, the Pre-Flight Summary disables Confirm if any blockers are present. When off, the legacy Continue Anyway behaviour is preserved. Toggle inline from the bottom of the Pre-Flight Summary; persists between sessions.

Typebool
Defaulttrue
10

Steam Guard & Troubleshooting

Every upload triggers Steam Guard two-factor authentication. The plugin handles this with a small popup window.

01During upload, steamcmd reports it needs a Steam Guard code. The plugin detects this and pauses.
02A Steam, Double Auth Code popup appears in Unreal. Enter the 5-character code from your email or Steam Mobile Authenticator. Case-insensitive, letters are auto-uppercased.
03Click Validate. The plugin re-launches steamcmd with the code and resumes the upload.
04The plugin handles this flow automatically each time. Have your authenticator ready before starting a publish.

The Tools row in the publisher window also includes a Test Login button. Clicking it spawns a one-shot steamcmd session that authenticates with the active preset's credentials and exits immediately, no upload, no build. Use it to verify a builder account is working before kicking off a long pipeline.

Error / Symptom Cause & Fix
BLOCKERS DETECTED at Pre-FlightOne or more required fields are empty or invalid. Look at the crimson-painted rows in the Pre-Flight summary to identify which.
Invalid Steam App IDApp ID is set to 0 or blank. Set your numeric Steam App ID in the publisher window.
Empty Steam username / passwordBuilder credentials missing for the active preset. Fill in the Username and Password fields, or run Test Login first to verify them.
Invalid package directoryPackage Directory not set or unreadable. Pick a folder with write permissions and enough free space.
No valid depot was specifiedDepots array is empty. Add at least one entry with a valid Depot ID matching your Steamworks setup.
SetLive branch reverts to empty after editYou entered default or a value containing spaces / special characters. The editor sanitizes these on edit; a toast explains what was stripped. To promote to default, leave this empty and use the Steamworks web admin instead.
Wrong code. Please try again.Steam Guard code mismatch. Re-open the popup and enter the latest code from your authenticator.
Too many requests for Steam. Try again in an hour.Steam rate-limited your account after repeated auth failures. Wait one hour before retrying.
Packaging failedThe Unreal cook/package step failed before reaching Steam. Check the Output Log for the underlying error, usually a missing asset or a compile error.
Plugin downloads ~20 MB on first runExpected. The plugin auto-downloads the latest steamcmd.zip from Valve's CDN to Plugins/AshenexSteamPublisher/Content/. Only happens once per install.
DRM wrap appears stuckSteam's CEG DRM wrap can take ~15 minutes on Valve's side. The status line will indicate this while it runs.
Progress window closes but build keeps runningIntentional. The pipeline runs independently of the window. Re-open by clicking the toolbar Steam glyph; log, status, and progress are restored.
Output Log

All steamcmd stdout and stderr are mirrored into the Unreal Output Log under the AshenexSteamPublisher log category, and into the progress window's live log. Passwords and 2FA codes are redacted in both. If a notification message isn't enough to diagnose a failure, opening the Output Log and filtering on that category will give you the full trace.

Build History as a Diagnostic

Each failed run is recorded in the Build History strip with its final status message. Clicking the square opens a popover showing the AppID, depot count, build configuration, branch, and the exact error text. Useful for spotting patterns (e.g. "every Tuesday upload fails on the Linux depot").