diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,20 @@
 Brick changelog
 ---------------
 
+0.67
+----
+
+API changes:
+ * `Brick.Widgets.FileBrowser` now exports getters for all
+   `FileBrowser` fields. These getters are lens-like accessors
+   with the `G` suffix.
+ * `Brick.Widgets.FileBrowser` no longer exports the
+   `fileBrowserEntryFilterL` lens. The lens broke the API
+   because it allowed modification of internal state that could
+   lead to inconsistency in the UI. Users who needed to use
+   `fileBrowserEntryFilterL` before this change should use
+   `setFileBrowserEntryFilter` instead.
+
 0.66.1
 ------
 
diff --git a/brick.cabal b/brick.cabal
--- a/brick.cabal
+++ b/brick.cabal
@@ -1,5 +1,5 @@
 name:                brick
-version:             0.66.1
+version:             0.67
 synopsis:            A declarative terminal user interface library
 description:
   Write terminal user interfaces (TUIs) painlessly with 'brick'! You
diff --git a/src/Brick/Focus.hs b/src/Brick/Focus.hs
--- a/src/Brick/Focus.hs
+++ b/src/Brick/Focus.hs
@@ -16,7 +16,7 @@
 where
 
 import Lens.Micro ((^.))
-import Data.Maybe (listToMaybe)
+import Data.List (find)
 import qualified Data.CircularList as C
 
 import Brick.Types
@@ -64,7 +64,7 @@
 withFocusRing ring f a = f (focusGetCurrent ring == Just (getName a)) a
 
 -- | Get the currently-focused resource name from the ring. If the ring
--- is emtpy, return 'Nothing'.
+-- is empty, return 'Nothing'.
 focusGetCurrent :: FocusRing n -> Maybe n
 focusGetCurrent (FocusRing l) = C.focus l
 
@@ -107,8 +107,5 @@
                 -> Maybe (CursorLocation n)
                 -- ^ The cursor position, if any, that matches the
                 -- resource name currently focused by the 'FocusRing'.
-focusRingCursor getRing st ls =
-    listToMaybe $ filter isCurrent ls
-    where
-        isCurrent cl = cl^.cursorLocationNameL ==
-                       (focusGetCurrent $ getRing st)
+focusRingCursor getRing st = find $ \cl ->
+    cl^.cursorLocationNameL == focusGetCurrent (getRing st)
diff --git a/src/Brick/Types.hs b/src/Brick/Types.hs
--- a/src/Brick/Types.hs
+++ b/src/Brick/Types.hs
@@ -72,6 +72,7 @@
 
   -- * Making lenses
   , suffixLenses
+  , suffixLensesWith
 
   -- * Dynamic borders
   , bordersL
diff --git a/src/Brick/Types/TH.hs b/src/Brick/Types/TH.hs
--- a/src/Brick/Types/TH.hs
+++ b/src/Brick/Types/TH.hs
@@ -1,5 +1,6 @@
 module Brick.Types.TH
   ( suffixLenses
+  , suffixLensesWith
   )
 where
 
@@ -7,7 +8,7 @@
 import qualified Language.Haskell.TH.Lib as TH
 
 import Lens.Micro ((&), (.~))
-import Lens.Micro.TH (DefName(..), makeLensesWith, lensRules, lensField)
+import Lens.Micro.TH (DefName(..), LensRules, makeLensesWith, lensRules, lensField)
 
 -- | A template haskell function to build lenses for a record type. This
 -- function differs from the 'Control.Lens.makeLenses' function in that
@@ -15,5 +16,10 @@
 -- and it adds an "L" suffix to lens names to make it clear that they
 -- are lenses.
 suffixLenses :: TH.Name -> TH.DecsQ
-suffixLenses = makeLensesWith $
-  lensRules & lensField .~ (\_ _ name -> [TopName $ TH.mkName $ TH.nameBase name ++ "L"])
+suffixLenses = suffixLensesWith "L" lensRules
+
+-- | A more general version of 'suffixLenses' that allows customization
+-- of the lens-building rules and allows customization of the suffix.
+suffixLensesWith :: String -> LensRules -> TH.Name -> TH.DecsQ
+suffixLensesWith suffix rs = makeLensesWith $
+    rs & lensField .~ (\_ _ name -> [TopName $ TH.mkName $ TH.nameBase name ++ suffix])
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
@@ -111,7 +111,6 @@
   , fileExtensionMatch
 
   -- * Lenses
-  , fileBrowserEntryFilterL
   , fileBrowserSelectableL
   , fileInfoFilenameL
   , fileInfoSanitizedFilenameL
@@ -121,6 +120,17 @@
   , fileStatusSizeL
   , fileStatusFileTypeL
 
+  -- * Getters
+  , fileBrowserEntryFilterG
+  , fileBrowserWorkingDirectoryG
+  , fileBrowserEntriesG
+  , fileBrowserLatestResultsG
+  , fileBrowserSelectedFilesG
+  , fileBrowserNameG
+  , fileBrowserSearchStringG
+  , fileBrowserExceptionG
+  , fileBrowserSelectableG
+
   -- * Miscellaneous
   , prettyFileSize
 
@@ -145,6 +155,7 @@
 import qualified Data.Set as Set
 import qualified Data.Vector as V
 import Lens.Micro
+import Lens.Micro.TH (lensRules, generateUpdateableOptics)
 import qualified Graphics.Vty as Vty
 import qualified System.Directory as D
 import qualified System.Posix.Files as U
@@ -238,6 +249,7 @@
     deriving (Read, Show, Eq)
 
 suffixLenses ''FileBrowser
+suffixLensesWith "G" (lensRules & generateUpdateableOptics .~ False) ''FileBrowser
 suffixLenses ''FileInfo
 suffixLenses ''FileStatus
 
@@ -311,6 +323,12 @@
 -- indicates no filtering, meaning all entries will be shown. 'Just'
 -- indicates a function that should return 'True' for entries that
 -- should be permitted to appear.
+--
+-- Note that this applies the filter after setting it by updating the
+-- listed entries to reflect the result of the filter. That is unlike
+-- setting the filter with the 'fileBrowserEntryFilterL' lens directly,
+-- which just sets the filter but does not (and cannot) update the
+-- listed entries.
 setFileBrowserEntryFilter :: Maybe (FileInfo -> Bool) -> FileBrowser n -> FileBrowser n
 setFileBrowserEntryFilter f b =
     applyFilterAndSearch $ b & fileBrowserEntryFilterL .~ f
