diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Change log
 
+## v0.0.16 (2015-04-03)
+
+-   Fixed a bug that incorrectly decoded inputs from the URL.
+-   Added some explanatory text, ostensibly for SEO.
+-   Added a ping to the WebSocket client to keep the connection open.
+
 ## v0.0.15 (2015-03-29)
 
 -   Switch to converting expressions over WebSockets.
@@ -51,7 +57,7 @@
 
 ## v0.0.5 (2015-03-19)
 
--   Constraint versions of `pointfree` dependencies.
+-   Constrained versions of pointfree dependencies.
 
 ## v0.0.4 (2015-03-19)
 
diff --git a/blunt.cabal b/blunt.cabal
--- a/blunt.cabal
+++ b/blunt.cabal
@@ -1,5 +1,5 @@
 name: blunt
-version: 0.0.15
+version: 0.0.16
 cabal-version: >=1.10
 build-type: Simple
 license: MIT
@@ -30,6 +30,7 @@
         aeson ==0.8.*,
         bytestring ==0.10.*,
         clay ==0.10.*,
+        flow ==1.*,
         http-types ==0.8.*,
         jmacro ==0.6.*,
         lucid ==2.*,
diff --git a/library/Blunt.hs b/library/Blunt.hs
--- a/library/Blunt.hs
+++ b/library/Blunt.hs
@@ -2,6 +2,8 @@
 
 module Blunt where
 
+import Flow
+
 import Blunt.Markup (markup)
 import Control.Exception (SomeException, evaluate, handle)
 import Control.Monad (forever)
@@ -16,7 +18,7 @@
 import Network.Wai.Middleware.Gzip (def, gzip)
 import Network.Wai.Middleware.RequestLogger (logStdout)
 import Network.WebSockets (ServerApp, acceptRequest, defaultConnectionOptions,
-    receiveData, sendTextData)
+    forkPingThread, receiveData, sendTextData)
 import Pointfree (pointfree)
 
 main :: IO ()
@@ -28,14 +30,15 @@
 ws :: ServerApp
 ws pending = do
     connection <- acceptRequest pending
-    forever $ do
+    forkPingThread connection 30
+    forever <| do
         message <- receiveData connection
         result <- convert message
         sendTextData connection (encode result)
 
 http :: Application
-http = gzip def . logStdout $ \ request respond ->
-    respond $ case (requestMethod request, pathInfo request) of
+http = logStdout .> gzip def <| \ request respond ->
+    respond <| case (requestMethod request, pathInfo request) of
         ("GET", []) -> responseLBS status headers body where
             status = ok200
             headers = [("Content-Type", "text/html; charset=utf-8")]
@@ -54,7 +57,7 @@
         }
 
 safePointfree :: String -> IO [String]
-safePointfree = handle handler . evaluate . pointfree
+safePointfree = pointfree .> evaluate .> handle handler
 
 handler :: SomeException -> IO [String]
 handler _ = return []
diff --git a/library/Blunt/Markup.hs b/library/Blunt/Markup.hs
--- a/library/Blunt/Markup.hs
+++ b/library/Blunt/Markup.hs
@@ -2,6 +2,7 @@
 
 module Blunt.Markup where
 
+import Flow
 import Lucid
 
 import Blunt.Script (script)
@@ -12,8 +13,8 @@
 markup = renderBS html
 
 html :: Html ()
-html = doctypehtml_ $ do
-    head_ $ do
+html = doctypehtml_ <| do
+    head_ <| do
         meta_
             [ name_ "viewport"
             , content_ "initial-scale = 1, maximum-scale = 1, minimum-scale = 1, width = device-width"
@@ -23,12 +24,12 @@
 
         style_ [] style
 
-    body_ $ do
+    body_ <| do
         h1_ "Blunt"
 
-        dl_ $ do
+        dl_ <| do
             dt_ "Input"
-            dd_ $ do
+            dd_ <| do
                 input_
                     [ id_ "input"
                     , placeholder_ "sum xs = foldr (+) 0 xs"
@@ -45,8 +46,18 @@
             dt_ "Pointful"
             dd_ (div_ [id_ "pointful"] "")
 
-        p_ $ do
-            a_ [href_ "https://github.com/tfausak/blunt"] $ do
+        p_ <| do
+            "Blunt converts Haskell expressions between the pointfree and "
+            "pointful styles. It is a web front end to the "
+            a_ [href_ "http://hackage.haskell.org/package/pointfree"]
+                "pointfree"
+            " and "
+            a_ [href_ "http://hackage.haskell.org/package/pointful"]
+                "pointful"
+            " libraries."
+
+        p_ <| do
+            a_ [href_ "https://github.com/tfausak/blunt"] <| do
                 "github.com/tfausak/blunt"
 
         script_ [] script
diff --git a/library/Blunt/Script.hs b/library/Blunt/Script.hs
--- a/library/Blunt/Script.hs
+++ b/library/Blunt/Script.hs
@@ -20,7 +20,8 @@
 
     socket.onopen = \ {
         input.oninput = \ {
-            window.location.replace("#input=" + input.value);
+            window.location.replace(
+                "#input=" + encodeURIComponent(input.value));
             socket.send(input.value);
         };
 
@@ -34,6 +35,6 @@
     };
 
     if (window.location.hash.indexOf("#input=") === 0) {
-        input.value = window.location.hash.substring(7);
+        input.value = decodeURIComponent(window.location.hash.substring(7));
     }
 }(); |]
