Skip to content

Chapter 8.7: Publishing to the Steam Workshop

Home | << Previous: Debugging & Testing | Publishing to the Steam Workshop | Next: Building a HUD Overlay >>


Inhaltsverzeichnis


Einführung

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. Dieses Kapitel behandelt 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 am häufigsten 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.RPT or script_*.log)
  • [ ] All Print() debug statements removed or wrapped in #ifdef DEVELOPER
  • [ ] No hardcoded test values or leftover experimental code
  • [ ] stringtable.csv contains all user-facing strings with translations
  • [ ] credits.json filled out with author and contributor information
  • [ ] Logo image prepared (see Step 3 for sizes)
  • [ ] All textures converted to .paa format (not raw .png/.tga in 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 / FilePurpose
addons/Enthält all .pbo files (packed mod content) and their .bisign signature files
keys/Enthält the public key (.bikey) that servers use to verify your PBOs
mod.cppMod metadata: name, author, version, description, icon paths
meta.cppAuto-generated by DayZ Launcher; contains the Workshop ID after publishing

Wichtig Rules

  • The folder name must start with @. This is how DayZ identifies mod directories.
  • Every .pbo in addons/ must have a matching .bisign file next to it.
  • The .bikey file in keys/ must correspond to the private key used to create the .bisign files.
  • Do not include source files (.c scripts, 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

cpp
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

FieldRequiredDescription
nameYesDisplay name shown in the DayZ Launcher mod list
pictureYesPath to the main logo image (displayed in launcher). Relative to the P: drive or mod root
logoYesSame as picture in most cases; used in some UI contexts
logoSmallNoSmaller version of the logo for compact views
logoOverNoHover state of the logo (often same as logo)
tooltipYesShort one-line description shown on hover in the launcher
overviewYesLonger description shown in the mod details panel
authorYesYour name or team name
overviewPictureNoLarge image shown in the mod overview panel
actionNoURL opened when der Spieler clicks "Website" (typischerweise your Workshop page or GitHub)
versionYesCurrent version string (e.g., "1.0.0")
versionPathNoPath to a text file containing the version number (for automated builds)

Häufige Fehler

  • 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

ImageSizeFormatUsed 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 preview512 x 512 px.png or .jpgWorkshop page thumbnail
Overview picture1024 x 512 px.paa (in-game)Mod details panel

Converting Images to PAA

DayZ uses .paa textures internally. To convert PNG/TGA images:

  1. Open TexView2 (included with DayZ Tools)
  2. File > Open your .png or .tga image
  3. File > Save As > choose .paa format
  4. 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 wird 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 .pbo with the private key, producing a .bisign file
  • You distribute the .bikey with your mod; server operators place it in their keys/ folder
  • When a player joins, der Server checks each .pbo against its .bisign using the .bikey

Generating Keys with DayZ Tools

  1. Open DayZ Tools from Steam
  2. In the main window, find and click DS Create Key (sometimes listed under Tools or Utilities)
  3. Enter a key name -- use your mod name (e.g., MyMod)
  4. Choose where to save the files
  5. 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:

batch
"C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools\Bin\DsUtils\DSCreateKey.exe" MyMod

This creates MyMod.bikey and MyMod.biprivatekey in the current directory.

Critical Security Rule

NEVER share your .biprivatekey file. 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 muss signed with your private key. This produces .bisign files that sit alongside the PBOs.

Signing with DayZ Tools

  1. Open DayZ Tools
  2. Find and click DS Sign File (under Tools or Utilities)
  3. Select your .biprivatekey file
  4. Select the .pbo file to sign
  5. A .bisign file is created next to the PBO (e.g., MyMod_Scripts.pbo.MyMod.bisign)
  6. Repeat for every .pbo in your addons/ folder

Signing via Command Line

For automation or multiple PBOs, use the command line:

batch
"C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools\Bin\DsUtils\DSSignFile.exe" MyMod.biprivatekey MyMod_Scripts.pbo

To sign all PBOs in a folder with a batch script:

batch
@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.
pause

After 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.bisign

Every .pbo must have a corresponding .bisign. If any .bisign is missing, players wird 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

  1. Open DayZ Tools from Steam
  2. Click Publisher in the main window (may also be labeled "Workshop Tool")
  3. The Publisher window opens with fields for your mod details

Fill In the Details

FieldWhat to Enter
TitleYour mod's display name (e.g., "My Awesome Mod")
DescriptionDetailed overview of what your mod does. Unterstützt Steam's BB code formatting (siehe unten)
Preview ImageBrowse to your 512 x 512 .png or .jpg preview image
Mod FolderBrowse to your complete @MyMod folder
TagsSelect relevant tags (e.g., Weapons, Vehicles, UI, Server, Gear, Maps)
VisibilityPublic (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

  1. Review all fields one final time
  2. Click Publish (or Upload)
  3. Wait for the upload to complete. Large mods may take several minutes depending on your connection.
  4. Once complete, you will see a confirmation with your Workshop ID (a long numeric ID like 2345678901)
  5. 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:

  1. Visit https://steamcommunity.com/sharedfiles/filedetails/?id=YOUR_ID and verify title, description, preview image
  2. Subscribe to your own mod on the Workshop
  3. Launch DayZ, confirm the mod appears in the launcher
  4. Enable it, launch the game, join a server (or run your own test server)
  5. Confirm all features work
  6. Update the action field in mod.cpp to 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

FieldValue
appidAlways 221100 for DayZ
publishedfileid0 for a new item; use the Workshop ID for updates
contentfolderAbsolute path to your @MyMod folder
previewfileAbsolute path to your preview image
visibility0 = Public, 1 = Friends Only, 2 = Unlisted, 3 = Private
titleMod name
descriptionMod description (plain text)
changenoteText shown in the change history on the Workshop page

Run SteamCMD

batch
C:\SteamCMD\steamcmd.exe +login YourSteamUsername +workshop_build_item "C:\Path\To\workshop_publish.vdf" +quit

SteamCMD will prompt for your password and Steam Guard code on first use. After authentication, it uploads the mod and prints the Workshop ID.

Wann verwenden 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

  1. Make your code changes and test thoroughly
  2. Increment the version in mod.cpp (e.g., "1.0.0" becomes "1.0.1")
  3. Rebuild all PBOs using Addon Builder or your build script
  4. Re-sign all PBOs with the same private key you used originally
  5. Open the DayZ Tools Publisher
  6. Enter your existing Workshop ID (or select the existing item)
  7. Point to your updated @MyMod folder
  8. Write a change note describing what changed
  9. 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 stattdessen 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:

ComponentWhen to IncrementExample
MAJORBreaking changes: config format changes, removed features, API overhauls1.0.0 to 2.0.0
MINORNew features that are backwards-compatible1.0.0 to 1.1.0
PATCHBug fixes, small tweaks, translation updates1.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 release

Backwards 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:

csharp
// 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:

bash
git tag -a v1.0.0 -m "Initial release"
git push origin v1.0.0

This creates a permanent reference point so you can always go back to the exact code of any published version.


Workshop Page Best Practices

Beschreibung Structure

Organize your description with these sections:

  1. Overview -- what the mod does, in 2-3 sentences
  2. Features -- bullet list of key features
  3. Requirements -- list all dependency mods with Workshop links
  4. Installation -- step-by-step for players (usually just "subscribe and enable")
  5. Server Setup -- instructions for server operators (key placement, config files)
  6. FAQ -- common questions answered preemptively
  7. Known Issues -- be honest about current limitations
  8. Support -- link to your Discord, GitHub issues, or forum thread
  9. Changelog -- recent version history
  10. 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 automatisch 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

  1. Download the mod using SteamCMD or the Steam client:
    batch
    steamcmd +login anonymous +workshop_download_item 221100 WORKSHOP_ID +quit
  2. Copy (or symlink) the @ModName folder to the DayZ Server directory
  3. Copy the .bikey file from @ModName/keys/ to the server's keys/ folder
  4. Add the mod to the -mod= launch parameter

Launch Parameter Syntax

Mods are loaded via the -mod= parameter, separated by semicolons:

-mod=@CF;@VPPAdminTools;@MyMod

Use the full relative path from der 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 @MyMod requires @CF, list @CF before @MyMod.
  • General rule: frameworks first, content mods last.
  • If your mod declares requiredAddons in config.cpp, DayZ will attempt to resolve load order automatisch, but explicit ordering in -mod= is safer.

Key Management

  • Place one .bikey per mod in the server's keys/ directory
  • When a mod updates with the same key, no action needed -- existing .bikey still works
  • If a mod author changes keys, you must replace the old .bikey with the new one
  • The keys/ folder path is relative to der 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.cpp

Include 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 parameter

GitHub Releases

If your mod is open source, use GitHub Releases to host versioned downloads:

  1. Tag the release in Git (git tag v1.0.0)
  2. Build and sign PBOs
  3. Create a ZIP of the @MyMod folder
  4. Create a GitHub Release and attach the ZIP
  5. 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

ProblemCauseFix
"Addon rejected by server"Server missing .bikey, or .bisign macht nicht match .pboConfirm .bikey is in server keys/ folder. Re-sign PBOs with the correct .biprivatekey.
"Signature check failed"PBO modified after signing, or signed with wrong keyRebuild PBO from clean source. Re-sign with the same key that generated the server's .bikey.
Mod not in DayZ LauncherMalformed mod.cpp or wrong folder structureCheck mod.cpp for syntax errors (missing ;). Ensure folder starts with @. Restart launcher.
Upload fails in PublisherAuth, connection, or file lock issueVerify Steam login. Close Workbench/Addon Builder. Try running DayZ Tools as Administrator.
Wrong/missing Workshop iconBad path in mod.cpp or wrong image formatVerify picture/logo paths point to actual .paa files. Workshop preview (.png) is separate.
Conflicts with other modsRedefining vanilla classes stattdessen of modding themUse modded class, call super in overrides, set requiredAddons for load order.
Players crash on loadScript errors, corrupt PBOs, or missing dependenciesCheck .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.


Nächste Schritte

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.

Released under CC BY-SA 4.0 | Code examples under MIT License