diff --git a/Graphics/Blank.hs b/Graphics/Blank.hs
--- a/Graphics/Blank.hs
+++ b/Graphics/Blank.hs
@@ -29,11 +29,13 @@
 import Network.Wai.Handler.Warp (run)
 import Web.Scotty as S
 import Network.Wai.Middleware.RequestLogger
+import Network.Wai.Middleware.Rewrite 
 import qualified Data.Text.Lazy as T
 import qualified Data.Text as TS
 
 import qualified Data.Map as Map
 import Data.Maybe (fromMaybe)
+import Data.List (stripPrefix)
 
 import Graphics.Blank.Events
 import Graphics.Blank.Context
@@ -61,10 +63,14 @@
 blankCanvas :: Int -> (Context -> IO ()) -> IO ()
 blankCanvas port actions = do
    dataDir <- getDataDir
-   blankCanvasParams port actions dataDir False
+   blankCanvasParams port actions dataDir False Nothing
 
-blankCanvasParams :: Int -> (Context -> IO ()) -> FilePath -> Bool -> IO ()
-blankCanvasParams port actions dataDir performLogging = do
+-- | similar to blankCanvas but takes extra dataDir, performLogging, extraPathElements (to be stripped) args
+blankCanvasParams :: Int -> (Context -> IO ()) -> FilePath -> Bool -> Maybe [TS.Text] -> IO ()
+blankCanvasParams port actions dataDir performLogging extraPathElements = do
+   let performRewrite = extraPathElements /= Nothing
+       extraPath = fromMaybe [] extraPathElements
+
    uVar <- newMVar 0
    let getUniq :: IO Int
        getUniq = do
@@ -86,6 +92,11 @@
             return uq
 
    app <- scottyApp $ do
+        when performRewrite (middleware (rewrite (\ pathOrig headers -> do
+                                                    print (pathOrig, headers, extraPath)
+                                                    let fixed = stripPrefix extraPath pathOrig
+                                                    print fixed
+                                                    return (fromMaybe pathOrig fixed))))
         when performLogging (middleware logStdoutDev)
 
 --        middleware $ staticRoot $ TS.pack $ (dataDir ++ "/static")
diff --git a/Graphics/Blank/Canvas.hs b/Graphics/Blank/Canvas.hs
--- a/Graphics/Blank/Canvas.hs
+++ b/Graphics/Blank/Canvas.hs
@@ -34,6 +34,7 @@
         | BezierCurveTo (Float,Float,Float,Float,Float,Float)
         | ClearRect (Float,Float,Float,Float)
         | ClosePath
+        | Custom String
         | Fill
         | FillRect (Float,Float,Float,Float)
         | FillStyle String
diff --git a/Graphics/Blank/Generated.hs b/Graphics/Blank/Generated.hs
--- a/Graphics/Blank/Generated.hs
+++ b/Graphics/Blank/Generated.hs
@@ -9,6 +9,7 @@
   show (BezierCurveTo (a1,a2,a3,a4,a5,a6)) = "c.bezierCurveTo(" ++ showJ a1 ++ "," ++ showJ a2 ++ "," ++ showJ a3 ++ "," ++ showJ a4 ++ "," ++ showJ a5 ++ "," ++ showJ a6 ++ ");"
   show (ClearRect (a1,a2,a3,a4)) = "c.clearRect(" ++ showJ a1 ++ "," ++ showJ a2 ++ "," ++ showJ a3 ++ "," ++ showJ a4 ++ ");"
   show ClosePath = "c.closePath();"
+  show (Custom str) = str
   show Fill = "c.fill();"
   show (FillRect (a1,a2,a3,a4)) = "c.fillRect(" ++ showJ a1 ++ "," ++ showJ a2 ++ "," ++ showJ a3 ++ "," ++ showJ a4 ++ ");"
   show (FillStyle (a1)) = "c.fillStyle = (" ++ show a1 ++ ");"
@@ -39,8 +40,8 @@
 arc :: (Float,Float,Float,Float,Float,Bool) -> Canvas ()
 arc = Command . Arc
 
-beginPath :: () -> Canvas ()
-beginPath () = Command BeginPath
+beginPath :: Canvas ()
+beginPath = Command BeginPath
 
 bezierCurveTo :: (Float,Float,Float,Float,Float,Float) -> Canvas ()
 bezierCurveTo = Command . BezierCurveTo
@@ -48,12 +49,16 @@
 clearRect :: (Float,Float,Float,Float) -> Canvas ()
 clearRect = Command . ClearRect
 
-closePath :: () -> Canvas ()
-closePath () = Command ClosePath
+closePath :: Canvas ()
+closePath = Command ClosePath
 
-fill :: () -> Canvas ()
-fill () = Command Fill
+-- | sends command (JS) unchanged 
+custom :: String -> Canvas ()
+custom = Command . Custom
 
+fill :: Canvas ()
+fill = Command Fill
+
 fillRect :: (Float,Float,Float,Float) -> Canvas ()
 fillRect = Command . FillRect
 
@@ -87,8 +92,8 @@
 moveTo :: (Float,Float) -> Canvas ()
 moveTo = Command . MoveTo
 
-restore :: () -> Canvas ()
-restore () = Command Restore
+restore :: Canvas ()
+restore = Command Restore
 
 rotate :: Float -> Canvas ()
 rotate = Command . Rotate
@@ -96,11 +101,11 @@
 scale :: (Float,Float) -> Canvas ()
 scale = Command . Scale
 
-save :: () -> Canvas ()
-save () = Command Save
+save :: Canvas ()
+save = Command Save
 
-stroke :: () -> Canvas ()
-stroke () = Command Stroke
+stroke :: Canvas ()
+stroke = Command Stroke
 
 strokeRect :: (Float,Float,Float,Float) -> Canvas ()
 strokeRect = Command . StrokeRect
diff --git a/null-canvas.cabal b/null-canvas.cabal
--- a/null-canvas.cabal
+++ b/null-canvas.cabal
@@ -1,5 +1,5 @@
 Name:                null-canvas
-Version:             0.2.4
+Version:             0.2.5
 Synopsis:            HTML5 Canvas Graphics Library - forked Blank Canvas
 Description:         A Haskell port of the HTML5 Canvas API.
                      blank-canvas works by providing a web service that
@@ -48,7 +48,7 @@
                        transformers     >= 0.2.2,
                        wai-extra        == 1.3.*,
                        warp             >= 1.3.1        && < 1.4,
-                       stm              == 2.2.*
+                       stm              == 2.*
 
   GHC-options:  -Wall -fno-warn-orphans
 
