A Reactive Database that syncs even without the internet

Build mission critical apps that allow your employees and customers to sync data regardless of connectivity.

Get StartedRead the Docs

With love from

Logo
Logo
Logo
Logo
Fast

1. Install Ditto into your app

Install Ditto through Cocoapods, Gradle, or Nuget. NPM coming soon.

Fast

2. Write a bit of code.

Use our easy to use NoSQL database APIs. Read the docs

Fast

3. See your apps sync while offline.

Ditto can sync without the internet by using our peer-to-peer mesh network.

Mobile screens
Mobile screens

Try ourdemo apps

Download our demo apps on your own iOS and Android devices and see the sync for yourself. Some of our most popular demo apps:
Scan QR code to test on your iOS device
Download Link
Scan QR code to test on your Android device
Download Link
insert(doc)update(doc)remove(doc) observe{ docs => } observe{ docs => } observe{ docs => }

Real-time&Observable

Instead of performing expensive and wasteful HTTP or queue polling, Ditto opts for a query based synchronization technology. Simply register a query and allow Ditto to tell your apps what has changed.

Ditto's query based synchronization allows your company to rapidly build reactive applications that can engage users and dramatically your developers' time to market.

AutomaticConflict Resolution

Ditto's peer to peer database technologies are backed by delta state Conflict Free Replicated Data Types (CRDTs). This means that all edits can occur regardless of connectivity between each Ditto enabled device.

Because the CRDTs are delta state based, Ditto can efficiently replicate data without replicating the entire data. This means that Ditto is capable of highly frequent and efficient changes so that your apps remain quick while using as low bandwidth as possible.

Sync evenwithout the internet

Ditto's special connectivity infrastructure does not rely on an internet connection. In the event that your Ditto-powered app loses connectivity, it will fall back to peer-to-peer synchronization allowing you business functions to continue even during downtime. In addition, Ditto allows your app to function even completely offline. Offline changes are cached locally and will automatically when cloud or peer devices are discovered.

Packed with features

A massive toolbox to build fast apps, quickly.

Icon

Structured Data and File Sync

Efficiently synchronize data using primitives, collection, or even raw binary types.
Icon

Secure and Encrypted

All connections, whether to cloud or with peer to peer connections, are securely encrypted preventing users

Icon

Offline-First

Even if devices are not connected to the cloud or nearby peers, they will always be able to read or edit data.

Icon

Automatic conflict resolution

Powered by conflict free replicated data types (CRDTs), all devices are able to make concurrent edits.

Icon

Extreme Performance

Today, speed is everything. Ditto's cloud "big peer" can handle over 15,000 write transactions per second.

Icon

Multi-hop mesh sync

Ditto's "small peer" can form large inter-connected mesh networks so that offline scenarios can share data in large areas.

Designed for developers

The most powerful and easy to use SDKs

Read the docs

Cross platform means that we strive to make the developer experience feel natural for each individual programming language.

Each of our software developer kits are were built on the same foundation but abstracted with hand written APIs to maximize a natural developer experience.
import { Ditto, Counter } from "@dittolive/ditto"

const ditto = new Ditto({
  url: "https://cloud.ditto.live/myorg/myapp"
})

ditto.store["cars"].find("color == 'red'").observe((docs) => {
  console.log(docs)
})

// inserting a document
ditto.store["cars"].insert({
  "color": "red",
  "mileage": 5600,
  "inventoryCount": new Counter(45)
})
import DittoSwift

let ditto = new Ditto(
  url: "https://cloud.ditto.live/myorg/myapp"
)

let liveQuery = ditto.store["people"].findAll().observe { docs, _ in 
  // do something
}

ditto.store["people"].insert([
  "name": "Frank",
  "age": 31,
  "ownedCars": 0,
  "friends": []
])

ditto.store["people"].findByID(docId).update { mutableDoc in
  mutableDoc?["age"].set(32)
  mutableDoc?["ownedCars"].replaceWithCounter()
  mutableDoc?["ownedCars"].increment(amount: 1)
  mutableDoc?["friends"].push("Susan")
}
val ditto = Ditto(url: "https://cloud.ditto.live/myorg/myapp")

val liveQuery = ditto.store.collection("cars")
    .findAll()
    .observe { docs, _ ->
        // do something
    }
    
// inserting a document
ditto.store["cars"].insert(mapOf(
  "name" to "Susan",
  "age" to 31
))

//
ditto.store.collection("people").findByID(docId).update { mutableDoc ->
  mutableDoc?.let { 
      it["age"].set(32)
      it["ownedCars"].replaceWithCounter()
      it["ownedCars"].increment(1)
      it["friends"].push("Susan")
      it["name"].replaceText(5, 0, " Smith")    
  }
}