Build realtime apps even without the internet

Ditto is a realtime database for mobile, web, IoT, and server systems that automatically syncs data peer-to-peer.

Get Started FreeRead the Docs

With love from

Logo
Logo
Logo
Fast

1. Install Ditto into your app

Install Ditto through common package managers for your platform of choice.

Fast

2. Write a bit of code.

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

Fast

3. See your apps sync instantly!

Ditto lets you store and sync data peer-to-peer between devices in realtime.

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 => }

Realtime&Observable

Ditto provides query-based realtime data sync that makes it easy to control and share data across devices. Simply register a query and allow Ditto to tell your apps what has changed.

Use Ditto to rapidly build mission-critical applications and dramatically lower your development time.

AutomaticConflict Resolution

Ditto's peer-to-peer realtime database is 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 minimal bandwidth (even with Bluetooth)!

Sync evenwithout the internet

Ditto's realtime database is not reliant on an internet connection. In the event that your Ditto-powered app loses internet connectivity, it will fall back to peer-to-peer sync with nearby devices.

Even when completely offline, your app will continue to operate. Offline changes are stored locally and will sync instantly when cloud or peer devices are discovered.

Packed with features

A massive toolbox to build realtime 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.

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 programming language.

Each of our SDKs are built via a common Rust core, but abstracted with platform-specific APIs to maximize the 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")    
  }
}