diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,14 @@
 Brick changelog
 ---------------
 
+0.13
+----
+
+API changes:
+ * Mouse mode is no longer enabled by default.
+ * customMain's event channel parameter is now optional
+ * FocusRing now provides a Functor instance (thanks Ian Jeffries)
+
 0.12
 ----
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -34,8 +34,6 @@
  * Border-drawing widgets (put borders around or in between things)
  * Generic scrollable viewports
  * Extensible widget-building API
- * Mouse interaction
- * Rendering cache
  * (And many more general-purpose layout control combinators)
 
 In addition, some of `brick`'s more powerful features may not be obvious
diff --git a/brick.cabal b/brick.cabal
--- a/brick.cabal
+++ b/brick.cabal
@@ -1,5 +1,5 @@
 name:                brick
-version:             0.12
+version:             0.13
 synopsis:            A declarative terminal user interface library
 description:
   Write terminal applications painlessly with 'brick'! You write an
diff --git a/docs/guide.rst b/docs/guide.rst
--- a/docs/guide.rst
+++ b/docs/guide.rst
@@ -343,7 +343,7 @@
    main :: IO ()
    main = do
        eventChan <- Control.Concurrent.newChan
-       finalState <- customMain (Graphics.Vty.mkVty Data.Default.def) eventChan app initialState
+       finalState <- customMain (Graphics.Vty.mkVty Data.Default.def) (Just eventChan) app initialState
        -- Use finalState and exit
 
 The ``customMain`` function lets us have control over how the ``vty``
diff --git a/programs/CustomEventDemo.hs b/programs/CustomEventDemo.hs
--- a/programs/CustomEventDemo.hs
+++ b/programs/CustomEventDemo.hs
@@ -76,4 +76,4 @@
         writeChan chan Counter
         threadDelay 1000000
 
-    void $ customMain (V.mkVty def) chan theApp initialState
+    void $ customMain (V.mkVty def) (Just chan) theApp initialState
diff --git a/programs/MouseDemo.hs b/programs/MouseDemo.hs
--- a/programs/MouseDemo.hs
+++ b/programs/MouseDemo.hs
@@ -3,6 +3,7 @@
 module Main where
 
 import Control.Applicative ((<$>))
+import Control.Concurrent (newChan)
 import Data.Monoid ((<>))
 import Lens.Micro ((^.), (&), (.~))
 import Lens.Micro.TH (makeLenses)
@@ -88,4 +89,10 @@
           }
 
 main :: IO ()
-main = void $ M.defaultMain app $ St [] Nothing
+main = do
+    let buildVty = do
+          v <- V.mkVty =<< V.standardIOConfig
+          V.setMode (V.outputIface v) V.Mouse True
+          return v
+
+    void $ M.customMain buildVty Nothing app $ St [] Nothing
diff --git a/src/Brick/Focus.hs b/src/Brick/Focus.hs
--- a/src/Brick/Focus.hs
+++ b/src/Brick/Focus.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE DeriveFunctor #-}
+
 -- | This module provides a type and functions for handling focus rings
 -- of widgets. Note that this interface is merely provided for managing
 -- the focus state for a sequence of resource names; it does not do
@@ -25,6 +27,7 @@
 -- currently-focused name.
 data FocusRing n = FocusRingEmpty
                  | FocusRingNonempty ![n] !Int
+                 deriving Functor
 
 -- | Construct a focus ring from the list of resource names.
 focusRing :: [n] -> FocusRing n
diff --git a/src/Brick/Main.hs b/src/Brick/Main.hs
--- a/src/Brick/Main.hs
+++ b/src/Brick/Main.hs
@@ -42,7 +42,7 @@
 
 import Control.Exception (finally)
 import Lens.Micro ((^.), (&), (.~))
-import Control.Monad (forever)
+import Control.Monad (forever, void)
 import Control.Monad.Trans.Class (lift)
 import Control.Monad.Trans.State
 import Control.Monad.Trans.Reader
@@ -60,8 +60,6 @@
   , Picture(..)
   , Cursor(..)
   , Event(..)
-  , Mode(..)
-  , setMode
   , update
   , outputIface
   , displayBounds
@@ -121,7 +119,7 @@
             -> IO s
 defaultMain app st = do
     chan <- newChan
-    customMain (mkVty def) chan app st
+    customMain (mkVty def) (Just chan) app st
 
 -- | A simple main entry point which takes a widget and renders it. This
 -- event loop terminates when the user presses any key, but terminal
@@ -160,7 +158,6 @@
               -> IO (InternalNext n s)
 runWithNewVty buildVty chan app initialRS initialSt =
     withVty buildVty $ \vty -> do
-        setMode (outputIface vty) Mouse True
         pid <- forkIO $ supplyVtyEvents vty chan
         let runInner rs st = do
               (result, newRS) <- runVty vty chan app st (rs & observedNamesL .~ S.empty
@@ -182,16 +179,17 @@
            -- ^ An IO action to build a Vty handle. This is used to
            -- build a Vty handle whenever the event loop begins or is
            -- resumed after suspension.
-           -> Chan e
+           -> Maybe (Chan e)
            -- ^ An event channel for sending custom events to the event
            -- loop (you write to this channel, the event loop reads from
-           -- it).
+           -- it). Provide 'Nothing' if you don't plan on sending custom
+           -- events.
            -> App s e n
            -- ^ The application.
            -> s
            -- ^ The initial application state.
            -> IO s
-customMain buildVty userChan app initialAppState = do
+customMain buildVty mUserChan app initialAppState = do
     let run rs st chan = do
             result <- runWithNewVty buildVty chan app rs st
             case result of
@@ -205,7 +203,11 @@
     (st, eState) <- runStateT (runReaderT (runEventM (appStartEvent app initialAppState)) eventRO) emptyES
     let initialRS = RS M.empty (esScrollRequests eState) S.empty mempty []
     chan <- newChan
-    forkIO $ forever $ readChan userChan >>= (\userEvent -> writeChan chan $ AppEvent userEvent)
+    case mUserChan of
+        Just userChan ->
+            void $ forkIO $ forever $ readChan userChan >>= (\userEvent -> writeChan chan $ AppEvent userEvent)
+        Nothing -> return ()
+
     run initialRS st chan
 
 supplyVtyEvents :: Vty -> Chan (BrickEvent n e) -> IO ()
