# game.json

> The project manifest and the package limits.

Every project has a `game.json` at its root.

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

## Keys

| Key             | Required   | Rule                                                                                                            |
| --------------- | ---------- | --------------------------------------------------------------------------------------------------------------- |
| `schemaVersion` | yes        | The integer `1`.                                                                                                |
| `game`          | to publish | The game address, `<namespace>/<slug>`. `disko publish --dry-run` and local rooms work without it.              |
| `version`       | yes        | A SemVer 2.0.0 version without build metadata (`+…`), at most 64 bytes, for example `1.4.2` or `2.0.0-beta.1`.  |
| `entry`         | yes        | The package path of the entry module, a `.js` or `.ts` file. Its extension selects the language of the project. |
| `$schema`       | no         | Any string, for editor support. Ignored.                                                                        |

- Any other key is an error ([`manifest_invalid`](/errors/manifest_invalid)).
- The file is UTF-8 JSON, at most 4 KiB, with no duplicate keys.
- There are no name, description, icon or asset keys. Display metadata lives
  in the Creator Portal, and assets are found through imports.
- The published archive holds a rewritten `game.json` with only `entry` (the
  emitted `.js` path), `schemaVersion` and `version`, so one archive is valid
  under any address.

## Package paths

Paths are ASCII, `/`-separated, at most 128 bytes and 8 segments. Each segment
is 1–64 bytes, matches `^[A-Za-z0-9_][A-Za-z0-9._-]*$`, does not end in `.`
and is not a Windows reserved name such as `con` or `lpt1`. Hidden files
cannot be imported, and no two paths may differ only in case.

## Limits

Generated from the release checks.

| Limit | Value |
| --- | --- |
| Maximum compressed archive length in bytes. | 10 MiB (10,485,760 bytes) |
| Maximum uncompressed tar length in bytes, headers included. | 64 MiB (67,108,864 bytes) |
| Maximum `game.json` length in bytes. | 4 KiB (4,096 bytes) |
| Maximum number of module files. | 512 |
| Maximum length of one module in bytes. | 2 MiB (2,097,152 bytes) |
| Maximum combined length of all modules in bytes. | 8 MiB (8,388,608 bytes) |
| Maximum number of asset files. | 512 |
| Maximum length of one asset in bytes. | 16 MiB (16,777,216 bytes) |
| Minimum image side in pixels. | 1 |
| Maximum image side in pixels. | 4 KiB (4,096 bytes) |
