Scene Stage

An animated, looping pan/zoom SVG scene composed from a provenance-verified prop kit (original MIT artwork, each asset pinned by sha256 and restricted to an allowlist of SVG elements). Give a preset and the layout, backdrop, props and motion come from it; or write the layout in full. Props are referenced by id and never as SVG, so the agent cannot introduce script or external references. For a one-off shape use agent_sketchpad; for a diagram use a chart or d2 atom.

Surfaces
mcp-appsandroid
Degraded on
SurfaceNote
google-apps-script-webThe renderer source is in the repo, but the deployed Apps Script project predates the scene kit (it is at the 200-version cap), so a ?p= link there does not draw the scene until that project is migrated.
webThe Python static renderer (renderers/web_article.py) cannot run the engine; it shows the title and a note instead. Use the MCP Apps surface for the animation.
google-meet-stageAnimated SVG (SMIL) should play, but this has not been verified on the Meet stage runtime.
google-chatNo inline SVG in Chat cards; falls back to a still image rendered by the headless-Chromium fallback.
pdfRenders the first frame as a still image.
Live preview
wind-farm
Animated scene: open this page in an MCP Apps or Apps Script surface to play it.
Fields
FieldTypeRequired
presetstring. A ready-made place; supplies backdrop, ground, stage, camera, scenery and actors. PREFER a preset when one fits (it is a tested layout), and extend it with scenery_add / actors_add instead of rewriting it. One of: airfield, arctic-station, bedroom, boardroom-meeting, bus-stop, cafe, call-centre, ci-cd-factory, city-skyline, construction-site, container-port, corner-shop, data-centre, desert-oasis, drone-delivery, factory-assembly-line, farm-harvest, fire-station-response, forest-campfire, highway-interchange, home-kitchen, hospital-helipad, hospital-ward, hydro-dam, kanban-war-room, keynote-stage, laboratory-bench, library-archive, lighthouse-coast, living-room, message-post-office, metro-station, mine-quarry, mission-control, museum-gallery, observatory-night, offshore-platform, open-office, railway-station, restaurant-kitchen, river-ferry, school-classroom, school-yard, ski-resort, solar-farm, space-station-orbit, street-market, substation-grid, trading-floor, vertical-farm, warehouse-logistics, water-treatment, wind-farm.optional
titlestring (optional, max 80 chars). Accessible name and caption. Default is the preset id.optional
seedinteger (optional, 0..4294967295). Varies cloud and star placement. Default derives from the preset.optional
theme{time: "dawn"|"day"|"dusk"|"night", weather: "clear"|"cloudy"|"overcast", setting: "countryside"|"coast"}. Default day, clear, countryside. time: dawn = early morning, day = midday and afternoon, dusk = evening, night. Interiors dim with the time of day.optional
motion{duration: number 6..40} (optional, seconds per loop). Default 20.optional
camera{mode: "static"|"pan"|"push-in"}. The preset has a default; without a preset the default is static.optional
accentstring (optional, #rrggbb). Tints props that take an accent colour.optional
backdrop"sky-city"|"sky-hills"|"sky-sea"|"sky-mountains"|"sky-desert"|"sky-arctic"|"sky-flat"|"space"|"interior-office"|"interior-industrial"|"interior-lab"|"interior-civic"|"interior-home"|"interior-dark" (required when there is no preset).required
ground"grass"|"road"|"sand"|"snow"|"concrete"|"wood"|"water"|"none" (required when there is no preset).required
stage{width: 600..4000, zoom: 500..3200, focus_y: -800..200} (required when there is no preset). Scene units: x runs left to right from 0 to stage.width; the ground line is y=0, up is negative and positive y is toward the viewer.required
sceneryarray (optional, default empty; max 80) of {prop, x, y?, scale? 0.2..5, flip?, variant?, anim?}, or of {sketch, x, y?, scale?, flip?, anim?} when no prop fits, or of {label, x, y?, scale?, size?, colour?, align?, bold?} for real text (see LABEL below). THE ESCAPE HATCH: give `sketch` instead of `prop`, an array of 1..40 SVG element strings (one element per string, origin at the ground point, up negative), e.g. [""]. Same rules as agent_sketchpad: tags rect, circle, ellipse, line, polyline, polygon, path, g; attributes cx, cy, r, rx, ry, x, y, width, height, x1, y1, x2, y2, points, d, fill, stroke, stroke-width, opacity, fill-opacity, stroke-opacity, stroke-linecap, stroke-linejoin, transform; values only letters, digits and # . , - ( ) %; no text, style or id; at most 8 sketches per scene; an invalid element refuses the scene with an error. Prefer a listed prop when one fits. A hand-written animate or animateTransform is NEVER its own sketch array entry (it has nothing to animate alone): nest it as a CHILD inside the same as the shape(s) it moves, in the SAME string, e.g. ''; see the bouncing-ball example under conventions.sketch_style in the asset index for a full squash-and-stretch built this way. REUSE: a sketch element may instead be '' (or '--'), href ONLY, to place and hand-animate a REAL, already-verified kit prop -- only ids/variants that really exist are accepted; see the "hand-choreographed" example under conventions.sketch_style. LABEL: give `label` (a plain string, 1..4 lines split on '\n', 1..40 characters each, 160 total) instead of `prop`/`sketch` for REAL text, drawn by trusted code, never agent-authored markup, so it needs no allowlist at all. `size` 8..80 (default 26), `colour` #rrggbb or @name (default @dark), `align` start|middle|end (default middle), `bold` true/false; y is the text's own baseline (multiple lines stack upward). A label may also carry `anim` (see ANIMATION below) to blink/bob/etc, same generated SMIL as a prop or sketch, never hand-authored markup. See conventions.labels in the asset index for worked examples. HOUSE STYLE: dark rounded outlines are applied for you; colour with palette names written @name (dark, light, livery, glass, wood, brown, cream, skin, red, yellow ... listed with worked examples under conventions.sketch_style in the asset index) so the sketch matches the props and follows day and night; props are 40 to 150 units wide, so draw at that size. ANIMATION: give the item anim {kind: sway|bob|spin|pulse|blink|drift, period 0.3..30, amount, cx, cy} for a quick idle motion with no hand-authored SVG at all -- this works on a plain prop or label item directly, not only a sketch -- or put animateTransform / animate (numbers only; targets transform, opacity, stroke-width, cx, cy, r and similar, never href or fill; at most 12 per element) inside a group to move a part. Props by id from the asset index (https://a2uicatalog.ai/catalogue/assets-index-v1.json); the strict JSON Schema of this block is https://a2uicatalog.ai/catalogue/scene-spec.schema.json. A ground prop needs no y (it stands on y=0); wall items need a negative y and interior ceiling lights use y=-620. Each prop's mount, scale, moves and size are in the asset index ("conventions" explains x, y and lanes).optional
actorsarray (optional, default empty; max 30) of {prop, motion: "walk"|"ride"|"drive"|"fly"|"hover"|"orbit"|"takeoff"|"land", x0, x1, y, period 3..120, phase 0..1, scale?, variant?, ry?, anim?, size?, colour?, align?, bold?}. Movers that loop; y is a lane, 40..120 passes in front of props standing on the ground. takeoff rolls a plane along the ground, rotates and climbs away (ry = climb height, default 260); land descends, flares and rolls out. anim (see scenery's ANIMATION docs) layers an idle motion on top of the actor's own engine motion. A sketch (see scenery's field docs, including REUSE) or a label (see scenery's field docs) can be an actor too, moving on the same motion, instead of prop. A prop's suitable motions are its "moves" in the asset index.optional
scenery_addarray (optional, max 80 in total with the preset) of the same items as scenery. Appended to the preset's scenery instead of replacing it, e.g. add a cow and a chicken to farm-harvest.optional
actors_addarray (optional, max 30 in total with the preset) of the same items as actors. Appended to the preset's actors instead of replacing them.optional
Example payload
{
  "type": "scene_stage",
  "backdrop": 1,
  "ground": "Ground",
  "stage": "Stage"
}
ARD catalog entry
{
  "identifier": "urn:air:a2uicatalog.ai:atom:scene_stage",
  "displayName": "Scene Stage",
  "type": "application/vnd.a2ui.atom+json",
  "url": "https://a2uicatalog.ai/atoms/scene_stage",
  "capabilities": [
    "mcp-apps",
    "android"
  ],
  "description": "An animated, looping pan/zoom SVG scene composed from a provenance-verified prop kit (original MIT artwork, each asset pinned by sha256 and restricted to an allowlist of SVG elements). Give a preset and the layout, backdrop, props and motion come from it; or write the layout in full. Props are referenced by id and never as SVG, so the agent cannot introduce script or external references. For a one-off shape use agent_sketchpad; for a diagram use a chart or d2 atom.",
  "representativeQueries": [
    "show a animated looping SVG scene of a place (53 ready presets) from verified clipart",
    "an animated, looping pan/zoom svg scene composed from a provenance-verified prop kit (original mit a",
    "render a scene stage"
  ]
}
← Full ARD catalog
Deploy your own Google Apps Script renderer

The renderer is an open-source Google Apps Script web app. Deploy your own instance in 4 commands — you own the URL, no dependency on the demo endpoint.

git clone https://github.com/a2uicatalog/a2ui
cd a2ui/apps-script-surface/gas-wired-renderer
clasp push && clasp deploy
Full deploy guide →