# OrbitDB [](https://gitter.im/orbitdb/Lobby) [](http://webchat.freenode.net/?channels=%23orbitdb) [](https://circleci.com/gh/orbitdb/orbit-db) [](https://www.npmjs.com/package/orbit-db) [](https://www.npmjs.com/package/orbit-db) [](https://waffle.io/orbitdb/orbit-db) > A peer-to-peer database for the decentralized web OrbitDB is a serverless, distributed, peer-to-peer database. OrbitDB uses [IPFS](https://ipfs.io) as its data storage and [IPFS Pubsub](https://github.com/ipfs/go-ipfs/blob/master/core/commands/pubsub.go#L23) to automatically sync databases with peers. It's an eventually consistent database that uses [CRDTs](https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type) for conflict-free database merges making OrbitDB an excellent choice for decentralized apps (dApps), blockchain applications and offline-first web applications. **Test it live at [Live demo 1](https://ipfs.io/ipfs/QmeESXh9wPib8Xz7hdRzHuYLDuEUgkYTSuujZ2phQfvznQ/), [Live demo 2](https://ipfs.io/ipfs/QmasHFRj6unJ3nSmtPn97tWDaQWEZw3W9Eh3gUgZktuZDZ/), or [P2P TodoMVC app](https://ipfs.io/ipfs/QmTJGHccriUtq3qf3bvAQUcDUHnBbHNJG2x2FYwYUecN43/)**! OrbitDB provides various types of databases for different data models and use cases: - **[log](https://github.com/orbitdb/orbit-db/blob/master/API.md#orbitdblognameaddress)**: an immutable (append-only) log with traversable history. Useful for *"latest N"* use cases or as a message queue. - **[feed](https://github.com/orbitdb/orbit-db/blob/master/API.md#orbitdbfeednameaddress)**: a mutable log with traversable history. Entries can be added and removed. Useful for *"shopping cart" type of use cases, or for example as a feed of blog posts or "tweets". - **[keyvalue](https://github.com/orbitdb/orbit-db/blob/master/API.md#orbitdbkeyvaluenameaddress)**: a key-value database just like your favourite key-value database. - **[docs](https://github.com/orbitdb/orbit-db/blob/master/API.md#orbitdbdocsnameaddress-options)**: a document database to which JSON documents can be stored and indexed by a specified key. Useful for building search indices or version controlling documents and data. - **[counter](https://github.com/orbitdb/orbit-db/blob/master/API.md#orbitdbcounternameaddress)**: Useful for counting events separate from log/feed data. All databases are [implemented](https://github.com/orbitdb/orbit-db-store) on top of [ipfs-log](https://github.com/orbitdb/ipfs-log), an immutable, operation-based conflict-free replicated data structure (CRDT) for distributed systems. If none of the OrbitDB database types match your needs and/or you need case-specific functionality, you can easily [implement and use a custom database store](https://github.com/orbitdb/orbit-db/blob/master/GUIDE.md#custom-stores) of your own. #### Project status & support Status: **in active development** ***NOTE!*** *OrbitDB is **alpha-stage** software. It means OrbitDB hasn't been security audited and programming APIs and data formats can still change. We encourage you to [reach out to the maintainers](https://gitter.im/orbitdb/Lobby) if you plan to use OrbitDB in mission critical systems.* This is the Javascript implementation and it works both in **Browsers** and **Node.js** with support for Linux and OS X (Windows is not supported yet). The minimum required version of Node.js is now 8.0.0. To use with older versions of Node.js, we provide an ES5-compatible build through the npm package, located in `dist/es5/` when installed through npm. #### Community Calls We also have **regular community calls**, which we announce in the issues in [the @orbitdb welcome repository](https://github.com/orbitdb/welcome/issues). Join us! ## Table of Contents - [Usage](#usage) * [CLI](#cli) * [Module with IPFS Instance](#module-with-ipfs-instance) * [Module with IPFS Daemon](#module-with-ipfs-daemon) - [API](#api) - [Examples](#examples) * [Install dependencies](#install-dependencies) * [Browser example](#browser-example) * [Node.js example](#nodejs-example) - [Packages](#packages) * [OrbitDB Store Packages](#orbitdb-store-packages) - [Development](#development) * [Run Tests](#run-tests) * [Build](#build) * [Benchmark](#benchmark) * [Logging](#logging) - [Contributing](#contributing) - [Sponsors](#sponsors) - [License](#license) ## Usage Read the **[GETTING STARTED](https://github.com/orbitdb/orbit-db/blob/master/GUIDE.md)** guide for a more in-depth tutorial and to understand how OrbitDB works. ### CLI For the CLI tool to manage orbit-db database, see **[OrbitDB CLI](https://github.com/orbitdb/orbit-db-cli)**. It can be installed from Npm with: ``` npm install orbit-db-cli -g ``` ### Module with IPFS Instance If you're using `orbitd-db` to develop **browser** or **Node.js** applications, use it as a module with the javascript instance of IPFS Install dependencies: ``` npm install orbit-db ipfs ``` ```javascript const IPFS = require('ipfs') const OrbitDB = require('orbit-db') // OrbitDB uses Pubsub which is an experimental feature // and need to be turned on manually. // Note that these options need to be passed to IPFS in // all examples even if not specified so. const ipfsOptions = { EXPERIMENTAL: { pubsub: true } } // Create IPFS instance const ipfs = new IPFS(ipfsOptions) ipfs.on('error', (e) => console.error(e)) ipfs.on('ready', async () => { const orbitdb = new OrbitDB(ipfs) // Create / Open a database const db = await orbitdb.log('hello') await db.load() // Listen for updates from peers db.events.on('replicated', (address) => { console.log(db.iterator({ limit: -1 }).collect()) }) // Add an entry const hash = await db.add('world') console.log(hash) // Query const result = db.iterator({ limit: -1 }).collect() console.log(JSON.stringify(result, null, 2)) }) ``` ### Module with IPFS Daemon Alternatively, you can use [ipfs-api](https://npmjs.org/package/ipfs-api) to use `orbit-db` with a locally running IPFS daemon. Use this method if you're using `orbitd-db` to develop **backend** or **desktop** applications, eg. with [Electron](https://electron.atom.io). Install dependencies: ``` npm install orbit-db ipfs-api ``` ```javascript const IpfsApi = require('ipfs-api') const OrbitDB = require('orbit-db') const ipfs = IpfsApi('localhost', '5001') const orbitdb = new OrbitDB(ipfs) const db = await orbitdb.log('hello') ... ``` ## API See [API.md](https://github.com/orbitdb/orbit-db/blob/master/API.md) for the full documentation. ## Examples ### Install dependencies ``` git clone https://github.com/orbitdb/orbit-db.git cd orbit-db npm install ``` You'll also need babel and webpack, if you don't have them installed already: ``` npm install --global babel-cli npm install --global webpack ``` Some dependencies depend on native addon modules, so you'll also need to meet [node-gyp's](https://github.com/nodejs/node-gyp#installation) installation prerequisites. Therefore, Linux users may need to ``` make clean && make ``` to redo the local package-lock.json with working native dependencies. ### Browser example In macOS: ``` npm run build npm run examples:browser-macos ``` In Linux: ``` npm run build npm run examples:browser-linux ```