diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Revision history for yesod-colonnade
+
+## 1.3.0.2 -- 2024-03-06
+
+* Update package metadata.
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/src/Yesod/Colonnade.hs b/src/Yesod/Colonnade.hs
--- a/src/Yesod/Colonnade.hs
+++ b/src/Yesod/Colonnade.hs
@@ -1,19 +1,21 @@
--- | Build HTML tables using @yesod@ and @colonnade@. To learn
---   how to use this module, first read the documentation for @colonnade@,
---   and then read the documentation for @blaze-colonnade@. This library
---   and @blaze-colonnade@ are entirely distinct; neither depends on the
---   other. However, the interfaces they expose are very similar, and
---   the explanations provided counterpart are sufficient to understand
---   this library.
+{- | Build HTML tables using @yesod@ and @colonnade@. To learn
+  how to use this module, first read the documentation for @colonnade@,
+  and then read the documentation for @blaze-colonnade@. This library
+  and @blaze-colonnade@ are entirely distinct; neither depends on the
+  other. However, the interfaces they expose are very similar, and
+  the explanations provided counterpart are sufficient to understand
+  this library.
+-}
 module Yesod.Colonnade
   ( -- * Build
-    Cell(..)
+    Cell (..)
   , cell
   , stringCell
   , textCell
   , builderCell
   , anchorCell
   , anchorWidget
+
     -- * Apply
   , encodeWidgetTable
   , encodeCellTable
@@ -21,28 +23,23 @@
   , encodeListItems
   ) where
 
-import Yesod.Core
-import Yesod.Core.Types (Body(..),GWData(..),WidgetFor(..),wdRef)
-import Colonnade (Colonnade,Headed,Headless)
-import Data.Text (Text)
+import Colonnade (Colonnade, Headed)
+import qualified Colonnade.Encode as E
 import Control.Monad
-import Data.IORef (modifyIORef')
-import Data.Monoid
-import Data.String (IsString(..))
-import Text.Blaze (Attribute,toValue)
 import Data.Foldable
-import Yesod.Elements (table_,thead_,tbody_,tr_,td_,th_,ul_,li_,a_)
-import Data.Semigroup (Semigroup)
 import qualified Data.Semigroup as SG
-import qualified Text.Blaze.Html5.Attributes as HA
-import qualified Text.Blaze.Html5 as H
-import qualified Colonnade.Encode as E
-import qualified Data.Text as Text
+import Data.String (IsString (..))
+import Data.Text (Text)
 import qualified Data.Text.Lazy as LText
 import qualified Data.Text.Lazy.Builder as TBuilder
+import Text.Blaze (Attribute, toValue)
+import qualified Text.Blaze.Html5.Attributes as HA
+import Yesod.Core
+import Yesod.Elements (a_, li_, table_, tbody_, td_, th_, thead_, tr_)
 
--- | The attributes that will be applied to a @<td>@ and
---   the HTML content that will go inside it.
+{- | The attributes that will be applied to a @<td>@ and
+  the HTML content that will go inside it.
+-}
 data Cell site = Cell
   { cellAttrs :: [Attribute]
   , cellContents :: !(WidgetFor site ())
@@ -73,98 +70,139 @@
 builderCell :: TBuilder.Builder -> Cell site
 builderCell = cell . toWidget . toHtml . LText.toStrict . TBuilder.toLazyText
 
--- | Create a 'Cell' whose content is hyperlinked by wrapping
---   it in an @\<a\>@.
-anchorCell :: 
-     (a -> Route site) -- ^ Route that will go in @href@ attribute
-  -> (a -> WidgetFor site ()) -- ^ Content wrapped by @<a>@ tag
-  -> a -- ^ Value
-  -> Cell site
+{- | Create a 'Cell' whose content is hyperlinked by wrapping
+  it in an @\<a\>@.
+-}
+anchorCell ::
+  -- | Route that will go in @href@ attribute
+  (a -> Route site) ->
+  -- | Content wrapped by @<a>@ tag
+  (a -> WidgetFor site ()) ->
+  -- | Value
+  a ->
+  Cell site
 anchorCell getRoute getContent = cell . anchorWidget getRoute getContent
 
--- | Create a widget whose content is hyperlinked by wrapping
---   it in an @\<a\>@.
-anchorWidget :: 
-     (a -> Route site) -- ^ Route that will go in @href@ attribute
-  -> (a -> WidgetFor site ()) -- ^ Content wrapped by @<a>@ tag
-  -> a -- ^ Value
-  -> WidgetFor site ()
+{- | Create a widget whose content is hyperlinked by wrapping
+  it in an @\<a\>@.
+-}
+anchorWidget ::
+  -- | Route that will go in @href@ attribute
+  (a -> Route site) ->
+  -- | Content wrapped by @<a>@ tag
+  (a -> WidgetFor site ()) ->
+  -- | Value
+  a ->
+  WidgetFor site ()
 anchorWidget getRoute getContent a = do
   urlRender <- getUrlRender
   a_ [HA.href (toValue (urlRender (getRoute a)))] (getContent a)
 
--- | This determines the attributes that are added
---   to the individual @li@s by concatenating the header\'s
---   attributes with the data\'s attributes. 
-encodeListItems :: 
-     (WidgetFor site () -> WidgetFor site ())
-     -- ^ Wrapper for items, often @ul@
-  -> (WidgetFor site () -> WidgetFor site () -> WidgetFor site ())
-     -- ^ Combines header with data
-  -> Colonnade Headed a (Cell site)
-     -- ^ How to encode data as a row
-  -> a
-     -- ^ The value to display
-  -> WidgetFor site ()
+{- | This determines the attributes that are added
+  to the individual @li@s by concatenating the header\'s
+  attributes with the data\'s attributes.
+-}
+encodeListItems ::
+  -- | Wrapper for items, often @ul@
+  (WidgetFor site () -> WidgetFor site ()) ->
+  -- | Combines header with data
+  (WidgetFor site () -> WidgetFor site () -> WidgetFor site ()) ->
+  -- | How to encode data as a row
+  Colonnade Headed a (Cell site) ->
+  -- | The value to display
+  a ->
+  WidgetFor site ()
 encodeListItems ulWrap combine enc =
-  ulWrap . E.bothMonadic_ enc
-    (\(Cell ha hc) (Cell ba bc) ->
-      li_ (ha <> ba) (combine hc bc)
-    )
+  ulWrap
+    . E.bothMonadic_
+      enc
+      ( \(Cell ha hc) (Cell ba bc) ->
+          li_ (ha <> ba) (combine hc bc)
+      )
 
--- | A two-column table with the header content displayed in the
---   first column and the data displayed in the second column. Note
---   that the generated HTML table does not have a @thead@.
+{- | A two-column table with the header content displayed in the
+  first column and the data displayed in the second column. Note
+  that the generated HTML table does not have a @thead@.
+-}
 encodeDefinitionTable ::
-     [Attribute]
-     -- ^ Attributes of @table@ element.
-  -> Colonnade Headed a (Cell site)
-     -- ^ How to encode data as a row
-  -> a
-     -- ^ The value to display
-  -> WidgetFor site ()
-encodeDefinitionTable attrs enc a = table_ attrs $ tbody_ [] $ 
-  E.bothMonadic_ enc
-    (\theKey theValue -> tr_ [] $ do
-      widgetFromCell td_ theKey
-      widgetFromCell td_ theValue
-    ) a
+  -- | Attributes of @table@ element.
+  [Attribute] ->
+  -- | How to encode data as a row
+  Colonnade Headed a (Cell site) ->
+  -- | The value to display
+  a ->
+  WidgetFor site ()
+encodeDefinitionTable attrs enc a =
+  table_ attrs $
+    tbody_ [] $
+      E.bothMonadic_
+        enc
+        ( \theKey theValue -> tr_ [] $ do
+            widgetFromCell td_ theKey
+            widgetFromCell td_ theValue
+        )
+        a
 
--- | Encode an html table with attributes on the table cells.
---   If you are using the bootstrap css framework, then you may want
---   to call this with the first argument as:
---
---   > encodeCellTable (HA.class_ "table table-striped") ...
-encodeCellTable :: (Foldable f, E.Headedness h)
-  => [Attribute] -- ^ Attributes of @table@ element
-  -> Colonnade h a (Cell site) -- ^ How to encode data as a row
-  -> f a -- ^ Rows of data
-  -> WidgetFor site ()
-encodeCellTable = encodeTable
-  (E.headednessPure mempty) mempty (const mempty) widgetFromCell 
+{- | Encode an html table with attributes on the table cells.
+  If you are using the bootstrap css framework, then you may want
+  to call this with the first argument as:
 
+  > encodeCellTable (HA.class_ "table table-striped") ...
+-}
+encodeCellTable ::
+  (Foldable f, E.Headedness h) =>
+  -- | Attributes of @table@ element
+  [Attribute] ->
+  -- | How to encode data as a row
+  Colonnade h a (Cell site) ->
+  -- | Rows of data
+  f a ->
+  WidgetFor site ()
+encodeCellTable =
+  encodeTable
+    (E.headednessPure mempty)
+    mempty
+    (const mempty)
+    widgetFromCell
+
 -- | Encode an html table.
-encodeWidgetTable :: (Foldable f, E.Headedness h)
-  => [Attribute] -- ^ Attributes of @\<table\>@ element
-  -> Colonnade h a (WidgetFor site ()) -- ^ How to encode data as columns
-  -> f a -- ^ Rows of data
-  -> WidgetFor site ()
-encodeWidgetTable = encodeTable
-  (E.headednessPure mempty) mempty (const mempty) ($ mempty) 
+encodeWidgetTable ::
+  (Foldable f, E.Headedness h) =>
+  -- | Attributes of @\<table\>@ element
+  [Attribute] ->
+  -- | How to encode data as columns
+  Colonnade h a (WidgetFor site ()) ->
+  -- | Rows of data
+  f a ->
+  WidgetFor site ()
+encodeWidgetTable =
+  encodeTable
+    (E.headednessPure mempty)
+    mempty
+    (const mempty)
+    ($ mempty)
 
--- | Encode a table. This handles a very general case and
---   is seldom needed by users. One of the arguments provided is
---   used to add attributes to the generated @\<tr\>@ elements.
+{- | Encode a table. This handles a very general case and
+  is seldom needed by users. One of the arguments provided is
+  used to add attributes to the generated @\<tr\>@ elements.
+-}
 encodeTable ::
-     (Foldable f, E.Headedness h)
-  => h [Attribute] -- ^ Attributes of @\<thead\>@
-  -> [Attribute] -- ^ Attributes of @\<tbody\>@ element
-  -> (a -> [Attribute]) -- ^ Attributes of each @\<tr\>@ element
-  -> (([Attribute] -> WidgetFor site () -> WidgetFor site ()) -> c -> WidgetFor site ()) -- ^ Wrap content and convert to 'Html'
-  -> [Attribute] -- ^ Attributes of @\<table\>@ element
-  -> Colonnade h a c -- ^ How to encode data as a row
-  -> f a -- ^ Collection of data
-  -> WidgetFor site ()
+  (Foldable f, E.Headedness h) =>
+  -- | Attributes of @\<thead\>@
+  h [Attribute] ->
+  -- | Attributes of @\<tbody\>@ element
+  [Attribute] ->
+  -- | Attributes of each @\<tr\>@ element
+  (a -> [Attribute]) ->
+  -- | Wrap content and convert to 'Html'
+  (([Attribute] -> WidgetFor site () -> WidgetFor site ()) -> c -> WidgetFor site ()) ->
+  -- | Attributes of @\<table\>@ element
+  [Attribute] ->
+  -- | How to encode data as a row
+  Colonnade h a c ->
+  -- | Collection of data
+  f a ->
+  WidgetFor site ()
 encodeTable theadAttrs tbodyAttrs trAttrs wrapContent tableAttrs colonnade xs =
   table_ tableAttrs $ do
     for_ E.headednessExtract $ \unhead ->
@@ -175,9 +213,8 @@
         tr_ (trAttrs x) (E.rowMonadic_ colonnade (wrapContent td_) x)
 
 widgetFromCell ::
-     ([Attribute] -> WidgetFor site () -> WidgetFor site ())
-  -> Cell site
-  -> WidgetFor site ()
+  ([Attribute] -> WidgetFor site () -> WidgetFor site ()) ->
+  Cell site ->
+  WidgetFor site ()
 widgetFromCell f (Cell attrs contents) =
   f attrs contents
-
diff --git a/yesod-colonnade.cabal b/yesod-colonnade.cabal
--- a/yesod-colonnade.cabal
+++ b/yesod-colonnade.cabal
@@ -1,33 +1,38 @@
-cabal-version: 2.0
-name: yesod-colonnade
-version: 1.3.0.1
-synopsis: Helper functions for using yesod with colonnade
-description: Yesod and colonnade
-homepage: https://github.com/andrewthad/colonnade#readme
-license: BSD3
-license-file: LICENSE
-author: Andrew Martin
-maintainer: andrew.thaddeus@gmail.com
-copyright: 2018 Andrew Martin
-category: web
-build-type: Simple
+cabal-version:   3.0
+name:            yesod-colonnade
+version:         1.3.0.2
+synopsis:        Helper functions for using yesod with colonnade
+description:     Helper functions for using yesod with colonnade.
+homepage:        https://github.com/byteverse/yesod-colonnade
+bug-reports:     https://github.com/byteverse/yesod-colonnade/issues
+license:         BSD-3-Clause
+license-file:    LICENSE
+author:          Andrew Martin
+maintainer:      amartin@layer3com.com
+copyright:       2018 Andrew Martin
+category:        web
+build-type:      Simple
+extra-doc-files: CHANGELOG.md
+tested-with:     GHC ==9.4.8 || ==9.6.3 || ==9.8.1
 
+common build-settings
+  default-language: Haskell2010
+  ghc-options:      -Wall -Wunused-packages
+  build-depends:    base >=4.9.1 && <5
+
 library
-  hs-source-dirs: src
-  exposed-modules:
-    Yesod.Colonnade
+  import:          build-settings
+  ghc-options:     -O2
+  hs-source-dirs:  src
+  exposed-modules: Yesod.Colonnade
   build-depends:
-      base >= 4.9.1.0 && < 4.12
-    , colonnade >= 1.2 && < 1.3
-    , yesod-core >= 1.6 && < 1.7
-    , conduit >= 1.3 && < 1.4
-    , conduit-extra >= 1.3 && < 1.4
-    , text >= 1.0 && < 1.3
-    , blaze-markup >= 0.7 && < 0.9
-    , blaze-html >= 0.8 && < 0.10
-    , yesod-elements >= 1.1 && < 1.2
-  default-language: Haskell2010
+    , blaze-html      >=0.8
+    , blaze-markup    >=0.7
+    , colonnade       >=1.2
+    , text            >=1.0
+    , yesod-core      >=1.6
+    , yesod-elements  >=1.1
 
 source-repository head
-  type: git
-  location: https://github.com/andrewthad/colonnade
+  type:     git
+  location: git://github.com/byteverse/yesod-colonnade.git
