---
title: 'Steam publication plan'
url: 'https://wiki.teletypegames.org/platforms/ebitengine/steam-publication-plan'
markdown: 'https://wiki.teletypegames.org/platforms/ebitengine/steam-publication-plan.md'
lang: en
date: '2026-06-11'
description: 'Timeline Time Phase T−10 weeks Steam onboarding T−9 → T−7 weeks Store setup T−8 → T−5 weeks AI usage review T−6 → T−3 weeks Steam integration T−2 weeks Steam review Release day Publish Mandatory platform cost Item Cost Steam Direct Fee $100 USD + applicable tax T−10 w…'
taxonomy:
  tag:
    - ebitengine
---

# Steam publication plan

## Timeline

| Time | Phase |
|---|---|
| T−10 weeks | Steam onboarding |
| T−9 → T−7 weeks | Store setup |
| T−8 → T−5 weeks | AI usage review |
| T−6 → T−3 weeks | Steam integration |
| T−2 weeks | Steam review |
| Release day | Publish |

## Mandatory platform cost

| Item | Cost |
|---|---|
| Steam Direct Fee | $100 USD + applicable tax |

---

# T−10 weeks — Steam onboarding

## Tasks

- Sign into Steam
- Register for Steamworks
- Accept distribution agreements
- Complete identity verification
- Configure bank payout information
- Complete tax forms
- Pay Steam Direct fee

## Result

- Steamworks dashboard access
- App ID assigned

---

# T−9 to T−7 weeks — Store setup

## Configure store page

### Basic metadata

- Game name
- Short description
- Long description
- Supported languages
- Categories
- Tags
- Pricing

### Media

- Capsule images
- Header image
- Screenshots
- Trailer (optional)

### Technical information

- Minimum specs
- Recommended specs
- Supported controllers
- Multiplayer flags
- Steam Deck compatibility (optional)

### Release settings

```text
Visibility → Coming Soon
Planned release date
```

## Requirement

Coming Soon page should remain public for at least 2 weeks before launch.

---

# T−8 to T−5 weeks — AI usage review (only if applicable)

Create:

```text
AI_DISCLOSURE.md
```

## Tracking table

| Area | Tool | Included in final game |
|---|---|---|
| Code | Yes/No | Yes/No |
| Art | Yes/No | Yes/No |
| Audio | Yes/No | Yes/No |
| Text | Yes/No | Yes/No |
| Runtime generation | Yes/No | Yes/No |

## Disclosure required if AI generated

- Art
- Text
- Audio
- Localization
- Gameplay content
- Marketing assets

## Usually not required

- Coding assistants
- Internal productivity tools
- Prototypes

---

# T−6 to T−3 weeks — Steam integration (Go + Ebitengine)

## Install Steam SDK

Project structure:

```text
project/
├── cmd/game
├── internal
├── assets
├── steam/
│   ├── sdk/
│   └── lib/
└── build/
```

Required SDK folders:

```text
sdk/public/
sdk/redistributable_bin/
```

---

## Install Go Steam bindings

```bash
go get github.com/Philipp15b/go-steamworks
```

Enable:

```bash
CGO_ENABLED=1
```

---

## Configure Steam App ID

Development only:

```text
steam_appid.txt
```

Example:

```text
1234567
```

Directory:

```text
game.exe
steam_appid.txt
```

Remove before release upload.

---

## Steam initialization

```go
package steam

import steamworks "github.com/Philipp15b/go-steamworks"

func Init() error {
    return steamworks.Init()
}

func Shutdown() {
    steamworks.Shutdown()
}
```

Startup:

```go
func main() {

    if err := steam.Init(); err != nil {
        panic(err)
    }

    defer steam.Shutdown()

    runGame()
}
```

---

## Ebitengine callback loop

```go
type Game struct{}

func (g *Game) Update() error {

    steamworks.RunCallbacks()

    return nil
}
```

---

## Runtime verification

```go
func VerifySteam() bool {
    return steamworks.IsSteamRunning()
}
```

Optional:

```go
if !VerifySteam() {
    log.Println("Steam unavailable")
}
```

---

## Achievements

Configure in Steam dashboard.

Example:

```go
func UnlockFirstWin() {

    steamworks.UserStats().
        SetAchievement("FIRST_WIN")

    steamworks.UserStats().
        StoreStats()
}
```

---

## Steam Cloud

Enable cloud support.

Recommended save locations:

Windows:

```text
%USERPROFILE%/AppData/Local/Game
```

Linux:

```text
~/.local/share/game
```

Example:

```go
func SavePath() string {

    return filepath.Join(
        os.UserConfigDir(),
        "yourgame",
    )
}
```

---

## Rich Presence (optional)

```go
steamworks.
Friends().
SetRichPresence(
    "status",
    "Playing",
)
```

---

## Overlay

Check:

```go
steamworks.
Utils().
IsOverlayEnabled()
```

Open:

```go
steamworks.
Friends().
ActivateGameOverlay(
    "Achievements",
)
```

---

## Build release binaries

Windows:

```bash
go build \
-ldflags="-s -w" \
-o build/game.exe
```

Linux:

```bash
go build \
-ldflags="-s -w" \
-o build/game
```

---

## SteamPipe upload

Build folder:

```text
build/
├── game.exe
├── assets/
└── steam_api64.dll
```

Create:

```text
app_build.vdf
```

Example:

```text
"AppBuild"
{
 "AppID" "1234567"

 "ContentRoot" "./build"

 "BuildOutput" "./output"

 "Depots"
 {
   "1234568"
   {
     "FileMapping"
     {
       "LocalPath" "*"
       "DepotPath" "."
       "recursive" "1"
     }
   }
 }
}
```

Upload:

```bash
steamcmd \
+login USER \
+run_app_build app_build.vdf \
+quit
```

---

## Branches

Recommended:

```text
default
beta
dev
```

Promotion flow:

```text
dev
↓
beta
↓
default
```

---

## Technical validation

### Rendering

- Fullscreen
- Windowed
- DPI scaling

### Input

- Keyboard
- Mouse
- Controller

### Audio

- Device reconnect
- Mute/unmute

### Saves

- Save
- Load
- Upgrade old saves

### Steam

- Overlay
- Achievements
- Cloud
- Relaunch

### Packaging

Release contains:

```text
game.exe
steam_api64.dll
assets/
```

Release does NOT contain:

```text
steam_appid.txt
*.pdb
testdata/
editor files
source code
```

---

# T−2 weeks — Steam review

Submit:

- Store page
- Build

Steam verifies:

- Build launches
- Store accuracy
- Configuration validity

Prepare:

- Emergency patch branch
- Release tag
- Smoke test

---

# Release day

## Sequence

```text
1. Upload final build
2. Verify store
3. Verify pricing
4. Publish build
5. Press Release App
6. Install from Steam
7. Verify overlay
8. Verify saves
9. Verify achievements
10. Monitor crashes
```

---

# Final summary

## Required

- Steam account
- Steamworks onboarding
- Tax information
- Bank information
- Store page
- Uploadable build
- Steam review
- Steam Direct payment

## Required only if applicable

- AI disclosure

## Mandatory publication cost

$100 USD (+ applicable tax)

'; var prevLevel = 2; for (var i = 0; i < headings.length; i++) { var h = headings\[i\]; var text = h.textContent.trim(); var slug = text.toLowerCase() .replace(/\[áàâä\]/g,'a').replace(/\[éèêë\]/g,'e').replace(/\[íìîï\]/g,'i') .replace(/\[óòôöő\]/g,'o').replace(/\[úùûüű\]/g,'u') .replace(/\[^a-z0-9\]+/g, '-').replace(/^-|-$/g, ''); if (!slug) slug = 'heading-' + i; if (used\[slug\]) { slug += '-' + i; } used\[slug\] = true; h.id = slug; var level = parseInt(h.tagName.charAt(1)); var cls = level > 2 ? ' class="toc-child"' : ''; html += '- [' + text + '](#'%20+%20slug%20+%20')
'; } html += '
'; toc.innerHTML = html; // Scroll-spy: highlight current heading var links = toc.querySelectorAll('a'); var ids = \[\]; for (var j = 0; j < links.length; j++) ids.push(links\[j\].getAttribute('href').slice(1)); function updateActive() { var current = ''; for (var k = 0; k < ids.length; k++) { var el = document.getElementById(ids\[k\]); if (el && el.getBoundingClientRect().top <= 80) current = ids\[k\]; } for (var m = 0; m < links.length; m++) { links\[m\].parentNode.classList.toggle('active', links\[m\].getAttribute('href') === '#' + current); } } window.addEventListener('scroll', updateActive, { passive: true }); updateActive(); })();

---

## Navigation

- Parent: [Ebitengine](https://wiki.teletypegames.org/platforms/ebitengine.md)
