The QGIS plugin
A second renderer for the same file. It is the reason the format is a format rather than this website’s save data.
Not publicly released yet. There is nothing to download at the moment and no install instructions worth giving you — this page describes what it does and how it relates to the format. The website needs no plugin for anything.
Why it exists
A format with one implementation is a file extension. The plugin is what makes the core invariant testable: take a story made here, open it there, and the same places, the same camera moves, the same narration and the same annotations come out — because all of it is declared in the document rather than baked into a renderer.
It was also the first implementation. Much of what this website does — scene compilation, derived timing, bounds-first framing, the suggest-then-generate flow behind Illustrate — was worked out there first and then ported.
What it does that the website does not
The two renderers are not meant to be identical. A browser and a desktop GIS are good at different things, and the format is the part they agree on.
Real GIS layers
Places, boundaries and drawings become ordinary QGIS vector layers with ordinary symbology — so anything QGIS can style, a story can use.
Native QGIS bridging
Each scene becomes a map theme, each camera target a spatial bookmark, and the timeline drives the Temporal Controller. The story becomes a QGIS project you can keep working in.
Frame-by-frame rendering
Video is rendered through the QGIS renderer itself and muxed with ffmpeg, rather than drawn in a browser canvas.
Offline narration
Speech can be generated locally with a bundled Piper voice, with ElevenLabs and Edge TTS as alternatives. No network required.
What the website does that it does not
- A link anyone can open. A plugin renders a file you then have to send someone, and a file is not a link.
- No install, no QGIS, and nothing to keep up to date.
- Video rendered in the browser, with no ffmpeg and nothing uploaded.
Moving between them
There is no import or export step, because there is no conversion. Both read and write .ov. Download a story from the player, open it in the plugin, work on it there, and open the result back here.
What makes that safe in both directions is unknown-field preservation. QGIS project settings travel through this website untouched even though nothing here understands them, and anything this site writes survives a trip through the plugin. Neither tool can quietly destroy the other’s work.
If you are building a third renderer
Nothing about either of these is privileged. Implement the verbs and you can play any GeoStory; the packages do the parsing, validation and compilation for you.