A Personal Server is a protocol participant — it registers onchain and can act under the scopes the user allows. A Vana app (the desktop app, or a web app) is a client that bundles and controls a Personal Server, but is not itself a protocol participant. Think of it like email: the app is your mail client, the Personal Server is your mail server.
Status. Live: the client-side Personal Server — bundled in the desktop app and running in a browser tab for the web, on a single SDK. Coming: bring your own compute, a user-controlled compute environment (an ODL product) where only the user can see the encrypted data.
What every Personal Server does
- Syncs data from the user’s connected sources into their own storage, organized by scope
- Serves data to builders who hold a valid grant, scope by scope, over an authenticated API
- Encrypts data before uploading to storage backends
- Validates grants on every request — registered grantee, unrevoked, unexpired, scope covered, and (where fee gating is enabled) fee paid
- Exposes an MCP interface so agents can work with the user’s data under the same grant permissions — bounding what an agent may access (see Agents)
- Keeps an access log the user can review
Forms
The desktop and web forms share one codebase and one SDK; they differ only in where they run and how they store data. Both keep the data and keys on the client. The desktop form keeps keys in the OS filesystem; the Web (Lite) form keeps them in the browser (IndexedDB) for zero-install convenience.
Registration
Every Personal Server must be registered onchain via theDataPortabilityServers contract. Registration records the server’s address, public key, and URL. Users then trust a server to act on their behalf.
The DP RPC provides signature-based registration so a Vana app can register a server without the user sending an onchain transaction directly:
DataPortabilityServers contract interface.
API
The Personal Server exposes a versioned REST API under/v1.
Data endpoints
Grant endpoints
Other endpoints
Query parameters for GET /v1/data
Query parameters for GET /v1/data/{scope}
If neither parameter is provided, the latest version by
collectedAt is returned.
Write flow (POST /v1/data/{scope})
When a data document is written:
- Look up
schemaIdfor the scope via the DP RPC - Validate the request body against the schema
- Generate a
collectedAttimestamp (UTC) - Construct the data file envelope with schema URL, version, scope, and timestamp
- Store locally in
~/.vana/data/{scope}/{collectedAt}.json - Return
201 Createdimmediately - Asynchronously: encrypt with the scope key, upload to the storage backend, and register in the DataRegistry
Builder data access
Builders read data from the Personal Server using signed HTTP requests. Every builder request must include anAuthorization: Web3Signed header.
Web3Signed authorization
Signing: The JSON is canonicalized (keys sorted alphabetically), then base64url-encoded (no padding). The
signature is an EIP-191 signature over the ASCII bytes of the base64url string.
Verification
When the Personal Server receives a builder request, it:- Recovers the signer address from the
Authorizationheader - Verifies the signer is a registered builder onchain
- Checks
audmatches the server’s own origin - Checks
methodandurimatch the actual request - Validates
iat/expare within the allowed skew window (e.g. 5 minutes) - For data reads: verifies
grantIdexists onchain and the signer matches the grantee - Confirms the requested scope is within the granted scopes
- Where fee gating is enabled, confirms the grant’s fee shows as paid (see Payments & fees)
- Logs the access
Access control summary
Reachability
A client-side Personal Server must be reachable from the internet for a builder to read from it. A desktop-bundled server is reachable while the app is open; when the app is closed, builder requests fail until it reopens. To expose it, Vana provides FRP tunneling (Fast Reverse Proxy): the app connects toproxy.server.vana.org and receives a public URL at {userId}.server.vana.org with automatic TLS. A self-hosted server (advanced users, run as a Docker container on their own infrastructure) controls its own URL and uptime.
Bring your own compute (future)
The forthcoming addition is bring your own compute: an option to run your Personal Server in a dedicated compute environment instead of on your own device — so a web user gets an always-available Personal Server without keeping a tab open or installing the desktop app. This is one of the products Open Data Labs will offer: a compute environment designed so that the user controls it and only the user can see the data. Data stays encrypted inside the environment, and the intended guarantee is that no one else — including ODL, which provides the environment — can see what runs in it or read the data. This rests on hardware-attested execution and PGE, both in active development.Sync
When a user has multiple Personal Server instances, they stay synchronized through the storage backend and Data Registry. See Storage & Encryption — Data sync for the full sync model.Local data hierarchy
Personal Server implementations that use a filesystem store the same directory layout:{YYYY-MM-DDTHH-mm-ssZ}.json using the collectedAt timestamp.
Related
- Scopes & Schemas — Data taxonomy and file format
- Storage & Encryption — Key derivation, encryption, and storage backends
- Encryption & PGE — How decryption is governed, today and with PGE
- Grants & Permissions — How builders get access to data
- Identity — Server registration and the
DataPortabilityServerscontract - Agents — The MCP interface and the access log