diff --git a/SnowGlobe.hs b/SnowGlobe.hs
--- a/SnowGlobe.hs
+++ b/SnowGlobe.hs
@@ -1,14 +1,12 @@
 -- SnowGlobe -- randomized fractal snowflakes demo
--- (GPL3+) 2012,2014 Claude Heiland-Allen <claude@mathr.co.uk>
--- usage: snowglobe
--- 'f' toggles full screen, 'shift-R' toggles record, any other key to quit
--- tested with: ghc-7.0.4, ghc-7.4-rc1, ghc-7.4.2, ghc-7.6.2, ghc-7.8.2
+-- (GPL3+) 2012,2014,2015 Claude Heiland-Allen <claude@mathr.co.uk>
+-- tested with: ghc-7.6.3, ghc-7.8.2, ghc-7.10.1~rc2
 
 import Vector hiding (i)
 import Graphics.UI.GLUT hiding (scale, FramebufferObject)
 import qualified Graphics.UI.GLUT as GL
 import Graphics.Rendering.OpenGL.Raw
-  ( glTexImage2D, gl_TEXTURE_2D, gl_LUMINANCE32F, gl_LUMINANCE, gl_RGBA
+  ( glTexImage2D, gl_TEXTURE_2D, gl_R32F, gl_RED, gl_RGBA
   , gl_UNSIGNED_BYTE, gl_FALSE, glClampColor, glGenerateMipmap
   , gl_CLAMP_VERTEX_COLOR, gl_CLAMP_READ_COLOR, gl_CLAMP_FRAGMENT_COLOR
   , glGenFramebuffers, glBindFramebuffer, glFramebufferTexture2D
@@ -26,7 +24,6 @@
 import System.Exit (exitSuccess)
 import System.IO (hPutStrLn, stderr, stdout, hPutStr, withBinaryFile, IOMode(WriteMode), hPutBuf)
 import System.Random (randomRIO)
-import Unsafe.Coerce (unsafeCoerce) -- for OpenGL uniform newtype
 import Foreign (alloca, peek, nullPtr, withArray)
 import Graphics.Rendering.OpenGL.Capture (capturePPM)
 import Data.ByteString as BS (hPut, pack)
@@ -171,6 +168,9 @@
   currentProgram $= Nothing
   return $ Step (flakeRenderPass sR ts passes passes)
 
+getUniformLocation :: UniformLocation -> GLint
+getUniformLocation (UniformLocation u) = u
+
 -- multi step passes
 flakeRenderPass :: IORef SnowGlobe -> [M3] -> N -> N -> IO Render
 flakeRenderPass sR _  passes 0 = flakeRenderFinish sR passes
@@ -182,7 +182,7 @@
   currentProgram $= Just (pStep s0)
   uniform (pStep'er s0) $= TexCoord1 (realToFrac er :: GLfloat)
   uniform (pStep'src s0) $= TexCoord1 (0 :: GLint)
-  withArray (map ((realToFrac :: Float -> GLfloat) . (realToFrac :: Double -> Float)) . concatMap matrixToList $ ts) $ glUniformMatrix3fv (unsafeCoerce $ pStep'ts s0) 6 1
+  withArray (map ((realToFrac :: Float -> GLfloat) . (realToFrac :: Double -> Float)) . concatMap matrixToList $ ts) $ glUniformMatrix3fv (getUniformLocation $ pStep'ts s0) 6 1
   bindFBO (fBuffer s0) (tPong s0)
   textureBinding Texture2D $= Just (tPing s0)
   unitQuad
@@ -462,7 +462,7 @@
 newTex s = do
   [t] <- genObjectNames 1
   textureBinding Texture2D $= Just t
-  glTexImage2D gl_TEXTURE_2D 0 (fromIntegral gl_LUMINANCE32F) (fromIntegral s) (fromIntegral s) 0 gl_LUMINANCE gl_UNSIGNED_BYTE nullPtr
+  glTexImage2D gl_TEXTURE_2D 0 (fromIntegral gl_R32F) (fromIntegral s) (fromIntegral s) 0 gl_RED gl_UNSIGNED_BYTE nullPtr
   textureFilter Texture2D $= ((Linear', Nothing), Linear')
   textureWrapMode Texture2D S $= (Repeated, ClampToEdge)
   textureWrapMode Texture2D T $= (Repeated, ClampToEdge)
diff --git a/snowglobe.cabal b/snowglobe.cabal
--- a/snowglobe.cabal
+++ b/snowglobe.cabal
@@ -1,5 +1,5 @@
 Name:                snowglobe
-Version:             3
+Version:             3.0.0.1
 Synopsis:            randomized fractal snowflakes demo
 Description:         @snowglobe@ generates random snowflakes using iterated
                      function systems via OpenGL texture feedback.  The
@@ -15,7 +15,14 @@
                          generated flake to the current working directory
                      .
                        * any other key: quit
+                     .
+                     Blog posts:
+                     .
+                       * http://mathr.co.uk/blog/2012-01-12_snowglobe.html
+                     .
+                       * http://mathr.co.uk/blog/2014-12-19_making_seasonal_cards_with_snowglobe.html
 
+homepage:            http://code.mathr.co.uk/snowglobe
 License:             GPL-3
 License-file:        LICENSE
 Author:              Claude Heiland-Allen
@@ -34,15 +41,15 @@
     containers,
     gl-capture,
     GLUT,
-    OpenGL == 2.9.*,
+    OpenGL == 2.11.*,
     OpenGLRaw,
     random
 
 Source-repository head
   type:                git
-  location:            git://gitorious.org/maximus/snowglobe.git
+  location:            http://code.mathr.co.uk/snowglobe.git
 
 Source-repository this
   type:                git
-  location:            git://gitorious.org/maximus/snowglobe.git
-  tag:                 v3
+  location:            http://code.mathr.co.uk/snowglobe.git
+  tag:                 v3.0.0.1
