diff --git a/changelog.md b/changelog.md
new file mode 100644
--- /dev/null
+++ b/changelog.md
@@ -0,0 +1,21 @@
+# Unreleased
+
+# 0.4.0.0
+
+* Add safe versions of `Foldable.minimum` et al.
+* Export `showsPrec`, `showParen`, `showString`.
+
+# 0.3.0.0
+
+* Add safe versions of `Fractional` division methods.
+* Add `fromText`.
+* Remove module exports for `Prelude` to avoid a Stack bug.
+* Rename `Incipit` modules to `IncipitBase` and `IncipitCore`.
+* Export `withFrozenCallStack`.
+* Add `leftA`, an `Either` combinator that runs an applicative action on a `Left`.
+
+# 0.2.0.0
+
+* Add safe, `Maybe` returning, versions of the methods of `Integral`.
+* Hide constructors of effect GADTs.
+* Reexport `Data.Text.Lazy.Builder`.
diff --git a/incipit-base.cabal b/incipit-base.cabal
--- a/incipit-base.cabal
+++ b/incipit-base.cabal
@@ -1,11 +1,11 @@
 cabal-version: 2.2
 
--- This file has been generated from package.yaml by hpack version 0.34.6.
+-- This file has been generated from package.yaml by hpack version 0.35.0.
 --
 -- see: https://github.com/sol/hpack
 
 name:           incipit-base
-version:        0.3.0.0
+version:        0.4.0.0
 synopsis:       A Prelude for Polysemy – Base Reexports
 description:    See https://hackage.haskell.org/package/incipit-base/docs/IncipitBase.html
 category:       Prelude
@@ -17,6 +17,9 @@
 license:        BSD-2-Clause-Patent
 license-file:   LICENSE
 build-type:     Simple
+extra-source-files:
+    changelog.md
+    readme.md
 
 source-repository head
   type: git
@@ -28,6 +31,7 @@
       Incipit.Debug
       Incipit.Either
       Incipit.Fixed
+      Incipit.Foldable
       Incipit.Fractional
       Incipit.Integral
       Incipit.Libraries
@@ -56,6 +60,8 @@
     , Data.IntSet
     , Data.Map.Lazy
     , Data.Map.Strict
+    , Data.Map.Merge.Lazy
+    , Data.Map.Merge.Strict
     , Data.Sequence
     , Data.Set
     , Data.Text
@@ -68,6 +74,7 @@
   hs-source-dirs:
       lib
   default-extensions:
+      NoImplicitPrelude
       AllowAmbiguousTypes
       ApplicativeDo
       BangPatterns
@@ -88,6 +95,7 @@
       DisambiguateRecordFields
       DoAndIfThenElse
       DuplicateRecordFields
+      EmptyCase
       EmptyDataDecls
       ExistentialQuantification
       FlexibleContexts
@@ -102,8 +110,9 @@
       MultiParamTypeClasses
       MultiWayIf
       NamedFieldPuns
-      OverloadedStrings
+      OverloadedLabels
       OverloadedLists
+      OverloadedStrings
       PackageImports
       PartialTypeSignatures
       PatternGuards
@@ -127,10 +136,9 @@
       UndecidableInstances
       UnicodeSyntax
       ViewPatterns
-      NoImplicitPrelude
   ghc-options: -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Widentities -Wunused-packages
   build-depends:
-      base >=4.13 && <4.17
+      base >=4.13 && <4.18
     , bytestring
     , containers
     , data-default >=0.2
diff --git a/lib/Incipit/Base.hs b/lib/Incipit/Base.hs
--- a/lib/Incipit/Base.hs
+++ b/lib/Incipit/Base.hs
@@ -15,7 +15,6 @@
   module Data.Coerce,
   module Data.Either,
   module Data.Eq,
-  module Data.Foldable,
   module Data.Function,
   module Data.Functor,
   module Data.Functor.Compose,
@@ -47,10 +46,12 @@
   module GHC.Stack,
   module GHC.TypeLits,
   module Incipit.Fixed,
+  module Incipit.Foldable,
   module Incipit.Fractional,
   module Incipit.Integral,
   module Numeric.Natural,
   module System.IO,
+  module Text.Show,
 ) where
 
 import Control.Applicative (
@@ -95,24 +96,6 @@
 import Data.Coerce (Coercible, coerce)
 import Data.Either
 import Data.Eq (Eq (..))
-import Data.Foldable (
-  Foldable (elem, fold, foldMap, foldMap', foldl', foldl1, foldr, foldr', foldr1, length, maximum, minimum, null, product, sum, toList),
-  all,
-  and,
-  any,
-  asum,
-  concat,
-  concatMap,
-  find,
-  foldlM,
-  forM_,
-  for_,
-  mapM_,
-  or,
-  sequenceA_,
-  sequence_,
-  traverse_,
-  )
 import Data.Function (const, fix, flip, id, on, ($), (&), (.))
 import Data.Functor (Functor (..), void, ($>), (<$>), (<&>))
 import Data.Functor.Compose (Compose (..))
@@ -206,7 +189,9 @@
 import GHC.TypeLits hiding (ErrorMessage (Text))
 import Numeric.Natural (Natural)
 import System.IO (FilePath, IO, print, putStr, putStrLn)
+import Text.Show (showParen, showString, showsPrec)
 
 import Incipit.Fixed
+import Incipit.Foldable
 import Incipit.Fractional
 import Incipit.Integral hiding (safeOp)
diff --git a/lib/Incipit/Debug.hs b/lib/Incipit/Debug.hs
--- a/lib/Incipit/Debug.hs
+++ b/lib/Incipit/Debug.hs
@@ -32,7 +32,7 @@
   SrcLoc ->
   Text ->
   IO ()
-debugPrint SrcLoc {srcLocModule = (toText -> slm), srcLocStartLine} msg =
+debugPrint SrcLoc {srcLocModule = (toText -> slm), srcLocStartLine} !msg =
   putStrLn (toString moduleName <> ":" <> show srcLocStartLine <> " " <> toString msg)
   where
     moduleName =
@@ -44,6 +44,7 @@
   Text ->
   m ()
 debugPrintWithLoc loc msg = do
+  () <- pure ()
   () <- pure (unsafePerformIO (debugPrint loc msg))
   pure ()
 
diff --git a/lib/Incipit/Foldable.hs b/lib/Incipit/Foldable.hs
new file mode 100644
--- /dev/null
+++ b/lib/Incipit/Foldable.hs
@@ -0,0 +1,91 @@
+-- |Overrides for problematic 'Foldable' functions.
+module Incipit.Foldable (
+  module Incipit.Foldable,
+  module Data.Foldable,
+) where
+
+import qualified Data.Foldable as Foldable
+import Data.Foldable (
+  Foldable (elem, fold, foldMap, foldMap', foldl', foldl1, foldr, foldr', foldr1, length, null, product, sum, toList),
+  all,
+  and,
+  any,
+  asum,
+  concat,
+  concatMap,
+  find,
+  foldlM,
+  forM_,
+  for_,
+  mapM_,
+  or,
+  sequenceA_,
+  sequence_,
+  traverse_,
+  )
+import Data.Maybe (Maybe (Just, Nothing))
+import Data.Ord (Ord, Ordering)
+
+-- |Default to using the strict version since the lazy one is so controversial.
+foldl ::
+  ∀ t b a .
+  Foldable t =>
+  (b -> a -> b) ->
+  b ->
+  t a ->
+  b
+foldl =
+  Foldable.foldl'
+{-# inlineable foldl #-}
+
+-- |Safe version of 'Foldable.minimum'.
+minimum ::
+  ∀ t a .
+  Ord a =>
+  Foldable t =>
+  t a ->
+  Maybe a
+minimum ta =
+  if null ta
+  then Nothing
+  else Just (Foldable.minimum ta)
+{-# inlineable minimum #-}
+
+-- |Safe version of 'Foldable.minimumBy'.
+minimumBy ::
+  ∀ t a .
+  Foldable t =>
+  (a -> a -> Ordering) ->
+  t a ->
+  Maybe a
+minimumBy cmp ta =
+  if null ta
+  then Nothing
+  else Just (Foldable.minimumBy cmp ta)
+{-# inlineable minimumBy #-}
+
+-- |Safe version of 'Foldable.maximum'.
+maximum ::
+  ∀ t a .
+  Ord a =>
+  Foldable t =>
+  t a ->
+  Maybe a
+maximum ta =
+  if null ta
+  then Nothing
+  else Just (Foldable.maximum ta)
+{-# inlineable maximum #-}
+
+-- |Safe version of 'Foldable.maximumBy'.
+maximumBy ::
+  ∀ t a .
+  Foldable t =>
+  (a -> a -> Ordering) ->
+  t a ->
+  Maybe a
+maximumBy cmp ta =
+  if null ta
+  then Nothing
+  else Just (Foldable.maximumBy cmp ta)
+{-# inlineable maximumBy #-}
diff --git a/lib/Incipit/Misc.hs b/lib/Incipit/Misc.hs
--- a/lib/Incipit/Misc.hs
+++ b/lib/Incipit/Misc.hs
@@ -1,8 +1,6 @@
 -- |Misc combinators.
 module Incipit.Misc where
 
-import qualified Data.Foldable as Foldable
-
 import Incipit.Base
 
 -- |Convenience alias for @pure ()@.
@@ -43,15 +41,3 @@
 ifM condM onTrue onFalse =
   condM >>= \ cond -> if cond then onTrue else onFalse
 {-# inline ifM #-}
-
--- |Default to using the strict version since the lazy one is so controversial.
-foldl ::
-  ∀ t b a .
-  Foldable t =>
-  (b -> a -> b) ->
-  b ->
-  t a ->
-  b
-foldl =
-  Foldable.foldl'
-{-# inline foldl #-}
diff --git a/lib/Incipit/String/Conversion.hs b/lib/Incipit/String/Conversion.hs
--- a/lib/Incipit/String/Conversion.hs
+++ b/lib/Incipit/String/Conversion.hs
@@ -106,7 +106,7 @@
     {-# INLINE encodeUtf8 #-}
 
     decodeUtf8 :: ByteString -> String
-    decodeUtf8 = T.unpack . T.decodeUtf8
+    decodeUtf8 = T.unpack . decodeUtf8
     {-# INLINE decodeUtf8 #-}
 
     decodeUtf8Strict :: ByteString -> Either T.UnicodeException String
@@ -148,7 +148,7 @@
     {-# INLINE encodeUtf8 #-}
 
     decodeUtf8 :: LByteString -> String
-    decodeUtf8 = LT.unpack . LT.decodeUtf8
+    decodeUtf8 = LT.unpack . decodeUtf8
     {-# INLINE decodeUtf8 #-}
 
     decodeUtf8Strict :: LByteString -> Either T.UnicodeException String
diff --git a/readme.md b/readme.md
new file mode 100644
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,37 @@
+# About
+
+This library is part of [incipit], a set of `Prelude` modules for the [Polysemy] ecosystem.
+It contains the reexports from `base` that are inherited by the other two packages.
+
+# Usage
+
+Using a custom `Prelude` requires the use of Cabal mixins to hide the module from `base` and replace it with
+`IncipitBase`:
+
+For `hpack`:
+```yaml
+dependencies:
+  - name: base
+    version: '>= 4 && < 5'
+    mixin:
+      - hiding (Prelude)
+  - name: incipit-base
+    version: '>= 0.3'
+    mixin:
+      - (IncipitBase as Prelude)
+      - hiding (IncipitBase)
+```
+
+For `cabal`:
+```cabal
+build-depends:
+    base >=4 && <5, incipit-base >= 0.3
+mixins:
+    base hiding (Prelude), incipit-base (IncipitBase as Prelude), incipit-base hiding (IncipitBase)
+```
+
+`incipit-base` used to export `Prelude`, but
+[stack can't deal with that](https://github.com/commercialhaskell/stack/issues/5414).
+
+[incipit]: https://hackage.haskell.org/package/incipit
+[Polysemy]: https://hackage.haskell.org/package/polysemy
