Skip to main content

remoteStorage

Your data, anywhere. An open protocol for per-user storage on the Web.

Overview

remoteStorage is an open protocol enabling apps to store user data on personal servers. Users choose their storage provider; apps work with any provider. True data portability.

Key Features

User-Owned Storage

┌─────────────────────────────────────────────────────────────────┐
│ remoteStorage Model │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Traditional: │
│ ┌─────────┐ ┌─────────────┐ │
│ │ App │ ──► │ App's Server │ ← App controls data │
│ └─────────┘ └─────────────┘ │
│ │
│ remoteStorage: │
│ ┌─────────┐ ┌─────────────────┐ │
│ │ App │ ──► │ User's Storage │ ← User controls data │
│ └─────────┘ │ (any provider) │ │
│ └─────────────────┘ │
│ │
│ App never touches its own server for user data │
│ │
└─────────────────────────────────────────────────────────────────┘

Core Features

FeatureDescription
Open protocolAnyone can implement
Provider-agnosticUser chooses storage
Offline-firstWorks without network
Auto-syncChanges sync when online
Cross-deviceSame data everywhere

How It Works

┌─────────────────────────────────────────────────────────────────┐
│ Connection Flow │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. User enters their address: user@example.com │
│ │
│ 2. App discovers storage via WebFinger │
│ GET /.well-known/webfinger?resource=acct:user@example.com │
│ │
│ 3. App redirects to OAuth │
│ User authorizes app for specific folders │
│ │
│ 4. App accesses storage │
│ GET /storage/user/notes/ │
│ PUT /storage/user/notes/todo.json │
│ │
│ User data stays on user's server │
│ │
└─────────────────────────────────────────────────────────────────┘

Protocol

REST API

OperationHTTP Method
Get folder listingGET /folder/
Get documentGET /folder/file
Create/UpdatePUT /folder/file
DeleteDELETE /folder/file

Directory Listing

{
"@context": "http://remotestorage.io/spec/folder-description",
"items": {
"todo.json": {
"ETag": "\"abc123\"",
"Content-Type": "application/json",
"Content-Length": 245
},
"notes/": {
"ETag": "\"def456\""
}
}
}

Categories (Modules)

Apps request access to specific categories:

CategoryPurpose
documentsText documents
contactsAddress book
calendarEvents
bookmarksSaved links
tasksTo-do items

Usage

Client Library

import RemoteStorage from 'remotestoragejs'

const rs = new RemoteStorage({
modules: [/* modules to use */]
})

// Connect widget
rs.widget.attach('remote-storage-widget')

// Access data
const client = rs.scope('/notes/')

// Write
await client.storeFile('text/plain', 'hello.txt', 'Hello World')

// Read
const content = await client.getFile('hello.txt')

// List
const listing = await client.getListing('')

Offline Support

// Enable caching
rs.caching.enable('/notes/')

// Works offline automatically
// Syncs when connection returns

Providers

ProviderFeatures
5appsCommercial hosting
Indie HostersCommunity hosting
Self-hostedRun your own server

Self-Host Options

ServerLanguage
rs-serveNode.js
armadiettoNode.js
mysteryshackRust
reStoreRuby

Comparison

FeatureremoteStorageSolidDropbox
ProtocolOpenOpenProprietary
Data modelKey-valueRDFFiles
OfflineBuilt-inManualSync client
AuthOAuthSolid-OIDCOAuth
ProvidersMultipleMultipleOne

Relationship to Solid

remoteStorage and Solid share goals:

AspectremoteStorageSolid
FocusSimple storageLinked Data
Data formatJSON, binaryRDF
ComplexityLowerHigher
FeaturesStorage + syncFull platform

Both promote user data ownership.

Use Cases

  1. Note apps — Store notes on user's server
  2. Todo lists — Personal task management
  3. Bookmarks — Cross-browser sync
  4. Contacts — Portable address book

See Also