MeowMC

The .meowui format

Beta

State

Beta. Reference for the .meowui scene format its loader validates.

.meowui is JSON, one document = one scene (or one template) under schema name meowmc.hologram/v1: the version field is mandatory, and a missing or unknown value refuses the file at load with a named reason.

A minimal example

{
  "schema": "meowmc.hologram/v1",
  "id": "spawn-leaderboard",
  "name": "Spawn Leaderboard",
  "mode": "personal",
  "anchor": { "type": "coordinate", "world": "world", "position": [0.5, 70.0, 0.5] },
  "view": { "billboard": "center", "viewRange": 1.0, "brightness": [15, 15] },
  "functions": [
    { "name": "warp-spawn",
      "actions": [ { "type": "teleport", "world": "world", "position": [0.5, 70.0, 0.5] } ] }
  ],
  "pages": [
    { "id": "main", "components": [
        { "type": "text", "text": "{server_name}", "style": { "bold": true }, "offset": [0.0, 1.6, 0.0] },
        { "type": "stat-text", "stat": "PLAYER_KILLS", "format": "Kills: {value}",
          "offset": [0.0, 1.2, 0.0], "style": { "shadow": true } },
        { "type": "stat-text", "stat": "DEATHS", "format": "Deaths: {value}", "offset": [0.0, 0.9, 0.0] },
        { "type": "item", "item": "minecraft:diamond_sword", "transform": "ground", "offset": [-0.6, 1.05, 0.0] },
        { "type": "hitbox", "width": 2.2, "height": 0.6, "offset": [0.0, 0.9, -0.05],
          "actions": [ { "type": "next-page" }, { "type": "function", "name": "warp-spawn" } ] }
    ] },
    { "id": "server", "components": [
        { "type": "text", "text": "TPS {tps}  MSPT {mspt}  Online {online}", "offset": [0.0, 1.2, 0.0] },
        { "type": "text", "text": "Day {stat:TIME_SINCE_DEATH}", "offset": [0.0, 0.9, 0.0] }
    ] }
  ],
  "permissions": { "view": null, "use": null }
}

{stat:TIME_SINCE_DEATH} is the generic statistic lookup; {kills}, {deaths} and {playtime} are short aliases for the common ones — see placeholders.

The rules

  • Required: schema (exactly meowmc.hologram/v1), id (unique across loaded scenes), name, mode (global | personal), anchor, view, functions, pages (at least one), permissions.
  • permissions.view gates who renders the scene; permissions.use gates who may trigger its hitboxes. null = unrestricted. Both are ordinary permission strings granted with the server's permission manager.
  • Unknown keys are rejected at load with a named reason — top-level and component-level alike. A typo in a scene file is heard about at load, not at runtime.
  • Validation happens at load, before anything spawns: component types exist in the registry; properties conform to the component's schema; referenced pages and functions exist; statistic names resolve; action lists conform to the closed set; entity budgets are checked per scene.
  • String depth and length caps (256 characters per text component, 16 nested components deep) bound what an author can put in a metadata packet, and a scene file size cap bounds the loader.

Import and export

  • Server side: ./holograms/ next to the config directory, loaded at boot and on /meow hologram reload. The folder is the scene store; the command lists paths and validation failures by file and reason.
  • Browser side: import via the file picker, export via a download. No server round-trip exists — nothing about a scene is stored on meowmc.org (see the web editor). Dropping a downloaded file into holograms/ is the entire publish step.

Runtime state — page, caches, last-rendered values — is in memory only, and a restart returns every viewer to page 1. persist: true on a global scene is the one place runtime entities outlive the process (they save with the chunk); the default is false, because the scene file is the source of truth, not the chunk.

  • Components — the component types, anchors, pages and actions the format above describes.
  • Placeholders — what the {…} tokens resolve against, and the injection boundary.
  • The web editor — authoring without writing JSON by hand.