Skip to content

Publishing and Distribution

When publishing your game server for players to run, you need to plan how they will download it, how they’ll update it, and how hosting platforms will automate that process at scale. Each distribution method has trade-offs.

If your game runs on Steam, you can use SteamCMD to distribute your dedicated server. It handles both installation and updates. It’s free to use, but comes with gotchas you need to plan around.

Steam’s depot settings control who can download your server files. There are three configurations, and your choice here has significant consequences:

Anonymous access (recommended)

Anyone can download the server files without a Steam account. This is the recommended approach because:

  • Hosting platforms can install and update servers at scale without managing Steam credentials
  • Open-source server management tools work without storing sensitive login data
  • No bottleneck on simultaneous downloads

The trade-off: your server files are publicly available. Make sure they contain only server logic and assets, not the full game client. If someone could use your server files to play the game without purchasing it, you’ve created a piracy vector. A properly built server executable (see Building Your Server Executable) should not have this problem.

Requiring authentication

This requires a logged-in Steam account to download. No practical upside, same downsides as requiring a purchase (below). Avoid this.

Requiring a purchase

Requires the downloading Steam account to own the game. This may seem like an anti-piracy measure, but it creates serious problems:

  • Open-source server management tools (AMP, Pterodactyl, etc.) cannot store Steam credentials securely, so they can’t install your server at all
  • Larger hosting platforms must maintain pools of Steam accounts, each with a purchased copy of your game
  • Only one server can download per account at a time, creating a bottleneck during high-demand periods (think launch day)
  • SteamGuard two-factor authentication adds another layer of complexity to automated downloads

This setting has broken hosting automation for multiple games at launch. Unless you have a specific reason to require it, use anonymous access.

Create a separate Steam App ID for your dedicated server tool. This is free to set up through Steamworks and keeps your server distribution separate from the game client distribution. It also ensures that downloading the server does not require owning the game.

SteamCMD handles updates via Steam’s depot system. When you push an update, SteamCMD can diff and download only changed files. This is efficient for hosts.

Document whether your updates require a full server restart or if the server can hot-reload certain changes. Hosting platforms need to know whether an update means “restart the server” or “restart and wipe the world.”

A common alternative: zip up the server build and host versions for download. Many studios set up a CI pipeline that exports build artifacts to cloud storage (Amazon S3, Backblaze B2, or a CDN).

This is the simplest approach to set up, but it creates version management challenges.

Because an archive contains many files, it’s difficult to determine which version is installed just by looking at the file system. Solve this with a manifest.json file at the root of the archive:

{
"version": "1.2.3",
"build": "20260115-001",
"minimum_client_version": "1.2.0"
}

Hosting platforms read this file to display the current version and detect when an update is available.

Updating means extracting the new archive over the existing installation. This has edge cases:

  • Deleted files from the previous version may linger on disk
  • Modified config files may be overwritten
  • It’s hard for hosting platforms to guarantee the server is in a known-good state

You can mitigate this by:

  • Having your server detect and clean up files from old versions at startup
  • Placing config files outside the archive extraction directory
  • Including a file manifest that lists exactly what files should exist

The simplest distribution format: one file that is the entire server. Minecraft’s server JAR is the canonical example.

Benefits:

  • Swapping versions is trivial (replace one file)
  • Hosting platforms can track the version by filename or a version command
  • No file state ambiguity

The trade-off is that this requires compiling or packaging your entire server into a single binary or runtime (like a JAR). This is uncommon outside of Java-based games and requires significant build tooling work.

If your technology stack supports it, this is the most hosting-friendly distribution format.

Regardless of distribution method, hosting platforms need a way to determine what version of your server is running. Support at least one of:

  • A manifest.json file at the root
  • A --version startup flag that prints the version and exits
  • A status console command that includes the version in its output
  • A query protocol response that includes the version

How do hosting platforms know a new version is available? Options:

  • SteamCMD: Handled automatically by Steam’s update system
  • RSS / API endpoint: Publish version info to a URL that hosting platforms can poll
  • Webhook: Notify hosting platforms directly when a new version ships
  • Manual: Hosting platforms check your changelog or download page (least reliable)

The more automated you make this, the faster your servers get updated across the ecosystem after a release.