# The client half

> The same jar in a player's mods: ultimine with an outline, "typing…" above the chat and the resource pack without a reload — and exactly what the client and the server say. From 0.2.5.

Source: https://stygion.eu/docs/keystone/client-half
Updated: 2026-10-11

Keystone is one jar for the server and the player. In a player's `mods/` it **greets** a server running Keystone as they join, and that server then offers three things. A player without it plays exactly as before, nobody is ever refused, and a server without Keystone receives nothing from the client.

## What it does

- **[Ultimine](/docs/keystone/ultimine)** with a key and an outline of what one swing takes.
- **"Anna is typing…"** above the chat input, between players who both run the client half (`chat.typing.enabled`, on). A vanished player is never shown; with chat channels only those who would receive the line see it. Through the Discord bridge both ways: somebody typing in the bridged room shows in the game as "Dora (Discord) is typing…" (`typing.from-discord`), and the bot types on Discord while somebody in the game does (`typing.to-discord`, at most once every nine seconds per room).
- **The resource pack without the reload:** when the player has the server's pack switched on (the same SHA-1 as `resource-pack-sha1` in `server.properties`), the server does not send it and the game does not reload its textures (`resourcepack.skip-when-client-has`, on). A launcher that puts the pack into the instance ahead makes joining that much shorter.

## What the client and the server say to each other

Nothing else is sent, and nothing leaves the server.

| Who | What | When |
|---|---|---|
| server → client | a hello: the protocol version and what the server has switched on | on joining (configuration phase) |
| client → server | the client half's version and the **SHA-1 of the resource packs switched on** (only `.zip` files from the resourcepacks folder — not their names or contents) | in answer to the hello, in that connection only |
| client → server | the ultimine key: held / not held | when it changes |
| server → client | the outline of a vein (a list of blocks) | only while the key is held |
| client → server | one bit, "typing / not typing" — never the text, never for a command | while typing |
| server → client | the "who is typing" line | when it changes |

A server sees who runs the client half in `GET /v1/players` (`client`) and on the editor's Players screen. Everything the client learns from a server **ends with that connection**: after leaving or moving to another server nothing is sent until the new server greets it itself.

## Turning it off

- The server owner: the `ultimine` module (off by default), `chat.typing.enabled`, `resourcepack.skip-when-client-has`, `discord.typing.from-discord` and `discord.typing.to-discord`.
- A player: removes the jar from `mods/`; the game and the server carry on.
