diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -15,13 +15,7 @@
 Installation
 ------------
 
-You can build and install this program as any other Cabalized program:
-
-    $ runhaskell Setup.hs configure
-    $ runhaskell Setup.hs build
-    $ runhaskell Setup.hs install
-    
-Other installation options are described in the [website](http://arbtt.nomeata.de/#install).
+See <http://arbtt.nomeata.de/#install>
 
 You also need to make sure that `arbtt-capture` is started with your X
 session:
@@ -32,7 +26,7 @@
 - If you use macOS, you can use `launchd` for this.
   Create a `.plist` file like the following
   (with the path changed to match where arbtt-capture is located in your system):
-  
+
   ```xml
   <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
@@ -74,11 +68,6 @@
 latest source at the git repository at
 <https://github.com/nomeata/arbtt> or
 <https://bitbucket.org/nomeata/arbtt>.
-
-User and Developer discussion happens on the arbtt mailing list:
-  arbtt@lists.nomeata.de
-To subscribe to the list, visit:
-  <http://lists.nomeata.de/mailman/listinfo/arbtt>
 
 The issue tracker is hosted on bitbucket:
   <https://bitbucket.org/nomeata/arbtt/issues>
diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -23,7 +23,7 @@
                                  "creation of the windows setup executable."
           Just configuredProg -> do
                 writeFile includeFilename $ "AppVerName=" ++ display (package pd) ++ "\n"
-                rawSystemProgram verb configuredProg
+                runProgram verb configuredProg
                                 ["/Odist","/F"++setupFilename,"setup.iss"]
                 removeFile includeFilename
   where verb = fromFlag (buildVerbosity flags)
diff --git a/arbtt.cabal b/arbtt.cabal
--- a/arbtt.cabal
+++ b/arbtt.cabal
@@ -1,5 +1,5 @@
 name:               arbtt
-version:            0.10.2
+version:            0.10.3
 license:            GPL-2
 license-file:       LICENSE
 category:           Desktop
@@ -63,6 +63,7 @@
         LeftFold
         LockFile
         DumpFormat
+        Paths_arbtt
 
     ghc-options: -rtsopts
 
@@ -285,11 +286,10 @@
     Text.Parsec.ExprFail
     Text.Regex.PCRE.Light.Text
     TimeLog
-    Paths_arbtt
   Build-depends:
       base >= 4.7 && < 5
       , tasty >= 0.7 && < 1.3
-      , tasty-golden >= 2.2.0.2  && < 2.4
+      , tasty-golden >= 2.2.0.2  && <= 2.3.3.2
       , tasty-hunit >= 0.2  && < 0.11
       , process-extras >= 0.2 && < 0.8
       , deepseq
diff --git a/categorize.cfg b/categorize.cfg
--- a/categorize.cfg
+++ b/categorize.cfg
@@ -113,7 +113,7 @@
 -- “format $date” produces a string with the date in ISO 8601 format
 -- (YYYY-MM-DD), it may be compared with strings. For example, to match
 -- everything on and after a particular date I can use
-format $date =~ ".*-03-19"  ==> tag period:on_a_special_day,
+format $date =~ /.*-03-19/  ==> tag period:on_a_special_day,
 -- but note that this is a rather expensive operation and will slow down your
 -- data processing considerably.
 
diff --git a/doc/arbtt.xml b/doc/arbtt.xml
--- a/doc/arbtt.xml
+++ b/doc/arbtt.xml
@@ -96,29 +96,11 @@
 
 <sect1 id="installation">
   <title>Installation</title>
-  <sect2>
-    <title>Building with <command>cabal-install</command></title>
-    <para>
-    arbtt comes in the form of a Cabalized<footnote><para>Cabal is the common software
-    packaging for Haskell programs and libraries, see <ulink
-    url="http://www.haskell.org/cabal/"/>.</para></footnote> package, and is
-    available from hackage. The easiest way of obtaining and installing arbtt is
-    via <command>cabal-install</command>. If you have
-    <command>cabal-install</command> available, just run
-    <screen>$ cabal install arbtt</screen>
-    to download, build and install arbtt.
-    </para>
-  </sect2>
 
   <sect2>
-    <title>Building without <command>cabal-install</command></title>
+    <title>Obtaining arbtt</title>>
     <para>
-    You can fetch the latest arbtt source tarball from hackage, at
-    <ulink url="http://hackage.haskell.org/package/arbtt"/>. Extract the tarball
-    and run the following commands to build and install the arbtt binaries:
-    <screen>$ runhaskell Setup.hs configure
-$ runhaskell Setup.hs build
-$ runhaskell Setup.hs install</screen>
+      See the project website <ulink url="http://arbtt.nomeata.de/#install">for installation instructions</ulink>.
     </para>
   </sect2>
 
@@ -322,7 +304,7 @@
       <literal>&gt;</literal> operators. String expressions
       (<literal>$program</literal>, <literal>$title</literal>) can be matched
       against regular expressions with <literal>=~</literal> operator. With these
-      operatorions, the right hand side can be a comma-separated list of
+      operators, the right hand side can be a comma-separated list of
       literals enclosed in square brackets (<literal>[</literal>
       <emphasis>...</emphasis>, <emphasis>...</emphasis>, <literal>]</literal>), which
       succeeds if any of them succeeds.
@@ -808,7 +790,6 @@
 ( ) urxvt:          /home/gwern; 2014-09-03 13:42:17 history 1 | cut --delimiter=' ' --fields=5-
 ( ) urxvt:          /home/gwern; 2014-09-03 13:12:21 git log -p .emacs
 (*) emacs:          emacs@elan
-( ) urxvt:          /home/gwern; 2014-09-01 14:50:30 while true; do cd ~/ &amp;&amp; getmail_fetch --ssl pop.gmail.com gwern0 'ugaozoumbhwcijxb' ./mail/; done
 ( ) urxvt:          /home/gwern/blackmarket-mirrors/silkroad2-forums; 2014-08-31 23:20:10 mv /home/gwern/cookies.txt ./; http_proxy=&quot;localhost:8118&quot; wget...
 ( ) urxvt:          /home/gwern/blackmarket-mirrors/agora; 2014-08-31 23:15:50 mv /home/gwern/cookies.txt ./; http_proxy=&quot;localhost:8118&quot; wget --mirror ...
 ( ) urxvt:          /home/gwern/blackmarket-mirrors/evolution-forums; 2014-08-31 23:04:10 mv ~/cookies.txt ./; http_proxy=&quot;localhost:8118&quot; wget --mirror ...
@@ -1765,11 +1746,6 @@
   arbtt is Copyright © 2009-2010 Joachim Breitner
   </para>
 
-  <para>
-    arbtt does not have a bug tracker yet. If you have bug reports, suggestions
-    or questions, please send an email to the arbtt mailing list at <ulink url="mailto:arbtt@lists.nomeata.de">arbtt@lists.nomeata.de</ulink>, which you can subscribe at <ulink url="http://lists.nomeata.de/mailman/listinfo/arbtt">http://lists.nomeata.de/mailman/listinfo/arbtt</ulink>.
-  </para>
-
   <sect2>
     <title>arbtt License</title>
     <para>
@@ -1797,6 +1773,17 @@
   <para>
   The version history with changes relevant for the user is documented here.
   </para>
+
+  <sect2 id="release-notes-0.10.3">
+    <title>Version 0.10.3</title>
+    <itemizedlist>
+      <listitem>
+        <para>
+	  Fix build issues with Cabal.
+	</para>
+      </listitem>
+    </itemizedlist>
+  </sect2>
 
   <sect2 id="release-notes-0.10.2">
     <title>Version 0.10.2</title>
diff --git a/src/Data.hs b/src/Data.hs
--- a/src/Data.hs
+++ b/src/Data.hs
@@ -76,6 +76,10 @@
 
 -- Data.Binary instances
 
+validTimeLogEntryTag :: Word8 -> Bool
+validTimeLogEntryTag 1 = True
+validTimeLogEntryTag _ = False
+
 instance StringReferencingBinary a => StringReferencingBinary (TimeLogEntry a) where
  ls_put strs tle = do
         -- A version tag
@@ -87,7 +91,8 @@
         v <- getWord8
         case v of
          1 -> TimeLogEntry <$> get <*> get <*> ls_get strs
-         _ -> error $ "Unsupported TimeLogEntry version tag " ++ show v
+         _ -> error $ "Unsupported TimeLogEntry version tag " ++ show v ++ "\n" ++
+                      "You can try to recover your data using arbtt-recover."
 
 instance Binary UTCTime where
  put (UTCTime (ModifiedJulianDay d) t) = do
@@ -117,7 +122,8 @@
          1 -> CaptureData <$> get <*> get <*> pure ""
          2 -> CaptureData <$> ls_get strs <*> ls_get strs <*> pure ""
          3 -> CaptureData <$> ls_get strs <*> ls_get strs <*> ls_get strs
-         _ -> error $ "Unsupported CaptureData version tag " ++ show v
+         _ -> error $ "Unsupported CaptureData version tag " ++ show v ++ "\n" ++
+                      "You can try to recover your data using arbtt-recover."
 
   -- | 'getMany n' get 'n' elements in order, without blowing the stack.
   --   From Data.Binary
diff --git a/src/LeftFold.hs b/src/LeftFold.hs
--- a/src/LeftFold.hs
+++ b/src/LeftFold.hs
@@ -77,12 +77,12 @@
                                   | otherwise = (S.Just x :!: po so ix)
           finish (S.Nothing :!: so) = fo so
           finish (S.Just _  :!: so) = fo (po so ix)
-runOnGroups eq (LeftFold sti pi fi) (LeftFold sto po fo) = LeftFold (S.Nothing :!: sti :!: sto) go finish 
-    where go (S.Nothing :!: si :!: so) x             = (S.Just x :!: pi si x  :!: so)
-          go (S.Just x' :!: si :!: so) x | x' `eq` x = (S.Just x :!: pi si x  :!: so)
-                                         | otherwise = (S.Just x :!: pi sti x :!: po so (fi si))
-          finish (S.Nothing :!: si :!: so) = fo so
-          finish (S.Just _  :!: si :!: so) = fo (po so (fi si))
+runOnGroups eq (LeftFold sti pi fi) (LeftFold sto po fo) = LeftFold (S.Nothing :!: (sti :!: sto)) go finish
+    where go (S.Nothing :!: (si :!: so)) x             = (S.Just x :!: (pi si x  :!: so))
+          go (S.Just x' :!: (si :!: so)) x | x' `eq` x = (S.Just x :!: (pi si x  :!: so))
+                                           | otherwise = (S.Just x :!: (pi sti x :!: po so (fi si)))
+          finish (S.Nothing :!: (si :!: so)) = fo so
+          finish (S.Just _  :!: (si :!: so)) = fo (po so (fi si))
 
 runOnIntervals :: LeftFold x y -> LeftFold y z -> LeftFold (Bool :!: x) z
 runOnIntervals _ (Pure ox) = (Pure ox)
diff --git a/src/TimeLog.hs b/src/TimeLog.hs
--- a/src/TimeLog.hs
+++ b/src/TimeLog.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE CPP #-}
+{-# LANGUAGE PatternGuards #-}
 module TimeLog where
 
 import Data
@@ -80,12 +81,21 @@
                 go Nothing rest off
 
         go prev input off = do
-                mb <- tryGet prev input off off
+                mb <- trySkip prev input off off
                 flip (maybe (return [])) mb $ \(v,rest,off') ->
                         if BS.null rest
                         then return [v]
                         else (v:) <$> (unsafeInterleaveIO $ go (Just (tlData v)) rest off')
 
+        trySkip prev input off orig_off
+            | Just i <- BS.findIndex validTimeLogEntryTag input = do
+               when (i > 0) $ do
+                   putStrLn $ "At position " ++ show off ++ " skipping " ++ show i ++ " bytes to next valid TimeLogEntry tag"
+               tryGet prev (BS.drop i input) (off + i) orig_off
+            | otherwise = do
+               putStrLn "No valid TimeLogEntry tag bytes remaining"
+               return Nothing
+
         tryGet prev input off orig_off = catch (
                         do -- putStrLn $ "Trying value at offset " ++ show off
                            let (v,rest,off') = runGetState (ls_get strs) input off
@@ -100,7 +110,7 @@
                            if BS.length input <= 1
                              then do putStrLn $ "End of file reached"
                                      return Nothing
-                             else do tryGet prev (BS.tail input) (off+1) orig_off
+                             else do trySkip prev (BS.tail input) (off+1) orig_off
                         )
           where strs = maybe [] listOfStrings prev
 
