diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,19 @@
 Brick changelog
 ---------------
 
+0.37
+----
+
+Behavior changes:
+ * `listMoveBy` now automatically moves to the first or last position
+   in the list if called when the list is non-empty but has no selected
+   element (thanks Philip Kamenarsky)
+
+API changes:
+ * Added `Brick.Widgets.List.renderListWithIndex` that passes
+   the index of each element to the item rendering function (thanks
+   liam@magicseaweed.com)
+
 0.36.3
 ------
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -166,3 +166,8 @@
    codebase.
  - Please adjust or provide Haddock and/or user guide documentation
    relevant to any changes you make.
+ - New commits should be `-Wall` clean.
+ - Please do NOT include package version changes in your patches.
+   Package version changes are only done at release time when the full
+   scope of a release's changes can be evaluated to determine the
+   appropriate version change.
diff --git a/brick.cabal b/brick.cabal
--- a/brick.cabal
+++ b/brick.cabal
@@ -1,5 +1,5 @@
 name:                brick
-version:             0.36.3
+version:             0.37
 synopsis:            A declarative terminal user interface library
 description:
   Write terminal applications painlessly with 'brick'! You write an
diff --git a/src/Brick/Widgets/List.hs b/src/Brick/Widgets/List.hs
--- a/src/Brick/Widgets/List.hs
+++ b/src/Brick/Widgets/List.hs
@@ -16,6 +16,7 @@
 
   -- * Rendering a list
   , renderList
+  , renderListWithIndex
 
   -- * Handling events
   , handleListEvent
@@ -180,11 +181,25 @@
            -- ^ The List to be rendered
            -> Widget n
            -- ^ rendered widget
-renderList drawElem foc l =
+renderList drawElem = renderListWithIndex $ const drawElem
+
+-- | Like 'renderList', except the render function is also provided
+-- with the index of each element.
+renderListWithIndex :: (Ord n, Show n)
+           => (Int -> Bool -> e -> Widget n)
+           -- ^ Rendering function, taking index, and True for the
+           -- selected element
+           -> Bool
+           -- ^ Whether the list has focus
+           -> List n e
+           -- ^ The List to be rendered
+           -> Widget n
+           -- ^ rendered widget
+renderListWithIndex drawElem foc l =
     withDefAttr listAttr $
     drawListElements foc l drawElem
 
-drawListElements :: (Ord n, Show n) => Bool -> List n e -> (Bool -> e -> Widget n) -> Widget n
+drawListElements :: (Ord n, Show n) => Bool -> List n e -> (Int -> Bool -> e -> Widget n) -> Widget n
 drawListElements foc l drawElem =
     Widget Greedy Greedy $ do
         c <- getContext
@@ -214,8 +229,9 @@
             off = start * (l^.listItemHeightL)
 
             drawnElements = flip V.imap es $ \i e ->
-                let isSelected = Just (i + start) == l^.listSelectedL
-                    elemWidget = drawElem isSelected e
+                let j = i + start
+                    isSelected = Just j == l^.listSelectedL
+                    elemWidget = drawElem j isSelected e
                     selItemAttr = if foc
                                   then withDefAttr listSelectedFocusedAttr
                                   else withDefAttr listSelectedAttr
@@ -306,11 +322,21 @@
           in
             return $ listMoveBy nElems theList
 
--- | Move the list selected index by the specified amount, subject to
--- validation.
+-- | Move the list selected index. If the index is `Just x`, adjust by the
+-- specified amount; if it is `Nothing` (i.e. there is no selection) and the
+-- direction is positive, set to `Just 0` (first element), otherwise set to
+-- `Just (length - 1)` (last element). Subject to validation.
 listMoveBy :: Int -> List n e -> List n e
 listMoveBy amt l =
-    let newSel = clamp 0 (V.length (l^.listElementsL) - 1) <$> (amt +) <$> (l^.listSelectedL)
+    let current = case l^.listSelectedL of
+          Nothing
+            | amt > 0 -> Just 0
+            | otherwise -> Just (V.length (l^.listElementsL) - 1)
+          cur -> cur
+        clamp' a b c
+          | a <= b = Just (clamp a b c)
+          | otherwise = Nothing
+        newSel = clamp' 0 (V.length (l^.listElementsL) - 1) =<< (amt +) <$> current
     in l & listSelectedL .~ newSel
 
 -- | Set the selected index for a list to the specified index, subject
