
Irmin: Git-like distributed DB - mortimerwax
https://mirage.io/blog/introducing-irmin
======
amirmc
There was some discussion about Irmin just over a year ago [1] and it's been
steadily improving ever since. The Readme on the repo [2] lists the bleeding-
edge users too, so you can see examples of how it's been applied -- _(note to
self: we should probably write an update about the progress to date)._

[1]
[https://news.ycombinator.com/item?id=8053687](https://news.ycombinator.com/item?id=8053687)

[2] [https://github.com/mirage/irmin/blob/master/README.md#use-
ca...](https://github.com/mirage/irmin/blob/master/README.md#use-cases)

------
avsm
If anyone wants to see a talk about this with a few demos of various use-cases
(such as the JavaScript transpilation backend, and log servers), I gave a talk
at QCon NYC that just went live on InfoQ yesterday:
[http://www.infoq.com/presentations/irmin](http://www.infoq.com/presentations/irmin)

------
zmanian
I'd like to see more information about transactions. Is it possible to update
a several keys atomicly?

~~~
eriangazag
Yes, you can easily add thing into a "staging area" of your database (which is
hold in-memory), and then "commit" your changes to update multiple keys in one
go. You can also use this mechanism to keep track of reads (what Git doesn't
do) to detect read/write conflicts.

~~~
avsm
See also an early paper on "mergeable persistent data structures" that shows
how to do this for Irmin-based Rope and Queue data structures.
[http://anil.recoil.org/papers/2015-jfla-
irmin.pdf](http://anil.recoil.org/papers/2015-jfla-irmin.pdf)

------
bratsche
The Github repo[1] says "This repository is currently offline". I've never
seen this message on github before, I'm not really sure what it means. Github
then refers me to the "working when Github goes down" article, but Github
hasn't really _gone down_.. I can access every other repo I try to access.
Just not this one.

[1] [https://github.com/mirage/irmin](https://github.com/mirage/irmin)

~~~
drewm1980
If github went down I would seek the nearest bomb shelter.

~~~
rplnt
It's down pretty often.

------
marknadal
From your description I'm not quite sure where in the stack Irmin belongs? Is
this to be used by web application developers? I assume note, as this looks
like it is targeting more OS level development work?

Pretty cool stuff. I am also working on a distributed database,
[https://github.com/amark/gun](https://github.com/amark/gun) , that operates
at the high level (web/javascript) rather than the low level. Although it
looks like Irmin can be used in the browser? [https://github.com/talex5/irmin-
js](https://github.com/talex5/irmin-js) ? Would love to hear some
clarification.

~~~
eriangazag
As for the rest of MirageOS, Irmin is a "library" database, means that you
have a bunch of components than you can re-use in different contexts. Two
interesting contexts are:

\- the browser, where some components of Irmin are transpiled to JavaScript
using js_of_ocaml
([http://ocsigen.org/js_of_ocaml/](http://ocsigen.org/js_of_ocaml/)).
Cuekeeper ([http://roscidus.com/blog/blog/2015/04/28/cuekeeper-
gitting-t...](http://roscidus.com/blog/blog/2015/04/28/cuekeeper-gitting-
things-done-in-the-browser/)) is an interesting use-case for that.

\- the kernel, where some components of Irmin can be compiled into a unikernel
and be run on top of Xen/baremetal, bypassing the OS completely. Irmin-ARP
([http://somerandomidiot.com/blog/2015/04/24/what-a-
distribute...](http://somerandomidiot.com/blog/2015/04/24/what-a-distributed-
version-controlled-ARP-cache-gets-you/)) is an interesting step is the
direction of exposing kernel data and do interesting stuff with it.

------
csense
How does this compare / contrast with IPFS?

~~~
Natanael_L
IPFS isn't designed as a database, more as a lookup layer for files

~~~
david_ar
You'll soon be able to store arbitrary data structures on IPFS [1], and we're
discussing how to perform merging in a decentralised manner [2]. I'm actually
quite interested in having a persistent data storage system (like Irmin)
backed by IPFS in the future.

[1] [https://github.com/ipfs/go-ipld](https://github.com/ipfs/go-ipld) [2]
[https://github.com/ipfs/notes/issues/40](https://github.com/ipfs/notes/issues/40)

------
amelius
Nice, but there is a fundamental problem with the three-way merge: the
guarantees about the result are very weak, and it may require special
attention to resolve merge conflicts.

~~~
avsm
That's sort of the entire point. The idea is that you build datastructures
using this library that operate over the three-way merge, and provide their
own guarantees about merge conflicts.

For instance, a weakly consistent data structure could promise never to raise
a merge conflict, and therefore be safe to compose. A stronger one could raise
more precise merge exceptions depending on the exact error, which ripple up to
the application.

An example of an application handling this sort of merge error is the
Cuekeeper TODO manager (which is a pure JavaScript Irmin app that uses HTML5
Localstorage/IndexedDB). Try opening
[http://test.roscidus.com/CueKeeper/](http://test.roscidus.com/CueKeeper/) in
two tabs and creating conflicting changes, and see the Irmin merge error
ripple up to the UI.

~~~
talex5
Note: CueKeeper is a bit unusual here. Merges always succeed, but it adds a
note to the item saying what it did to resolve the conflict.

e.g. if you rename an action "orig" to "a" and to "b" and then merge, you'll
end up with an action called "a" with a note saying the change to "b" was
discarded.

BTW: it's easier to generate merge conflicts using this web interface, which
lets you run two instances in one window:

[http://roscidus.com/blog/blog/2015/04/28/cuekeeper-
gitting-t...](http://roscidus.com/blog/blog/2015/04/28/cuekeeper-gitting-
things-done-in-the-browser/#sync)

------
shahbazac
Heads up to the Irmin folks, looks like your website is down.

~~~
amirmc
Seems to be fine now.

