Irmin is a distributed database that follows the same design principles as Git
Clone or download
samoht Merge pull request #609 from samoht/batch
backends: distinguish between read and writes operations
Latest commit e1ee3b6 Jan 20, 2019

Irmin - A distributed database built on the same principles as Git

Build Status docs

Irmin is an OCaml library for building mergeable, branchable distributed data stores.


  • Built-in snapshotting - backup and restore
  • Storage agnostic - you can use Irmin on top of your own storage layer
  • Custom datatypes - (de)serialization for custom data types
  • Highly portable - runs anywhere from Linux to web browsers and Xen unikernels
  • Git compatibility - irmin-git uses an on-disk format that can be inspected and modified using Git
  • Dynamic behavior - allows the users to define custom merge functions, use in-memory transactions (to keep track of reads as well as writes) and to define event-driven workflows using a notification mechanism


Documentation can be found online at


To install Irmin, the command-line tool and all optional dependencies using opam:

opam install irmin-unix

A minimal installation, with no storage backends can be installed by running:

opam install irmin

To only install the in-memory storage backend:

opam install irmin-mem

The following packages have been made available on opam:

  • irmin - the base package, no storage implementations
  • irmin-chunk - chunked storage
  • irmin-fs - filesystem-based storage using bin_prot
  • irmin-git - Git compatible storage
  • irmin-http - a simple REST interface
  • irmin-mem - in-memory storage implementation
  • irmin-mirage - mirage compatibility
  • irmin-unix - unix compatibility

For more information about an individual package consult the online documentation


Below is a simple example of setting a key and getting the value out of a Git based, filesystem-backed store.

open Lwt.Infix

(* Irmin store with string contents *)
module Store = Irmin_unix.Git.FS.KV(Irmin.Contents.String)

(* Database configuration *)
let config = Irmin_git.config ~bare:true "/tmp/irmin/test"

(* Commit author *)
let author = "Example <>"

(* Commit information *)
let info fmt = ~author fmt

let main =
    (* Open the repo *)
    Store.Repo.v config >>=

    (* Load the master branch *)
    Store.master >>= fun t ->

    (* Set key "foo/bar" to "testing 123" *)
    Store.set t ~info:(info "Updating foo/bar") ["foo"; "bar"] "testing 123" >>= fun () ->

    (* Get key "foo/bar" and print it to stdout *)
    Store.get t ["foo"; "bar"] >|= fun x ->
    Printf.printf "foo/bar => '%s'\n" x

(* Run the program *)
let () = main

To compile the example above, save it to a file called and run:

$ ocamlfind ocamlopt -o example -package irmin-unix,lwt.unix -linkpkg
$ ./example
foo/bar => 'testing 123'

The examples directory contains some more advanced examples. The build them, run:

$ jbuilder build examples/trees.exe
$ _build/default/examples/trees.exe


The same thing can also be accomplished using irmin, the command-line application installed with irmin-unix, by running:

$ echo "root: ." > irmin.yml
$ irmin init
$ irmin set foo/bar "testing 123"
$ irmin get foo/bar

irmin.yml allows for irmin flags to be set on a per-directory basis. You can also set flags globally using $HOME/.irmin/config.yml. Run irmin help irmin.yml for further details.

Also see irmin --help for list of all commands and either irmin <command> --help or irmin help <command> for more help with a specific command.


Feel free to to report any issues using the Github bugtracker.


See the LICENSE file.


Development of Irmin was supported in part by the EU FP7 User-Centric Networking project, Grant No. 611001.