Bytes
File content — video, image, document, audio.
- Stored in
def:dsf/content· content-addressed by hash- Owner
- User (DID-rooted)
- Schema
- Format only (JPEG, MP4, PDF)
- Portable
- ✓ universally
- Survives if app shuts down
- ✓
On The Grid, you don't write CRUD APIs and you don't maintain user databases. You define data schemas, capability rules, and event triggers. The user owns their rows. Apps hold revocable capability tokens.
The naive model — “user data goes in user's vault, app data goes in app's vault” — breaks the moment a user wants to take their post with them. A post is more than its bytes; it has captions, timestamps, ownership claims. The four-layer model captures the asymmetry.
File content — video, image, document, audio.
def:dsf/content · content-addressed by hashTitle, caption, owner, content_ref, public/private, timestamps — fields every app of this type has.
def:dsf/state · user namespacegrid:<type>/v<n> · Grid-standardProprietary fields: effects, ranking signals, app-internal IDs, audit trails.
def:dsf/state · app namespace<app>:<type>/v<n> · app-definedDerived data: cohort recommendations, trending lists, scoring models.
def:dsf/state · app namespace<app>:agg:<purpose>/v<n>Each app you connect holds a capability token — a DID-signed grant scoped to a path pattern in your data (e.g., prefix · did:alice/short-video/*). When you revoke, the protocol invalidates the token. The app can't read your bytes. It can't read your universal metadata. What's left in its proprietary L3 namespace becomes a dangling reference — the app might keep that row for audit but its post_ref is unresolvable.
A traditional app is a backend + a frontend. The backend owns the user database. On The Grid, the backend disappears — there's no separate HTTP API layer. Apps are frontend code that:
def:dsf/state.def:xsr bound to data events.The protocol is the backend. The user owns the database. The app is a UI.