# Referensi manifest (`ralyoo.json`)

Dihasilkan dari `MANIFEST_SCHEMA` di `@ralyoo/sdk` 1.1.0, skema yang sama yang dipakai `ralystudioo lint` dan registry. Penjelasan tiap field berbahasa Inggris.

Skema JSON untuk editor: [`/schema/ralyoo.json`](schema/ralyoo.json). Taruh di baris pertama manifest supaya editor memberi saran dan peringatan:

```json
{ "$schema": "https://docs.ralyoo.com/schema/ralyoo.json" }
```

| Field | | Tipe | Arti |
| --- | --- | --- | --- |
| `id` | wajib | string; min. 3 karakter, maks. 40 karakter | Permanent identifier: lowercase letters, digits, and dashes. Part of the bundle URL and of the storage key, so it never changes after the first upload. |
| `version` | wajib | string | Version of the game (semver). Every upload needs a new one; a published version is immutable. |
| `sdk` | wajib | string; maks. 40 karakter | SDK versions the game runs on, as a semver range, e.g. ">=1.1 <2". Checked against the platform at upload and before the game is mounted. |
| `title` | wajib | teks, atau teks per bahasa (`{ "id": "…" }`); maks. 22 karakter | Name shown in the catalog, the countdown, and the menu. One line in the lobby. |
| `description` | wajib | teks, atau teks per bahasa (`{ "id": "…" }`); maks. 100 karakter | One or two short sentences under the title: two lines in the lobby. |
| `controls` |  | teks, atau teks per bahasa (`{ "id": "…" }`); maks. 60 karakter | How it is played, in a few words, e.g. "Joystick, dorong, nempel". |
| `badge` |  | teks, atau teks per bahasa (`{ "id": "…" }`); maks. 24 karakter | Optional short tag on the catalog card, e.g. "Demo SDK". |
| `author` | wajib | objek | Who made the game. |
| `author.name` | wajib | string; maks. 60 karakter |  |
| `author.url` |  | string; maks. 200 karakter |  |
| `players` | wajib | objek | How many players the game supports (the platform seats 1–4). |
| `players.min` | wajib | integer; 1–4 |  |
| `players.max` | wajib | integer; 1–4 |  |
| `pillars` | wajib | daftar: `"konsol"` atau `"rahasia"`; min. 1 isi | Which Ralyoo pillar the game belongs to: "konsol" (the phone is a gamepad) or "rahasia" (the phone shows secret information). |
| `locales` | wajib | daftar: string; min. 1 isi | Languages the game ships, default first. Localized manifest texts must cover the default. |
| `media` | wajib | objek | Catalog artwork: paths inside the bundle, and the game colour. |
| `media.icon` | wajib | string; maks. 120 karakter | Square icon used as a mask (one colour, transparent background). SVG preferred. |
| `media.cover` | wajib | string; maks. 120 karakter | Cover image, 16:9, at least 1280×720. |
| `media.color` | wajib | string | Game colour as #rrggbb; must read on the dark host background (≥ 3:1). |
| `tier` |  | `"free"` | Access tier. Only "free" for now. |
| `entry` |  | objek | Entry points. The host entry is an ES module; controllers are declarative. |
| `entry.host` |  | `"main.js"` |  |
| `entry.controller` |  | `"declarative"` |  |
| `inputs` |  | daftar: `"buttons"` atau `"dpad"` atau `"joystick"` atau `"cards"` atau `"vote"` | Controller widgets the game uses (shown to players before they pick it). |
| `permissions` |  | daftar: `"vibrate"` | Device capabilities the game asks for. |
| `offline` |  | boolean | True when the game needs nothing but its own bundle (always, for now). |
| `opening` |  | `"platform"` atau `"game"` | "platform" (default): the platform shows "3·2·1·GAS!". "game": the game runs its own opening. |
| `theme` |  | objek | Colours, frame, and labels of the host menu while the game is on screen. Colours below the contrast floor are ignored as a set. |
| `theme.panel` |  | string |  |
| `theme.accent` |  | string |  |
| `theme.text` |  | string |  |
| `theme.frame` |  | string; maks. 120 karakter |  |
| `theme.labels` |  | objek |  |

Field yang tidak dikenal di akar manifest hanya menghasilkan peringatan, supaya manifest untuk SDK yang lebih baru tetap terbaca.
