prompts about
about

An image is not a sentence.

A caption flattens a scene into a string. A scene graph keeps the structure: who is where, holding what, doing what to whom, in what kind of place. VSON is one notation for that graph, designed so any vision-capable model can produce it and any database can read it.

What you just saw

If you clicked a demo or a spec example, no model ran and no key was spent. The studio fetched a committed file: for a demo, the envelope one real extraction produced, kept with its provenance; for a spec example, a hand-authored document. What you are looking at is that file, rendered. The verdict beside it is the one recorded when the file was made — which is why the conformance panel offers to re-run the two browser gates over the document on screen, live, so you can watch them agree rather than take the stored answer on trust.

If you uploaded an image, your browser sent it straight to a vision-language model through OpenRouter, on your own key — the request never touches the studio host — with a 5 KB system prompt that lists the closed vocabulary, the five hard rules, and a worked example. The model emitted a Penman tree — text that looks like nested S-expressions. A Pyodide worker, also in your browser, rewrote that tree into Turtle 1.2 with the reference emitter CI byte-compares against the vson CLI, then checked it with two of the three gates the CLI runs. If it conformed, you saw the graph. If it didn't, the studio fed the violations back to the model and asked for a fix, up to twice.

The image goes from your browser to OpenRouter and nowhere else. There is no studio backend to store, log, or cache it. Only the resulting envelope (≤8 KB of text) is small enough to keep around.

Why a graph?

A caption is fine for a search index. It is wrong for everything else. "A queen with a crown stands behind a knight" hides the spatial relation, fuses two entities into one phrase, and offers no way to say what the knight is holding. Try to query it. Try to merge it with another caption of the same scene. It melts.

A graph is the format the rest of the stack already wants. Knowledge graphs, retrieval, 3D reconstruction, scene-aware tools, simulators, evaluation harnesses — they all consume edges, not strings. VSON is what the model emits when you ask for the same data the downstream code is going to need anyway.

Why these primitives?

Frame
The world from a viewer's chair: SceneContext (where), VisualStyle (how rendered), CameraView (from where). Every directional spatial fact must name a viewer; perspective is not optional.
Entity
What the scene contains: PhysicalObject, Aggregate, Substance. Carries traits — animacy, countability, individuation — derived from the class, not re-inferred per call.
Quality
Properties that vary independently of identity: color, material, affect, action-state. Reified as their own nodes so they can be annotated, cited, or revised without rewriting the entity.
Event
A predication with thematic roles: :agent, :patient, :instrument. Actions are nodes, not edges, so a third party can attach confidence, time, or counter-claims to them.
SpatialFact
RCC-8 topology + Talmy-style direction + proximity, all reified as a single node so a viewer can be attached. "left of" is meaningless without saying left of whom.

The full vocabulary lives in docs/vson.md. It is closed: out-of-vocabulary tokens fail SHACL by design.

Where the ideas come from

Almost none of this thinking is ours; Appendix E states, per source, what was taken and what was left.

Talmy (2000) is why a spatial relation has two slots that cannot be swapped: one names the located thing, the other what it is located against. Levinson (2003) is why a directional fact must name a viewer — three frames of reference exist and left of is a different claim in each, so VSON fixes the relative frame and makes the anchor a structural obligation (C5). That obligation is not new: ISO 24617-7:2020's movement link already carries @figure and @ground. What VSON adds: those schemes instruct an annotator, this one rejects a document.

DOLCE (Masolo et al. 2003) supplies the endurant/perdurant spine — inspired, not aligned: no IRI imported, no axiom asserted. AMR (Banarescu et al. 2013) proves a graph can be written by hand; VSON-P borrows its Penman surface. RCC-8 and Allen arrive as closed calculi; this notation takes their names, not their inference: no composition table ships.

How it stays correct

Every document is checked against a published SHACL shape graph before it is returned. The shapes encode the constraints that matter most:

  • Every directional SpatialFact must carry a viewer.
  • Every Event must carry a lemma.
  • Every Quality must carry both a dimension and a value.
  • Bounding boxes are normalized to [0,1].
  • Trait values come from a closed enumeration.

All of it runs in your browser: a Pyodide worker executes pyshacl over the shapes (Gate 1), then an owlrl OWL 2 RL consistency check (Gate 2) — the same two gates, in the same order and from the same source files, as vson validate. The CLI has a third gate the browser does not: a vocabulary-closure check that rejects VSON terms the ontology never declared. So a document that passes here passes the CLI's first two gates too, and may still fail its third. The first live validation downloads ~16 MB of runtime (less over the wire with compression); after that it is cached.

If the model emits a non-conformant document, the studio feeds the SHACL report back to the model and asks it to repair. Up to two repair rounds, then it ships whatever it has with the violations attached so you can see what failed. No silent corrections.

What a verdict refuses to say

Conformance is three properties, decided by the parser, SHACL over the shapes and an OWL 2 RL closure; a pass establishes only what its mechanism examined (§2.1). None of them reads pixels: a document asserting a red cube left of a blue sphere, describing a photograph containing neither, is fully conformant and entirely false.

Geometry narrows that by one step. A box bounds the region it is asserted of, so boxes that cannot support a relation refute it; boxes that agree confirm nothing — a cat on a mat touches its mat while their rectangles overlap with area (§5.13.2). A box can say no; it can never say yes.

Agreement is not correctness: two conformant documents vson diff scores have agreed, and that is all (§5.15.5). Groundedness — that each assertion matches what the image depicts — does not exist here, and the specification says so itself.

The essay these two sections distill makes the argument at length, a receipt behind each refusal: An image is not a sentence.

Why it's free

The six demo images were extracted once, for real, and their envelopes are committed to the repo with the model's genuine provenance. Clicking a thumbnail fetches the baked envelope — no model call, no API key, no spend. The sixteen gallery scenes are hand-authored conformant fixtures served the same way. That is the keyless $0 path. A new upload is different: it goes from your browser straight to OpenRouter on your own key — your spend — and never routes through the studio host. Image bytes are never persisted, in either path.

The six photographs are not ours. They are Unsplash photographs, credited under the demo strip and in full — photographer, licence, source and file hash — in CREDITS.md. The licence is the Unsplash License, which covers the photograph and not the people in it; two earlier demos were withdrawn on exactly that ground, and none of the six shows an identifiable person.

The studio is stateless. Refresh the page and the scene is gone. There is no account, no database, no session. The only durable artifact of a run is the envelope you choose to download.

Why it's open

The ontology, the shapes, the CLI, and the studio are all Apache-2.0. The vocabulary maps directly to AMR (for actions), Cypher (for property graphs), and Visual Genome (for image-graph corpora). Anyone can extend the vocabulary, ship a model that emits VSON, or build a consumer that reads it. The studio is one such consumer; the vson-extractor skill is one such producer.

Built by Yaman Can — BSc Philosophy, Boğaziçi University. The notation is that philosophy put through a build gate.

What's next

An IndexedDB envelope cache so re-uploading the same image is free for you too, and streaming responses. The ontology itself is published at vson.pages.dev under the w3id.org/vson names. Status, in honest terms, is on GitHub.