MeowMC

Placeholders

Beta

State

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 text fields resolve per clicker.
  • Placeholders never flow into a command string. If a run-command's command field 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.

  • Components — stat-text and hitbox, 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.