The .meowui format
BetaState
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(exactlymeowmc.hologram/v1),id(unique across loaded scenes),name,mode(global|personal),anchor,view,functions,pages(at least one),permissions. permissions.viewgates who renders the scene;permissions.usegates 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 intoholograms/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.
Related
- 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.