diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,7 @@
+0.0.2
+
+* BREAKING CHANGE: helper function sync is not IO anymore
+
+0.0.1
+
+* Initial release
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -4,11 +4,16 @@
 
 *crjdt-haskell* provides high level interface to CRDT which is formalised in the [paper](https://arxiv.org/pdf/1608.03960v1.pdf) by Martin Kleppmann and Alastair R. Beresford.
 
+## Documentation
+
+See [haddocks](https://hackage.haskell.org/package/crjdt-haskell).
+
 ## Example
 
 ```haskell
 
 {-# LANGUAGE OverloadedStrings #-}
+
 module Main where
 
 import Data.Crjdt as C
@@ -32,7 +37,7 @@
 main :: IO ()
 main = do
   -- Sync first and second replica
-  (r1, r2) <- sync (1, replica1) (2, replica2)
+  let Right (r1, r2) = sync (1, replica1) (2, replica2)
 
   let replica1' = execEval 1 r1
       replica2' = execEval 2 r2
@@ -44,6 +49,7 @@
 
 ## Future work
 
+* Improve documentation
 * Aeson support
 * Simplify API as described in [second version](https://arxiv.org/abs/1608.03960) of the paper
 
diff --git a/crjdt-haskell.cabal b/crjdt-haskell.cabal
--- a/crjdt-haskell.cabal
+++ b/crjdt-haskell.cabal
@@ -1,5 +1,5 @@
 name:          crjdt-haskell
-version:       0.1.0.0
+version:       0.2.0.0
 synopsis:      A Conflict-Free Replicated JSON Datatype for Haskell
 description:   A Conflict-Free Replicated JSON Datatype for Haskell
 homepage:      https://github.com/amarpotghan/crjdt-haskell#readme
@@ -13,6 +13,7 @@
 cabal-version: >=1.10
 
 extra-source-files:  README.md
+                   , CHANGELOG.md 	
 
 library
   hs-source-dirs:      src
@@ -42,6 +43,13 @@
   ghc-options:         -threaded -rtsopts -with-rtsopts=-N
   other-modules: Data.CrjdtSpec
                , Data.FigureSpec
+  default-language:    Haskell2010
+
+executable examples
+  main-is: Main.hs
+  hs-source-dirs: examples
+  build-depends: base >= 4.7 && < 5
+               , crjdt-haskell
   default-language:    Haskell2010
 
 source-repository head
diff --git a/examples/Main.hs b/examples/Main.hs
new file mode 100644
--- /dev/null
+++ b/examples/Main.hs
@@ -0,0 +1,31 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Main where
+
+import Data.Crjdt as C
+
+-- Original state
+original :: Command ()
+original = (doc .> key "key") =: "A"
+
+-- First replica updates doc["key"] to "B"
+replica1 :: Command ()
+replica1 = do
+  original
+  (doc .> key "key") =: "B"
+
+-- Second replica updates doc["key"] to "C"
+replica2 :: Command ()
+replica2 = do
+  original
+  (doc .> key "key") =: "C"
+
+main :: IO ()
+main = do
+  -- Sync first and second replica
+  let Right (r1, r2) = sync (1, replica1) (2, replica2)
+
+  let replica1' = execEval 1 r1
+      replica2' = execEval 2 r2
+
+  -- Both replicas converge to: {"key": {"B", "C"}}
+  print (document replica1' == document replica2') -- True
diff --git a/src/Data/Crjdt.hs b/src/Data/Crjdt.hs
--- a/src/Data/Crjdt.hs
+++ b/src/Data/Crjdt.hs
@@ -47,7 +47,6 @@
 import Data.Set (Set)
 import Data.Void
 import Data.Function
-import Control.Exception (throwIO)
 import Control.Monad.Free (liftF)
 
 import Data.Crjdt.Context as Core
@@ -147,7 +146,7 @@
 -----------------------------------------------------------------------------------------------
 -- Utility functions
 
-sync :: (ReplicaId, Command ()) -> (ReplicaId, Command ()) -> IO (Eval (), Eval ())
+sync :: (ReplicaId, Command ()) -> (ReplicaId, Command ()) -> Either EvalError (Eval (), Eval ())
 sync (rid1, first) (rid2, second) =
   let (rFirst, sFirst) = run rid1 (Eval.execute first)
       (rSecond, sSecond) = run rid2 (Eval.execute second)
@@ -157,4 +156,4 @@
         Eval.execute yield
   in case (rFirst *> rSecond) of
     Right () -> pure $ (synced first sSecond, synced second sFirst)
-    Left ex -> throwIO ex
+    Left ex -> Left ex
