Irmin is a library for persistent stores with built-in snapshot,
branching and reverting mechanisms. It is designed to use a large
variety of backends. Irmin is written in pure OCaml and does not
depend on external C stubs; it aims to run everywhere, from Linux,
to browsers and Xen unikernels.
Irmin is a library to version-control application data. It has the following
on-disk format various formats are supported, including the Git format:
Irmin on-disk repositories can be inspected and modified using the classic
Git command-line tools.
wire format various formats are supported, including the Git protocol
(only in client mode) or a simple JSON-based REST API (client and server).
dynamic behaviour Irmin allows the users to define custom merge functions,
to use in-memory transactions (to keep track of reads as well as writes) and
to define event-driven workflows using a notification mechanism.
These abstractions allow developers to create applications with concurrent
behaviors which are both efficient and safe.
Bindings to other languages
Irmin ships with various backends. It provides the following OCamlfind pacakges:
irmin.memis an in-memory backend.
irmin.gituses the Git format to persist data on disk.
irmin.fsuses bin_prot to persist
data on disk.
irmin.httpuses JSON over HTTP to speak with an Irmin server.
Other external backends are available as external OPAM packages
opam install <pkg> to install):
irmin-chunk stores raw contents into
a well-balanced rope where leafs are chunks of all the same size.
irmin-indexdb is a backend
for a web browser's IndexedDB store.
merge-queues is an implementation
of mergeable queues.
merge-ropes is an implementation
of mergeable ropes.
diff-datatypes is a collection
of automatic merge functions based on edit scripts. It is fairly generic but
contains specific implementation for mergeable trees, stacks and queues.
irmin-datatypes is a
collection of mergeable datatypes, including LWW registers, queues and sets.
Here a list of Irmin users:
version-controlled TODO list in the browser.
imaplet, a version-controlled
IMAP server and client.
jitsu, a DNS server that automatically
starts unikernels on demand. The database is persisted with Irmin.
Xenstore deamon rewritten to use Irmin to persist its data.
irmin-arp, a distributed ARP cache.
dog, a synchronisation tool.
irminFS, a prototype version-controlled
file-system using Fuse.
What a Distributed, Version-Controlled ARP Cache Gets
Blog post describing how Irmin can be used with Mirage to store the
network stack's ARP cache, which allows the history to be viewed using
the git tools.
CueKeeper: Gitting Things Done in the
A GTD-based todo list running client-side in the browser, using Irmin
between tabs. The data is stored using an IndexedDB Irmin backend.
Using Irmin to add fault-tolerance to the Xenstore
Porting the Xen hypervisor toolstack to support Git persistence via
Introducing Irmin: Git-like distributed, branchable
storage. This is the first
post that describes Irmin, the new Git-like storage layer for Mirage
Irmin is packaged with opam:
opam install irmin-unix # install all the optional depencies
Irmin comes with a command-line tool called
irmin --help for further reading. Use either
irmin <command> --help or
irmin help <command> for more information on a specific command.
To get the full capabilites of Irmin, use the API:
open Lwt open Irmin_unix module Store = Irmin_git.FS (Irmin.Contents.String)(Irmin.Ref.String)(Irmin.Hash.SHA1) let config = Irmin_git.config ~root:"/tmp/irmin/test" ~bare:true () let prog = Store.Repo.create config >>= Store.master task >>= fun t -> Store.update (t "Updating foo/bar") ["foo"; "bar"] "hi!" >>= fun () -> Store.read_exn (t "Reading foo/bar") ["foo"; "bar"] >>= fun x -> Printf.printf "Read: %s\n%!" x; Lwt.return_unit let () = Lwt_main.run prog
To compile the example above, save it to a file called
example.ml. Install irmin and git with opam (
opam install irmin-unix) and
$ ocamlfind ocamlopt example.ml -o example -package irmin.unix,lwt.unix -linkpkg $ ./example Read: hi!
examples directory contains more examples. To build them, run
$ ./configure --enable-examples $ make
Tutorials are available on the
To report any issues please use the bugtracker on
Copyright (c) 2013-2015 Thomas Gazagnaire firstname.lastname@example.org
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Development of Irmin was supported in part by the EU FP7 User-Centric Networking
project, Grant No. 611001.
with-test & >= "0.2.0"
with-test & >= "0.4.1"
>= "0.4.2" & < "0.5.0"
build & >= "0.7.8"