Steam Publish (Steamworks + SteamPipe)
Take a finished build to a live Steam store page. Two tracks run in parallel and both must be
approved before release: the store page (presence) and the build (SteamPipe upload +
the release checklists). This skill is the operational checklist; deep build-script,
CI/CD, and troubleshooting detail lives in references/steampipe-build-scripts.md.
When to use
- Use when setting up a Steam app, building/editing the store page, configuring depots and
packages, uploading a build via SteamPipe/steamcmd, managing beta branches, or releasing
and updating a Steam title.
- Triggers:
steam_appid.txt, the Steamworks SDK tools/ContentBuilder, app_build_*.vdf,
steamcmd, "publish on Steam", "depot", "set build live".
When not to use: publishing on itch.io (use itch-publish); writing the
Steamworks API in-game (achievements/cloud/overlay live in engine SDK integrations, not
here); store/financial advice (pricing strategy, tax) — direct the user to Steamworks docs
and their own counsel.
Prerequisites (do these once, in order)
- Partner account + Steam Direct fee. Each new app requires the Steam Direct recoupable
fee (USD $100 per app at time of writing). You receive an App ID — find it on your
Steamworks homepage. Treat the App ID as the key to everything below.
- A dedicated build account with least privilege. Builds require a Steam account in your
partner group with Edit App Metadata and Publish App Changes To Steam. Create a
separate build account with only those permissions (not your admin login). Releasing the
app additionally needs Manage pricing and discounts.
- Download the Steamworks SDK on the upload machine. The SteamPipe tools are under
tools/ContentBuilder/.
Security note: never commit account passwords or the config.vdf login token to the repo.
See the CI/CD section in the reference for the supported token workflow.
Core workflow
- Configure the app (App Admin).
- Set launch options (executable path + args per OS) under Installation. For a
sub-folder exe, put the sub-folder in the Executable field — no leading slashes/dots.
- Add depots on the Depots page (a depot is a bucket of files). Name each depot
("Base Content", "Windows Content"). Leave [All languages] / [All OSes] unless the
depot is genuinely OS- or language-specific.
- Grant yourself the depots: add them to your Developer Comp package on the
Associated Packages & DLC page, or you won't own the content you upload.
- Publish the configuration. Unpublished config is the most common cause of upload
failures.
- Build the store page (presence track). Fill graphical assets, description, tags,
trailers, system requirements. When complete, click Mark as ready for review. Store
review takes ~3-5 business days; submit at least 7 days before you want it live. It
must be in Coming Soon for at least 2 weeks before release.
- Create your build scripts. Start with the simple app-build
.vdf in Patterns below;
for multi-depot/multi-platform apps use depot scripts (see the reference). The script maps
local files into depots and names where build output/logs go.
- Bootstrap steamcmd and upload. Run
steamcmd once to self-update, then run the build
(Patterns). steamcmd chunks files (~1 MB), uploads only changed chunks, and registers a
global BuildID.
- Set the build live on a branch. Go to
https://partner.steamgames.com/apps/builds/<AppID>,
pick the build, Preview Change, then Set Build Live Now for a branch. Test on a
beta branch first (see references/steampipe-build-scripts.md for branch setup).
- Run the Game Build checklist and Mark as ready for review (store presence must be
submitted before the build review). Both tracks must be approved.
- Release manually. When approved and Coming Soon has run its time, use the green
Release App button → Publish Now → Release Now. Approved titles do not
release themselves.
- Update later by uploading a new build and setting it live on
default (manually) or
shipping to a beta branch first. See references/steampipe-build-scripts.md.
Patterns
1. SteamPipe ContentBuilder layout (Steamworks SDK)
tools/ContentBuilder/
builder/ steamcmd.exe (Windows) <- run once to bootstrap
builder_linux/ steamcmd (Linux)
builder_osx/ steamcmd (macOS)
content/ <- your final, runnable build goes here (the files players get)
output/ build logs + chunk cache (safe to delete; speeds up re-uploads)
scripts/ <- your *.vdf build scripts live here
2. Minimal app build script — app_build_1000.vdf
// AppID 1000 with one depot (1001): upload everything under ../content recursively.
// VDF is Valve KeyValues: "key" "value", braces for nesting. Adjust IDs to your app.
"AppBuild"
{
"AppID" "1000" // your App ID
"Desc" "1.0.0 launch build" // internal only; visible in Your Builds
"ContentRoot" "..\content\" // root of files to upload (relative to this file)
"BuildOutput" "..\output\" // logs + chunk cache
"Depots"
{
"1001" // your Depot ID
{
"FileMapping"
{
"LocalPath" "*" // all files from ContentRoot
"DepotPath" "." // mapped to the depot root
"recursive" "1" // include subfolders
}
}
}
}
3. Upload the build (Windows; substitute the platform builder elsewhere)
REM Run from the SDK. Bootstrap once, then build. Use a build account, not your admin login.
tools\ContentBuilder\builder\steamcmd.exe ^
+login <build_account> <password> ^
+run_app_build ..\scripts\app_build_1000.vdf ^
+quit
What happens: steamcmd self-updates -> logs in -> for each depot, hashes files into ~1 MB
chunks -> uploads only NEW chunks -> writes a depot manifest -> finishes with a global
BuildID. The build is NOT live yet; set it live per the workflow above.
4. Iterate safely with a preview build (uploads nothing)
// Add to the AppBuild block to validate file mappings without uploading:
"Preview" "1" // outputs logs + a file manifest into BuildOutput only
// And to auto-set live on a BETA branch after a successful build (never 'default'):
"SetLive" "beta-qa"
Pitfalls
- The
default branch cannot be set live automatically. SetLive only works for a
beta branch; you must set the default (customer) build live by hand in App Admin. Plan
releases around this.
- Store page must be approved before the build. You cannot submit the build for review
until store presence is submitted; both must pass, and Coming Soon must run ~2 weeks.
- Titles never auto-release. Even after approval, a human must click Release App at
the chosen moment.
- Mac/Linux install nothing. Almost always: the OS-specific depots aren't in the package.
Add every depot to the package on Associated Packages & DLC.
- Unpublished app config. "Failed to get application info" / build errors usually mean
depots, launch options, or the App ID config were never Published.
status = 6 on build. The build account lacks permission for the App ID, or
ContentRoot/LocalPath points at the wrong (empty) path.
- Committing the login token. The
config.vdf Steam Guard token and account password are
secrets. Keep them out of the repo; use the CI workflow in the reference.
- Released-app safety delay. Changing the build account's email/phone forces a 3-day
wait before you can set a build live for a released app — don't reconfigure the account
right before launch.
References
- For advanced multi-depot/multi-platform build scripts,
FileExclusion/FileProperties,
beta-branch setup, the CI/CD login-token workflow, and the SteamPipe troubleshooting table,
read references/steampipe-build-scripts.md.
- Primary docs: Steamworks "Uploading to Steam" (
partner.steamgames.com/doc/sdk/uploading),
"Release Process" (/doc/store/releasing), "Branches (Betas)" (/doc/store/application/branches),
"Depots" (/doc/store/application/depots).
Related skills
itch-publish — the same game shipped on itch.io with butler (often done alongside Steam).
game-jam / prototype-fast — earlier stages of the same project's lifecycle.
1---
2name: steam-publish
3description: >
4 Publish or update a game on Steam with Steamworks and SteamPipe: configure depots and
5 packages, upload builds with steamcmd, set a build live on a branch, and run the release
6 checklists. Use for Steam publishing, app_build.vdf/steamcmd uploads, depots, beta branches,
7 or a store page release.
8---
9
10# Steam Publish (Steamworks + SteamPipe)
11
12Take a finished build to a live Steam store page. Two tracks run in parallel and both must be
13approved before release: the **store page** (presence) and the **build** (SteamPipe upload +
14the release checklists). This skill is the operational checklist; deep build-script,
15CI/CD, and troubleshooting detail lives in `references/steampipe-build-scripts.md`.
16
17## When to use
18
19- Use when setting up a Steam app, building/editing the store page, configuring depots and
20 packages, uploading a build via SteamPipe/steamcmd, managing beta branches, or releasing
21 and updating a Steam title.
22- Triggers: `steam_appid.txt`, the Steamworks SDK `tools/ContentBuilder`, `app_build_*.vdf`,
23 `steamcmd`, "publish on Steam", "depot", "set build live".
24
25**When *not* to use:** publishing on itch.io (use `itch-publish`); writing the
26Steamworks **API** in-game (achievements/cloud/overlay live in engine SDK integrations, not
27here); store/financial *advice* (pricing strategy, tax) — direct the user to Steamworks docs
28and their own counsel.
29
30## Prerequisites (do these once, in order)
31
321. **Partner account + Steam Direct fee.** Each new app requires the Steam Direct recoupable
33 fee (USD $100 per app at time of writing). You receive an **App ID** — find it on your
34 Steamworks homepage. Treat the App ID as the key to everything below.
352. **A dedicated build account with least privilege.** Builds require a Steam account in your
36 partner group with **Edit App Metadata** and **Publish App Changes To Steam**. Create a
37 *separate* build account with only those permissions (not your admin login). Releasing the
38 app additionally needs **Manage pricing and discounts**.
393. **Download the Steamworks SDK** on the upload machine. The SteamPipe tools are under
40 `tools/ContentBuilder/`.
41
42> Security note: never commit account passwords or the `config.vdf` login token to the repo.
43> See the CI/CD section in the reference for the supported token workflow.
44
45## Core workflow
46
471. **Configure the app (App Admin).**
48 - Set **launch options** (executable path + args per OS) under *Installation*. For a
49 sub-folder exe, put the sub-folder in the Executable field — no leading slashes/dots.
50 - Add **depots** on the *Depots* page (a depot is a bucket of files). Name each depot
51 ("Base Content", "Windows Content"). Leave *[All languages]* / *[All OSes]* unless the
52 depot is genuinely OS- or language-specific.
53 - **Grant yourself the depots:** add them to your **Developer Comp** package on the
54 *Associated Packages & DLC* page, or you won't own the content you upload.
55 - **Publish** the configuration. Unpublished config is the most common cause of upload
56 failures.
572. **Build the store page (presence track).** Fill graphical assets, description, tags,
58 trailers, system requirements. When complete, click **Mark as ready for review**. Store
59 review takes ~3-5 business days; submit at least **7 days** before you want it live. It
60 must be in **Coming Soon** for at least **2 weeks** before release.
613. **Create your build scripts.** Start with the simple app-build `.vdf` in Patterns below;
62 for multi-depot/multi-platform apps use depot scripts (see the reference). The script maps
63 local files into depots and names where build output/logs go.
644. **Bootstrap steamcmd and upload.** Run `steamcmd` once to self-update, then run the build
65 (Patterns). steamcmd chunks files (~1 MB), uploads only changed chunks, and registers a
66 global **BuildID**.
675. **Set the build live on a branch.** Go to `https://partner.steamgames.com/apps/builds/<AppID>`,
68 pick the build, **Preview Change**, then **Set Build Live Now** for a branch. Test on a
69 beta branch first (see `references/steampipe-build-scripts.md` for branch setup).
706. **Run the Game Build checklist** and **Mark as ready for review** (store presence must be
71 submitted *before* the build review). Both tracks must be approved.
727. **Release manually.** When approved and Coming Soon has run its time, use the green
73 **Release App** button → **Publish Now** → **Release Now**. Approved titles do **not**
74 release themselves.
758. **Update later** by uploading a new build and setting it live on `default` (manually) or
76 shipping to a beta branch first. See `references/steampipe-build-scripts.md`.
77
78## Patterns
79
80### 1. SteamPipe ContentBuilder layout (Steamworks SDK)
81
82```text
83tools/ContentBuilder/
84 builder/ steamcmd.exe (Windows) <- run once to bootstrap
85 builder_linux/ steamcmd (Linux)
86 builder_osx/ steamcmd (macOS)
87 content/ <- your final, runnable build goes here (the files players get)
88 output/ build logs + chunk cache (safe to delete; speeds up re-uploads)
89 scripts/ <- your *.vdf build scripts live here
90```
91
92### 2. Minimal app build script — `app_build_1000.vdf`
93
94```text
95// AppID 1000 with one depot (1001): upload everything under ../content recursively.
96// VDF is Valve KeyValues: "key" "value", braces for nesting. Adjust IDs to your app.
97"AppBuild"
98{
99 "AppID" "1000" // your App ID
100 "Desc" "1.0.0 launch build" // internal only; visible in Your Builds
101
102 "ContentRoot" "..\content\" // root of files to upload (relative to this file)
103 "BuildOutput" "..\output\" // logs + chunk cache
104
105 "Depots"
106 {
107 "1001" // your Depot ID
108 {
109 "FileMapping"
110 {
111 "LocalPath" "*" // all files from ContentRoot
112 "DepotPath" "." // mapped to the depot root
113 "recursive" "1" // include subfolders
114 }
115 }
116 }
117}
118```
119
120### 3. Upload the build (Windows; substitute the platform builder elsewhere)
121
122```bat
123REM Run from the SDK. Bootstrap once, then build. Use a build account, not your admin login.
124tools\ContentBuilder\builder\steamcmd.exe ^
125 +login <build_account> <password> ^
126 +run_app_build ..\scripts\app_build_1000.vdf ^
127 +quit
128```
129
130```text
131What happens: steamcmd self-updates -> logs in -> for each depot, hashes files into ~1 MB
132chunks -> uploads only NEW chunks -> writes a depot manifest -> finishes with a global
133BuildID. The build is NOT live yet; set it live per the workflow above.
134```
135
136### 4. Iterate safely with a preview build (uploads nothing)
137
138```text
139// Add to the AppBuild block to validate file mappings without uploading:
140"Preview" "1" // outputs logs + a file manifest into BuildOutput only
141// And to auto-set live on a BETA branch after a successful build (never 'default'):
142"SetLive" "beta-qa"
143```
144
145## Pitfalls
146
147- **The `default` branch cannot be set live automatically.** `SetLive` only works for a
148 *beta* branch; you must set the default (customer) build live by hand in App Admin. Plan
149 releases around this.
150- **Store page must be approved before the build.** You cannot submit the build for review
151 until store presence is submitted; both must pass, and Coming Soon must run ~2 weeks.
152- **Titles never auto-release.** Even after approval, a human must click **Release App** at
153 the chosen moment.
154- **Mac/Linux install nothing.** Almost always: the OS-specific depots aren't in the package.
155 Add every depot to the package on *Associated Packages & DLC*.
156- **Unpublished app config.** "Failed to get application info" / build errors usually mean
157 depots, launch options, or the App ID config were never **Published**.
158- **`status = 6` on build.** The build account lacks permission for the App ID, or
159 `ContentRoot`/`LocalPath` points at the wrong (empty) path.
160- **Committing the login token.** The `config.vdf` Steam Guard token and account password are
161 secrets. Keep them out of the repo; use the CI workflow in the reference.
162- **Released-app safety delay.** Changing the build account's email/phone forces a **3-day**
163 wait before you can set a build live for a *released* app — don't reconfigure the account
164 right before launch.
165
166## References
167
168- For advanced multi-depot/multi-platform build scripts, `FileExclusion`/`FileProperties`,
169 beta-branch setup, the CI/CD login-token workflow, and the SteamPipe troubleshooting table,
170 read `references/steampipe-build-scripts.md`.
171- Primary docs: Steamworks "Uploading to Steam" (`partner.steamgames.com/doc/sdk/uploading`),
172 "Release Process" (`/doc/store/releasing`), "Branches (Betas)" (`/doc/store/application/branches`),
173 "Depots" (`/doc/store/application/depots`).
174
175## Related skills
176
177- `itch-publish` — the same game shipped on itch.io with `butler` (often done alongside Steam).
178- `game-jam` / `prototype-fast` — earlier stages of the same project's lifecycle.