What It Does

Simperium is a new kind of data layer. As your app reads and writes data, Simperium circulates that data everywhere it's needed. This makes your code simpler and your users happier:

  • Data transparently moves across mobile, web, and desktop versions of your app
  • Your users can read and write data even when they're offline
  • Multiple users can collaborate with the same data at the same time
  • You can build unique backend services that read and write data

How It Works

You add a Simperium library to your app and initialize it. This library keeps a persistent connection to the Simperium hosted service. The Simperium libraries and service work together to efficiently move data around for your users.

You can add Simperium to your backend services as well. This lets you keep a mirrored copy of your app's data in your own database, integrate with other services, manage curated content, and more.

Why It Helps

Moving data can be hard: conflicts arise, connections come and go, and data gets lost. Building and scaling a good solution can be challenging and expensive.

Simperium deals with everything to do with moving data so you can focus on creating a great user experience and building unique backend services.

The easiest way to get started is to follow a tutorial.



What Makes It Different

Simperium is the second generation of our technology. It is securely moving data for hundreds of thousands of users in production systems, with persistent connections, operational transforms, and aggressive versioning.

It is not a backend-as-a-service. We believe the best apps have both a great user experience and unique backend services. Our focus is to provide a great data layer between your frontend and backend while integrating with other providers of tools, hosting, and services.


Security

Security is handled through a number of different mechanisms in Simperium, all with the goal of allowing you to build production-ready apps.

All data is transferred over SSL for all libraries, as well as the HTTP API.

User Accounts

Simperium gives you a default system for these user accounts. Typically, your users will create accounts and sign in to your app or service.

The Simperium libraries help you manage your user accounts. You can also generate an access token for a user by calling authorize.

Access Tokens and API Keys

Access to data is controlled by tokens that are granted with a certain set of permissions. Access tokens determine which objects you can access and what you can do with them. They must be created using an API key, and they inherit their permissions and restrictions from that API key.

A default and an admin API keys are automatically created and available for you in your application dashboard. The risks of exposing a default API key to clients are mitigated since it's only used to generate private user tokens that are protected by a username and password.

Your backend services and admin tools can use an admin API key to access all data across your entire system.

Permissions

API keys grant a different set of permissions according to their level of privileges:

  • Admin: allow any operation on an application
  • Default: allow any operation except deleting and resetting users, listing buckets and bucket changes
  • Read-Only: give only read access to an application as well as the ability to create new users

Data Model

Simperium uses an inherently schema-less datastore. Objects in the same bucket need not have the same structure, though for use with client libraries like iOS Core Data, keeping the same structure is necessary. This is currently the responsibility of the application, but additional tools to enforce structure using Simperium are currently in development.

Buckets

Simperium persists your data for you in buckets. Buckets are application-wide namespaces and exist as a convenience for you to organize your application's data. Every Simperium object is JSON data that is stored in a bucket.

Versioning

Each update you make to any object either through the client libraries or directly through the HTTP API is recorded as a change and a version. In the beta period, Simperium stores up to 50 of your most recent versions, and then every 10th version beyond that.

Conflict Resolution

Simperium does some basic conflict resolution for you automatically. For example, if the same object is modified in two different places, we can tell if two changes are being made to the same version and then apply a default resolution policy for basic data types. This is possible because we keep a history of changes to the object.

In the simplest case, updates to two different fields of the same version of an object will succeed (since there is no conflict). When two edits are made for the same field though, Simperium supports automatic resolution for strings (currently) and will merge the two edits together.

Work on adding full resolution for other data types as well as the ability to specify custom resolution policies is under way.