From click to shared change
A click on “Save” does not change the surface that triggered it. It goes down to the Connector Die Implementierung des DataInterface für eine konkrete Datenquelle, ergänzt um unterstützte Capabilities. Die Steckstelle des Stacks nach unten. GlossarConnector The implementation of the DataInterface for one data source, plus the capabilities it supports. The stack's socket downward. Glossary, and from there the change comes back to every surface that shows the item. This page follows that path.
An item
{ "id": "erntefest", "type": "event", "createdAt": "2026-09-01T09:00:00.000Z", "createdBy": "mira", "tags": ["garten"], "data": { "title": "Harvest festival in the garden", "start": "2026-09-26T14:00:00+02:00", "position": { "type": "Point", "coordinates": [13.405, 52.52] } }}id, type, createdAt, createdBy are the core; the domain fields live in data; tags are an axis of their own. The type is a class with an IRI (spec 06), and there may be several. The position is GeoJSON, longitude before latitude.
Four words, four jobs:
- Type: what the item was created as. Determines rendering, symbol and colour through the type register, and what the composer offers when creating.
- Vocabulary: the meaning and shape of the fields (
@context, spec 06). The vocabulary turnsstartinto a point in time andpositioninto a place, for everyone who reads the item. - Tag: thematic classification by people. Free, no schema.
- Module: a view. The map shows what has a place, the calendar what has a point in time. The field decides, never the type; a task with a date appears in the calendar.
The loading contract
A module says in the register what it can show (presents: ["start"]). The host looks up in the hints table which filter belongs to it (hasField: ["start"]), asks the connector for it and hands the module the items already filtered by search, tags and types. Two hints produce the union; the map loads itself, by viewport, and the host then issues no query (spec 01, loading contract).
Two hints: the host loads the union of start and position. The sample data is fictional. Changes last only for this session.
The connector loads coarsely, the module decides finely: the connector checks whether a field is present, not which value it has. Whether a status belongs in a kanban column is checked by the kanban on the loaded set.
The path through the layers
- A surface asks a hook, say
useItems(filter). - The hook subscribes to the connector’s observable (
observe) instead of loading once (getItems). - A permitted change goes through the write hook (
useUpdateItem) to the connector. - The connector changes its data and reports the change to all subscribers.
- Every surface that shows the item re-renders, without anyone having notified it.
Reading hooks observe the data source; the surface loads nothing on demand. The sample data is fictional. Changes last only for this session.
Hooks own no copy of the truth. Whoever keeps a list in component state and reloads by hand after saving rebuilds the reactivity that already exists, and misses changes from other devices. Cleaning up is part of it: a hook ends its subscription when the surface goes away.
Relations
A Relation Eine gerichtete Beziehung zwischen Items mit Prädikat und Ziel. Rückverweise zeigen sie aus der Gegenrichtung. GlossarRelation A directed link between items with predicate and target. Back-references show it from the opposite direction. Glossary connects an item through a predicate to a target. Comments and reactions are items of their own with a relation to the post, comments with commentOn, reactions with reactsTo, not arrays inside the post that keep growing; statements in the resonance module are signed relation records (spec 08). For every kind of relationship there is the matching hook (useComments, useReactions, useVotes, useRelationRecords), each with its own resolution of authors and counts. A general UI hook for reverse relations deliberately does not exist; the reverse lookup itself stays in the connector (observeRelatedItems with direction: "to") and is the way for a kind of relationship that has no hook yet. The new hook then belongs in the toolkit, not in the app.
Comments, reactions, votes: items of their own with a relation, one hook each. The sample data is fictional. Changes last only for this session.
Empty is not “still loading”
An empty result can be fully loaded. That is why reading hooks answer with {data, isLoading}, and the connector carries its own signal for the first sync (useInitialSync). A surface that turns an empty list into “nothing here” while the sync is still running shows a false truth; the preview components have the loading state for this.
Where to go next
Spec 02 DataInterface, Spec 06 schema composition, all hooks in the reference. The next page separates three questions that are often squeezed into one: Capability, permission, origin.