diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,21 @@
 Brick changelog
 ---------------
 
+0.51
+----
+
+API changes:
+ * Added Brick.Focus.focusRingToList, which returns all of the elements
+   in a focus ring as a list, starting with the focused entry and
+   wrapping around (#257; thanks @4eUeP)
+
+Bug fixes:
+ * Fix Brick.Widgets.FileBrowser.fileExtensionMatch to match directories
+   and also match symlinks that link to directories (thanks @YVee1)
+
+Other changes:
+ * Added demonstration program screenshot gallery (thanks @drola)
+
 0.50.1
 ------
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -94,7 +94,7 @@
 * [The official brick user guide](https://github.com/jtdaugherty/brick/blob/master/docs/guide.rst)
 * [Samuel Tay's brick tutorial](https://github.com/jtdaugherty/brick/blob/master/docs/samtay-tutorial.md)
 * Haddock (all modules)
-* [Demo programs](https://github.com/jtdaugherty/brick/blob/master/programs)
+* [Demo programs](https://github.com/jtdaugherty/brick/blob/master/programs) ([Screenshots](https://github.com/jtdaugherty/brick/blob/master/docs/programs-screenshots.md))
 * [FAQ](https://github.com/jtdaugherty/brick/blob/master/FAQ.md)
 
 Feature Overview
diff --git a/brick.cabal b/brick.cabal
--- a/brick.cabal
+++ b/brick.cabal
@@ -1,5 +1,5 @@
 name:                brick
-version:             0.50.1
+version:             0.51
 synopsis:            A declarative terminal user interface library
 description:
   Write terminal applications painlessly with 'brick'! You write an
@@ -43,7 +43,32 @@
                      docs/guide.rst,
                      docs/samtay-tutorial.md,
                      docs/snake-demo.gif,
-                     CHANGELOG.md
+                     CHANGELOG.md,
+                     docs/programs-screenshots.md,
+                     docs/programs-screenshots/brick-attr-demo.png,
+                     docs/programs-screenshots/brick-border-demo.png,
+                     docs/programs-screenshots/brick-cache-demo.png,
+                     docs/programs-screenshots/brick-custom-event-demo.png,
+                     docs/programs-screenshots/brick-dialog-demo.png,
+                     docs/programs-screenshots/brick-dynamic-border-demo.png,
+                     docs/programs-screenshots/brick-edit-demo.png,
+                     docs/programs-screenshots/brick-file-browser-demo.png,
+                     docs/programs-screenshots/brick-fill-demo.png,
+                     docs/programs-screenshots/brick-form-demo.png,
+                     docs/programs-screenshots/brick-hello-world-demo.png,
+                     docs/programs-screenshots/brick-layer-demo.png,
+                     docs/programs-screenshots/brick-list-demo.png,
+                     docs/programs-screenshots/brick-list-vi-demo.png,
+                     docs/programs-screenshots/brick-markup-demo.png,
+                     docs/programs-screenshots/brick-mouse-demo.png,
+                     docs/programs-screenshots/brick-padding-demo.png,
+                     docs/programs-screenshots/brick-progressbar-demo.png,
+                     docs/programs-screenshots/brick-readme-demo.png,
+                     docs/programs-screenshots/brick-suspend-resume-demo.png,
+                     docs/programs-screenshots/brick-text-wrap-demo.png,
+                     docs/programs-screenshots/brick-theme-demo.png,
+                     docs/programs-screenshots/brick-viewport-scroll-demo.png,
+                     docs/programs-screenshots/brick-visibility-demo.png
 
 Source-Repository head
   type:     git
diff --git a/docs/programs-screenshots.md b/docs/programs-screenshots.md
new file mode 100644
--- /dev/null
+++ b/docs/programs-screenshots.md
@@ -0,0 +1,73 @@
+# Demo program screenshots
+
+## [AttrDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/AttrDemo.hs)
+![attr demo](./programs-screenshots/brick-attr-demo.png)
+
+## [BorderDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/BorderDemo.hs)
+![border demo](./programs-screenshots/brick-border-demo.png)
+
+## [CacheDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/CacheDemo.hs)
+![cache demo](./programs-screenshots/brick-cache-demo.png)
+
+## [CustomEventDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/CustomEventDemo.hs)
+![custom-event demo](./programs-screenshots/brick-custom-event-demo.png)
+
+## [DialogDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/DialogDemo.hs)
+![dialog demo](./programs-screenshots/brick-dialog-demo.png)
+
+## [DynamicBorderDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/DynamicBorderDemo.hs)
+![dynamic-border demo](./programs-screenshots/brick-dynamic-border-demo.png)
+
+## [EditDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/EditDemo.hs)
+![edit demo](./programs-screenshots/brick-edit-demo.png)
+
+## [FileBrowserDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/FileBrowserDemo.hs)
+![file-browser demo](./programs-screenshots/brick-file-browser-demo.png)
+
+## [FillDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/FillDemo.hs)
+![fill demo](./programs-screenshots/brick-fill-demo.png)
+
+## [FormDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/FormDemo.hs)
+![form demo](./programs-screenshots/brick-form-demo.png)
+
+## [HelloWorldDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/HelloWorldDemo.hs)
+![hello-world demo](./programs-screenshots/brick-hello-world-demo.png)
+
+## [LayerDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/LayerDemo.hs)
+![layer demo](./programs-screenshots/brick-layer-demo.png)
+
+## [ListDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/ListDemo.hs)
+![list demo](./programs-screenshots/brick-list-demo.png)
+
+## [ListViDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/ListViDemo.hs)
+![list-vi demo](./programs-screenshots/brick-list-vi-demo.png)
+
+## [MarkupDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/MarkupDemo.hs)
+![markup demo](./programs-screenshots/brick-markup-demo.png)
+
+## [MouseDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/MouseDemo.hs)
+![mouse demo](./programs-screenshots/brick-mouse-demo.png)
+
+## [PaddingDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/PaddingDemo.hs)
+![padding demo](./programs-screenshots/brick-padding-demo.png)
+
+## [ProgressBarDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/ProgressBarDemo.hs)
+![progressbar demo](./programs-screenshots/brick-progressbar-demo.png)
+
+## [ReadmeDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/ReadmeDemo.hs)
+![readme demo](./programs-screenshots/brick-readme-demo.png)
+
+## [SuspendAndResumeDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/SuspendAndResumeDemo.hs)
+![suspend-resume demo](./programs-screenshots/brick-suspend-resume-demo.png)
+
+## [TextWrapDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/TextWrapDemo.hs)
+![text-wrap demo](./programs-screenshots/brick-text-wrap-demo.png)
+
+## [ThemeDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/ThemeDemo.hs)
+![theme demo](./programs-screenshots/brick-theme-demo.png)
+
+## [ViewportScrollDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/ViewportScrollDemo.hs)
+![viewport-scroll demo](./programs-screenshots/brick-viewport-scroll-demo.png)
+
+## [VisibilityDemo.hs](https://github.com/jtdaugherty/brick/blob/master/programs/VisibilityDemo.hs)
+![visibility demo](./programs-screenshots/brick-visibility-demo.png)
diff --git a/docs/programs-screenshots/brick-attr-demo.png b/docs/programs-screenshots/brick-attr-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-attr-demo.png differ
diff --git a/docs/programs-screenshots/brick-border-demo.png b/docs/programs-screenshots/brick-border-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-border-demo.png differ
diff --git a/docs/programs-screenshots/brick-cache-demo.png b/docs/programs-screenshots/brick-cache-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-cache-demo.png differ
diff --git a/docs/programs-screenshots/brick-custom-event-demo.png b/docs/programs-screenshots/brick-custom-event-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-custom-event-demo.png differ
diff --git a/docs/programs-screenshots/brick-dialog-demo.png b/docs/programs-screenshots/brick-dialog-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-dialog-demo.png differ
diff --git a/docs/programs-screenshots/brick-dynamic-border-demo.png b/docs/programs-screenshots/brick-dynamic-border-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-dynamic-border-demo.png differ
diff --git a/docs/programs-screenshots/brick-edit-demo.png b/docs/programs-screenshots/brick-edit-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-edit-demo.png differ
diff --git a/docs/programs-screenshots/brick-file-browser-demo.png b/docs/programs-screenshots/brick-file-browser-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-file-browser-demo.png differ
diff --git a/docs/programs-screenshots/brick-fill-demo.png b/docs/programs-screenshots/brick-fill-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-fill-demo.png differ
diff --git a/docs/programs-screenshots/brick-form-demo.png b/docs/programs-screenshots/brick-form-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-form-demo.png differ
diff --git a/docs/programs-screenshots/brick-hello-world-demo.png b/docs/programs-screenshots/brick-hello-world-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-hello-world-demo.png differ
diff --git a/docs/programs-screenshots/brick-layer-demo.png b/docs/programs-screenshots/brick-layer-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-layer-demo.png differ
diff --git a/docs/programs-screenshots/brick-list-demo.png b/docs/programs-screenshots/brick-list-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-list-demo.png differ
diff --git a/docs/programs-screenshots/brick-list-vi-demo.png b/docs/programs-screenshots/brick-list-vi-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-list-vi-demo.png differ
diff --git a/docs/programs-screenshots/brick-markup-demo.png b/docs/programs-screenshots/brick-markup-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-markup-demo.png differ
diff --git a/docs/programs-screenshots/brick-mouse-demo.png b/docs/programs-screenshots/brick-mouse-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-mouse-demo.png differ
diff --git a/docs/programs-screenshots/brick-padding-demo.png b/docs/programs-screenshots/brick-padding-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-padding-demo.png differ
diff --git a/docs/programs-screenshots/brick-progressbar-demo.png b/docs/programs-screenshots/brick-progressbar-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-progressbar-demo.png differ
diff --git a/docs/programs-screenshots/brick-readme-demo.png b/docs/programs-screenshots/brick-readme-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-readme-demo.png differ
diff --git a/docs/programs-screenshots/brick-suspend-resume-demo.png b/docs/programs-screenshots/brick-suspend-resume-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-suspend-resume-demo.png differ
diff --git a/docs/programs-screenshots/brick-text-wrap-demo.png b/docs/programs-screenshots/brick-text-wrap-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-text-wrap-demo.png differ
diff --git a/docs/programs-screenshots/brick-theme-demo.png b/docs/programs-screenshots/brick-theme-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-theme-demo.png differ
diff --git a/docs/programs-screenshots/brick-viewport-scroll-demo.png b/docs/programs-screenshots/brick-viewport-scroll-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-viewport-scroll-demo.png differ
diff --git a/docs/programs-screenshots/brick-visibility-demo.png b/docs/programs-screenshots/brick-visibility-demo.png
new file mode 100644
Binary files /dev/null and b/docs/programs-screenshots/brick-visibility-demo.png differ
diff --git a/src/Brick/Focus.hs b/src/Brick/Focus.hs
--- a/src/Brick/Focus.hs
+++ b/src/Brick/Focus.hs
@@ -10,6 +10,7 @@
   , focusGetCurrent
   , focusSetCurrent
   , focusRingLength
+  , focusRingToList
   , focusRingCursor
   , withFocusRing
   , focusRingModify
@@ -80,6 +81,14 @@
 -- | Get the size of the FocusRing.
 focusRingLength :: FocusRing n -> Int
 focusRingLength (FocusRing l) = C.size l
+
+-- | Return all of the entries in the focus ring, starting with the
+-- currently-focused entry and wrapping around the ring.
+--
+-- For example, if a ring contains A, B, C, and D, and the current entry
+-- is B, the result will be [B, C, D, A].
+focusRingToList :: FocusRing n -> [n]
+focusRingToList (FocusRing l) = C.rightElements l
 
 -- | Modify the internal circular list structure of a focus ring
 -- directly. This function permits modification of the circular list
diff --git a/src/Brick/Widgets/Core.hs b/src/Brick/Widgets/Core.hs
--- a/src/Brick/Widgets/Core.hs
+++ b/src/Brick/Widgets/Core.hs
@@ -660,7 +660,7 @@
 catDynBorder towardsA towardsB a b
     -- Currently, we check if the 'BorderStyle's are exactly the same. In the
     -- future, it might be nice to relax this restriction. For example, if a
-    -- horizontal border is being rewritten to accomodate a neighboring
+    -- horizontal border is being rewritten to accommodate a neighboring
     -- vertical border, all we care about is that the two 'bsVertical's line up
     -- sanely. After all, if the horizontal border's 'bsVertical' is the same
     -- as the vertical one's, and the horizontal border's 'BorderStyle' is
diff --git a/src/Brick/Widgets/FileBrowser.hs b/src/Brick/Widgets/FileBrowser.hs
--- a/src/Brick/Widgets/FileBrowser.hs
+++ b/src/Brick/Widgets/FileBrowser.hs
@@ -777,6 +777,16 @@
 -- regular file with the specified extension. For example, an extension
 -- argument of @"xml"@ would match regular files @test.xml@ and
 -- @TEST.XML@ and it will match directories regardless of name.
+--
+-- This matcher also matches symlinks if and only if their targets are
+-- directories. This is intended to make it possible to use this matcher
+-- to find files with certain extensions, but also support directory
+-- traversal via symlinks.
 fileExtensionMatch :: String -> FileInfo -> Bool
-fileExtensionMatch ext i =
-    ('.' : (toLower <$> ext)) `isSuffixOf` (toLower <$> fileInfoFilename i)
+fileExtensionMatch ext i = case fileInfoFileType i of
+    Just Directory -> True
+    Just RegularFile -> ('.' : (toLower <$> ext)) `isSuffixOf` (toLower <$> fileInfoFilename i)
+    Just SymbolicLink -> case fileInfoLinkTargetType i of
+        Just Directory -> True
+        _ -> False
+    _ -> False
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
@@ -561,7 +561,7 @@
         clamp 0 (if null t then length l - 1 else i) i
 
 -- | Set the selected index for a list to the index of the first
--- occurence of the specified element if it is in the list, or leave
+-- occurrence of the specified element if it is in the list, or leave
 -- the list unmodified otherwise.
 --
 -- /O(n)/.  Only evaluates as much of the container as needed.
