@openverb/motion

The renderer behind GeoStory

GeoStory is the language. Motion is what draws it — every frame, in the browser and in the exported video, from the same code. It needs a map about as much as a document needs one.

What the renderer actually does

A frame is derived entirely from the document and a timestamp, so the same arguments give the same picture. That is what makes an export reproducible — and what lets it run faster than realtime.

One renderer, two spaces

Annotations are addressed in degrees or in percentages of the frame, per annotation, in the same document. A line can be projected onto the ground while the panel beside it is composed against the picture — which is what lets a Motion frame sit over a live map instead of replacing it.

Vehicles locked to the narration

A marker that travels a path as a function of the clock rather than a speed, measured along cumulative great-circle distance so a constant rate is a constant ground speed. One waypoint per scene, so the aircraft is where the sentence being spoken says it is.

Seven themes, four type roles

Colour and type as one set of decisions rather than a palette. Display, title, body and caption each take their own face and size, and label ink follows the basemap underneath it, so a story can fly from a dark canvas to a street map without losing its labels.

The preview is the export

The player and the MP4 exporter call the same drawing code with the same arguments, so what you watch in the browser is what the file contains. Frame-accurate, reproducible, and rendered locally — nothing is uploaded.

A panel over a live map

space is set per annotation, so one document can argue in both registers at once. The map keeps the frame; the panel takes a margin.

annotations:
  # Projected onto the ground, with an aircraft travelling it.
  - id: rt_flown
    kind: line
    style: { color: "#3E4753", weight: 2 }
    animate:
      vehicle: plane
      vehicle_keys: [0.04, 0.80, 1.0, 1.0]   # one per scene it appears in
      vehicle_color: "#F4F7F9"
      vehicle_label: "N722BD"
    geometry:
      type: LineString
      coordinates: [[-97.6699, 30.1945], [-80.1131, 26.6329]]

  # Composed against the frame, in percentages, over the same map.
  - id: pn5_plate
    space: canvas
    kind: polygon
    style: { color: "#0B0F14", weight: 1, fill_opacity: 0.90 }
    geometry:
      type: Polygon
      coordinates: [[[2, 42], [33, 42], [33, 84], [2, 84], [2, 42]]]
OpenVerb Sandbox

Paste a Verb Library JSON schema here to define what actions the AI can perform.

Ask the AI to perform a task. It will use the vocabulary defined in your library.

The AI proposes a structured action based on your library vocabulary.

Waiting for prompt...

OpenVerb Core intercepts the AI's action and validates it before execution.

Verb exists in library
Payload matches JSON Schema
Policy requirements passed
Inputs valid and sanitized

The validated action is routed to the application backend for execution.

Waiting...

OpenVerb Core generates an execution receipt for full auditability.

Waiting for execution...