# disko documentation > Build multiplayer games for disko, publish them to the registry and host rooms. Every page is plain Markdown at its URL plus `.md`. - [Creator Docs](https://docs.disko.ooo/index.md): Build multiplayer games for disko, publish them to the registry and host rooms. ## Get started - [Install](https://docs.disko.ooo/get-started/install.md): Install Node.js and the disko command, and sign in. - [Create your first game](https://docs.disko.ooo/get-started/first-game.md): Scaffold a game, understand how it runs, and play it in a test room. - [Test rooms (disko dev)](https://docs.disko.ooo/get-started/test-rooms.md): Run a game project in a test room that rebuilds and reloads on every edit. - [Publish a release](https://docs.disko.ooo/get-started/publish.md): Create the game in the Creator Portal, then publish an immutable release with disko publish. - [Host a room](https://docs.disko.ooo/get-started/host-a-room.md): Create a room in the Creator Portal and launch it from Node with @disko-game/room. ## Games - [Project structure & imports](https://docs.disko.ooo/games/project-structure.md): How a game project is laid out, which imports are allowed, and how TypeScript is built. - [Assets](https://docs.disko.ooo/games/assets.md): Import images and sounds, and use them for avatars, sounds and the UI. - [Menus & HUD](https://docs.disko.ooo/games/menus-and-hud.md): Build the Menu and the HUD with the retained ui API, and update them with swaps. - [World & physics](https://docs.disko.ooo/games/world-and-physics.md): Create discs, walls, goals and lines in the physical world of a running match. - [Players, teams & actions](https://docs.disko.ooo/games/players-teams-actions.md): React to players joining and entering matches, give them discs, declare actions and permissions. - [Randomness & determinism](https://docs.disko.ooo/games/randomness.md): Seeded random numbers and deterministic math with disko:math. - [Map geometry](https://docs.disko.ooo/games/map-geometry.md): Build maps and test positions with plain-data shapes from disko:geometry. ## Rooms - [Room.launch & options](https://docs.disko.ooo/rooms/launch.md): Launch a room from Node with @disko-game/room, and every launch option. - [Events, chat & lifecycle](https://docs.disko.ooo/rooms/events-chat-lifecycle.md): Room events, chat moderation, messages, game events and the room lifecycle. - [Loading & switching games](https://docs.disko.ooo/rooms/loading-games.md): Load registry releases or local projects, and switch games without disconnecting players. - [Running on a server](https://docs.disko.ooo/rooms/running-on-a-server.md): Ports, public URLs and certificates for rooms hosted on your own machines. - [Multiple rooms](https://docs.disko.ooo/rooms/multiple-rooms.md): Run several rooms in one Node process. - [Permissions & moderation](https://docs.disko.ooo/rooms/permissions-and-moderation.md): Resolve game permissions, fill the Room management modal, and kick or ban players. ## Registry - [Games, namespaces & visibility](https://docs.disko.ooo/registry/games-and-namespaces.md): Namespaces, game slugs and addresses, and the permanent public or private choice. - [Releases & deprecation](https://docs.disko.ooo/registry/releases.md): Immutable releases, versions, digests and deprecation. - [Private games & sharing](https://docs.disko.ooo/registry/private-games.md): Share private games and releases with other accounts through grants. - [CLI tokens & CI](https://docs.disko.ooo/registry/cli-tokens.md): Publish from CI and agents with CLI tokens instead of a browser sign-in. ## Agents - [Building with coding agents](https://docs.disko.ooo/agents/coding-agents.md): How disko supports coding agents with JSON output, exit codes and AGENTS.md. ## Reference - [game global](https://docs.disko.ooo/reference/game.md): Lifecycle, players, permissions, events, chat and asset imports, generated from the shipped declarations. - [world global](https://docs.disko.ooo/reference/world.md): The physical world of a running match, generated from the shipped declarations. - [ui global](https://docs.disko.ooo/reference/ui.md): The retained Menu and HUD and their primitives, generated from the shipped declarations. - [disko:math](https://docs.disko.ooo/reference/math.md): Deterministic scalars, vectors, angles, elementary functions and seeded random numbers. - [disko:geometry](https://docs.disko.ooo/reference/geometry.md): Plain-data shapes, intersections, projections, bounds and containment. - [@disko-game/room](https://docs.disko.ooo/reference/room.md): The Node room-host API, generated from the package declarations. - [CLI commands](https://docs.disko.ooo/reference/cli.md): Every disko command and flag, exit codes, error codes and environment variables. - [game.json](https://docs.disko.ooo/reference/game-json.md): The project manifest and the package limits. - [Error codes](https://docs.disko.ooo/errors.md): Every build and validation problem code and every disko command error, each with a page. ## Error codes - [api_unavailable](https://docs.disko.ooo/errors/api_unavailable.md): disko-master could not be reached, or cannot create test rooms right now. - [archive_gzip_invalid](https://docs.disko.ooo/errors/archive_gzip_invalid.md): The archive is not a valid gzip stream (header, deflate data, CRC or length). - [archive_gzip_multi_member](https://docs.disko.ooo/errors/archive_gzip_multi_member.md): The gzip stream contains more than one member. - [archive_too_large](https://docs.disko.ooo/errors/archive_too_large.md): The compressed archive exceeds 10 MiB. - [archive_trailing_data](https://docs.disko.ooo/errors/archive_trailing_data.md): Bytes follow the single gzip member. - [asset_content_mismatch](https://docs.disko.ooo/errors/asset_content_mismatch.md): An asset's bytes do not match the media type its extension selects. - [asset_import_form](https://docs.disko.ooo/errors/asset_import_form.md): An asset is imported or re-exported by a form other than its default binding. - [auth_unavailable](https://docs.disko.ooo/errors/auth_unavailable.md): The sign-in service could not be reached or answered with an error, so `disko` could not sign you in. - [build_failed](https://docs.disko.ooo/errors/build_failed.md): The local build found problems; the output lists each one with its own code. - [conflict](https://docs.disko.ooo/errors/conflict.md): The registry refused the release with a conflict or rate-limit response; wait and try again. - [credential_store_unavailable](https://docs.disko.ooo/errors/credential_store_unavailable.md): No OS credential store is available, so `disko login --with-token` cannot save the token. - [digest_mismatch](https://docs.disko.ooo/errors/digest_mismatch.md): The uncompressed tar does not hash to the expected release digest. - [extension_unsupported](https://docs.disko.ooo/errors/extension_unsupported.md): A file or import names an extension that is not allowed here. - [file_too_large](https://docs.disko.ooo/errors/file_too_large.md): One module exceeds 2 MiB or one asset exceeds 16 MiB. - [file_unreachable](https://docs.disko.ooo/errors/file_unreachable.md): An archive file is not reachable from the entry module through imports. - [game_project_required](https://docs.disko.ooo/errors/game_project_required.md): `disko dev` was run in a directory without `game.json`. - [game_required](https://docs.disko.ooo/errors/game_required.md): `game.json` has no `game` address, which a real publish needs. - [image_dimensions](https://docs.disko.ooo/errors/image_dimensions.md): An image side is outside 1-4096 px. - [import_attributes](https://docs.disko.ooo/errors/import_attributes.md): An import or re-export carries import attributes (with or assert). - [import_dynamic](https://docs.disko.ooo/errors/import_dynamic.md): A module uses dynamic `import()`. - [import_meta](https://docs.disko.ooo/errors/import_meta.md): A module uses import.meta. - [import_unresolved](https://docs.disko.ooo/errors/import_unresolved.md): A relative import names a file that does not exist with exactly that path. - [internal_error](https://docs.disko.ooo/errors/internal_error.md): `disko` hit an unexpected error that has no specific code. - [invalid_package](https://docs.disko.ooo/errors/invalid_package.md): The registry rejected the uploaded archive and listed the problems it found. - [invalid_token](https://docs.disko.ooo/errors/invalid_token.md): The value given as a CLI token is not a `dpt_` CLI token. - [manifest_invalid](https://docs.disko.ooo/errors/manifest_invalid.md): game.json is missing, too large, not valid JSON, or has a missing, unknown or invalid key. - [manifest_not_canonical](https://docs.disko.ooo/errors/manifest_not_canonical.md): The archive game.json differs from its canonical serialization. - [missing_permission](https://docs.disko.ooo/errors/missing_permission.md): The CLI token lacks the permission the command needs, such as `publish` for the game or `test_rooms`. - [module_encoding](https://docs.disko.ooo/errors/module_encoding.md): A module is not UTF-8 or starts with a byte-order mark. - [module_syntax](https://docs.disko.ooo/errors/module_syntax.md): A module does not parse as an ECMAScript 2023 module. - [modules_too_large](https://docs.disko.ooo/errors/modules_too_large.md): All modules together exceed 8 MiB. - [not_found](https://docs.disko.ooo/errors/not_found.md): The game does not exist, or the credential in use may not publish to it. - [package_too_large](https://docs.disko.ooo/errors/package_too_large.md): The uncompressed tar, headers included, exceeds 64 MiB. - [path_case_conflict](https://docs.disko.ooo/errors/path_case_conflict.md): Two file paths are equal after ASCII case-folding. - [path_invalid](https://docs.disko.ooo/errors/path_invalid.md): A file path breaks the package path grammar. - [quota_exceeded](https://docs.disko.ooo/errors/quota_exceeded.md): The account has used up a quota, such as publishes per 24 hours, stored release bytes or concurrent test rooms. - [registry_error](https://docs.disko.ooo/errors/registry_error.md): The registry refused the request with an error the CLI has no specific handling for. - [registry_unavailable](https://docs.disko.ooo/errors/registry_unavailable.md): The registry or disko-master could not be reached, or is temporarily unavailable. - [sign_in_failed](https://docs.disko.ooo/errors/sign_in_failed.md): Browser sign-in did not complete: it timed out, was canceled, or was rejected. - [source_case_mismatch](https://docs.disko.ooo/errors/source_case_mismatch.md): An import's case differs from the file name on disk. - [source_file_missing](https://docs.disko.ooo/errors/source_file_missing.md): A file named by game.json or an import does not exist in the project. - [source_symlink](https://docs.disko.ooo/errors/source_symlink.md): A project path on the import graph is a symbolic link. - [specifier_escapes_root](https://docs.disko.ooo/errors/specifier_escapes_root.md): A relative import climbs above the package root. - [specifier_invalid](https://docs.disko.ooo/errors/specifier_invalid.md): An import specifier is neither an exact relative path nor a disko: built-in name. - [stdlib_module_unknown](https://docs.disko.ooo/errors/stdlib_module_unknown.md): A disko: import names a module the host does not provide. - [tar_header_not_canonical](https://docs.disko.ooo/errors/tar_header_not_canonical.md): A tar header or its padding differs from the canonical ustar encoding. - [tar_malformed](https://docs.disko.ooo/errors/tar_malformed.md): The tar stream is truncated, has a wrong checksum, or has a missing or non-empty end marker. - [tar_order](https://docs.disko.ooo/errors/tar_order.md): Tar entries are not in strictly ascending path-byte order, or a path repeats. - [token_required](https://docs.disko.ooo/errors/token_required.md): `disko login --with-token` read no token, because stdin is a terminal or is empty. - [too_many_assets](https://docs.disko.ooo/errors/too_many_assets.md): The package contains more than 512 assets. - [too_many_modules](https://docs.disko.ooo/errors/too_many_modules.md): The package contains more than 512 modules. - [top_level_await](https://docs.disko.ooo/errors/top_level_await.md): A module uses await or for await outside any function. - [ts_construct_unsupported](https://docs.disko.ooo/errors/ts_construct_unsupported.md): A TypeScript file uses import = require, export =, a reference directive, or module/global augmentation. - [ts_emit_conflict](https://docs.disko.ooo/errors/ts_emit_conflict.md): Both a.ts and a.js exist, so emitting a.ts would overwrite a.js. - [ts_type_error](https://docs.disko.ooo/errors/ts_type_error.md): TypeScript type-checking reported an error. - [unauthorized](https://docs.disko.ooo/errors/unauthorized.md): The credential was rejected: the token or sign-in is invalid, expired or revoked. - [usage](https://docs.disko.ooo/errors/usage.md): A command was run with an unknown, repeated, malformed or missing flag or argument. - [version_exists](https://docs.disko.ooo/errors/version_exists.md): This version is already published with a different archive or visibility; releases are immutable. - [visibility_not_allowed](https://docs.disko.ooo/errors/visibility_not_allowed.md): A private game accepts only private releases. - [visibility_required](https://docs.disko.ooo/errors/visibility_required.md): Publishing to a public game needs `--visibility`; there is no default.