Placeholders
BetaState
Beta. Reference for the placeholder system the runtime resolves.
Placeholders resolve at render time: a scene holds the template, the runtime holds the values — placeholders never appear in stored metadata.
The two scopes
| Scope | Tokens | Source | Valid in |
| --- | --- | --- | --- |
| Scene-global — the same text for every viewer | {server_name}, {online}, {tps}, {mspt}, {max_players} | the server itself and the shared 1 Hz sampler that /meow health reads | global and personal scenes — public server state either way |
| Per-viewer — the looking player's own statistics | {kills}, {deaths}, {playtime}, {stat:<NAME>} | the vanilla Statistic system (PLAYER_KILLS, DEATHS, PLAY_ONE_MINUTE, and any of the 60+ names the API exposes) | personal scenes only |
Rendering the looking player's own statistics is the reason per-viewer
rendering exists: a {kills} line is meaningless unless the metadata going to
player A carries A's kills. Per-viewer placeholders therefore require personal
mode, and with it the per-viewer entity budget and the bounded refresh cadence
below.
The privacy property is structural: a per-viewer placeholder's value is sent only to the viewer it describes. No player ever sees another player's statistics through a hologram, because the packet is addressed to one connection.
The refresh cadence — capped, never per tick
A stat-text component re-renders at a configured interval (default 100 ticks,
i.e. 5 seconds), clamped by a floor (40 ticks, i.e. 2 seconds — a server may
not set it below that floor). The send is changed-values-gated: the cached
last-rendered value is compared first, so a statistic that has not moved sends
nothing. Scene-global values follow the same cadence and the same gate — {tps}
has no reason to re-send at the client's frame rate either.
Resolver rules
- Tokens are
{name}. An unknown token renders literally and produces a load-time warning naming the token — so a typo in a scene file is visible in the world instead of silently blank. - Resolution happens only on the render path; an action's
textfields resolve per clicker. - Placeholders never flow into a command string. If a
run-command'scommandfield contains so much as one{…}token, the scene is refused at load. Text-valued placeholders cannot reach a command, by construction, not by promise.
Plugin placeholders
A registry so a plugin can supply its own placeholders — {plugin:key}
namespaced against the built-in bare names, opt-in per server
(holograms.pluginPlaceholders, default off) — is planned after 1.0. Today a
plugin cannot supply a placeholder. MeowMC never imports a plugin; plugins
look the registry up through the standard service-registration surface.
One sampler, every surface
{tps} and {mspt} read the shared sampler the /meow suite uses, so a
hologram stat line and /meow health show the same numbers by construction.
See in-game analytics.
Related
- Components —
stat-textandhitbox, the two components that consume these tokens. - The .meowui format — where validation rules live.
- The web editor — the placeholder picker, so nobody
types
{stat:PLAYER_KILLS}from memory.