# Publish a release

> Create the game in the Creator Portal, then publish an immutable release with disko publish.

Publishing turns your project into a **release**: a packaged copy of your
game with a version number, stored in the disko registry. Any room can then
load it by name.

A release never changes. `gabriel/arena@0.1.0` always means exactly the same
files, so an update can't break a room behind its back. To change your game,
you publish a new version.

## 1. Create the game in the Creator Portal

In the [Creator Portal](https://dev.disko.ooo), create a game. You choose:

- a **namespace**, your name in the registry, such as `gabriel` (only the
  first time);
- the game's **slug**, such as `arena`;
- its **visibility**: public, or private to you and people you choose.

Together they form the game's address, `gabriel/arena`. These choices are
permanent; see [Games, namespaces & visibility](/registry/games-and-namespaces).

## 2. Put the address in game.json

```json title="game.json"
{
  "schemaVersion": 1,
  "game": "gabriel/arena",
  "version": "0.1.0",
  "entry": "src/main.ts"
}
```

## 3. Publish

Check everything first with a dry run, which uploads nothing, then publish:

```sh
npx disko publish --dry-run
npx disko publish --visibility public
```

On success, `disko` prints the release's name, `gabriel/arena@0.1.0`. That's
what a room uses to load it.

## Publishing an update

Raise `version` in `game.json` and publish again. Rooms keep their current
version until their owner switches to the new one.

See [Releases & deprecation](/registry/releases) for version rules and
release visibility.

## Next

[Host a room](/get-started/host-a-room) that loads your release.
