# Releases & deprecation

> Immutable releases, versions, digests and deprecation.

A **release** is one published version of a game, named
`<namespace>/<slug>@<version>`, for example `gabriel/arena@1.4.2`. Once
published, a release never changes: the same name always means the same
files.

That guarantee is what keeps rooms safe. A room that loads
`gabriel/arena@1.4.2` gets exactly what was tested, every time. To ship a fix,
you publish a new version and rooms move to it when their owners choose.
That's also why there are no version ranges, tags or `latest`: a room always
names one exact release.

## Versions

- Versions are SemVer 2.0.0 without build metadata: `1.4.2` and
  `2.0.0-beta.1` are valid, `1.0.0+build.5` is not.
- The version comes from `game.json`, never from the command line.
- `disko publish --visibility public|unlisted|private` sets the release's
  visibility (see [Visibility](/registry/games-and-namespaces#visibility)). A
  public game requires the flag; a private game only publishes `private`
  releases and needs none.
- `--out release.tgz` also saves the exact package that was uploaded.
- Versions need not increase: publishing `1.3.5` after `2.0.0` is allowed.
- Publishing the same archive again with the same visibility succeeds without
  change, so retries are safe. A different archive or visibility under an
  existing version fails with [`version_exists`](/errors/version_exists).
- A failed publish never uses up a version. Releases are never deleted.

## Digests

Besides its name, every release has a **digest**: a fingerprint computed from
its contents. If two releases have the same digest, they contain exactly the
same files. A release's identity is its **digest**, `blake3:` plus 64 hex characters,
computed over the uncompressed canonical archive. `disko publish` prints it,
and a room reports the digest of the game it runs. The same source always
builds the same archive and digest.

## Deprecation

Since releases can't be deleted, you warn people away from a bad one instead.
Deprecate a release in the Creator Portal's **Releases** page, with an optional
message of up to 280 characters such as "Use 1.4.3 (fixes goal detection)".
A deprecated release still loads normally; rooms receive the warning in their
`game-loaded` event and log it. Un-deprecate at any time.

A release taken down by the platform stops loading everywhere, with
`game_removed` in rooms.
