diff --git a/apps/WebsocketUtils.hs b/apps/WebsocketUtils.hs
new file mode 100644
--- /dev/null
+++ b/apps/WebsocketUtils.hs
@@ -0,0 +1,49 @@
+{-# LANGUAGE ExistentialQuantification #-}
+
+module WebsocketUtils
+  ( jsonWSServerFromChan
+  , makeJsonWSServer
+  , makeJsonOrShowWSServer
+  , JsonShowable (..)
+  ) where
+
+import           Control.Concurrent
+import           Control.Monad
+import           Control.Monad.IO.Class
+import           Data.Aeson (ToJSON(..), encode)
+import           Network.WebSockets
+
+
+-- | A websocket server that serves JSON from a Chan.
+jsonWSServerFromChan :: (ToJSON a) => Chan a -> (Request -> WebSockets Hybi10 ())
+jsonWSServerFromChan chan = \req -> do
+  acceptRequest req
+  c <- liftIO $ dupChan chan
+  forever (liftIO (readChan c) >>= sendTextData . encode)
+
+
+-- | Creates and starts (forking) a JSON-serving websocket server.
+-- Returns a Chan from which the server will read.
+makeJsonWSServer :: (ToJSON a) => String -> Int -> IO (Chan a)
+makeJsonWSServer host port = do
+  chan <- newChan
+  _ <- forkIO $ runServer host port (jsonWSServerFromChan chan)
+  return chan
+
+
+-- | Creates a server that can serve things either as text or as JSON.
+-- If `json` is true, inputs to the returned function will be sent as JSON,
+-- otherwise they will be `show`n and then JSON-formatted as a String.
+makeJsonOrShowWSServer :: (Show a, ToJSON a) => String -> Int -> Bool -> IO (a -> IO ())
+makeJsonOrShowWSServer host port json =
+  if json then do chan <- makeJsonWSServer host port
+                  return (writeChan chan)
+          else do chan <- makeJsonWSServer host port
+                  return (writeChan chan . show)
+
+
+-- | Something that can be shown and formatted as JSON.
+data JsonShowable = forall a . (Show a, ToJSON a) => JsonShowable a
+
+instance Show JsonShowable   where show (JsonShowable x) = show x
+instance ToJSON JsonShowable where toJSON (JsonShowable x) = toJSON x
diff --git a/hemokit.cabal b/hemokit.cabal
--- a/hemokit.cabal
+++ b/hemokit.cabal
@@ -1,5 +1,5 @@
 name:          hemokit
-version:       0.4.0
+version:       0.4.1
 license:       MIT
 copyright:     2013 Niklas Hambüchen <mail@nh2.me>, Patrick Chilton <chpatrick@gmail.com>
 author:        Niklas Hambüchen <mail@nh2.me>, Patrick Chilton <chpatrick@gmail.com>
@@ -81,6 +81,8 @@
     apps
   main-is:
     Dump.hs
+  other-modules:
+    WebsocketUtils
   build-depends:
       base
     , hemokit
