# Kits

> A starter kit on the first join and /kit with a wait between two — daily for everybody, bigger ones for ranks. New in 0.2.4, off by default.

Source: https://stygion.eu/docs/keystone/kits
Updated: 2026-10-10

The `kits` module, `kits.toml`. **Off until you turn it on** (`enabled = true` in `kits.toml`, or the Settings screen; a restart applies it) — free items change how a server plays.

## What players do

- `/kit` lists the kits they may take and when each is ready again; `/kit <name>` takes one. Tab offers only theirs.
- A kit marked `first-join` arrives by itself on somebody's very first join.
- The wait is kept **per account in the database**: leaving and joining, a reload or a restart gives nobody a second kit. It is written down before the items are handed over, so a kit that fails halfway is one kit too few, never one too many.
- A kit that is not theirs reads exactly like one that does not exist.

## Writing kits

Three lists:

```toml
kits = ["starter once first-join", "daily 24h", "vip 24h groups=vip", "legend 24h groups=legend"]
items = [
  "starter minecraft:stone_sword",
  "starter minecraft:bread 16",
  "daily minecraft:bread 8",
  "vip minecraft:diamond_sword[enchantments={levels:{'minecraft:sharpness':3}}] 1",
]
commands = ["legend crate give {player} 1"]
```

- **`kits`** — the name, how often (`24h`, `7d`, or `once`), then optionally `first-join` and `groups=a,b`: who may take it besides holding `keystone.kit.<name>`. Inherited groups count, so a rank that inherits `vip` gets the VIP kit too.
- **`items`** — the kit, then the item **as `/give` takes it**: its id, components in brackets (enchantments, a name, anything a mod adds), how many. The game itself checks the line; one it refuses is said in the server log and the rest still arrive. A full inventory drops the rest at their feet, as `/give` does.
- **`commands`** — the kit, then a command the console runs, with `{player}` and `{uuid}`. For money, a rank for a week, a crate key. `{player}` is the account's id whenever the name is not a plain one, so a name can never smuggle in a selector such as `@a`.

## Permissions

- `keystone.kit` — the command (the `default` group has it from the first start).
- `keystone.kit.<name>` — one kit, unless its `groups=` already lets them.
- `keystone.kit.give` — `/keystone kits give <player> <kit>`: hand a kit over now, whatever its wait, without starting one.

## In the editor and over the API

The **Kits** screen shows every kit, how often, for whom and what it holds, with links to the three settings. `GET /v1/kits` (`server.read`) answers the same.
