Play, illustrate, export, share
Everything the player does, and where each thing stops. No account is needed to play — only to publish.
Playing
The camera flies between the places a story names, the basemap changes when a scene asks for a different one, annotations appear and animate, and captions come up underneath. A locator inset in the corner shows where on Earth you are, which matters the moment a scene zooms into a coastline you do not recognise.
Narration is spoken by your browser from the text in the document. A scene will not be cut off mid-sentence: the clock waits for the line to finish, then takes a short breath before the next scene begins.
Browser narration cannot be recorded — the speech API hands back no audio stream. That is why exporting a video generates the narration again properly rather than capturing what you just heard.
Illustrate
Opens a list of every scene with a suggested subject already filled in, taken from what the story says — the scene title, falling back to the caption, then the narration, with the place name appended. Suggesting costs nothing and happens instantly, because the document already knows what each moment is about.
Nothing is generated until you press Generate on a row, one scene at a time. Edit the prompt first — a sentence written to be spoken over a map is rarely the sentence you want to hand an image model.
Pictures land in a corner of the map at about a fifth of the frame width, for the span of their scene. They are context, not the subject; the map is the subject.
Generated pictures are stored inside the document rather than as a link. Provider image links expire within the hour, and a story published with one would look right and then quietly break. The cost is roughly a megabyte per picture added to the file.
Export video
Renders an MP4 in your browser, frame by frame. Nothing is uploaded. 720p, 1080p, 4K, square or vertical, at 24, 30 or 60 fps.
The preview on the left is a real frame from the renderer that writes the file, not an approximation — drag the slider to check any moment before committing to a render.
With Narrate on, the narration is generated as real audio first and muxed in. Because the audio exists before any frame is drawn, each scene is retimed to how long its line actually takes to say — which is what timing: {mode: derived} has always meant. Expect the frame count to change when you switch it on.
Video export needs WebCodecs, so it works in Chrome and Edge. Safari and Firefox will tell you rather than fail silently. Rendering is faster than realtime — a 68-second story takes about 50 seconds at 720p.
Share
Publishes the story to a link that plays for anyone, with no account and nothing to install. Publishing needs an account; reading never does.
What gets stored is the .ov text itself, written by the format’s own serializer — so a published story is still a GeoStory. The share page has a download button that hands the file over, and the page can be embedded in a lesson page or a blog post.
A shared story opens paused behind a play button. That is deliberate: browsers refuse to speak until the viewer has interacted with the page, so a story that started on its own would start in silence.
Sharing offers a choice. By default the link is unlisted — a slug is six random bytes, so the link itself is the credential and only people you send it to can find it. Tick Publish to the Gazette and it is also listed in the public index, where anyone can browse and play it.
Open .ov
Reads a story from your machine, YAML or JSON. The same file the QGIS plugin writes, and the same file this site exports.
Known limits
Stated plainly so you do not discover them halfway through a project:
layersdeclared in a document are not drawn yet, by either renderer.- The live player does not show the title block, legend or scene counter that the exported video has. Use the export preview to see the real frame.
- The slow camera push during a held shot is in the exported video only; the player holds still.
dissolveis accepted as a transition but currently renders as a slower camera move, not a cross-fade.