diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,12 @@
 For the latest version of this document, please see
 [https://github.com/DougBurke/hvega/blob/master/hvega/CHANGELOG.md](https://github.com/DougBurke/hvega/blob/master/hvega/CHANGELOG.md).
 
+## 0.4.1.1
+
+Avoid a build warning about importing <> from Data.Monoid in GHC 8.8.1
+by using the CPP sledge-hammer. Relaxed the bounds on containers so
+that the tests can be built on stack LTS 9.21 (GHC 8.0.2).
+
 ## 0.4.1.0
 
 Updated the tutorial, adding in a new plot to introduce the addition
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,13 +1,25 @@
 # hvega
 
-Support the creation of [Vega-Lite](https://vega.github.io/vega-lite/) visualizations
-in Haskell. This code is released under the BSD3 license.
+Create [Vega-Lite](https://vega.github.io/vega-lite/) visualizations in
+Haskell. It targets version 3 of the Vega-Lite specification. Note that
+the module does not include a viewer for these visualizations (which are
+JSON files), but does provide several helper functions, such as
+[toHtmlFile](https://hackage.haskell.org/package/hvega/docs/Graphics-Vega-VegaLite.html#v:toHtmlFile),
+which create HTML that can be viewed
+with a browser to display the visualization. Other approaches include
+automatic display in IHaskell notebooks - with the
+[ihaskell-vega](https://hackage.haskell.org/package/ihaskell-hvega)
+package - or use of external viewers such as
+[Vega View](https://hackage.haskell.org/package/vega-view) and
+[Vega-Desktop](https://github.com/vega/vega-desktop).
 
-It is an almost-direct copy of version 2.2.1 of the
+It is based on an early version (2.2.1) of the
 [Elm Vega library](http://package.elm-lang.org/packages/gicentre/elm-vega/2.2.1/VegaLite),
 which is released under a BSD3 license by Jo Wood of the giCentre at the
 City University of London.
 
+This code is released under the BSD3 license.
+
 ## Example
 
 ```Haskell
@@ -29,12 +41,19 @@
 
 ## Documentation
 
-The [Elm Vega documentation](http://package.elm-lang.org/packages/gicentre/elm-vega/2.2.1)
-can be used as a guide to using this module. The
+A tutorial is provided as part of the module: it is based, as is
+so much of the module, on the
+[Elm Vega walk through](https://github.com/gicentre/elm-vegalite/tree/master/docs/walkthrough).
+The tutorial
+is [available on hackage](https://hackage.haskell.org/package/hvega/docs/Graphics-Vega-Tutorials-VegaLite.html) - and includes the plot outputs -
+and the plots it creates are also available by importing the
+`Graphics.Vega.Tutorials.VegaLite` module.
+
+The
 [Vega-Lite Example Gallery](https://vega.github.io/vega-lite/examples/) has
 been converted to an
 [IHaskell notebook](https://github.com/DougBurke/hvega/blob/master/notebooks/VegaLiteGallery.ipynb)
-Uunfortunately the plots created by VegaEmbed **do not appear**
+Uunfortunately the plots created by VegaEmbed **do not always appear**
 in the notebook when viewed with either GitHub's viewer or
 [ipynb viewer](http://nbviewer.jupyter.org/github/DougBurke/hvega/blob/master/notebooks/VegaLiteGallery.ipynb),
 but things seem much better when using Jupyter Lab (rather than
@@ -50,22 +69,15 @@
 
 ## Differences to Elm Vega
 
-The main changes to version 2.2.1 of
-[Elm Vega](http://package.elm-lang.org/packages/gicentre/elm-vega/2.2.1)
-are:
-
-- Replace `Spec` by `VLSpec` (although both are synonyms for the underlying
-  JSON representation).
-
-- Add a type for the output of `toVegaLite` (`VegaLite`) that is separate from
-  `VLSpec`, which is usefull for integration with IHaskell. The JSON
-  specification is retrieved with `fromVL`.
-
-- Take advantage of the lack of backwards compatibality requirements to remove or
-  replace several symbols (such as add the `Utc` constructor to `TimeUnit`, remove the `bin`
-  function, and use `Data` rather than `(VLProperty, VLSpec)` in function
-  signatures).
+Elm Vega has changed significantly since I started `hvega`, and no-longer
+exposes data types directly but uses functions instead: for example,
+rather than `PName`, it uses a function like `pName`. It is an open
+question whether `hvega` will make the same switch. Over time
+the naming of certain operations or data types has diverged between
+`hevga` and Elm Vega.
 
-- In version 0.2.0.0, the constructors for the `LegendOrientation` type
-  have gained a `LO` prefix, which avoids clashing with the Prelude's
-  `Either` type.
+One of the more-obvious changes is that the output of `toVegaLite`
+is a separate type from the input values - that is `VegaLite`
+and `VLSpec` - since it makes it easier to display the output of
+`hvega` in `IHaskell`. The JSON specification is retrieved from
+this type with `fromVL`.
diff --git a/hvega.cabal b/hvega.cabal
--- a/hvega.cabal
+++ b/hvega.cabal
@@ -1,5 +1,5 @@
 name:                hvega
-version:             0.4.1.0
+version:             0.4.1.1
 synopsis:            Create Vega-Lite visualizations (version 3) in Haskell.
 description:         This is based on the elm-vegalite package
                      (<http://package.elm-lang.org/packages/gicentre/elm-vegalite/latest>)
@@ -178,7 +178,7 @@
                      , aeson-pretty == 0.8.*
                      , base >= 4 && < 5
                      , bytestring == 0.10.*
-                     , containers >= 0.5.8 && < 0.7
+                     , containers >= 0.5.7 && < 0.7
                      , filepath
                      , tasty
                      , tasty-golden >= 2.2 && < 2.4
diff --git a/src/Graphics/Vega/Tutorials/VegaLite.hs b/src/Graphics/Vega/Tutorials/VegaLite.hs
--- a/src/Graphics/Vega/Tutorials/VegaLite.hs
+++ b/src/Graphics/Vega/Tutorials/VegaLite.hs
@@ -123,6 +123,7 @@
   , posPlot
 
   , skyPlot
+  , skyPlot2  -- DEBUG
 
   -- * Layered and Multi-View Compositions
   --
@@ -1320,6 +1321,45 @@
                 , trans []
                 , mark Circle []
                 , enc []
+                ]
+
+skyPlot2 :: VegaLite
+skyPlot2 =
+  let enc = encoding
+              . position Longitude (axOpts "fakeLongitude")
+              . position Latitude (axOpts "DE_ICRS")
+              . color [ MName "plx"
+                      , MmType Quantitative
+                      , MScale [ SType ScLog
+                               , SScheme "viridis" []
+                               ]
+                      ]
+              . tooltip [ TName "Cluster", TmType Nominal ]
+                    
+      axOpts field = [ PName field, PmType Quantitative ]
+            
+      trans = transform
+                . calculateAs "180 - datum.RA_ICRS" "fakeLongitude"
+
+      spec1 = [ gaiaData
+              , trans []
+              , enc []
+              , mark Circle []
+              ]
+
+      -- depending on how we view it, may need to specify mark
+      -- options (ie "mark Geoshape []" should be enough but
+      -- vega-view doesn't show anything for some reason, but
+      -- the vega editor does)
+      --
+      spec2 = [ graticule [ GrStepMinor (45, 20) ]
+              , mark Geoshape [ MFilled False, MStrokeWidth 0.3 ]
+              ]
+      
+  in toVegaLite [ projection [ PrType Mercator
+                             , PrCenter 0 0
+                             ]
+                , layer [ asSpec spec1, asSpec spec2 ]
                 ]
 
 -- $intro-layered
diff --git a/src/Graphics/Vega/VegaLite.hs b/src/Graphics/Vega/VegaLite.hs
--- a/src/Graphics/Vega/VegaLite.hs
+++ b/src/Graphics/Vega/VegaLite.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TupleSections #-}
 {-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
@@ -9,7 +10,7 @@
 
 Maintainer  : dburke.gw@gmail.com
 Stability   : unstable
-Portability : OverloadedStrings, TupleSections
+Portability : CPP, OverloadedStrings, TupleSections
 
 This is a port of the
 <http://package.elm-lang.org/packages/gicentre/elm-vegalite/latest Elm Vega Lite module>,
@@ -618,7 +619,10 @@
 -- Aeson's Value type conflicts with the Number type
 import Data.Aeson (Value, decode, encode, object, toJSON, (.=))
 import Data.Maybe (catMaybes, fromMaybe, mapMaybe)
+
+#if !(MIN_VERSION_base(4, 12, 0))
 import Data.Monoid ((<>))
+#endif
 
 -- added in base 4.8.0.0 / ghc 7.10.1
 import Numeric.Natural (Natural)
@@ -1586,7 +1590,7 @@
     , "<body>"
     , "<div id=\"vis\"></div>"
     , "<script type=\"text/javascript\">"
-    , ("  var spec = " <> spec <> ";")
+    , "  var spec = " <> spec <> ";"
     , "  vegaEmbed(\'#vis\', spec" <> opts <> ").then(function(result) {"
     , "  // Access the Vega view instance (https://vega.github.io/vega/docs/api/view/) as result.view"
     , "  }).catch(console.error);"
@@ -6580,7 +6584,7 @@
 selectionProperty (SInitInterval Nothing Nothing) = "init" .= A.Null
 selectionProperty (SInitInterval mx my) =
   let conv (_, Nothing) = Nothing
-      conv (lbl, (Just (lo, hi))) = Just (lbl .= [ dataValueSpec lo, dataValueSpec hi ])
+      conv (lbl, Just (lo, hi)) = Just (lbl .= [ dataValueSpec lo, dataValueSpec hi ])
 
   in "init" .= object (mapMaybe conv (zip ["x", "y"] [mx, my]))
 
@@ -7974,7 +7978,7 @@
         RLegend chRules -> ("legend", chRules)
         RScale chRules -> ("scale", chRules)
 
-      ans = map (\(ch, rule) -> (channelLabel ch .= resolutionLabel rule)) rls
+      ans = map (\(ch, rule) -> channelLabel ch .= resolutionLabel rule) rls
   in (nme, object ans)
 
 
@@ -10295,7 +10299,7 @@
   -- ^ A separate list of properties for each channel.
   -> BuildLabelledSpecs
 tooltips tDefs ols =
-  ("tooltip" .= toJSON (map (object . (concatMap textChannelProperty)) tDefs)) : ols
+  ("tooltip" .= toJSON (map (object . concatMap textChannelProperty) tDefs)) : ols
 
 
 -- | This is used with 'MTooltip'.
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -5,4 +5,4 @@
 
 extra-deps: []
 
-resolver: lts-14.4
+resolver: lts-14.7
diff --git a/tools/PlayTutorial.hs b/tools/PlayTutorial.hs
--- a/tools/PlayTutorial.hs
+++ b/tools/PlayTutorial.hs
@@ -100,6 +100,7 @@
      , ("pointplot", VL.pointPlot)
      , ("posplot", VL.posPlot)
      , ("skyplot", VL.skyPlot)
+     , ("skyplot2", VL.skyPlot2)
      , ("smallmultiples", VL.smallMultiples)
      , ("smallmultiples2", VL.smallMultiples2)
      , ("baseplot", VL.basePlot)
