diff --git a/hi3status.cabal b/hi3status.cabal
--- a/hi3status.cabal
+++ b/hi3status.cabal
@@ -1,5 +1,5 @@
 name:                hi3status
-version:             0.1.0.0
+version:             0.1.1.0
 synopsis:            Status line for i3bar.
 description:         Hi3status is a compact, lightweight, responsive and highly configurable status line for i3bar.
 license:             MIT
@@ -31,6 +31,7 @@
                        Hi3Status.Blocks.Window
                        Hi3Status.Blocks.Weather
                        Hi3Status.Blocks.Music
+                       Hi3Status.Blocks.Command
   other-modules:       Hi3Status.Block.Internal
                        Hi3Status.StatusLine
   build-depends:       base >=4.8 && <4.9, vector, text, aeson, dbus, transformers, bytestring, process, time, regex-pcre-builtin, dyre, prefix-units, network, binary
diff --git a/lib-src/Hi3Status/Blocks/Command.hs b/lib-src/Hi3Status/Blocks/Command.hs
new file mode 100644
--- /dev/null
+++ b/lib-src/Hi3Status/Blocks/Command.hs
@@ -0,0 +1,43 @@
+{-|
+Module      : Hi3Status.Blocks.Command
+License     : MIT
+Maintainer  : Josh Kirklin (jjvk2@cam.ac.uk)
+Stability   : experimental
+-}
+module Hi3Status.Blocks.Command (
+    CommandBlock (..)
+    ) where
+
+import Hi3Status.Block
+import Hi3Status.Block.Util
+
+import qualified Data.Text as T
+import System.Process
+import GHC.IO.Handle
+import Control.Monad.IO.Class
+
+-- | A block that executes an arbitrary shell command and displays the output.
+data CommandBlock = CommandBlock {
+    -- | The command to execute.
+    cmd :: String, 
+    -- | The format of the displayed text.
+    --
+    -- *@{stdout}@ = stdout.
+    -- *@{stderr}@ = stderr.
+    format :: String,
+    -- | An optional refresh period in microseconds.
+    refresh :: Maybe Int 
+    }
+
+instance Block CommandBlock where
+    runBlock b = case refresh b of
+        Nothing -> onUpdate go
+        Just n -> periodic n go
+      where
+        go = do
+            (_, mhout, mherr, _) <- liftIO $ createProcess $ (shell (cmd b)) { std_out = CreatePipe, std_err = CreatePipe }
+            out <- maybe (return "") (liftIO . hGetContents) mhout
+            err <- maybe (return "") (liftIO . hGetContents) mherr
+            pushBlockDescription $ emptyBlockDescription 
+                { full_text = formatText [("stdout", concat . take 1 . lines $ out),("stderr", concat . take 1 . lines $ err)] (format b) }
+
diff --git a/lib-src/Hi3Status/Blocks/Weather.hs b/lib-src/Hi3Status/Blocks/Weather.hs
--- a/lib-src/Hi3Status/Blocks/Weather.hs
+++ b/lib-src/Hi3Status/Blocks/Weather.hs
@@ -19,7 +19,7 @@
 
 data Conditions = ClearDay | ClearNight | Rain | Cloudy
 
--- | A simple block that displays a piece of static text. Requires @weather@ and @sunwait@.
+-- | A block to display the weather. Requires @weather@ and @sunwait@.
 data WeatherBlock = WeatherBlock  {
     -- | The weather format.
     --
