{"id":50948048,"url":"https://github.com/dolthub/dumbodb","last_synced_at":"2026-06-17T22:30:37.066Z","repository":{"id":356125177,"uuid":"1185741685","full_name":"dolthub/dumbodb","owner":"dolthub","description":"Dumbo - Version Controlled Document Database","archived":false,"fork":false,"pushed_at":"2026-06-16T23:58:31.000Z","size":3940,"stargazers_count":40,"open_issues_count":5,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-17T01:19:25.496Z","etag":null,"topics":["document-database","dolt","dolthub","git","git-for-data","mongodb","prolly-tree","version-control"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dolthub.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-18T22:38:33.000Z","updated_at":"2026-06-16T23:36:33.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dolthub/dumbodb","commit_stats":null,"previous_names":["dolthub/dumbodb"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/dolthub/dumbodb","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dolthub%2Fdumbodb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dolthub%2Fdumbodb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dolthub%2Fdumbodb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dolthub%2Fdumbodb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dolthub","download_url":"https://codeload.github.com/dolthub/dumbodb/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dolthub%2Fdumbodb/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34468766,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-17T02:00:05.408Z","response_time":127,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["document-database","dolt","dolthub","git","git-for-data","mongodb","prolly-tree","version-control"],"created_at":"2026-06-17T22:30:36.324Z","updated_at":"2026-06-17T22:30:37.058Z","avatar_url":"https://github.com/dolthub.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Logo](./img/dolt-dumbo-logo.png)\n\n## What is DumboDB?\n\n[MongoDB](https://github.com/mongodb/mongo) and [Git](https://git-scm.com/) had a baby, and it's named **Dumbo**. It's a document database with built-in version control, so you can track changes, branch, and merge just like you would with code  -- but for your data.\n\nDumboDB leverages the power of the [Dolt](https://github.com/dolthub/dolt) storage engine. Dolt's [prolly trees](https://docs.dolthub.com/architecture/storage-engine/prolly-tree) enable efficient storage of data over time thanks to structural sharing between commits. This means you can have a rich history of changes without worrying about storage bloat. \n\n## What's in Version 0.1?\nDumbo v0.1 is Alpha quality software. We don't recommend it for production use, but it's great for testing your existing applications and seeing what they are changing over time. In a test environment, you can use DumboDB just like you would use MongoDB, but with the added ability to reset to specific snapshots in time and see the changes made by your application code.\n\nWe are actively developing new features, so please [join our discord server](https://discord.gg/gqr7K4VNKe) and give us feedback. See the [roadmap below](#roadmap)!\n\n### MongoDB Compatibility\nDumboDB implements the MongoDB 8.0 wire protocol and is designed for high parity with core MongoDB operations. It functions as a drop-in replacement for [standard drivers](https://www.mongodb.com/docs/drivers/) and [`mongosh`](https://www.mongodb.com/docs/mongodb-shell/) in single-node environments.\n\n#### Parity\n- BSON Engine: Full support for BSON type fidelity, including nested documents, arrays, and ObjectIDs.\n- Query \u0026 Update: Supports complex MQL operators (e.g., $elemMatch, $all, $rename) and atomic array modifiers ($push, $pull, $bit).\n- Aggregation Framework: Implementation of multi-stage pipelines including $match, $group, $unwind, and $lookup.\n- Indexing: Support for secondary indexes on top-level and nested fields to ensure query performance.\n\n#### Limitations \u0026 Scope\n- No Authentication. DumboDB does not implement any authentication. It is intended for use in trusted environments or local development. Do not expose DumboDB instances to untrusted networks. Planned for v0.6.\n- Single Node: Replication (Replica Sets) and Sharding are out of scope. Support not planned.\n- Ecosystem Features: Proprietary features specific to [MongoDB Atlas](https://www.mongodb.com/lp/cloud/atlas/try3) (e.g., Search Indexes, Serverless Triggers) are not supported. Support not planned.\n\n### Version Control Features\nDumboDB's version control features are exposed via a set of custom commands (e.g. `dumboCommit`, `dumboMerge`, etc.) that you can run from any MongoDB client. These commands allow you to commit changes, create branches, merge branches, view commit history, and more.\n\n| Command | Description |\n|---------|-------------|\n| [`dumboCommit`](https://github.com/dolthub/dumbodb/wiki/Commands#dumbocommit) | Commit the current working set with a message and author |\n| [`dumboBranch`](https://github.com/dolthub/dumbodb/wiki/Commands#dumbobranch) | Create or delete a branch |\n| [`dumboMerge`](https://github.com/dolthub/dumbodb/wiki/Commands#dumbomerge) | Merge a source branch into the current branch |\n| [`dumboCherryPick`](https://github.com/dolthub/dumbodb/wiki/Commands#dumbocherrypick) | Apply one commit's diff onto the current branch |\n| [`dumboRebase`](https://github.com/dolthub/dumbodb/wiki/Commands#dumborebase) | Reapply branch commits onto another branch tip, rewriting history |\n| [`dumboLog`](https://github.com/dolthub/dumbodb/wiki/Commands#dumbolog) | Return commit history for the current branch |\n| [`dumboStatus`](https://github.com/dolthub/dumbodb/wiki/Commands#dumbostatus) | Show summary of uncommitted changes on the current branch |\n| [`dumboDiff`](https://github.com/dolthub/dumbodb/wiki/Commands#dumbodiff) | Document-level diff between two states |\n| [`dumboReset`](https://github.com/dolthub/dumbodb/wiki/Commands#dumboreset) | Move branch HEAD to a target commit (soft or hard) |\n| [`dumboRevert`](https://github.com/dolthub/dumbodb/wiki/Commands#dumborevert) | Revert a commit, creating a new inverse commit |\n| [`dumboConflicts`](https://github.com/dolthub/dumbodb/wiki/Commands#dumboconflicts) | List or inspect conflicts from an in-progress merge/cherry-pick/rebase |\n| [`dumboResolveConflict`](https://github.com/dolthub/dumbodb/wiki/Commands#dumboresolveconflict) | Resolve a single document conflict (ours / theirs / custom) |\n| [`dumboTag`](https://github.com/dolthub/dumbodb/wiki/Commands#dumbotag) | Create, list, or delete tags at specific commits |\n| [`dumboGC`](https://github.com/dolthub/dumbodb/wiki/Commands#dumbogc) | Run garbage collection on the database's chunk store |\n\nAll commands have a `dolt*` alias (e.g. `doltCommit`, `doltMerge`). Use whichever prefix you prefer!\n\nFull command reference: [Command Reference](https://github.com/dolthub/dumbodb/wiki/Commands)\n\n## Install, Run, Connect\n### Install DumboDB\n#### Build From Source\n```bash\ngit clone https://github.com/dolthub/dumbodb\ncd dumbodb\nmake build                             # Binary ends up here: .runtime/bin/dumbodb\ncp .runtime/bin/dumbodb /usr/local/bin # or somewhere else in your $PATH\n```\n\n#### Released Binaries\nWe publish pre-built binaries for Linux, MacOS, and Windows on our [GitHub Releases page](https://github.com/dolthub/dumbodb/releases). Download the appropriate binary for your platform, put it somewhere in your `PATH`. The specifics will depend on your operating system, as they have protections against running arbitrary binaries from the internet, so please refer to your OS documentation for how to run downloaded binaries. We are working on getting signed binaries published to make this easier!\n\n### Run DumboDB\nThe only required argument to run DumboDB is `--data-dir`, which specifies the directory where your data will be stored. If the directory does not exist, it will be created.\n\n```bash\n$ dumbodb --data-dir /tmp/dumbodb-data\n```\n\n### Connect\nConnect with any [MongoDB driver](https://www.mongodb.com/docs/drivers/), or use the\n`mongosh` [shell](https://www.mongodb.com/try/download/shell):\n\n```bash\nmongosh mongodb://localhost:27017\n```\n\nThis will connect you to the `test` database by default. You can specify a different database in the connection string if you like (e.g. `mongodb://localhost:27017/mydb`)\n\n## Example Usage\nAll examples below are using the `mongosh` shell, which is effectively javascript. There are equivalent operations for any MongoDB driver in your favorite language.\n\n### Specifying a Branch\nBy default, all connections target the `main` branch. This is currently hard coded. Using the `getSiblingDB()` method, you can connect to a different branch by encoding the branch name in the database name. `@` is the delimiter between the database name and the branch name. For example, to connect to a branch named `mybranch`, you would connect to the database `mydb@mybranch`:\n\n```js\nvar db = db.getSiblingDB(\"mydb@mybranch\")\n```\n\nIf you specify a revision rather than a branch name, then the database returned will be read-only and reflect the state of the database at that revision. For example, if you'd like to perform reads against the parent commit of the `main` branch, you can connect to `mydb@main~1`:\n\n```js\nvar db = db.getSiblingDB(\"mydb@main~1\")\n```\n\nAlternatively you can use a commit hash to create a read-only connection to that commit:\n\n```js\nvar db = db.getSiblingDB(\"mydb@v9ra3pmi0f6kotj5k3fganpmb3oi9t1k\")\n```\n\n### Committing Changes\nSay you want to stick two documents into the \"items\" collection, then commit them:\n\n```js\nvar db = db.getSiblingDB(\"mydb@main\")\ndb.items.insertOne({ _id: 1, label: \"alpha\", score: 10 })\ndb.items.insertOne({ _id: 2, label: \"beta\",  score: 20 })\ndb.runCommand({ dumboCommit: 1, message: \"baseline\", author: \"alice \u003calice@acme.com\u003e\" })\n```\n\nThe last command creates a new commit with the two inserted documents, and outputs the commit details:\n```js\n{\n  commitId: 'egqis00l0vqg5kd7gbje8k1k6g7dl7ja',\n  branch: 'main',\n  message: 'baseline',\n  author: 'alice \u003calice@acme.com\u003e',\n  timestamp: ISODate('2026-04-28T23:12:23.621Z'),\n  committer: 'alice \u003calice@acme.com\u003e',\n  committerTimestamp: ISODate('2026-04-28T23:12:23.621Z'),\n  ok: 1\n}\n```\n_Note that there is no need to `add` items like you would with `git add`. DumboDB tracks all changes in the working set, and they will all be included in the next commit unless you explicitly discard them._\n\n### Seeing Uncommitted Changes\nNow let's modify those documents, and add a new one, but don't commit just yet:\n\n```js\ndb.items.insertOne({ _id: 3, label: \"gamma\", score: 30 })\ndb.items.updateOne({ _id: 1 }, { $set: { score: 99 } })\ndb.items.deleteOne({ _id: 2 })\n```\n\nAt this point, if we run `dumboStatus`, we can see a summary of the uncommitted changes:\n\n```js\ndb.runCommand({dumboStatus: 1})\n```\nWill output the summary of your changes. Specifically, it shows that in the 'items' collection, you have 1 added document, 1 modified document, and 1 deleted document:\n```js\n{\n  branch: 'main',\n  dirty: true,\n  readonly: false,\n  collections: [\n    {\n      name: 'items',\n      status: 'modified',\n      added: 1,\n      modified: 1,\n      deleted: 1\n    }\n  ],\n  ok: 1\n}\n```\nIf you need more detail, you can run `dumboDiff`. When called with no additional arguments, it will print all of the changes in your session. Specifically everything that is not committed. These are the changes that will be committed when you run `dumboCommit`.\n\n```js\ndb.runCommand({ dumboDiff: 1 })\n```\nWill produce:\n```js\n{\n  collections: [\n    {\n      name: 'items',\n      status: 'modified',\n      added: [ { _id: 3, label: 'gamma', score: 30 } ],\n      removed: [ { _id: 2, label: 'beta', score: 20 } ],\n      modified: [\n        {\n          _id: 1,\n          diff: [ { type: 'modified', path: '$.score', from: 10, to: 99 } ]\n        }\n      ]\n    }\n  ],\n  ok: 1\n}\n```\n\n### Seeing What Changed\nYou can specify the `from` and `to` arguments to `dumboDiff` to see the changes between any two commits. For example, if you want to see the changes between the current state of your session and the last commit, you can run:\n\n```js\ndb.runCommand({ dumboDiff: 1, from: \"HEAD~1\", to: \"HEAD\" })\n```\n\nThe `dumboLog` command will show you the commit history for the current branch, starting with the most recent commit.\n\n```js\ndb.runCommand({ dumboLog: 1, limit: 2 })\n{\n  commits: [\n    {\n      commitId: 'v9ra3pmi0f6kotj5k3fganpmb3oi9t1k',\n      parent1:  'tqq1tn5qs0pns2j2uk5k1b2ufhqt9q3b',\n      refs:     [ 'HEAD', 'main' ],\n      message:  'alice order updated',\n      timestamp: ISODate('2026-04-14T17:22:31.000Z'),\n      author:   'alice \u003calice@acme.com\u003e'\n    },\n    {\n      commitId: 'tqq1tn5qs0pns2j2uk5k1b2ufhqt9q3b',\n      parent1:  '5vi6e5t3riqpgh6fq0j1pf0r0imuqhsn',\n      message:  'initial data',\n      timestamp: ISODate('2026-04-14T09:00:00.000Z'),\n      author:   'bob \u003cbob@acme.com\u003e'\n    },\n  ],\n  ok: 1\n}\n```\n\n### Branching and Merging\nYou can create a new branch with `dumboBranch`. In this example, you can see that a new variable `feature` is created to represent the new branch, and you can run commands against it directly:\n\n```js\n// Create the branch\ndb.runCommand({ dumboBranch: 1, branch: \"feature\" })\n// \"checkout\"\nvar feature = db.getSiblingDB(\"mydb@feature\")\n\nfeature.items.insertOne({ _id: 4, label: \"delta\", score: 40 })\nfeature.runCommand({ dumboCommit: 1, message: \"add delta on feature branch\", author: \"alice \u003calice@acme.com\u003e\" })\n```\n\nThe `dumboMerge` command will merge the changes from the `feature` branch back into whatever branch you are on. `db` is still connected to `main`, so when we run the merge command, it will merge `feature` into `main`, which in this case is a fast-forward merge, since `main` has not diverged from `feature`. The output of the merge command will show you the new commit that was created on `main` as a result of the merge.\n\n```js\ndb.runCommand({ dumboMerge: 1, merge_in: \"feature\"})\n{\n  commitId: 'gr2iofosqge0se1dcu2b1a1u42l6udd3',\n  message: 'fast-forward',\n  ok: 1\n}\n```\nThere are also legitimate merges which join two commit histories, complete with conflict detection and resolution. Look at the [Command Reference](https://github.com/dolthub/dumbodb/wiki/Commands) for more details and examples.\n\n\n## Acknowledgements\n\nDumboDB is built on two open-source projects:\n\n- **[FerretDB](https://github.com/FerretDB/FerretDB)**  -- The wire protocol, connection handling, type system, and handler packages were adapted from FerretDB v1.24.2 (Apache 2.0). See [ACKNOWLEDGEMENTS](https://github.com/dolthub/dumbodb/blob/main/ACKNOWLEDGEMENTS) for details.\n- **[Dolt](https://github.com/dolthub/dolt)**  -- The version-controlled storage engine powering every commit, branch, and merge.\n\n## Roadmap\nDumboDB is in active development, and we have a lot of exciting features planned. Major milestones we are planning:\n\n- **v0.2**: Garbage Collection and zstd compression. Reduce the footprint of your database. Simplified configuration for user details (name and email) so you don't have to specify them on every commit.\n- **v0.3**: Add Clone, Push, and Pull support. This will allow you to sync your DumboDB repositories with remote servers, and collaborate with others.\n- **v0.4**: Add support for Replication (as a secondary backup to your existing MongoDB instance)\n- **v0.6**: Add Authentication and Authorization support.\n- **v0.8**: Visualization and operations via a custom Workbench UI.\n- **v1.0**: General availability release, with a focus on stability, performance, and usability improvements.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdolthub%2Fdumbodb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdolthub%2Fdumbodb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdolthub%2Fdumbodb/lists"}