Chapter 8.7: Publishing to the Steam Workshop
Home | << Previous: Debugging & Testing | Publishing to the Steam Workshop | Next: Building a HUD Overlay >>
Table of Contents
- Introduction
- Pre-Publishing Checklist
- Step 1: Prepare Your Mod Folder
- Step 2: Write a Complete mod.cpp
- Step 3: Prepare Logo and Preview Images
- Step 4: Generate a Key Pair
- Step 5: Sign Your PBOs
- Step 6: Publish via DayZ Tools Publisher
- Publishing via Command Line (Alternative)
- Updating Your Mod
- Version Management Best Practices
- Workshop Page Best Practices
- Guide for Server Operators
- Distribution Without the Workshop
- Common Problems and Solutions
- The Complete Mod Lifecycle
- Next Steps
Introduction
Publishing to the Steam Workshop is the final step in the DayZ modding journey. Everything you have learned in previous chapters culminates here. Once your mod is on the Workshop, any DayZ player can subscribe, download, and play with it. This chapter covers the complete process: preparing your mod, signing PBOs, uploading, and maintaining updates.
Pre-Publishing Checklist
Before you upload anything, go through this list. Skipping items here causes the most common post-publish headaches.
- [ ] All features tested on a dedicated server (not just single-player)
- [ ] Multiplayer tested: another client can join and use mod features
- [ ] No game-breaking errors in script logs (
DayZDiag_x64.RPTorscript_*.log) - [ ] All
Print()debug statements removed or wrapped in#ifdef DEVELOPER - [ ] No hardcoded test values or leftover experimental code
- [ ]
stringtable.csvcontains all user-facing strings with translations - [ ]
credits.jsonfilled out with author and contributor information - [ ] Logo image prepared (see Step 3 for sizes)
- [ ] All textures converted to
.paaformat (not raw.png/.tgain PBOs) - [ ] Workshop description and installation instructions written
- [ ] Changelog started (even if just "1.0.0 - Initial release")
Step 1: Prepare Your Mod Folder
Your final mod folder must follow DayZ's expected structure exactly.
Required Structure
@MyMod/
├── addons/
│ ├── MyMod_Scripts.pbo
│ ├── MyMod_Scripts.pbo.MyMod.bisign
│ ├── MyMod_Data.pbo
│ └── MyMod_Data.pbo.MyMod.bisign
├── keys/
│ └── MyMod.bikey
├── mod.cpp
└── meta.cpp (auto-generated by the DayZ Launcher on first load)Folder Breakdown
| Folder / File | Purpose |
|---|---|
addons/ | Contains all .pbo files (packed mod content) and their .bisign signature files |
keys/ | Contains the public key (.bikey) that servers use to verify your PBOs |
mod.cpp | Mod metadata: name, author, version, description, icon paths |
meta.cpp | Auto-generated by DayZ Launcher; contains the Workshop ID after publishing |
Important Rules
- The folder name must start with
@. This is how DayZ identifies mod directories. - Every
.pboinaddons/must have a matching.bisignfile next to it. - The
.bikeyfile inkeys/must correspond to the private key used to create the.bisignfiles. - Do not include source files (
.cscripts, raw textures, Workbench projects) in the upload folder. Only packed PBOs belong here.
Step 2: Write a Complete mod.cpp
The mod.cpp file tells DayZ and the launcher everything about your mod. An incomplete mod.cpp causes missing icons, blank descriptions, and display issues.
Full mod.cpp Example
name = "My Awesome Mod";
picture = "MyMod/Data/Textures/logo_co.paa";
logo = "MyMod/Data/Textures/logo_co.paa";
logoSmall = "MyMod/Data/Textures/logo_small_co.paa";
logoOver = "MyMod/Data/Textures/logo_co.paa";
tooltip = "My Awesome Mod - Adds cool features to DayZ";
overview = "A comprehensive mod that adds new items, mechanics, and UI elements to DayZ.";
author = "YourName";
overviewPicture = "MyMod/Data/Textures/overview_co.paa";
action = "https://steamcommunity.com/sharedfiles/filedetails/?id=YOUR_WORKSHOP_ID";
version = "1.0.0";
versionPath = "MyMod/Data/version.txt";Field Reference
| Field | Required | Description |
|---|---|---|
name | Yes | Display name shown in the DayZ Launcher mod list |
picture | Yes | Path to the main logo image (displayed in launcher). Relative to the P: drive or mod root |
logo | Yes | Same as picture in most cases; used in some UI contexts |
logoSmall | No | Smaller version of the logo for compact views |
logoOver | No | Hover state of the logo (often same as logo) |
tooltip | Yes | Short one-line description shown on hover in the launcher |
overview | Yes | Longer description shown in the mod details panel |
author | Yes | Your name or team name |
overviewPicture | No | Large image shown in the mod overview panel |
action | No | URL opened when the player clicks "Website" (typically your Workshop page or GitHub) |
version | Yes | Current version string (e.g., "1.0.0") |
versionPath | No | Path to a text file containing the version number (for automated builds) |
Common Mistakes
- Missing semicolons at the end of each line. Every line must end with
;. - Wrong image paths. Paths are relative to the P: drive root when building. After packing, the path should reflect the PBO prefix. Test by loading the mod locally before uploading.
- Forgetting to update the version before re-uploading. Always increment the version string.
Step 3: Prepare Logo and Preview Images
Image Requirements
| Image | Size | Format | Used For |
|---|---|---|---|
Mod logo (picture / logo) | 512 x 512 px | .paa (in-game) | DayZ Launcher mod list |
Small logo (logoSmall) | 128 x 128 px | .paa (in-game) | Compact launcher views |
| Steam Workshop preview | 512 x 512 px | .png or .jpg | Workshop page thumbnail |
| Overview picture | 1024 x 512 px | .paa (in-game) | Mod details panel |
Converting Images to PAA
DayZ uses .paa textures internally. To convert PNG/TGA images:
- Open TexView2 (included with DayZ Tools)
- File > Open your
.pngor.tgaimage - File > Save As > choose
.paaformat - Save to your mod's
Data/Textures/directory
Addon Builder can also auto-convert textures when packing PBOs if configured to binarize.
Tips
- Use a clear, recognizable icon that reads well at small sizes.
- Keep text on logos to a minimum -- it becomes unreadable at 128x128.
- The Steam Workshop preview image (
.png/.jpg) is separate from the in-game logo (.paa). You upload it through the Publisher.
Step 4: Generate a Key Pair
Key signing is essential for multiplayer. Almost all public servers enable signature verification, so without proper signatures players will be kicked when joining with your mod.
How Key Signing Works
- You create a key pair: a
.biprivatekey(private) and a.bikey(public) - You sign each
.pbowith the private key, producing a.bisignfile - You distribute the
.bikeywith your mod; server operators place it in theirkeys/folder - When a player joins, the server checks each
.pboagainst its.bisignusing the.bikey
Generating Keys with DayZ Tools
- Open DayZ Tools from Steam
- In the main window, find and click DS Create Key (sometimes listed under Tools or Utilities)
- Enter a key name -- use your mod name (e.g.,
MyMod) - Choose where to save the files
- Two files are created:
MyMod.bikey-- the public key (distribute this)MyMod.biprivatekey-- the private key (keep this secret)
Generating Keys via Command Line
You can also use the DSCreateKey tool directly from a terminal:
"C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools\Bin\DsUtils\DSCreateKey.exe" MyModThis creates MyMod.bikey and MyMod.biprivatekey in the current directory.
Critical Security Rule
NEVER share your
.biprivatekeyfile. Anyone who has your private key can sign modified PBOs that servers will accept as legitimate. Store it securely and back it up. If you lose it, you must generate a new key pair, re-sign everything, and server operators must update their keys.
Step 5: Sign Your PBOs
Every .pbo file in your mod must be signed with your private key. This produces .bisign files that sit alongside the PBOs.
Signing with DayZ Tools
- Open DayZ Tools
- Find and click DS Sign File (under Tools or Utilities)
- Select your
.biprivatekeyfile - Select the
.pbofile to sign - A
.bisignfile is created next to the PBO (e.g.,MyMod_Scripts.pbo.MyMod.bisign) - Repeat for every
.pboin youraddons/folder
Signing via Command Line
For automation or multiple PBOs, use the command line:
"C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools\Bin\DsUtils\DSSignFile.exe" MyMod.biprivatekey MyMod_Scripts.pboTo sign all PBOs in a folder with a batch script:
@echo off
set DSSIGN="C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools\Bin\DsUtils\DSSignFile.exe"
set KEY="path\to\MyMod.biprivatekey"
for %%f in (addons\*.pbo) do (
echo Signing %%f ...
%DSSIGN% %KEY% "%%f"
)
echo All PBOs signed.
pauseAfter Signing: Verify Your Folder
Your addons/ folder should look like this:
addons/
├── MyMod_Scripts.pbo
├── MyMod_Scripts.pbo.MyMod.bisign
├── MyMod_Data.pbo
└── MyMod_Data.pbo.MyMod.bisignEvery .pbo must have a corresponding .bisign. If any .bisign is missing, players will be kicked from signature-verified servers.
Place the Public Key
Copy MyMod.bikey into your @MyMod/keys/ folder. This is what server operators will copy into their server's keys/ directory to allow your mod.
Step 6: Publish via DayZ Tools Publisher
DayZ Tools includes a built-in Workshop publisher -- the easiest way to get your mod onto Steam.
Open the Publisher
- Open DayZ Tools from Steam
- Click Publisher in the main window (may also be labeled "Workshop Tool")
- The Publisher window opens with fields for your mod details
Fill In the Details
| Field | What to Enter |
|---|---|
| Title | Your mod's display name (e.g., "My Awesome Mod") |
| Description | Detailed overview of what your mod does. Supports Steam's BB code formatting (see below) |
| Preview Image | Browse to your 512 x 512 .png or .jpg preview image |
| Mod Folder | Browse to your complete @MyMod folder |
| Tags | Select relevant tags (e.g., Weapons, Vehicles, UI, Server, Gear, Maps) |
| Visibility | Public (anyone can find it), Friends Only, or Unlisted (only accessible via direct link) |
Steam BB Code Quick Reference
The Workshop description supports BB code:
[h1]Features[/h1]
[list]
[*] Feature one
[*] Feature two
[/list]
[b]Bold[/b] [i]Italic[/i] [code]Code[/code]
[url=https://example.com]Link text[/url]
[img]https://example.com/image.png[/img]Publish
- Review all fields one final time
- Click Publish (or Upload)
- Wait for the upload to complete. Large mods may take several minutes depending on your connection.
- Once complete, you will see a confirmation with your Workshop ID (a long numeric ID like
2345678901) - Save this Workshop ID. You need it to push updates later.
After Publishing: Verify
Do not skip this. Test your mod as a regular player would:
- Visit
https://steamcommunity.com/sharedfiles/filedetails/?id=YOUR_IDand verify title, description, preview image - Subscribe to your own mod on the Workshop
- Launch DayZ, confirm the mod appears in the launcher
- Enable it, launch the game, join a server (or run your own test server)
- Confirm all features work
- Update the
actionfield inmod.cppto point to your Workshop page URL
If anything is broken, update and re-upload before announcing publicly.
Publishing via Command Line (Alternative)
For automation, CI/CD, or batch uploads, SteamCMD provides a command-line alternative.
Install SteamCMD
Download from Valve's developer site and extract to a folder like C:\SteamCMD\.
Create a VDF File
SteamCMD uses a .vdf file to describe what to upload. Create a file called workshop_publish.vdf:
"workshopitem"
{
"appid" "221100"
"publishedfileid" "0"
"contentfolder" "C:\\Path\\To\\@MyMod"
"previewfile" "C:\\Path\\To\\preview.png"
"visibility" "0"
"title" "My Awesome Mod"
"description" "A comprehensive mod for DayZ."
"changenote" "Initial release"
}Field Reference
| Field | Value |
|---|---|
appid | Always 221100 for DayZ |
publishedfileid | 0 for a new item; use the Workshop ID for updates |
contentfolder | Absolute path to your @MyMod folder |
previewfile | Absolute path to your preview image |
visibility | 0 = Public, 1 = Friends Only, 2 = Unlisted, 3 = Private |
title | Mod name |
description | Mod description (plain text) |
changenote | Text shown in the change history on the Workshop page |
Run SteamCMD
C:\SteamCMD\steamcmd.exe +login YourSteamUsername +workshop_build_item "C:\Path\To\workshop_publish.vdf" +quitSteamCMD will prompt for your password and Steam Guard code on first use. After authentication, it uploads the mod and prints the Workshop ID.
When to Use Command Line
- Automated builds: integrate into a build script that packs PBOs, signs them, and uploads in one step
- Batch operations: uploading multiple mods at once
- Headless servers: environments without a GUI
- CI/CD pipelines: GitHub Actions or similar can call SteamCMD
Updating Your Mod
Step-by-Step Update Process
- Make your code changes and test thoroughly
- Increment the version in
mod.cpp(e.g.,"1.0.0"becomes"1.0.1") - Rebuild all PBOs using Addon Builder or your build script
- Re-sign all PBOs with the same private key you used originally
- Open the DayZ Tools Publisher
- Enter your existing Workshop ID (or select the existing item)
- Point to your updated
@MyModfolder - Write a change note describing what changed
- Click Publish / Update
Using SteamCMD for Updates
Update the VDF file with your Workshop ID and a new change note:
"workshopitem"
{
"appid" "221100"
"publishedfileid" "2345678901"
"contentfolder" "C:\\Path\\To\\@MyMod"
"changenote" "v1.0.1 - Fixed item duplication bug, added French translation"
}Then run SteamCMD as before. The publishedfileid tells Steam to update the existing item instead of creating a new one.
Important: Use the Same Key
Always sign updates with the same private key you used for the original release. If you sign with a different key, server operators must replace the old .bikey with your new one -- which means downtime and confusion. Only generate a new key pair if your private key is compromised.
Version Management Best Practices
Semantic Versioning
Use MAJOR.MINOR.PATCH format:
| Component | When to Increment | Example |
|---|---|---|
| MAJOR | Breaking changes: config format changes, removed features, API overhauls | 1.0.0 to 2.0.0 |
| MINOR | New features that are backwards-compatible | 1.0.0 to 1.1.0 |
| PATCH | Bug fixes, small tweaks, translation updates | 1.0.0 to 1.0.1 |
Changelog Format
Maintain a changelog in your Workshop description or a separate file. A clean format:
v1.2.0 (2025-06-15)
- Added: Night vision toggle keybind
- Added: German and Spanish translations
- Fixed: Inventory crash when dropping stacked items
- Changed: Reduced default spawn rate from 5 to 3
v1.1.0 (2025-05-01)
- Added: New crafting recipes for 4 items
- Fixed: Server crash on player disconnect during trade
v1.0.0 (2025-04-01)
- Initial releaseBackwards Compatibility
When your mod saves persistent data (JSON configs, player data files), think carefully before changing the format:
- Adding new fields is safe. Use default values for missing fields when loading old files.
- Renaming or removing fields is a breaking change. Increment MAJOR version.
- Consider a migration pattern: detect the old format, convert to new format, save.
Example migration check in Enforce Script:
// In your config load function
if (config.configVersion < 2)
{
// Migrate from v1 to v2: rename "oldField" to "newField"
config.newField = config.oldField;
config.configVersion = 2;
SaveConfig(config);
SDZ_Log.Info("MyMod", "Config migrated from v1 to v2");
}Git Tagging
If you use Git for version control (and you should), tag each release:
git tag -a v1.0.0 -m "Initial release"
git push origin v1.0.0This creates a permanent reference point so you can always go back to the exact code of any published version.
Workshop Page Best Practices
Description Structure
Organize your description with these sections:
- Overview -- what the mod does, in 2-3 sentences
- Features -- bullet list of key features
- Requirements -- list all dependency mods with Workshop links
- Installation -- step-by-step for players (usually just "subscribe and enable")
- Server Setup -- instructions for server operators (key placement, config files)
- FAQ -- common questions answered preemptively
- Known Issues -- be honest about current limitations
- Support -- link to your Discord, GitHub issues, or forum thread
- Changelog -- recent version history
- License -- how others can (or cannot) use your work
Screenshots and Media
- Include 3-5 in-game screenshots showing your mod in action
- If your mod adds UI, show the UI panels clearly
- If your mod adds items, show them in-game (not just in the editor)
- A short gameplay video dramatically increases subscriptions
Dependencies
If your mod requires other mods, list them clearly with Workshop links. Use the Steam Workshop "Required Items" feature so the launcher automatically loads dependencies.
Update Schedule
Set expectations. If you update weekly, say so. If updates are occasional, say "updates as needed." Players are more understanding when they know what to expect.
Guide for Server Operators
Include this information in your Workshop description for server admins.
Installing a Workshop Mod on a Dedicated Server
- Download the mod using SteamCMD or the Steam client:batch
steamcmd +login anonymous +workshop_download_item 221100 WORKSHOP_ID +quit - Copy (or symlink) the
@ModNamefolder to the DayZ Server directory - Copy the
.bikeyfile from@ModName/keys/to the server'skeys/folder - Add the mod to the
-mod=launch parameter
Launch Parameter Syntax
Mods are loaded via the -mod= parameter, separated by semicolons:
-mod=@CF;@VPPAdminTools;@MyModUse the full relative path from the server root. On Linux, paths are case-sensitive.
Load Order
Mods load in the order listed in -mod=. This matters when mods depend on each other:
- Dependencies first. If
@MyModrequires@CF, list@CFbefore@MyMod. - General rule: frameworks first, content mods last.
- If your mod declares
requiredAddonsinconfig.cpp, DayZ will attempt to resolve load order automatically, but explicit ordering in-mod=is safer.
Key Management
- Place one
.bikeyper mod in the server'skeys/directory - When a mod updates with the same key, no action needed -- existing
.bikeystill works - If a mod author changes keys, you must replace the old
.bikeywith the new one - The
keys/folder path is relative to the server root (e.g.,DayZServer/keys/)
Distribution Without the Workshop
When to Skip the Workshop
- Private mods for your own server community
- Beta testing with a small group before public release
- Commercial or licensed mods distributed through other channels
- Rapid iteration during development (faster than re-uploading each time)
Creating a Release ZIP
Package your mod for manual distribution:
MyMod_v1.0.0.zip
└── @MyMod/
├── addons/
│ ├── MyMod_Scripts.pbo
│ ├── MyMod_Scripts.pbo.MyMod.bisign
│ ├── MyMod_Data.pbo
│ └── MyMod_Data.pbo.MyMod.bisign
├── keys/
│ └── MyMod.bikey
└── mod.cppInclude a README.txt with installation instructions:
INSTALLATION:
1. Extract the @MyMod folder into your DayZ game directory
2. (Server operators) Copy MyMod.bikey from @MyMod/keys/ to your server's keys/ folder
3. Add @MyMod to your -mod= launch parameterGitHub Releases
If your mod is open source, use GitHub Releases to host versioned downloads:
- Tag the release in Git (
git tag v1.0.0) - Build and sign PBOs
- Create a ZIP of the
@MyModfolder - Create a GitHub Release and attach the ZIP
- Write release notes in the release description
This gives you version history, download counts, and a stable URL for each release.
Common Problems and Solutions
| Problem | Cause | Fix |
|---|---|---|
| "Addon rejected by server" | Server missing .bikey, or .bisign does not match .pbo | Confirm .bikey is in server keys/ folder. Re-sign PBOs with the correct .biprivatekey. |
| "Signature check failed" | PBO modified after signing, or signed with wrong key | Rebuild PBO from clean source. Re-sign with the same key that generated the server's .bikey. |
| Mod not in DayZ Launcher | Malformed mod.cpp or wrong folder structure | Check mod.cpp for syntax errors (missing ;). Ensure folder starts with @. Restart launcher. |
| Upload fails in Publisher | Auth, connection, or file lock issue | Verify Steam login. Close Workbench/Addon Builder. Try running DayZ Tools as Administrator. |
| Wrong/missing Workshop icon | Bad path in mod.cpp or wrong image format | Verify picture/logo paths point to actual .paa files. Workshop preview (.png) is separate. |
| Conflicts with other mods | Redefining vanilla classes instead of modding them | Use modded class, call super in overrides, set requiredAddons for load order. |
| Players crash on load | Script errors, corrupt PBOs, or missing dependencies | Check .RPT logs. Rebuild PBOs from clean source. Verify dependencies load first. |
The Complete Mod Lifecycle
IDEA → SETUP (8.1) → STRUCTURE (8.1, 8.5) → CODE (8.2, 8.3, 8.4) → BUILD (8.1)
→ TEST → DEBUG (8.6) → POLISH → SIGN (8.7) → PUBLISH (8.7) → MAINTAIN (8.7)
↑ │
└────── feedback loop ───────────────┘After publishing, player feedback sends you back to CODE, TEST, and DEBUG. That cycle of publish-feedback-improve is how great mods are built.
Next Steps
You have completed the full DayZ modding tutorial series -- from a blank workspace to a published, signed, and maintained mod on the Steam Workshop. From here:
- Explore the reference chapters (Chapters 1-7) for deeper knowledge on the GUI system, config.cpp, and Enforce Script
- Study open-source mods like CF, Community Online Tools, and Expansion for advanced patterns
- Join the DayZ modding community on Discord and the Bohemia Interactive forums
- Build bigger. Your first mod was Hello World. Your next one could be a complete gameplay overhaul.
The tools are in your hands. Build something great.
