Scope taxonomy
A scope is a hierarchical identifier for a category of personal data:Examples
| Scope | Source | What it contains |
|---|---|---|
instagram.profile | Username, bio, follower counts | |
instagram.posts | Posts and captions | |
instagram.likes | Liked content | |
instagram.followers | Follower list | |
chatgpt.conversations | ChatGPT | Conversation history |
chatgpt.conversations.shared | ChatGPT | Shared conversations |
youtube.watch_history | YouTube | Watch history |
youtube.subscriptions | YouTube | Channel subscriptions |
gmail.messages | Gmail | Email messages |
gmail.labels | Gmail | Email labels |
Naming rules
- Use lowercase, dot-separated segments
- Source segment must match the platform name
- Category should describe the data type, not the API endpoint
- Keep scope names stable — changing a scope name changes the encryption key used for that data
Schema registry
Every scope has a corresponding schema that defines the structure of its data. Schemas are registered onchain in theDataRefinerRegistry contract, which maps a schemaId to a schema definition (typically an IPFS CID pointing to a JSON Schema document).
How schemas are used
- When a Personal Server writes a data file, it looks up the
schemaIdfor the scope via the Gateway (GET /v1/schemas?scope={scope}) - The data file is validated against the schema before storage
- The
schemaIdis included when registering the file in the DataRegistry - Other Personal Server instances use the
schemaIdto resolve the canonical scope when syncing
Schema lookup
Data file format
In v1, all data files are JSON. Each file follows a standard envelope format:| Field | Description |
|---|---|
$schema | URL pointing to the IPFS CID for the registered schemaId |
version | Envelope format version ("1.0" in v1) |
scope | Canonical scope identifier |
collectedAt | UTC timestamp of when the data was collected |
data | Source-specific payload — structure defined by the schema |
Encryption
Before upload to a storage backend, the entire plaintext JSON file is encrypted as a single OpenPGP blob. No plaintext metadata is stored alongside the ciphertext. ThefileId linkage is tracked in the Personal Server’s local index. See Storage & Encryption for the full encryption model.
File naming
Data files are stored locally at:collectedAt timestamp with colons replaced by hyphens for filesystem compatibility.
Data connectors
Data Connectors are modules that extract data from specific platforms. They are not part of the protocol — they are implementation details of specific clients (e.g. Data Connect desktop app). The protocol defines the data format; connectors produce data in that format. Each connector publishes metadata that maps scopes to human-readable labels:Adding new scopes
To add a new data source to the protocol:- Define the scope taxonomy — Choose scope names following the
{source}.{category}pattern - Create a JSON Schema — Define the structure of the
datafield for each scope - Register the schema — Upload the schema to IPFS and register it in the
DataRefinerRegistrywith the canonical scope - Build a Data Connector (optional) — Implement a connector module for the new platform in the Desktop App
Data Connectors are not required at the protocol level. Any client that can produce data in the correct file format and write it to a Personal Server via
POST /v1/data/{scope} is compatible.Related
- Personal Servers — Where data files are stored and served
- Storage & Encryption — How data files are encrypted and where they’re stored
- Grants & Permissions — How builders request access to specific scopes