diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,5 +1,4 @@
-streaming
-=========
+# streaming [![Hackage version](https://img.shields.io/hackage/v/streaming.svg?label=Hackage)](https://hackage.haskell.org/package/streaming)
 
 Contents
 --------
diff --git a/changelog.md b/changelog.md
new file mode 100644
--- /dev/null
+++ b/changelog.md
@@ -0,0 +1,45 @@
+- 0.2.1.0
+
+    Adding `Semigroup` instances for GHC 8.4.
+
+- 0.2.0.0
+
+    Remove `bracketStream`, `MonadCatch` instance, and everything
+    dealing with `ResourceT`. All of these things of sort of
+    broken for `Stream` since there is no guarantee of linear
+    consumption (functions like `take` can prevent finalizers
+    from running). The `streaming-with` library is recommended
+    to get this kind of behavior.
+
+    Add `Semigroup` instances for `Of` and `Stream`.
+
+    Drop unneeded dependency on exceptions.
+
+- 0.2.0.0
+
+    Made `zipsWith` and allied functions short-circuit; if the
+    first stream is empty, ignore the second one.
+
+    Deprecated `mapsExposed` and `mapsMExposed`. These were perfectly
+    safe copies of `maps` and `mapsM` with scary names.
+
+    Made the `Show` and `Eq` instances for `Stream` respect the
+    abstraction. In effect, the streams are `unexposed` before
+    being shown or tested for equality.
+
+    Added `Eq1`, `Ord`, `Ord1`, and `Show1` instances for `Stream`.
+
+    Added `Generic`, `Generic1`, `Eq1`, `Ord1`, `Show1`, `Eq2`, `Ord2`,
+    and `Show2` instances for `Of`.
+
+    Bump the lower bound on `transformers` to 0.5.
+
+    Break compatibility with pre-AMP base. Prefer `fmap` to `liftM`.
+
+- 0.1.3.0 
+
+    Added `duplicate` and `store` for simultaneous folding.
+    
+    Added `mapped` for the ugly `mapsM`
+    
+    `mwrap` renamed `effect`
diff --git a/src/Data/Functor/Of.hs b/src/Data/Functor/Of.hs
--- a/src/Data/Functor/Of.hs
+++ b/src/Data/Functor/Of.hs
@@ -1,7 +1,8 @@
 {-# LANGUAGE CPP, DeriveDataTypeable, DeriveTraversable, DeriveFoldable,
        DeriveGeneric #-}
 module Data.Functor.Of where
-import Data.Monoid
+import Data.Monoid (Monoid (..))
+import Data.Semigroup (Semigroup (..))
 import Control.Applicative
 import Data.Traversable (Traversable)
 import Data.Foldable (Foldable)
@@ -19,11 +20,17 @@
               Read, Show, Traversable, Typeable, Generic, Generic1)
 infixr 5 :>
 
+instance (Semigroup a, Semigroup b) => Semigroup (Of a b) where
+  (m :> w) <> (m' :> w') = (m <> m') :> (w <> w')
+  {-#INLINE (<>) #-}
+
 instance (Monoid a, Monoid b) => Monoid (Of a b) where
   mempty = mempty :> mempty
   {-#INLINE mempty #-}
+#if !(MIN_VERSION_base(4,11,0))
   mappend (m :> w) (m' :> w') = mappend m m' :> mappend w w'
   {-#INLINE mappend #-}
+#endif
 
 instance Functor (Of a) where
   fmap f (a :> x) = a :> f x
diff --git a/src/Streaming/Internal.hs b/src/Streaming/Internal.hs
--- a/src/Streaming/Internal.hs
+++ b/src/Streaming/Internal.hs
@@ -94,7 +94,8 @@
 import Control.Applicative
 import Data.Function ( on )
 import Control.Monad.Morph
-import Data.Monoid (Monoid (..), (<>))
+import Data.Monoid (Monoid (..))
+import Data.Semigroup (Semigroup (..))
 import Data.Data (Typeable)
 import Prelude hiding (splitAt)
 import Data.Functor.Compose
@@ -295,11 +296,17 @@
   str <|> str' = zipsWith' liftA2 str str'
   {-#INLINE (<|>) #-}
 
+instance (Functor f, Monad m, Semigroup w) => Semigroup (Stream f m w) where
+  a <> b = a >>= \w -> fmap (w <>) b
+  {-#INLINE (<>) #-}
+
 instance (Functor f, Monad m, Monoid w) => Monoid (Stream f m w) where
   mempty = return mempty
   {-#INLINE mempty #-}
-  mappend a b = a >>= \w -> fmap (w <>) b
+#if !(MIN_VERSION_base(4,11,0))
+  mappend a b = a >>= \w -> fmap (w `mappend`) b
   {-#INLINE mappend #-}
+#endif
 
 instance (Applicative f, Monad m) => MonadPlus (Stream f m) where
   mzero = empty
diff --git a/streaming.cabal b/streaming.cabal
--- a/streaming.cabal
+++ b/streaming.cabal
@@ -1,5 +1,5 @@
 name:                streaming
-version:             0.2.0.0
+version:             0.2.1.0
 cabal-version:       >=1.10
 build-type:          Simple
 synopsis:            an elementary streaming prelude and general stream type.
@@ -91,7 +91,7 @@
                      to mention a few obviously desirable operations.
                      (This is explained more elaborately in the <https://hackage.haskell.org/package/streaming#readme readme> below.)
                      .
-                     One could throw of course throw something
+                     One could of course throw something
                      like the present @Stream@ type on top of a prior stream concept: this is how @pipes@ and
                      @pipes-group@ (which are very much our model here) use @FreeT@.
                      But once one grasps the iterable stream concept needed to express
@@ -191,7 +191,7 @@
 homepage:            https://github.com/haskell-streaming/streaming
 bug-reports:         https://github.com/haskell-streaming/streaming/issues
 category:            Data, Pipes, Streaming
-extra-source-files:  README.md
+extra-source-files:  README.md, changelog.md
 
 source-repository head
     type: git
@@ -217,9 +217,9 @@
       base >=4.8 && <5
     , mtl >=2.1 && <2.3
     , mmorph >=1.0 && <1.2
+    , semigroups >= 0.18 && <0.19
     , transformers >=0.5 && <0.6
     , transformers-base < 0.5
-    , exceptions > 0.5 && < 0.9
     , ghc-prim
     , containers
   hs-source-dirs:    src
