diff --git a/luminance-samples.cabal b/luminance-samples.cabal
--- a/luminance-samples.cabal
+++ b/luminance-samples.cabal
@@ -1,5 +1,5 @@
 name:                luminance-samples
-version:             0.7
+version:             0.8
 synopsis:            Luminance samples
 description:         Luminance samples used as tutorial help
 homepage:            https://github.com/phaazon/luminance-samples
@@ -31,7 +31,7 @@
                      , FlexibleContexts
 
   build-depends:       base         >= 4.8 && < 4.9
-                     , luminance    >= 0.6 && < 0.8
+                     , luminance    >= 0.8 && < 0.9
                      , GLFW-b       >= 1.4 && < 1.5
                      , mtl          >= 2.2 && < 2.3
                      , resourcet    >= 1.1 && < 1.2
@@ -53,7 +53,7 @@
                      , ScopedTypeVariables
 
   build-depends:       base         >= 4.8 && < 4.9
-                     , luminance    >= 0.6 && < 0.8
+                     , luminance    >= 0.8 && < 0.9
                      , GLFW-b       >= 1.4 && < 1.5
                      , mtl          >= 2.2 && < 2.3
                      , resourcet    >= 1.1 && < 1.2
@@ -76,7 +76,7 @@
 
   build-depends:       base          >= 4.8 && < 4.9
                      , contravariant >= 1.3 && < 1.4
-                     , luminance     >= 0.6 && < 0.8
+                     , luminance     >= 0.8 && < 0.9
                      , GLFW-b        >= 1.4 && < 1.5
                      , mtl           >= 2.2 && < 2.3
                      , resourcet     >= 1.1 && < 1.2
@@ -99,7 +99,7 @@
 
   build-depends:       base          >= 4.8 && < 4.9
                      , contravariant >= 1.3 && < 1.4
-                     , luminance     >= 0.6 && < 0.8
+                     , luminance     >= 0.8 && < 0.9
                      , GLFW-b        >= 1.4 && < 1.5
                      , mtl           >= 2.2 && < 2.3
                      , resourcet     >= 1.1 && < 1.2
@@ -123,7 +123,7 @@
   build-depends:       base          >= 4.8  && < 4.9
                      , contravariant >= 1.3  && < 1.4
                      , JuicyPixels   >= 3.2  && < 3.4
-                     , luminance     >= 0.6  && < 0.8
+                     , luminance     >= 0.8  && < 0.9
                      , GLFW-b        >= 1.4  && < 1.5
                      , mtl           >= 2.2  && < 2.3
                      , resourcet     >= 1.1  && < 1.2
@@ -146,7 +146,7 @@
 
   build-depends:       base          >= 4.8  && < 4.9
                      , contravariant >= 1.3  && < 1.4
-                     , luminance     >= 0.6  && < 0.8
+                     , luminance     >= 0.8  && < 0.9
                      , GLFW-b        >= 1.4  && < 1.5
                      , mtl           >= 2.2  && < 2.3
                      , resourcet     >= 1.1  && < 1.2
@@ -171,7 +171,7 @@
   build-depends:       base          >= 4.8  && < 4.9
                      , contravariant >= 1.3  && < 1.4
                      , linear        >= 1.20 && < 1.21
-                     , luminance     >= 0.6  && < 0.8
+                     , luminance     >= 0.8  && < 0.9
                      , GLFW-b        >= 1.4  && < 1.5
                      , mtl           >= 2.2  && < 2.3
                      , resourcet     >= 1.1  && < 1.2
diff --git a/src/Blending.hs b/src/Blending.hs
--- a/src/Blending.hs
+++ b/src/Blending.hs
@@ -1,6 +1,5 @@
 import Common
 import Control.Monad
-import Control.Monad.IO.Class
 import Data.Functor.Contravariant.Divisible
 import Graphics.Luminance.Batch
 import Graphics.Luminance.Cmd
@@ -11,18 +10,17 @@
 import Graphics.Luminance.Shader.Program
 import Graphics.Luminance.Shader.Stage
 import Graphics.Luminance.Vertex
-import Graphics.UI.GLFW
 
 main :: IO ()
-main = startup $ \window mainLoop -> do
+main = startup $ \window loop -> do
   triangle <- createGeometry vertices Nothing Triangle
   vs <- createStage VertexShader vsSource
   fs <- createStage FragmentShader fsSource
-  (program,colorOffsetU) <- createProgram [vs,fs] $ \uni _ -> do
-    colorU <- uni $ Left "color"
-    offsetU <- uni $ Left "offset"
+  (program,colorOffsetU) <- createProgram [vs,fs] $ \uni -> do
+    colorU <- uni (UniformName "color")
+    offsetU <- uni (UniformName "offset")
     pure $ divided colorU offsetU
-  mainLoop $ do
+  loop $ do
     void . runCmd . draw $ framebufferBatch defaultFramebuffer
       [anySPBatch . shaderProgramBatch_ program $
         [
diff --git a/src/Blit.hs b/src/Blit.hs
--- a/src/Blit.hs
+++ b/src/Blit.hs
@@ -1,5 +1,4 @@
 import Common
-import Control.Monad.IO.Class
 import Graphics.Luminance.Batch
 import Graphics.Luminance.Cmd
 import Graphics.Luminance.Framebuffer
@@ -11,16 +10,15 @@
 import Graphics.Luminance.Shader.Stage
 import Graphics.Luminance.Texture
 import Graphics.Luminance.Vertex
-import Graphics.UI.GLFW
 
 main :: IO ()
-main = startup $ \window mainLoop -> do
+main = startup $ \window loop -> do
   triangle <- createGeometry vertices Nothing Triangle
   vs <- createStage VertexShader vsSource
   fs <- createStage FragmentShader fsSource
-  fb :: Framebuffer RW RGBA32F () <- createFramebuffer windowW windowH 1
   program <- createProgram_ [vs,fs]
-  mainLoop $ do
+  fb :: Framebuffer RW RGBA32F () <- createFramebuffer windowW windowH 1
+  loop $ do
     _ <- runCmd $ do
       _ <- draw $ framebufferBatch fb 
         [anySPBatch $ shaderProgramBatch_ program [stdRenderCmd_ triangle]]
diff --git a/src/Common.hs b/src/Common.hs
--- a/src/Common.hs
+++ b/src/Common.hs
@@ -20,8 +20,7 @@
   | AppStageCompilationFailed String
   | AppUnsupportedStage StageType
   | AppProgramLinkFailed String
-  | AppInactiveUniform String
-  | AppInactiveUniformBlock String
+  | AppInactiveUniform SomeUniformName
   | TextureLoadFailed String
   | CLIUsage String
     deriving (Eq,Show)
@@ -37,8 +36,7 @@
 instance HasProgramError AppError where
   fromProgramError e = case e of
     LinkFailed s -> AppProgramLinkFailed s
-    InactiveUniform u -> AppInactiveUniform (show u)
-    InactiveUniformBlock s -> AppInactiveUniformBlock s
+    InactiveUniform name -> AppInactiveUniform name
 
 windowW,windowH :: (Num a) => a
 windowW = 800
diff --git a/src/DepthTest.hs b/src/DepthTest.hs
--- a/src/DepthTest.hs
+++ b/src/DepthTest.hs
@@ -1,27 +1,18 @@
 import Common
 import Control.Monad
-import Control.Monad.IO.Class
 import Data.Functor.Contravariant.Divisible
-import Graphics.Luminance.Batch
-import Graphics.Luminance.Cmd
-import Graphics.Luminance.Framebuffer
-import Graphics.Luminance.Geometry
-import Graphics.Luminance.RenderCmd
-import Graphics.Luminance.Shader.Program
-import Graphics.Luminance.Shader.Stage
-import Graphics.Luminance.Vertex
-import Graphics.UI.GLFW
+import Graphics.Luminance
 
 main :: IO ()
-main = startup $ \window mainLoop -> do
+main = startup $ \window loop -> do
   triangle <- createGeometry vertices Nothing Triangle
   vs <- createStage VertexShader vsSource
   fs <- createStage FragmentShader fsSource
-  (program,colorOffsetU) <- createProgram [vs,fs] $ \uni _ -> do
-    colorU <- uni $ Left "color"
-    offsetU <- uni $ Left "offset"
+  (program,colorOffsetU) <- createProgram [vs,fs] $ \uni -> do
+    colorU <- uni (UniformName "color")
+    offsetU <- uni (UniformName "offset")
     pure $ divided colorU offsetU
-  mainLoop $ do
+  loop $ do
     void . runCmd . draw $ framebufferBatch defaultFramebuffer
       [anySPBatch . shaderProgramBatch_ program $
         [
diff --git a/src/HelloWorld.hs b/src/HelloWorld.hs
--- a/src/HelloWorld.hs
+++ b/src/HelloWorld.hs
@@ -1,21 +1,12 @@
 import Common
 import Control.Monad
-import Control.Monad.IO.Class
-import Graphics.Luminance.Batch
-import Graphics.Luminance.Cmd
-import Graphics.Luminance.Framebuffer
-import Graphics.Luminance.Geometry
-import Graphics.Luminance.RenderCmd
-import Graphics.Luminance.Shader.Program
-import Graphics.Luminance.Shader.Stage
-import Graphics.Luminance.Vertex
-import Graphics.UI.GLFW
+import Graphics.Luminance
 
 main :: IO ()
-main = startup $ \window mainLoop -> do
+main = startup $ \window loop -> do
   triangle <- createGeometry vertices Nothing Triangle
   program <- sequenceA [createStage VertexShader vsSource,createStage FragmentShader fsSource] >>= createProgram_
-  mainLoop $ do
+  loop $ do
     void . runCmd . draw $ framebufferBatch defaultFramebuffer [anySPBatch $ shaderProgramBatch_ program [stdRenderCmd_ triangle]]
     endFrame window
 
diff --git a/src/HelloWorldUniform.hs b/src/HelloWorldUniform.hs
--- a/src/HelloWorldUniform.hs
+++ b/src/HelloWorldUniform.hs
@@ -1,17 +1,15 @@
 import Common
 import Control.Monad
-import Control.Monad.IO.Class
 import Graphics.Luminance
-import Graphics.UI.GLFW
 
 main :: IO ()
-main = startup $ \window mainLoop -> do
+main = startup $ \window loop -> do
   triangle <- createGeometry vertices Nothing Triangle
   vs <- createStage VertexShader vsSource
   fs <- createStage FragmentShader fsSource
-  (program,colorsU :: U [(Float,Float,Float)]) <- createProgram [vs,fs] $ \uni _ ->
-    uni (Left "colors")
-  mainLoop $ do
+  (program,colorsU :: U [(Float,Float,Float)]) <- createProgram [vs,fs] $ \uni ->
+    uni (UniformName "colors")
+  loop $ do
     void . runCmd . draw $ framebufferBatch defaultFramebuffer [anySPBatch $ shaderProgramBatch program colorsU colors [stdRenderCmd_ triangle]]
     endFrame window
 
diff --git a/src/Texture.hs b/src/Texture.hs
--- a/src/Texture.hs
+++ b/src/Texture.hs
@@ -6,19 +6,18 @@
 import Control.Monad.IO.Class
 import Control.Monad.Trans.Resource
 import Graphics.Luminance
-import Graphics.UI.GLFW
 import System.Environment ( getArgs )
 
 main :: IO ()
-main = startup $ \window mainLoop -> do
+main = startup $ \window loop -> do
   args <- liftIO getArgs
   when (null args) . throwError $ CLIUsage "expecting a texture path as argument!"
   tex <- loadTexture (head args)
   quad <- createGeometry vertices Nothing Triangle
   vs <- createStage VertexShader vsSource
   fs <- createStage FragmentShader fsSource
-  (program,texU) <- createProgram [vs,fs] $ \uni _ -> uni $ Left "srcTex"
-  mainLoop $ do
+  (program,texU) <- createProgram [vs,fs] $ \uni -> uni (UniformName "srcTex")
+  loop $ do
     void . runCmd . draw $ framebufferBatch defaultFramebuffer
       [anySPBatch $ shaderProgramBatch program texU tex [stdRenderCmd_ quad]]
     endFrame window
diff --git a/src/UBO.hs b/src/UBO.hs
--- a/src/UBO.hs
+++ b/src/UBO.hs
@@ -1,20 +1,18 @@
 import Common
 import Control.Monad
-import Control.Monad.IO.Class
 import GHC.Generics ( Generic )
 import Graphics.Luminance
-import Graphics.UI.GLFW
 import Linear
 
 main :: IO ()
-main = startup $ \window mainLoop -> do
+main = startup $ \window loop -> do
   triangle <- createGeometry vertices Nothing Triangle
   vs <- createStage VertexShader vsSource
   fs <- createStage FragmentShader fsSource
   colorBuffer :: Region RW (UB Color) <- createBuffer (newRegion 3)
   writeWhole colorBuffer (map UB colors)
-  (program,colorsU) <- createProgram [vs,fs] $ \_ uniBlock -> uniBlock "Colors"
-  mainLoop $ do
+  (program,colorsU) <- createProgram [vs,fs] $ \uni -> uni (UniformBlockName"Colors")
+  loop $ do
     void . runCmd . draw $ framebufferBatch defaultFramebuffer [anySPBatch $ shaderProgramBatch program colorsU colorBuffer [stdRenderCmd_ triangle]]
     endFrame window
 
