# Blok v server listu: specifikace

> Otevřená specifikace bloku „keystone“, který server přidává do odpovědi na ping v server listu, a manifestu vedle něj – pole, verze formátu, příklady – pro jakýkoli launcher. Otevřená je specifikace, kód Keystone ne.

Source: https://stygion.eu/cs/docs/keystone/announce-spec
Updated: 2026-10-25

Server s Keystone může launcheru říct **dřív, než se kdokoli připojí**, jaký modpack běží, jaká hra a loader, jaký Keystone, jeho resource pack a klientské mody, které doporučuje. Udělá to v obyčejném pingu server listu. Tahle stránka je specifikace toho, co posílá, aby ho mohl číst jakýkoli launcher. **Specifikace je otevřená; kód Keystone je All Rights Reserved.** Jak to majitel nastaví, je na stránce [server list](/docs/keystone/server-list).

## Kde je

Odpověď na ping server listu (status) je JSON objekt; Keystone do ní přidá jeden klíč, `"keystone"`. Vanilla klienti i jiné launchery čtou odpověď benevolentně a klíč, který neznají, přeskočí, takže blok je bezpečné posílat všem. Celá odpověď je jeden řetězec, který hra omezuje na 32 767 znaků společně s popisem a ikonou; kdyby se blok nevešel nebo cokoli při přidávání selhalo, odpověď odejde přesně tak, jak ji napsal vanilla. Blok zůstává hluboko pod kilobajtem.

## Blok, verze 1

```json
"keystone": {
  "v": 1,
  "pack": "curseforge:123456@7654321",
  "game": "1.21.1",
  "loader": "neoforge",
  "loaderVersion": "21.1.209",
  "java": 21,
  "heap": "6G",
  "manifest": {"url": "https://example.com/manifest.json", "sha256": "…64 hex…"},
  "keystoneVersion": "0.3.0",
  "keystoneClient": "optional",
  "recommend": [
    {"mod": "modrinth:AANobbMI", "version": "mc1.21.1-0.6.0", "why": {"en": "Smoother frames", "cs": "Plynulejší obraz"}},
    {"mod": "modrinth:sodium-extra", "atLeast": "0.6.0", "required": true, "why": {"en": "The HUD needs it"}},
    {"mod": "modrinth:AANobbMI", "or": "curseforge:394468"},
    {"preset": "my-quality"}
  ],
  "resourcePack": {"url": "https://example.com/pack.zip", "sha1": "…40 hex…"}
}
```

| Pole | Vždy | Význam |
|---|---|---|
| `v` | ano | Verze formátu, `1`. Launcher, který verzi nezná, blok ignoruje. |
| `game`, `loader` | ano | Verze Minecraftu a loader (`neoforge`), jak je server spouští. |
| `loaderVersion` | ne | Vlastní verze loaderu. |
| `pack` | ne | Modpack: `curseforge:<id projektu>[@<id souboru>]` nebo `modrinth:<projekt>[@<verze>]`. Jen id – písmena, číslice, `_` a `-`, každé nejvýš 64; id na CurseForge jsou čísla. |
| `java` | ne | Verze Javy, kterou pack chce (8–99). |
| `heap` | ne | Doporučená paměť, `512M` až `64G` (`6G`, `6144M`). |
| `manifest` | ne | `url` (https, tisknutelné ASCII, bez uživatele, bez `#fragmentu`, nejvýš 512 znaků) a `sha256` manifestu, jak je zapsaný. Jen obojí spolu: odkaz, který nejde ověřit, se neposílá. |
| `keystoneVersion` | ne | Keystone, který server spouští, bez části buildu (`0.3.0`, ne `0.3.0+1.21.1-neoforge`), aby launcher mohl nabídnout klientskou část ve stejné verzi. |
| `keystoneClient` | s `keystoneVersion` | Zatím `optional`: hráč bez klientské části se připojí stejně. `required` je vyhrazené pro server, jehož funkce ji potřebují. |
| `recommend` | ne | Nejvýš 12 položek a 3 000 znaků. Položka je `{"mod": "<portál>:<id>"}` s `version` (přesně jedna: id nebo číslo verze na Modrinthu, id souboru na CurseForge) nebo `atLeast` (Modrinth, číslované verze), volitelně `or` (stejný mod na druhém portálu); nebo `{"preset": "<id>"}` pro preset nastavení launcheru. `required: true` je pro hráče ke čtení a nikoho nezastaví. `why` drží důvod v každém jazyce (`en`, `cs`), každý nejvýš 120 znaků. |
| `resourcePack` | ne | Vlastní resource pack serveru ze `server.properties` (ten, který vanilla dá každému hráči při připojení), jen s https `url` a jeho `sha1`. |

Server, který nic neoznamuje, žádný blok neposílá.

## Manifest, formát 1

Soubor na adrese `manifest.url`. **Stejné mody dají stejné bajty** – žádný čas, soubory seřazené podle jména – takže jeho hash se změní, jen když se změní něco, co by hráč poznal.

```json
{
  "format": 1,
  "game": "1.21.1",
  "loader": "neoforge",
  "loaderVersion": "21.1.209",
  "pack": "curseforge:123456@7654321",
  "java": 21,
  "heap": "6G",
  "note": "Text pro hráče, nejvýš 280 znaků",
  "mods": [
    {"file": "create-1.21.1-6.0.6.jar", "ids": ["create"], "name": "Create", "version": "6.0.6",
     "client": "required", "size": 12345678, "sha1": "…", "sha512": "…", "curseforge": 1234567890}
  ]
}
```

`mods` vypíše soubory, které hra hráče potřebuje (`client: required`), nebo všechny soubory, když majitel zapne `manifest.server-only`. `curseforge` je vlastní otisk souboru CurseForge, `sha1` a `sha512` otisky Modrinthu, takže launcher každý soubor najde na portálu podle hashe.

## Pravidlo: id a hashe, nikdy stahování ze serveru

Nic v bloku ani v manifestu není soubor ke stažení ze serveru nebo z adresy, kterou majitel napsal. Launcher najde pack i každý mod **na portálu podle id nebo hashe** a ověří hash portálu; manifest ověří podle `sha256` v pingu. Jediná adresa kromě manifestu je resource pack, který vanilla už dává každému hráči při připojení, a i ten jen s SHA-1. Launcher kvůli jedinému poli mimo tvar odmítne celý blok; Keystone proto každou hodnotu před odesláním zkontroluje podle těchto tvarů a co nesedí, vynechá a důvod napíše do logu.

## Co tu server nikdy neřekne

Všechno v bloku dostane každý, kdo pingne, bez klíče. Proto obsahuje jen to, co majitel napsal úmyslně, a to, co server stejně prozrazuje (hra, loader, verze Keystone) – nikdy seznam modů (ten je v manifestu, jen když ho majitel zveřejní), nikdy cestu, nikdy klíč.
